diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 3113b70d5..7ce6436ec 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -5898,6 +5898,45 @@ void DivEngine::addOrder(bool duplicate, bool where) { isBusy.unlock(); } +void DivEngine::deepCloneOrder(bool where) { + unsigned char order[DIV_MAX_CHANS]; + if (song.ordersLen>=0x7e) return; + isBusy.lock(); + for (int i=0; idata,oldPat->data,256*32*sizeof(short)); + break; + } + } + } + if (where) { // at the end + for (int i=0; icurOrder; j--) { + song.orders.ord[i][j]=song.orders.ord[i][j-1]; + } + song.orders.ord[i][curOrder+1]=order[i]; + } + song.ordersLen++; + curOrder++; + if (playing && !freelance) { + playSub(false); + } + } + isBusy.unlock(); +} + void DivEngine::deleteOrder() { if (song.ordersLen<=1) return; isBusy.lock(); diff --git a/src/engine/engine.h b/src/engine/engine.h index 7700089da..5b78d9725 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -453,6 +453,9 @@ class DivEngine { // add order void addOrder(bool duplicate, bool where); + // deep clone orders + void deepCloneOrder(bool where); + // delete order void deleteOrder(); diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 34764f613..642203820 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -6423,6 +6423,9 @@ void FurnaceGUI::doAction(int what) { makeUndo(GUI_UNDO_CHANGE_ORDER); break; case GUI_ACTION_ORDERS_DEEP_CLONE: + prepareUndo(GUI_UNDO_CHANGE_ORDER); + e->deepCloneOrder(false); + makeUndo(GUI_UNDO_CHANGE_ORDER); break; case GUI_ACTION_ORDERS_DUPLICATE_END: prepareUndo(GUI_UNDO_CHANGE_ORDER); @@ -6430,6 +6433,9 @@ void FurnaceGUI::doAction(int what) { makeUndo(GUI_UNDO_CHANGE_ORDER); break; case GUI_ACTION_ORDERS_DEEP_CLONE_END: + prepareUndo(GUI_UNDO_CHANGE_ORDER); + e->deepCloneOrder(true); + makeUndo(GUI_UNDO_CHANGE_ORDER); break; case GUI_ACTION_ORDERS_REMOVE: prepareUndo(GUI_UNDO_CHANGE_ORDER);