GUI: set order to free pattern on middle-click

This commit is contained in:
tildearrow 2025-10-31 20:12:37 -05:00
parent 5b145b7121
commit 465328c952
3 changed files with 52 additions and 0 deletions

View file

@ -84,6 +84,15 @@ void DivChannelData::wipePatterns() {
}
}
bool DivPattern::isEmpty() {
for (int i=0; i<DIV_MAX_ROWS; i++) {
for (int j=0; j<DIV_MAX_COLS; j++) {
if (newData[i][j]!=-1) return false;
}
}
return true;
}
void DivPattern::copyOn(DivPattern* dest) {
dest->name=name;
memcpy(dest->newData,newData,sizeof(newData));

View file

@ -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.
*/

View file

@ -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; k<e->curSubSong->ordersLen; k++) {
available[e->curOrders->ord[j][k]]=false;
}
for (int k=0; k<DIV_MAX_PATTERNS; k++) {
// don't accept a used pattern
if (!available[k]) continue;
// accept an unallocated pattern (guaranteed to be empty)
if (e->curPat[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) {