fix order edit buttons when follow pattern is off

This commit is contained in:
tildearrow 2023-02-05 19:06:13 -05:00
parent 56d4950fad
commit 8d13ec078c
3 changed files with 44 additions and 37 deletions

View file

@ -3544,14 +3544,14 @@ void DivEngine::delSample(int index) {
BUSY_END;
}
void DivEngine::addOrder(bool duplicate, bool where) {
void DivEngine::addOrder(int pos, bool duplicate, bool where) {
unsigned char order[DIV_MAX_CHANS];
if (curSubSong->ordersLen>=(DIV_MAX_PATTERNS-1)) return;
memset(order,0,DIV_MAX_CHANS);
BUSY_BEGIN_SOFT;
if (duplicate) {
for (int i=0; i<DIV_MAX_CHANS; i++) {
order[i]=curOrders->ord[i][curOrder];
order[i]=curOrders->ord[i][pos];
}
} else {
bool used[DIV_MAX_PATTERNS];
@ -3579,14 +3579,14 @@ void DivEngine::addOrder(bool duplicate, bool where) {
} else { // after current order
saveLock.lock();
for (int i=0; i<DIV_MAX_CHANS; i++) {
for (int j=curSubSong->ordersLen; j>curOrder; j--) {
for (int j=curSubSong->ordersLen; j>pos; j--) {
curOrders->ord[i][j]=curOrders->ord[i][j-1];
}
curOrders->ord[i][curOrder+1]=order[i];
curOrders->ord[i][pos+1]=order[i];
}
curSubSong->ordersLen++;
saveLock.unlock();
curOrder++;
if (pos<=curOrder) curOrder++;
if (playing && !freelance) {
playSub(false);
}
@ -3594,7 +3594,7 @@ void DivEngine::addOrder(bool duplicate, bool where) {
BUSY_END;
}
void DivEngine::deepCloneOrder(bool where) {
void DivEngine::deepCloneOrder(int pos, bool where) {
unsigned char order[DIV_MAX_CHANS];
if (curSubSong->ordersLen>=(DIV_MAX_PATTERNS-1)) return;
warnings="";
@ -3602,7 +3602,7 @@ void DivEngine::deepCloneOrder(bool where) {
for (int i=0; i<chans; i++) {
bool didNotFind=true;
logD("channel %d",i);
order[i]=curOrders->ord[i][curOrder];
order[i]=curOrders->ord[i][pos];
// find free slot
for (int j=0; j<DIV_MAX_PATTERNS; j++) {
logD("finding free slot in %d...",j);
@ -3631,14 +3631,14 @@ void DivEngine::deepCloneOrder(bool where) {
} else { // after current order
saveLock.lock();
for (int i=0; i<chans; i++) {
for (int j=curSubSong->ordersLen; j>curOrder; j--) {
for (int j=curSubSong->ordersLen; j>pos; j--) {
curOrders->ord[i][j]=curOrders->ord[i][j-1];
}
curOrders->ord[i][curOrder+1]=order[i];
curOrders->ord[i][pos+1]=order[i];
}
curSubSong->ordersLen++;
saveLock.unlock();
curOrder++;
if (pos<=curOrder) curOrder++;
if (playing && !freelance) {
playSub(false);
}
@ -3646,17 +3646,18 @@ void DivEngine::deepCloneOrder(bool where) {
BUSY_END;
}
void DivEngine::deleteOrder() {
void DivEngine::deleteOrder(int pos) {
if (curSubSong->ordersLen<=1) return;
BUSY_BEGIN_SOFT;
saveLock.lock();
for (int i=0; i<DIV_MAX_CHANS; i++) {
for (int j=curOrder; j<curSubSong->ordersLen; j++) {
for (int j=pos; j<curSubSong->ordersLen; j++) {
curOrders->ord[i][j]=curOrders->ord[i][j+1];
}
}
curSubSong->ordersLen--;
saveLock.unlock();
if (curOrder>pos) curOrder--;
if (curOrder>=curSubSong->ordersLen) curOrder=curSubSong->ordersLen-1;
if (playing && !freelance) {
playSub(false);
@ -3664,40 +3665,46 @@ void DivEngine::deleteOrder() {
BUSY_END;
}
void DivEngine::moveOrderUp() {
void DivEngine::moveOrderUp(int& pos) {
BUSY_BEGIN_SOFT;
if (curOrder<1) {
if (pos<1) {
BUSY_END;
return;
}
saveLock.lock();
for (int i=0; i<DIV_MAX_CHANS; i++) {
curOrders->ord[i][curOrder]^=curOrders->ord[i][curOrder-1];
curOrders->ord[i][curOrder-1]^=curOrders->ord[i][curOrder];
curOrders->ord[i][curOrder]^=curOrders->ord[i][curOrder-1];
curOrders->ord[i][pos]^=curOrders->ord[i][pos-1];
curOrders->ord[i][pos-1]^=curOrders->ord[i][pos];
curOrders->ord[i][pos]^=curOrders->ord[i][pos-1];
}
saveLock.unlock();
if (curOrder==pos) {
curOrder--;
}
pos--;
if (playing && !freelance) {
playSub(false);
}
BUSY_END;
}
void DivEngine::moveOrderDown() {
void DivEngine::moveOrderDown(int& pos) {
BUSY_BEGIN_SOFT;
if (curOrder>=curSubSong->ordersLen-1) {
if (pos>=curSubSong->ordersLen-1) {
BUSY_END;
return;
}
saveLock.lock();
for (int i=0; i<DIV_MAX_CHANS; i++) {
curOrders->ord[i][curOrder]^=curOrders->ord[i][curOrder+1];
curOrders->ord[i][curOrder+1]^=curOrders->ord[i][curOrder];
curOrders->ord[i][curOrder]^=curOrders->ord[i][curOrder+1];
curOrders->ord[i][pos]^=curOrders->ord[i][pos+1];
curOrders->ord[i][pos+1]^=curOrders->ord[i][pos];
curOrders->ord[i][pos]^=curOrders->ord[i][pos+1];
}
saveLock.unlock();
if (curOrder==pos) {
curOrder++;
}
pos++;
if (playing && !freelance) {
playSub(false);
}

View file

@ -810,19 +810,19 @@ class DivEngine {
void delSample(int index);
// add order
void addOrder(bool duplicate, bool where);
void addOrder(int pos, bool duplicate, bool where);
// deep clone orders
void deepCloneOrder(bool where);
void deepCloneOrder(int pos, bool where);
// delete order
void deleteOrder();
void deleteOrder(int pos);
// move order up
void moveOrderUp();
void moveOrderUp(int& pos);
// move order down
void moveOrderDown();
void moveOrderDown(int& pos);
// move thing up
bool moveInsUp(int which);

View file

@ -1471,17 +1471,17 @@ void FurnaceGUI::doAction(int what) {
break;
case GUI_ACTION_ORDERS_ADD:
prepareUndo(GUI_UNDO_CHANGE_ORDER);
e->addOrder(false,false);
e->addOrder(curOrder,false,false);
makeUndo(GUI_UNDO_CHANGE_ORDER);
break;
case GUI_ACTION_ORDERS_DUPLICATE:
prepareUndo(GUI_UNDO_CHANGE_ORDER);
e->addOrder(true,false);
e->addOrder(curOrder,true,false);
makeUndo(GUI_UNDO_CHANGE_ORDER);
break;
case GUI_ACTION_ORDERS_DEEP_CLONE:
prepareUndo(GUI_UNDO_CHANGE_ORDER);
e->deepCloneOrder(false);
e->deepCloneOrder(curOrder,false);
makeUndo(GUI_UNDO_CHANGE_ORDER);
if (!e->getWarnings().empty()) {
showWarning(e->getWarnings(),GUI_WARN_GENERIC);
@ -1489,12 +1489,12 @@ void FurnaceGUI::doAction(int what) {
break;
case GUI_ACTION_ORDERS_DUPLICATE_END:
prepareUndo(GUI_UNDO_CHANGE_ORDER);
e->addOrder(true,true);
e->addOrder(curOrder,true,true);
makeUndo(GUI_UNDO_CHANGE_ORDER);
break;
case GUI_ACTION_ORDERS_DEEP_CLONE_END:
prepareUndo(GUI_UNDO_CHANGE_ORDER);
e->deepCloneOrder(true);
e->deepCloneOrder(curOrder,true);
makeUndo(GUI_UNDO_CHANGE_ORDER);
if (!e->getWarnings().empty()) {
showWarning(e->getWarnings(),GUI_WARN_GENERIC);
@ -1502,7 +1502,7 @@ void FurnaceGUI::doAction(int what) {
break;
case GUI_ACTION_ORDERS_REMOVE:
prepareUndo(GUI_UNDO_CHANGE_ORDER);
e->deleteOrder();
e->deleteOrder(curOrder);
if (curOrder>=e->curSubSong->ordersLen) {
curOrder=e->curSubSong->ordersLen-1;
oldOrder=curOrder;
@ -1513,12 +1513,12 @@ void FurnaceGUI::doAction(int what) {
break;
case GUI_ACTION_ORDERS_MOVE_UP:
prepareUndo(GUI_UNDO_CHANGE_ORDER);
e->moveOrderUp();
e->moveOrderUp(curOrder);
makeUndo(GUI_UNDO_CHANGE_ORDER);
break;
case GUI_ACTION_ORDERS_MOVE_DOWN:
prepareUndo(GUI_UNDO_CHANGE_ORDER);
e->moveOrderDown();
e->moveOrderDown(curOrder);
makeUndo(GUI_UNDO_CHANGE_ORDER);
break;
case GUI_ACTION_ORDERS_REPLAY: