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

View file

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

View file

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