diff --git a/src/gui/cursor.cpp b/src/gui/cursor.cpp index 7c7636aa2..576da9f3a 100644 --- a/src/gui/cursor.cpp +++ b/src/gui/cursor.cpp @@ -127,24 +127,45 @@ void FurnaceGUI::updateSelection(int xCoarse, int xFine, int y, int ord, bool fu } if (dragStart.xFine+(dragDestinationXFine-dragSourceXFine)<3) { dragDestinationXFine=3-dragStart.xFine+dragSourceXFine; - } + } } - // 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; diff --git a/src/gui/editing.cpp b/src/gui/editing.cpp index c8af0176b..ecde6e55f 100644 --- a/src/gui/editing.cpp +++ b/src/gui/editing.cpp @@ -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; icurSubSong->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 (charPoscurPat[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 (iCoarsecurSubSong->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 && curOrdercurSubSong->ordersLen-1) { + if (mode==GUI_PASTE_MODE_OVERFLOW && j>=e->curSubSong->patLen && jOrdercurSubSong->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 (charPoscurPat[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=e->curSubSong->patLen && curOrdercurSubSong->ordersLen-1) { + if (mode==GUI_PASTE_MODE_OVERFLOW && j>=e->curSubSong->patLen && jOrdercurSubSong->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); }