diff --git a/src/gui/doAction.cpp b/src/gui/doAction.cpp index 3333d83d8..b1e196806 100644 --- a/src/gui/doAction.cpp +++ b/src/gui/doAction.cpp @@ -170,6 +170,9 @@ void FurnaceGUI::doAction(int what) { case GUI_ACTION_METRONOME: e->setMetronome(!e->getMetronome()); break; + case GUI_ACTION_ORDER_LOCK: + orderLock=!orderLock; + break; case GUI_ACTION_REPEAT_PATTERN: e->setRepeatPattern(!e->getRepeatPattern()); break; diff --git a/src/gui/editControls.cpp b/src/gui/editControls.cpp index 56bf3e41a..ea363b5d9 100644 --- a/src/gui/editControls.cpp +++ b/src/gui/editControls.cpp @@ -723,6 +723,8 @@ void FurnaceGUI::drawEditControls() { ImGui::SameLine(); ImGui::Checkbox(_("Edit"),&edit); ImGui::SameLine(); + ImGui::Checkbox(_("Lock"),&orderLock); + ImGui::SameLine(); bool metro=e->getMetronome(); if (ImGui::Checkbox(_("Metronome"),&metro)) { e->setMetronome(metro); @@ -809,6 +811,15 @@ void FurnaceGUI::drawEditControls() { } 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(); bool metro=e->getMetronome(); pushToggleColors(metro); @@ -926,6 +937,15 @@ void FurnaceGUI::drawEditControls() { } 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(); pushToggleColors(metro); if (ImGui::Button(ICON_FUR_METRONOME "##Metronome",buttonSize)) { @@ -1065,6 +1085,16 @@ void FurnaceGUI::drawEditControls() { } 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(); ImGui::SameLine(); pushToggleColors(metro); diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 886edc990..36ac8b87c 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -7404,6 +7404,13 @@ bool FurnaceGUI::loop() { // to already have been made. 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<1) { if (settings.dpiScale<0.5f) { diff --git a/src/gui/gui.h b/src/gui/gui.h index 381862e5d..8b15f60ad 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -702,6 +702,7 @@ enum FurnaceGUIActions { GUI_ACTION_STEP_DOWN, GUI_ACTION_TOGGLE_EDIT, GUI_ACTION_METRONOME, + GUI_ACTION_ORDER_LOCK, GUI_ACTION_REPEAT_PATTERN, GUI_ACTION_FOLLOW_ORDERS, GUI_ACTION_FOLLOW_PATTERN, diff --git a/src/gui/guiConst.cpp b/src/gui/guiConst.cpp index fa9bb99e4..1d2e2da16 100644 --- a/src/gui/guiConst.cpp +++ b/src/gui/guiConst.cpp @@ -597,6 +597,7 @@ const FurnaceGUIActionDef guiActions[GUI_ACTION_MAX]={ D("STEP_DOWN", _N("Decrease edit step"), FURKMOD_CMD|SDLK_KP_DIVIDE), D("TOGGLE_EDIT", _N("Toggle edit mode"), SDLK_SPACE), 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("FOLLOW_ORDERS", _N("Follow orders"), 0), D("FOLLOW_PATTERN", _N("Follow pattern"), 0), diff --git a/src/gui/pattern.cpp b/src/gui/pattern.cpp index 64f638168..84d029b8c 100644 --- a/src/gui/pattern.cpp +++ b/src/gui/pattern.cpp @@ -1227,9 +1227,13 @@ void FurnaceGUI::drawPattern() { if (viewOrder>=0 && viewOrdercurSubSong->ordersLen) for (int i=0; icurPat[i].getPattern(e->curOrders->ord[i][viewOrder],false); } - ImGui::PushStyleVar(ImGuiStyleVar_Alpha,ImGui::GetStyle().Alpha*ImGui::GetStyle().DisabledAlpha); + if (orderLock) { + ImGui::BeginDisabled(); + } else { + ImGui::PushStyleVar(ImGuiStyleVar_Alpha,ImGui::GetStyle().Alpha*ImGui::GetStyle().DisabledAlpha); + } for (int i=0; iisPlaying(),lineHeight,chans,viewOrder,patCache,false); + patternRow(viewRow,e->isPlaying(),lineHeight,chans,viewOrder,patCache,orderLock); if (++viewRow>=e->curSubSong->patLen) { viewRow=0; viewOrder++; @@ -1238,7 +1242,11 @@ void FurnaceGUI::drawPattern() { } } } - ImGui::PopStyleVar(); + if (orderLock) { + ImGui::EndDisabled(); + } else { + ImGui::PopStyleVar(); + } } else { for (int i=0; icurSubSong->ordersLen) for (int i=0; icurPat[i].getPattern(e->curOrders->ord[i][ord+1],true); } - ImGui::PushStyleVar(ImGuiStyleVar_Alpha,ImGui::GetStyle().Alpha*ImGui::GetStyle().DisabledAlpha); + if (orderLock) { + ImGui::BeginDisabled(); + } else { + ImGui::PushStyleVar(ImGuiStyleVar_Alpha,ImGui::GetStyle().Alpha*ImGui::GetStyle().DisabledAlpha); + } 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) { viewRow=0; viewOrder++; @@ -1270,7 +1282,11 @@ void FurnaceGUI::drawPattern() { } } } - ImGui::PopStyleVar(); + if (orderLock) { + ImGui::EndDisabled(); + } else { + ImGui::PopStyleVar(); + } } else { for (int i=0; i<=dummyRows; i++) { ImGui::TableNextRow(0,lineHeight);