From 65b50f4accb827e512883f3e436b3f1810c525b2 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 28 Dec 2023 17:32:40 -0500 Subject: [PATCH] GUI: improve mobile order input --- src/gui/gui.cpp | 51 +++++++++++++++++++++++++--------------------- src/gui/gui.h | 1 + src/gui/orders.cpp | 8 ++++++-- src/gui/piano.cpp | 12 +++++++---- 4 files changed, 43 insertions(+), 29 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 7d17af0ee..b8da63237 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -1319,6 +1319,32 @@ void FurnaceGUI::valueInput(int num, bool direct, int target) { } } +void FurnaceGUI::orderInput(int num) { + if (orderCursor>=0 && orderCursorgetTotalChannelCount()) { + prepareUndo(GUI_UNDO_CHANGE_ORDER); + e->lockSave([this,num]() { + if (!curNibble && !settings.pushNibble) e->curOrders->ord[orderCursor][curOrder]=0; + e->curOrders->ord[orderCursor][curOrder]=((e->curOrders->ord[orderCursor][curOrder]<<4)|num); + }); + MARK_MODIFIED; + curNibble=!curNibble; + if (orderEditMode==2 || orderEditMode==3) { + if (!curNibble) { + if (orderEditMode==2) { + orderCursor++; + if (orderCursor>=e->getTotalChannelCount()) orderCursor=0; + } else if (orderEditMode==3) { + if (curOrdercurSubSong->ordersLen-1) { + setOrder(curOrder+1); + } + } + } + } + e->walkSong(loopOrder,loopRow,loopEnd); + makeUndo(GUI_UNDO_CHANGE_ORDER); + } +} + #define changeLatch(x) \ if (x<0) x=0; \ if (!latchNibble && !settings.pushNibble) x=0; \ @@ -1529,29 +1555,7 @@ void FurnaceGUI::keyDown(SDL_Event& ev) { auto it=valueKeys.find(ev.key.keysym.sym); if (it!=valueKeys.cend()) { int num=it->second; - if (orderCursor>=0 && orderCursorgetTotalChannelCount()) { - prepareUndo(GUI_UNDO_CHANGE_ORDER); - e->lockSave([this,num]() { - if (!curNibble && !settings.pushNibble) e->curOrders->ord[orderCursor][curOrder]=0; - e->curOrders->ord[orderCursor][curOrder]=((e->curOrders->ord[orderCursor][curOrder]<<4)|num); - }); - MARK_MODIFIED; - curNibble=!curNibble; - if (orderEditMode==2 || orderEditMode==3) { - if (!curNibble) { - if (orderEditMode==2) { - orderCursor++; - if (orderCursor>=e->getTotalChannelCount()) orderCursor=0; - } else if (orderEditMode==3) { - if (curOrdercurSubSong->ordersLen-1) { - setOrder(curOrder+1); - } - } - } - } - e->walkSong(loopOrder,loopRow,loopEnd); - makeUndo(GUI_UNDO_CHANGE_ORDER); - } + orderInput(num); } } break; @@ -4518,6 +4522,7 @@ bool FurnaceGUI::loop() { ordersOpen=true; curWindow=GUI_WINDOW_ORDERS; MEASURE(orders,drawOrders()); + MEASURE(piano,drawPiano()); break; case GUI_SCENE_INSTRUMENT: insEditOpen=true; diff --git a/src/gui/gui.h b/src/gui/gui.h index 51abb74ae..0e78b3b6e 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -2555,6 +2555,7 @@ class FurnaceGUI { DivSystem systemPicker(); void noteInput(int num, int key, int vol=-1); void valueInput(int num, bool direct=false, int target=-1); + void orderInput(int num); void doGenerateWave(); diff --git a/src/gui/orders.cpp b/src/gui/orders.cpp index 43dba3d79..4b0ae27d0 100644 --- a/src/gui/orders.cpp +++ b/src/gui/orders.cpp @@ -181,6 +181,10 @@ void FurnaceGUI::drawOrderButtons() { } NEXT_BUTTON; + if (orderEditMode==0 && mobileUI) { + orderEditMode=1; + } + const char* orderEditModeLabel="?##OrderEditMode"; if (orderEditMode==3) { orderEditModeLabel=ICON_FA_ARROWS_V "##OrderEditMode"; @@ -193,7 +197,7 @@ void FurnaceGUI::drawOrderButtons() { } if (ImGui::Button(orderEditModeLabel)) { handleUnimportant orderEditMode++; - if (orderEditMode>3) orderEditMode=0; + if (orderEditMode>3) orderEditMode=mobileUI?1:0; curNibble=false; } if (ImGui::IsItemHovered()) { @@ -219,7 +223,7 @@ void FurnaceGUI::drawOrders() { if (!ordersOpen) return; if (mobileUI) { patWindowPos=(portrait?ImVec2(0.0f,(mobileMenuPos*-0.65*canvasH)):ImVec2((0.16*canvasH)+0.5*canvasW*mobileMenuPos,0.0f)); - patWindowSize=(portrait?ImVec2(canvasW,canvasH-(0.16*canvasW)):ImVec2(canvasW-(0.16*canvasH),canvasH)); + patWindowSize=(portrait?ImVec2(canvasW,canvasH-(0.16*canvasW)-(pianoOpen?(0.4*canvasW):0.0f)):ImVec2(canvasW-(0.16*canvasH),canvasH-(pianoOpen?(0.3*canvasH):0.0f))); ImGui::SetNextWindowPos(patWindowPos); ImGui::SetNextWindowSize(patWindowSize); } else { diff --git a/src/gui/piano.cpp b/src/gui/piano.cpp index a167b1b89..4e20142c7 100644 --- a/src/gui/piano.cpp +++ b/src/gui/piano.cpp @@ -42,7 +42,11 @@ const bool isTopKey[12]={ #define VALUE_DIGIT(x,label) \ if (ImGui::Button(label,buttonSize)) { \ - valueInput(x,false); \ + if (curWindow==GUI_WINDOW_ORDERS && orderEditMode>0) { \ + orderInput(x); \ + } else { \ + valueInput(x,false); \ + } \ } void FurnaceGUI::drawPiano() { @@ -166,7 +170,7 @@ void FurnaceGUI::drawPiano() { } ImGui::TableNextColumn(); - if (pianoInputPadMode==PIANO_INPUT_PAD_REPLACE && cursor.xFine>0 && curWindow==GUI_WINDOW_PATTERN) { + if (pianoInputPadMode==PIANO_INPUT_PAD_REPLACE && ((cursor.xFine>0 && curWindow==GUI_WINDOW_PATTERN) || (curWindow==GUI_WINDOW_ORDERS && orderEditMode>0))) { ImVec2 buttonSize=ImGui::GetContentRegionAvail(); if (ImGui::BeginTable("InputPadP",8,ImGuiTableFlags_SizingFixedSame)) { ImGui::TableNextRow(); @@ -443,9 +447,9 @@ void FurnaceGUI::drawPiano() { ImGui::End(); // draw input pad if necessary - if ((curWindow==GUI_WINDOW_PATTERN || !mobileUI) && ((pianoInputPadMode==PIANO_INPUT_PAD_SPLIT_AUTO && cursor.xFine>0) || pianoInputPadMode==PIANO_INPUT_PAD_SPLIT_VISIBLE)) { + if ((curWindow==GUI_WINDOW_ORDERS || curWindow==GUI_WINDOW_PATTERN || !mobileUI) && ((pianoInputPadMode==PIANO_INPUT_PAD_SPLIT_AUTO && (cursor.xFine>0 || (curWindow==GUI_WINDOW_ORDERS && orderEditMode>0))) || pianoInputPadMode==PIANO_INPUT_PAD_SPLIT_VISIBLE)) { if (ImGui::Begin("Input Pad",NULL,ImGuiWindowFlags_NoTitleBar)) { - ImGui::BeginDisabled(cursor.xFine==0); + ImGui::BeginDisabled(cursor.xFine==0 && !(curWindow==GUI_WINDOW_ORDERS && orderEditMode>0)); if (ImGui::BeginTable("InputPad",3,ImGuiTableFlags_Borders)) { ImGui::TableNextRow(); ImGui::TableNextColumn();