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 ad53b33d7c.
This commit is contained in:
tildearrow 2024-08-19 02:49:14 -05:00
parent 4f3d61c0f1
commit 251be67b69
5 changed files with 19 additions and 51 deletions

View file

@ -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* preBytes=(const unsigned char*)pre;
const unsigned char* postBytes=(const unsigned char*)post; 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; ii<inputSize; ++ii) { for (size_t ii=0; ii<inputSize; ++ii) {
if (preBytes[ii] != postBytes[ii]) { if (preBytes[ii] != postBytes[ii]) {
lastDiff=ii; lastDiff=ii;
@ -441,7 +439,7 @@ bool DivInstrumentUndoStep::makeUndoPatch(size_t processTime_, const DivInstrume
return nameValid || podPatch.isValid(); return nameValid || podPatch.isValid();
} }
bool DivInstrument::recordUndoStepIfChanged(size_t processTime, const DivInstrument* old) { void DivInstrument::recordUndoStepIfChanged(size_t processTime, const DivInstrument* old) {
DivInstrumentUndoStep step; DivInstrumentUndoStep step;
// generate a patch to go back to old // generate a patch to go back to old
@ -466,10 +464,7 @@ bool DivInstrument::recordUndoStepIfChanged(size_t processTime, const DivInstrum
undoHist.push_back(stepPtr); undoHist.push_back(stepPtr);
// logI("DivInstrument::undoHist push (%u off, %u size)", stepPtr->podPatch.offset, stepPtr->podPatch.size); // logI("DivInstrument::undoHist push (%u off, %u size)", stepPtr->podPatch.offset, stepPtr->podPatch.size);
return true;
} }
return false;
} }
int DivInstrument::undo() { int DivInstrument::undo() {

View file

@ -934,7 +934,7 @@ struct DivInstrument : DivInstrumentPOD {
*/ */
FixedQueue<DivInstrumentUndoStep*, 128> undoHist; FixedQueue<DivInstrumentUndoStep*, 128> undoHist;
FixedQueue<DivInstrumentUndoStep*, 128> redoHist; FixedQueue<DivInstrumentUndoStep*, 128> redoHist;
bool recordUndoStepIfChanged(size_t processTime, const DivInstrument* old); void recordUndoStepIfChanged(size_t processTime, const DivInstrument* old);
int undo(); int undo();
int redo(); int redo();

View file

@ -3704,7 +3704,6 @@ bool FurnaceGUI::loop() {
ImGui::GetIO().AddKeyEvent(ImGuiKey_Backspace,false); ImGui::GetIO().AddKeyEvent(ImGuiKey_Backspace,false);
injectBackUp=false; injectBackUp=false;
} }
while (SDL_PollEvent(&ev)) { while (SDL_PollEvent(&ev)) {
WAKE_UP; WAKE_UP;
ImGui_ImplSDL2_ProcessEvent(&ev); ImGui_ImplSDL2_ProcessEvent(&ev);
@ -3721,16 +3720,13 @@ bool FurnaceGUI::loop() {
} }
case SDL_MOUSEBUTTONUP: case SDL_MOUSEBUTTONUP:
pointUp(ev.button.x,ev.button.y,ev.button.button); pointUp(ev.button.x,ev.button.y,ev.button.button);
insEditMayBeDirty=true;
break; break;
case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONDOWN:
pointDown(ev.button.x,ev.button.y,ev.button.button); pointDown(ev.button.x,ev.button.y,ev.button.button);
insEditMayBeDirty=true;
break; break;
case SDL_MOUSEWHEEL: case SDL_MOUSEWHEEL:
wheelX+=ev.wheel.x; wheelX+=ev.wheel.x;
wheelY+=ev.wheel.y; wheelY+=ev.wheel.y;
insEditMayBeDirty=true;
break; break;
case SDL_WINDOWEVENT: case SDL_WINDOWEVENT:
switch (ev.window.event) { switch (ev.window.event) {
@ -3807,14 +3803,12 @@ bool FurnaceGUI::loop() {
if (!ImGui::GetIO().WantCaptureKeyboard) { if (!ImGui::GetIO().WantCaptureKeyboard) {
keyDown(ev); keyDown(ev);
} }
insEditMayBeDirty=true;
#ifdef IS_MOBILE #ifdef IS_MOBILE
injectBackUp=true; injectBackUp=true;
#endif #endif
break; break;
case SDL_KEYUP: case SDL_KEYUP:
// for now // for now
insEditMayBeDirty=true;
break; break;
case SDL_DROPFILE: case SDL_DROPFILE:
if (ev.drop.file!=NULL) { if (ev.drop.file!=NULL) {
@ -7151,11 +7145,6 @@ bool FurnaceGUI::loop() {
willCommit=false; 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) {
if (--shallDetectScale<1) { if (--shallDetectScale<1) {
if (settings.dpiScale<0.5f) { if (settings.dpiScale<0.5f) {
@ -8322,7 +8311,6 @@ FurnaceGUI::FurnaceGUI():
localeRequiresKorean(false), localeRequiresKorean(false),
prevInsData(NULL), prevInsData(NULL),
cachedCurInsPtr(NULL), cachedCurInsPtr(NULL),
insEditMayBeDirty(false),
pendingLayoutImport(NULL), pendingLayoutImport(NULL),
pendingLayoutImportLen(0), pendingLayoutImportLen(0),
pendingLayoutImportStep(0), pendingLayoutImportStep(0),

View file

@ -2258,7 +2258,6 @@ class FurnaceGUI {
DivInstrument* prevInsData; DivInstrument* prevInsData;
DivInstrument cachedCurIns; DivInstrument cachedCurIns;
DivInstrument* cachedCurInsPtr; DivInstrument* cachedCurInsPtr;
bool insEditMayBeDirty;
unsigned char* pendingLayoutImport; unsigned char* pendingLayoutImport;
size_t pendingLayoutImportLen; size_t pendingLayoutImportLen;
@ -2925,7 +2924,6 @@ class FurnaceGUI {
void doUndoSample(); void doUndoSample();
void doRedoSample(); void doRedoSample();
void checkRecordInstrumentUndoStep();
void doUndoInstrument(); void doUndoInstrument();
void doRedoInstrument(); void doRedoInstrument();

View file

@ -7740,44 +7740,31 @@ void FurnaceGUI::drawInsEdit() {
ImGui::EndPopup(); ImGui::EndPopup();
} }
if (ins) {
bool insChanged=ins!=cachedCurInsPtr;
bool delayDiff=ImGui::IsMouseDown(ImGuiMouseButton_Left) || ImGui::IsMouseDown(ImGuiMouseButton_Right) || ImGui::GetIO().WantCaptureKeyboard;
// 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);
}
if (insChanged || !delayDiff) {
cachedCurIns=*ins;
}
cachedCurInsPtr=ins;
} else {
cachedCurInsPtr=NULL;
}
} }
if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_INS_EDIT; if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_INS_EDIT;
ImGui::End(); ImGui::End();
} }
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) {
cachedCurIns=*ins;
}
insEditMayBeDirty=false;
}
} else {
cachedCurInsPtr=NULL;
insEditMayBeDirty=false;
}
}
void FurnaceGUI::doUndoInstrument() { void FurnaceGUI::doUndoInstrument() {
if (!insEditOpen) return; if (!insEditOpen) return;
if (curIns<0 || curIns>=(int)e->song.ins.size()) return; if (curIns<0 || curIns>=(int)e->song.ins.size()) return;