From 251be67b695f43a8edee4423623de2079efeff1a Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 19 Aug 2024 02:49:14 -0500 Subject: [PATCH] Revert "instrument editor undo: don't check delta if no user input has come in that could potentially have dirtied the editor" This reverts commit ad53b33d7cba5a22c9deee427d420d467e599d41. --- src/engine/instrument.cpp | 7 +----- src/engine/instrument.h | 2 +- src/gui/gui.cpp | 12 ---------- src/gui/gui.h | 2 -- src/gui/insEdit.cpp | 47 ++++++++++++++------------------------- 5 files changed, 19 insertions(+), 51 deletions(-) diff --git a/src/engine/instrument.cpp b/src/engine/instrument.cpp index 2083f08be..7c3619a3a 100644 --- a/src/engine/instrument.cpp +++ b/src/engine/instrument.cpp @@ -376,8 +376,6 @@ bool MemPatch::calcDiff(const void* pre, const void* post, size_t inputSize) { const unsigned char* preBytes=(const unsigned char*)pre; const unsigned char* postBytes=(const unsigned char*)post; - // @NOTE: consider/profile using a memcmp==0 check to early-out, if it's potentially faster - // for the common case, which is no change for (size_t ii=0; iipodPatch.offset, stepPtr->podPatch.size); - return true; } - - return false; } int DivInstrument::undo() { diff --git a/src/engine/instrument.h b/src/engine/instrument.h index 8421a0658..bf04dac2e 100644 --- a/src/engine/instrument.h +++ b/src/engine/instrument.h @@ -934,7 +934,7 @@ struct DivInstrument : DivInstrumentPOD { */ FixedQueue undoHist; FixedQueue redoHist; - bool recordUndoStepIfChanged(size_t processTime, const DivInstrument* old); + void recordUndoStepIfChanged(size_t processTime, const DivInstrument* old); int undo(); int redo(); diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 714e4b291..c8afaaa8b 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -3704,7 +3704,6 @@ bool FurnaceGUI::loop() { ImGui::GetIO().AddKeyEvent(ImGuiKey_Backspace,false); injectBackUp=false; } - while (SDL_PollEvent(&ev)) { WAKE_UP; ImGui_ImplSDL2_ProcessEvent(&ev); @@ -3721,16 +3720,13 @@ bool FurnaceGUI::loop() { } case SDL_MOUSEBUTTONUP: pointUp(ev.button.x,ev.button.y,ev.button.button); - insEditMayBeDirty=true; break; case SDL_MOUSEBUTTONDOWN: pointDown(ev.button.x,ev.button.y,ev.button.button); - insEditMayBeDirty=true; break; case SDL_MOUSEWHEEL: wheelX+=ev.wheel.x; wheelY+=ev.wheel.y; - insEditMayBeDirty=true; break; case SDL_WINDOWEVENT: switch (ev.window.event) { @@ -3807,14 +3803,12 @@ bool FurnaceGUI::loop() { if (!ImGui::GetIO().WantCaptureKeyboard) { keyDown(ev); } - insEditMayBeDirty=true; #ifdef IS_MOBILE injectBackUp=true; #endif break; case SDL_KEYUP: // for now - insEditMayBeDirty=true; break; case SDL_DROPFILE: if (ev.drop.file!=NULL) { @@ -7151,11 +7145,6 @@ bool FurnaceGUI::loop() { willCommit=false; } - // To check for instrument editor modification, we need an up-to-date `insEditMayBeDirty` - // (based on incoming user input events), and we want any possible instrument modifications - // to already have been made. - checkRecordInstrumentUndoStep(); - if (shallDetectScale) { if (--shallDetectScale<1) { if (settings.dpiScale<0.5f) { @@ -8322,7 +8311,6 @@ FurnaceGUI::FurnaceGUI(): localeRequiresKorean(false), prevInsData(NULL), cachedCurInsPtr(NULL), - insEditMayBeDirty(false), pendingLayoutImport(NULL), pendingLayoutImportLen(0), pendingLayoutImportStep(0), diff --git a/src/gui/gui.h b/src/gui/gui.h index 1d5f0d17b..b169963c8 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -2258,7 +2258,6 @@ class FurnaceGUI { DivInstrument* prevInsData; DivInstrument cachedCurIns; DivInstrument* cachedCurInsPtr; - bool insEditMayBeDirty; unsigned char* pendingLayoutImport; size_t pendingLayoutImportLen; @@ -2925,7 +2924,6 @@ class FurnaceGUI { void doUndoSample(); void doRedoSample(); - void checkRecordInstrumentUndoStep(); void doUndoInstrument(); void doRedoInstrument(); diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index 1bc77bbf9..9a0c920b1 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -7740,42 +7740,29 @@ void FurnaceGUI::drawInsEdit() { ImGui::EndPopup(); } - } + + if (ins) { + bool insChanged=ins!=cachedCurInsPtr; + bool delayDiff=ImGui::IsMouseDown(ImGuiMouseButton_Left) || ImGui::IsMouseDown(ImGuiMouseButton_Right) || ImGui::GetIO().WantCaptureKeyboard; - if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_INS_EDIT; - ImGui::End(); -} + // check against the last cached to see if diff -- note that modifications to instruments happen outside + // drawInsEdit (e.g. cursor inputs are processed and can directly modify macro data) + if (!insChanged && !delayDiff) { + ins->recordUndoStepIfChanged(e->processTime, &cachedCurIns); + } -void FurnaceGUI::checkRecordInstrumentUndoStep() { - if (curIns>=0 && curIns<(int)e->song.ins.size()) { - DivInstrument* ins=e->song.ins[curIns]; - - // invalidate cachedCurIns/any possible changes if the cachedCurIns was referencing a different - // instrument altgoether - bool insChanged=ins!=cachedCurInsPtr; - if (insChanged) { - insEditMayBeDirty=false; - cachedCurInsPtr=ins; - cachedCurIns=*ins; - } - - cachedCurInsPtr=ins; - - // check against the last cached to see if diff -- note that modifications to instruments - // happen outside drawInsEdit (e.g. cursor inputs are processed and can directly modify - // macro data). but don't check until we think the user input is complete. - bool delayDiff=ImGui::IsMouseDown(ImGuiMouseButton_Left) || ImGui::IsMouseDown(ImGuiMouseButton_Right) || ImGui::GetIO().WantCaptureKeyboard; - if (!delayDiff && insEditMayBeDirty) { - bool hasChange=ins->recordUndoStepIfChanged(e->processTime, &cachedCurIns); - if (hasChange) { + if (insChanged || !delayDiff) { cachedCurIns=*ins; } - insEditMayBeDirty=false; + + cachedCurInsPtr=ins; + } else { + cachedCurInsPtr=NULL; } - } else { - cachedCurInsPtr=NULL; - insEditMayBeDirty=false; } + + if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_INS_EDIT; + ImGui::End(); } void FurnaceGUI::doUndoInstrument() {