GUI: new pattern cursor logic, part 12
dragging
This commit is contained in:
parent
ae3444566b
commit
0bbdfa877e
|
@ -130,21 +130,42 @@ void FurnaceGUI::updateSelection(int xCoarse, int xFine, int y, int ord, bool fu
|
|||
}
|
||||
}
|
||||
|
||||
// TODO: new cursor logic
|
||||
if (dragStart.y+(dragDestinationY-dragSourceY)<0) {
|
||||
dragDestinationY=dragSourceY-dragStart.y;
|
||||
}
|
||||
int dragStartYAbs=dragStart.y+(dragStart.order*e->curSubSong->patLen);
|
||||
int dragEndYAbs=dragEnd.y+(dragEnd.order*e->curSubSong->patLen);
|
||||
int dragSourceYAbs=dragSourceY+(dragSourceOrder*e->curSubSong->patLen);
|
||||
int dragDestinationYAbs=dragDestinationY+(dragDestinationOrder*e->curSubSong->patLen);
|
||||
|
||||
if (dragEnd.y+(dragDestinationY-dragSourceY)>=e->curSubSong->patLen) {
|
||||
dragDestinationY=e->curSubSong->patLen-(dragEnd.y-dragSourceY)-1;
|
||||
}
|
||||
if (e->curSubSong->patLen>0) {
|
||||
int newSelStartYAbs=dragStartYAbs+(dragDestinationYAbs-dragSourceYAbs);
|
||||
int newSelEndYAbs=dragEndYAbs+(dragDestinationYAbs-dragSourceYAbs);
|
||||
|
||||
selStart.xCoarse=dragStart.xCoarse+(dragDestinationX-dragSourceX);
|
||||
selStart.xFine=dragStart.xFine+(dragDestinationXFine-dragSourceXFine);
|
||||
selStart.y=dragStart.y+(dragDestinationY-dragSourceY);
|
||||
selEnd.xCoarse=dragEnd.xCoarse+(dragDestinationX-dragSourceX);
|
||||
selEnd.xFine=dragEnd.xFine+(dragDestinationXFine-dragSourceXFine);
|
||||
selEnd.y=dragEnd.y+(dragDestinationY-dragSourceY);
|
||||
logV("SS: %d SE: %d",newSelStartYAbs,newSelEndYAbs);
|
||||
|
||||
if (newSelStartYAbs<0) {
|
||||
int newDragDestination=dragSourceYAbs-dragStartYAbs;
|
||||
newSelStartYAbs=0;
|
||||
newSelEndYAbs=dragEndYAbs-dragStartYAbs;
|
||||
dragDestinationY=newDragDestination%e->curSubSong->patLen;
|
||||
dragDestinationOrder=newDragDestination/e->curSubSong->patLen;
|
||||
}
|
||||
|
||||
if (newSelEndYAbs>=(e->curSubSong->ordersLen*e->curSubSong->patLen)) {
|
||||
int newDragDestination=(e->curSubSong->ordersLen*e->curSubSong->patLen)-(dragEndYAbs-dragSourceYAbs)-1;
|
||||
newSelStartYAbs=(e->curSubSong->ordersLen*e->curSubSong->patLen)-1-(dragEndYAbs-dragStartYAbs);
|
||||
newSelEndYAbs=(e->curSubSong->ordersLen*e->curSubSong->patLen)-1;
|
||||
dragDestinationY=newDragDestination%e->curSubSong->patLen;
|
||||
dragDestinationOrder=newDragDestination/e->curSubSong->patLen;
|
||||
}
|
||||
|
||||
selStart.xCoarse=dragStart.xCoarse+(dragDestinationX-dragSourceX);
|
||||
selStart.xFine=dragStart.xFine+(dragDestinationXFine-dragSourceXFine);
|
||||
selStart.y=newSelStartYAbs%e->curSubSong->patLen;
|
||||
selStart.order=newSelStartYAbs/e->curSubSong->patLen;
|
||||
selEnd.xCoarse=dragEnd.xCoarse+(dragDestinationX-dragSourceX);
|
||||
selEnd.xFine=dragEnd.xFine+(dragDestinationXFine-dragSourceXFine);
|
||||
selEnd.y=newSelEndYAbs%e->curSubSong->patLen;
|
||||
selEnd.order=newSelEndYAbs/e->curSubSong->patLen;
|
||||
}
|
||||
} else {
|
||||
if (selectingFull) {
|
||||
DETERMINE_LAST;
|
||||
|
|
|
@ -626,6 +626,7 @@ void FurnaceGUI::doPasteFurnace(PasteMode mode, int arg, bool readClipboard, Str
|
|||
DETERMINE_LAST;
|
||||
|
||||
int j=cursor.y;
|
||||
int jOrder=cursor.order;
|
||||
char note[4];
|
||||
for (size_t i=2; i<data.size() && j<e->curSubSong->patLen; i++) {
|
||||
size_t charPos=0;
|
||||
|
@ -635,7 +636,7 @@ void FurnaceGUI::doPasteFurnace(PasteMode mode, int arg, bool readClipboard, Str
|
|||
String& line=data[i];
|
||||
|
||||
while (charPos<line.size() && iCoarse<lastChannel) {
|
||||
DivPattern* pat=e->curPat[iCoarse].getPattern(e->curOrders->ord[iCoarse][curOrder],true);
|
||||
DivPattern* pat=e->curPat[iCoarse].getPattern(e->curOrders->ord[iCoarse][jOrder],true);
|
||||
if (line[charPos]=='|') {
|
||||
iCoarse++;
|
||||
if (iCoarse<lastChannel) while (!e->curSubSong->chanShow[iCoarse]) {
|
||||
|
@ -741,9 +742,9 @@ void FurnaceGUI::doPasteFurnace(PasteMode mode, int arg, bool readClipboard, Str
|
|||
break;
|
||||
}
|
||||
j++;
|
||||
if (mode==GUI_PASTE_MODE_OVERFLOW && j>=e->curSubSong->patLen && curOrder<e->curSubSong->ordersLen-1) {
|
||||
if (mode==GUI_PASTE_MODE_OVERFLOW && j>=e->curSubSong->patLen && jOrder<e->curSubSong->ordersLen-1) {
|
||||
j=0;
|
||||
curOrder++;
|
||||
jOrder++;
|
||||
}
|
||||
|
||||
if (mode==GUI_PASTE_MODE_FLOOD && i==data.size()-1) {
|
||||
|
@ -751,8 +752,9 @@ void FurnaceGUI::doPasteFurnace(PasteMode mode, int arg, bool readClipboard, Str
|
|||
}
|
||||
}
|
||||
|
||||
curOrder=jOrder;
|
||||
if (mode==GUI_PASTE_MODE_OVERFLOW && !e->isPlaying()) {
|
||||
setOrder(curOrder);
|
||||
setOrder(jOrder);
|
||||
}
|
||||
|
||||
if (readClipboard) {
|
||||
|
@ -986,6 +988,7 @@ void FurnaceGUI::doPasteMPT(PasteMode mode, int arg, bool readClipboard, String
|
|||
DETERMINE_LAST;
|
||||
|
||||
int j=cursor.y;
|
||||
int jOrder=cursor.order;
|
||||
char note[4];
|
||||
bool invalidData=false;
|
||||
|
||||
|
@ -997,7 +1000,7 @@ void FurnaceGUI::doPasteMPT(PasteMode mode, int arg, bool readClipboard, String
|
|||
int iFine=0;
|
||||
String& line=data[i];
|
||||
while (charPos<line.size() && iCoarse<lastChannel) {
|
||||
DivPattern* pat=e->curPat[iCoarse].getPattern(e->curOrders->ord[iCoarse][curOrder],true);
|
||||
DivPattern* pat=e->curPat[iCoarse].getPattern(e->curOrders->ord[iCoarse][jOrder],true);
|
||||
if (line[charPos]=='|' && charPos!=0) { // MPT format starts every pattern line with '|'
|
||||
iCoarse++;
|
||||
if (iCoarse<lastChannel) {
|
||||
|
@ -1214,9 +1217,9 @@ void FurnaceGUI::doPasteMPT(PasteMode mode, int arg, bool readClipboard, String
|
|||
}
|
||||
|
||||
j++;
|
||||
if (mode==GUI_PASTE_MODE_OVERFLOW && j>=e->curSubSong->patLen && curOrder<e->curSubSong->ordersLen-1) {
|
||||
if (mode==GUI_PASTE_MODE_OVERFLOW && j>=e->curSubSong->patLen && jOrder<e->curSubSong->ordersLen-1) {
|
||||
j=0;
|
||||
curOrder++;
|
||||
jOrder++;
|
||||
}
|
||||
|
||||
if (mode==GUI_PASTE_MODE_FLOOD && i==data.size()-1) {
|
||||
|
@ -1224,6 +1227,11 @@ void FurnaceGUI::doPasteMPT(PasteMode mode, int arg, bool readClipboard, String
|
|||
}
|
||||
}
|
||||
|
||||
curOrder=jOrder;
|
||||
if (mode==GUI_PASTE_MODE_OVERFLOW && !e->isPlaying()) {
|
||||
setOrder(jOrder);
|
||||
}
|
||||
|
||||
if (readClipboard) {
|
||||
if (settings.cursorPastePos) {
|
||||
makeCursorUndo();
|
||||
|
@ -1291,8 +1299,8 @@ void FurnaceGUI::doPaste(PasteMode mode, int arg, bool readClipboard, String cli
|
|||
UndoRegion ur;
|
||||
if (mode==GUI_PASTE_MODE_OVERFLOW) {
|
||||
int rows=cursor.y;
|
||||
int firstPattern=curOrder;
|
||||
int lastPattern=curOrder;
|
||||
int firstPattern=cursor.order;
|
||||
int lastPattern=cursor.order;
|
||||
rows+=data.size();
|
||||
while (rows>=e->curSubSong->patLen) {
|
||||
lastPattern++;
|
||||
|
@ -2010,7 +2018,8 @@ void FurnaceGUI::doDrag(bool copy) {
|
|||
|
||||
// replace
|
||||
cursor=selStart;
|
||||
doPaste(GUI_PASTE_MODE_NORMAL,0,false,c);
|
||||
doPaste(GUI_PASTE_MODE_OVERFLOW,0,false,c);
|
||||
updateScroll(cursor.y);
|
||||
|
||||
makeUndo(GUI_UNDO_PATTERN_DRAG);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue