GUI: new pattern cursor logic, part 12

dragging
This commit is contained in:
tildearrow 2025-07-04 04:05:35 -05:00
parent ae3444566b
commit 0bbdfa877e
2 changed files with 54 additions and 24 deletions

View file

@ -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 (e->curSubSong->patLen>0) {
int newSelStartYAbs=dragStartYAbs+(dragDestinationYAbs-dragSourceYAbs);
int newSelEndYAbs=dragEndYAbs+(dragDestinationYAbs-dragSourceYAbs);
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 (dragEnd.y+(dragDestinationY-dragSourceY)>=e->curSubSong->patLen) {
dragDestinationY=e->curSubSong->patLen-(dragEnd.y-dragSourceY)-1;
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=dragStart.y+(dragDestinationY-dragSourceY);
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=dragEnd.y+(dragDestinationY-dragSourceY);
selEnd.y=newSelEndYAbs%e->curSubSong->patLen;
selEnd.order=newSelEndYAbs/e->curSubSong->patLen;
}
} else {
if (selectingFull) {
DETERMINE_LAST;

View file

@ -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);
}