diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 63f98d7d..db4af899 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -1752,6 +1752,103 @@ void DivEngine::delSample(int index) { isBusy.unlock(); } +void DivEngine::addOrder(bool duplicate, bool where) { + unsigned char order[32]; + if (song.ordersLen>=0x7e) return; + isBusy.lock(); + if (duplicate) { + for (int i=0; i<32; i++) { + order[i]=song.orders.ord[i][curOrder]; + } + } else { + bool used[256]; + 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) { + playSub(false); + } + } + isBusy.unlock(); +} + +void DivEngine::deleteOrder() { + if (song.ordersLen<=1) return; + isBusy.lock(); + for (int i=0; i<32; i++) { + for (int j=curOrder; j=song.ordersLen) curOrder=song.ordersLen-1; + if (playing) { + playSub(false); + } + isBusy.unlock(); +} + +void DivEngine::moveOrderUp() { + isBusy.lock(); + if (curOrder<1) { + isBusy.unlock(); + return; + } + for (int i=0; i<32; i++) { + song.orders.ord[i][curOrder]^=song.orders.ord[i][curOrder-1]; + song.orders.ord[i][curOrder-1]^=song.orders.ord[i][curOrder]; + song.orders.ord[i][curOrder]^=song.orders.ord[i][curOrder-1]; + } + curOrder--; + if (playing) { + playSub(false); + } + isBusy.unlock(); +} + +void DivEngine::moveOrderDown() { + isBusy.lock(); + if (curOrder>=song.ordersLen-1) { + isBusy.unlock(); + return; + } + for (int i=0; i<32; i++) { + song.orders.ord[i][curOrder]^=song.orders.ord[i][curOrder+1]; + song.orders.ord[i][curOrder+1]^=song.orders.ord[i][curOrder]; + song.orders.ord[i][curOrder]^=song.orders.ord[i][curOrder+1]; + } + curOrder++; + if (playing) { + playSub(false); + } + isBusy.unlock(); +} + void DivEngine::setOrder(unsigned char order) { isBusy.lock(); curOrder=order; diff --git a/src/engine/engine.h b/src/engine/engine.h index 5e85b24b..51f87605 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -269,6 +269,18 @@ class DivEngine { // delete sample void delSample(int index); + // add order + void addOrder(bool duplicate, bool where); + + // delete order + void deleteOrder(); + + // move order up + void moveOrderUp(); + + // move order down + void moveOrderDown(); + // go to order void setOrder(unsigned char order); diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 5437999b..d8675dcd 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -435,24 +435,31 @@ void FurnaceGUI::drawOrders() { ImGui::NextColumn(); if (ImGui::Button(ICON_FA_PLUS)) { // add order row (new) + e->addOrder(false,false); } if (ImGui::Button(ICON_FA_MINUS)) { // remove this order row + e->deleteOrder(); } if (ImGui::Button(ICON_FA_FILES_O)) { // duplicate order row + e->addOrder(true,false); } if (ImGui::Button(ICON_FA_ANGLE_UP)) { // move order row up + e->moveOrderUp(); } if (ImGui::Button(ICON_FA_ANGLE_DOWN)) { // move order row down + e->moveOrderDown(); } if (ImGui::Button(ICON_FA_ANGLE_DOUBLE_DOWN)) { // duplicate order row at end + e->addOrder(true,true); } - if (ImGui::Button(changeAllOrders?"1##ChangeAll":"A##ChangeAll")) { + if (ImGui::Button(changeAllOrders?ICON_FA_LINK"##ChangeAll":ICON_FA_CHAIN_BROKEN"##ChangeAll")) { // whether to change one or all orders in a row + changeAllOrders=!changeAllOrders; } ImGui::PopStyleVar(); }