From 465328c952d4b0906f90451eb1c7ca651e8b1ce3 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 31 Oct 2025 20:12:37 -0500 Subject: [PATCH] GUI: set order to free pattern on middle-click --- src/engine/pattern.cpp | 9 +++++++++ src/engine/pattern.h | 6 ++++++ src/gui/orders.cpp | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/src/engine/pattern.cpp b/src/engine/pattern.cpp index cce45e65c..74dd72f3b 100644 --- a/src/engine/pattern.cpp +++ b/src/engine/pattern.cpp @@ -84,6 +84,15 @@ void DivChannelData::wipePatterns() { } } +bool DivPattern::isEmpty() { + for (int i=0; iname=name; memcpy(dest->newData,newData,sizeof(newData)); diff --git a/src/engine/pattern.h b/src/engine/pattern.h index ff2417fef..3402b01c5 100644 --- a/src/engine/pattern.h +++ b/src/engine/pattern.h @@ -39,6 +39,12 @@ struct DivPattern { */ short newData[DIV_MAX_ROWS][DIV_MAX_COLS]; + /** + * check whether this pattern is empty. + * @return whether it is. + */ + bool isEmpty(); + /** * clear the pattern. */ diff --git a/src/gui/orders.cpp b/src/gui/orders.cpp index 2f85a69b0..8d1ed9f08 100644 --- a/src/gui/orders.cpp +++ b/src/gui/orders.cpp @@ -407,6 +407,43 @@ void FurnaceGUI::drawOrders() { if (!pat->name.empty() && ImGui::IsItemHovered()) { ImGui::SetTooltip("%s",pat->name.c_str()); } + bool findFreePat=ImGui::IsItemClicked(ImGuiMouseButton_Middle); + if (ImGui::IsItemHovered() && CHECK_LONG_HOLD) { + NOTIFY_LONG_HOLD; + findFreePat=true; + } + if (findFreePat) { + // find free pattern and assign it + prepareUndo(GUI_UNDO_CHANGE_ORDER); + e->lockSave([this,i,j]() { + bool foundOne=false; + bool available[DIV_MAX_PATTERNS]; + memset(available,1,DIV_MAX_PATTERNS*sizeof(bool)); + for (int k=0; kcurSubSong->ordersLen; k++) { + available[e->curOrders->ord[j][k]]=false; + } + for (int k=0; kcurPat[j].data[k]==NULL) { + e->curOrders->ord[j][i]=k; + foundOne=true; + break; + } else { + // check whether this pattern is empty and accept it if so + DivPattern* p=e->curPat[j].getPattern(k,false); + if (p->isEmpty()) { + e->curOrders->ord[j][i]=k; + foundOne=true; + break; + } + } + } + if (!foundOne) showError(_("no free patterns available on this channel!")); + }); + makeUndo(GUI_UNDO_CHANGE_ORDER); + } if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) { if (curOrder==i) { if (orderEditMode==0) {