GUI: order lock button...

This commit is contained in:
tildearrow 2025-07-16 05:07:22 -05:00
parent 1a68d0efe7
commit 203cb04758
6 changed files with 64 additions and 6 deletions

View file

@ -170,6 +170,9 @@ void FurnaceGUI::doAction(int what) {
case GUI_ACTION_METRONOME: case GUI_ACTION_METRONOME:
e->setMetronome(!e->getMetronome()); e->setMetronome(!e->getMetronome());
break; break;
case GUI_ACTION_ORDER_LOCK:
orderLock=!orderLock;
break;
case GUI_ACTION_REPEAT_PATTERN: case GUI_ACTION_REPEAT_PATTERN:
e->setRepeatPattern(!e->getRepeatPattern()); e->setRepeatPattern(!e->getRepeatPattern());
break; break;

View file

@ -723,6 +723,8 @@ void FurnaceGUI::drawEditControls() {
ImGui::SameLine(); ImGui::SameLine();
ImGui::Checkbox(_("Edit"),&edit); ImGui::Checkbox(_("Edit"),&edit);
ImGui::SameLine(); ImGui::SameLine();
ImGui::Checkbox(_("Lock"),&orderLock);
ImGui::SameLine();
bool metro=e->getMetronome(); bool metro=e->getMetronome();
if (ImGui::Checkbox(_("Metronome"),&metro)) { if (ImGui::Checkbox(_("Metronome"),&metro)) {
e->setMetronome(metro); e->setMetronome(metro);
@ -809,6 +811,15 @@ void FurnaceGUI::drawEditControls() {
} }
popToggleColors(); popToggleColors();
pushToggleColors(orderLock);
if (ImGui::Button(ICON_FA_LOCK "##OrderLock")) {
orderLock=!orderLock;
}
if (ImGui::IsItemHovered()) {
ImGui::SetTooltip(_("Lock cursor/selection to this order"));
}
popToggleColors();
ImGui::SameLine(); ImGui::SameLine();
bool metro=e->getMetronome(); bool metro=e->getMetronome();
pushToggleColors(metro); pushToggleColors(metro);
@ -926,6 +937,15 @@ void FurnaceGUI::drawEditControls() {
} }
popToggleColors(); popToggleColors();
pushToggleColors(orderLock);
if (ImGui::Button(ICON_FA_LOCK "##OrderLock",buttonSize)) {
orderLock=!orderLock;
}
if (ImGui::IsItemHovered()) {
ImGui::SetTooltip(_("Lock cursor/selection to this order"));
}
popToggleColors();
bool metro=e->getMetronome(); bool metro=e->getMetronome();
pushToggleColors(metro); pushToggleColors(metro);
if (ImGui::Button(ICON_FUR_METRONOME "##Metronome",buttonSize)) { if (ImGui::Button(ICON_FUR_METRONOME "##Metronome",buttonSize)) {
@ -1065,6 +1085,16 @@ void FurnaceGUI::drawEditControls() {
} }
popToggleColors(); popToggleColors();
ImGui::SameLine();
pushToggleColors(orderLock);
if (ImGui::Button(ICON_FA_LOCK "##OrderLock")) {
orderLock=!orderLock;
}
if (ImGui::IsItemHovered()) {
ImGui::SetTooltip(_("Lock cursor/selection to this order"));
}
popToggleColors();
bool metro=e->getMetronome(); bool metro=e->getMetronome();
ImGui::SameLine(); ImGui::SameLine();
pushToggleColors(metro); pushToggleColors(metro);

View file

@ -7404,6 +7404,13 @@ bool FurnaceGUI::loop() {
// to already have been made. // to already have been made.
checkRecordInstrumentUndoStep(); checkRecordInstrumentUndoStep();
// the following code handles order lock (if it is enabled).
if (orderLock) {
cursor.order=curOrder;
selStart.order=curOrder;
selEnd.order=curOrder;
}
if (shallDetectScale) { if (shallDetectScale) {
if (--shallDetectScale<1) { if (--shallDetectScale<1) {
if (settings.dpiScale<0.5f) { if (settings.dpiScale<0.5f) {

View file

@ -702,6 +702,7 @@ enum FurnaceGUIActions {
GUI_ACTION_STEP_DOWN, GUI_ACTION_STEP_DOWN,
GUI_ACTION_TOGGLE_EDIT, GUI_ACTION_TOGGLE_EDIT,
GUI_ACTION_METRONOME, GUI_ACTION_METRONOME,
GUI_ACTION_ORDER_LOCK,
GUI_ACTION_REPEAT_PATTERN, GUI_ACTION_REPEAT_PATTERN,
GUI_ACTION_FOLLOW_ORDERS, GUI_ACTION_FOLLOW_ORDERS,
GUI_ACTION_FOLLOW_PATTERN, GUI_ACTION_FOLLOW_PATTERN,

View file

@ -597,6 +597,7 @@ const FurnaceGUIActionDef guiActions[GUI_ACTION_MAX]={
D("STEP_DOWN", _N("Decrease edit step"), FURKMOD_CMD|SDLK_KP_DIVIDE), D("STEP_DOWN", _N("Decrease edit step"), FURKMOD_CMD|SDLK_KP_DIVIDE),
D("TOGGLE_EDIT", _N("Toggle edit mode"), SDLK_SPACE), D("TOGGLE_EDIT", _N("Toggle edit mode"), SDLK_SPACE),
D("METRONOME", _N("Metronome"), FURKMOD_CMD|SDLK_m), D("METRONOME", _N("Metronome"), FURKMOD_CMD|SDLK_m),
D("ORDER_LOCK", _N("Toggle order lock"), 0),
D("REPEAT_PATTERN", _N("Toggle repeat pattern"), 0), D("REPEAT_PATTERN", _N("Toggle repeat pattern"), 0),
D("FOLLOW_ORDERS", _N("Follow orders"), 0), D("FOLLOW_ORDERS", _N("Follow orders"), 0),
D("FOLLOW_PATTERN", _N("Follow pattern"), 0), D("FOLLOW_PATTERN", _N("Follow pattern"), 0),

View file

@ -1227,9 +1227,13 @@ void FurnaceGUI::drawPattern() {
if (viewOrder>=0 && viewOrder<e->curSubSong->ordersLen) for (int i=0; i<chans; i++) { if (viewOrder>=0 && viewOrder<e->curSubSong->ordersLen) for (int i=0; i<chans; i++) {
patCache[i]=e->curPat[i].getPattern(e->curOrders->ord[i][viewOrder],false); patCache[i]=e->curPat[i].getPattern(e->curOrders->ord[i][viewOrder],false);
} }
if (orderLock) {
ImGui::BeginDisabled();
} else {
ImGui::PushStyleVar(ImGuiStyleVar_Alpha,ImGui::GetStyle().Alpha*ImGui::GetStyle().DisabledAlpha); ImGui::PushStyleVar(ImGuiStyleVar_Alpha,ImGui::GetStyle().Alpha*ImGui::GetStyle().DisabledAlpha);
}
for (int i=0; i<dummyRows-1; i++) { for (int i=0; i<dummyRows-1; i++) {
patternRow(viewRow,e->isPlaying(),lineHeight,chans,viewOrder,patCache,false); patternRow(viewRow,e->isPlaying(),lineHeight,chans,viewOrder,patCache,orderLock);
if (++viewRow>=e->curSubSong->patLen) { if (++viewRow>=e->curSubSong->patLen) {
viewRow=0; viewRow=0;
viewOrder++; viewOrder++;
@ -1238,7 +1242,11 @@ void FurnaceGUI::drawPattern() {
} }
} }
} }
if (orderLock) {
ImGui::EndDisabled();
} else {
ImGui::PopStyleVar(); ImGui::PopStyleVar();
}
} else { } else {
for (int i=0; i<dummyRows-1; i++) { for (int i=0; i<dummyRows-1; i++) {
ImGui::TableNextRow(0,lineHeight); ImGui::TableNextRow(0,lineHeight);
@ -1259,9 +1267,13 @@ void FurnaceGUI::drawPattern() {
if (viewOrder<e->curSubSong->ordersLen) for (int i=0; i<chans; i++) { if (viewOrder<e->curSubSong->ordersLen) for (int i=0; i<chans; i++) {
patCache[i]=e->curPat[i].getPattern(e->curOrders->ord[i][ord+1],true); patCache[i]=e->curPat[i].getPattern(e->curOrders->ord[i][ord+1],true);
} }
if (orderLock) {
ImGui::BeginDisabled();
} else {
ImGui::PushStyleVar(ImGuiStyleVar_Alpha,ImGui::GetStyle().Alpha*ImGui::GetStyle().DisabledAlpha); ImGui::PushStyleVar(ImGuiStyleVar_Alpha,ImGui::GetStyle().Alpha*ImGui::GetStyle().DisabledAlpha);
}
for (int i=0; i<=dummyRows; i++) { for (int i=0; i<=dummyRows; i++) {
patternRow(viewRow,e->isPlaying(),lineHeight,chans,viewOrder,patCache,false); patternRow(viewRow,e->isPlaying(),lineHeight,chans,viewOrder,patCache,orderLock);
if (++viewRow>=e->curSubSong->patLen) { if (++viewRow>=e->curSubSong->patLen) {
viewRow=0; viewRow=0;
viewOrder++; viewOrder++;
@ -1270,7 +1282,11 @@ void FurnaceGUI::drawPattern() {
} }
} }
} }
if (orderLock) {
ImGui::EndDisabled();
} else {
ImGui::PopStyleVar(); ImGui::PopStyleVar();
}
} else { } else {
for (int i=0; i<=dummyRows; i++) { for (int i=0; i<=dummyRows; i++) {
ImGui::TableNextRow(0,lineHeight); ImGui::TableNextRow(0,lineHeight);