From 02f6a0f217b13ac793bb9ff4bafda87819501d03 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 10 Jun 2023 15:26:36 -0500 Subject: [PATCH] GUI: add very useful setting push entire channel when inserting --- src/gui/editing.cpp | 20 ++++++++++++++------ src/gui/gui.h | 2 ++ src/gui/settings.cpp | 8 ++++++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/gui/editing.cpp b/src/gui/editing.cpp index 1a2b1b11e..3f6d4b1db 100644 --- a/src/gui/editing.cpp +++ b/src/gui/editing.cpp @@ -277,15 +277,23 @@ void FurnaceGUI::doInsert() { prepareUndo(GUI_UNDO_PATTERN_PUSH); curNibble=false; - int iCoarse=selStart.xCoarse; - int iFine=selStart.xFine; - for (; iCoarse<=selEnd.xCoarse; iCoarse++) { + SelectionPoint sStart=selStart; + SelectionPoint sEnd=selEnd; + + if (selStart.xCoarse==selEnd.xCoarse && selStart.xFine==selEnd.xFine && selStart.y==selEnd.y) { + sStart.xFine=0; + sEnd.xFine=2+e->curPat[sEnd.xCoarse].effectCols*2; + } + + int iCoarse=sStart.xCoarse; + int iFine=sStart.xFine; + for (; iCoarse<=sEnd.xCoarse; iCoarse++) { if (!e->curSubSong->chanShow[iCoarse]) continue; DivPattern* pat=e->curPat[iCoarse].getPattern(e->curOrders->ord[iCoarse][curOrder],true); - for (; iFine<3+e->curPat[iCoarse].effectCols*2 && (iCoarsecurPat[iCoarse].effectCols*2 && (iCoarsecurSubSong->patLen-1; j>=selStart.y; j--) { - if (j==selStart.y) { + for (int j=e->curSubSong->patLen-1; j>=sStart.y; j--) { + if (j==sStart.y) { if (iFine==0) { pat->data[j][iFine]=0; } diff --git a/src/gui/gui.h b/src/gui/gui.h index 5b9e6335e..48169b83f 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1496,6 +1496,7 @@ class FurnaceGUI { int compress; int newPatternFormat; int renderClearPos; + int insertBehavior; unsigned int maxUndoSteps; String mainFontPath; String patFontPath; @@ -1645,6 +1646,7 @@ class FurnaceGUI { compress(1), newPatternFormat(1), renderClearPos(0), + insertBehavior(1), maxUndoSteps(100), mainFontPath(""), patFontPath(""), diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 56944fa67..a442b4306 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -543,6 +543,11 @@ void FurnaceGUI::drawSettings() { settings.stepOnDelete=stepOnDeleteB; } + bool insertBehaviorB=settings.insertBehavior; + if (ImGui::Checkbox("Insert pushes entire channel row",&insertBehaviorB)) { + settings.insertBehavior=insertBehaviorB; + } + bool absorbInsInputB=settings.absorbInsInput; if (ImGui::Checkbox("Change current instrument when changing instrument column (absorb)",&absorbInsInputB)) { settings.absorbInsInput=absorbInsInputB; @@ -2737,6 +2742,7 @@ void FurnaceGUI::syncSettings() { settings.newPatternFormat=e->getConfInt("newPatternFormat",1); settings.renderBackend=e->getConfString("renderBackend","SDL"); settings.renderClearPos=e->getConfInt("renderClearPos",0); + settings.insertBehavior=e->getConfInt("insertBehavior",1); clampSetting(settings.mainFontSize,2,96); clampSetting(settings.patFontSize,2,96); @@ -2860,6 +2866,7 @@ void FurnaceGUI::syncSettings() { clampSetting(settings.compress,0,1); clampSetting(settings.newPatternFormat,0,1); clampSetting(settings.renderClearPos,0,1); + clampSetting(settings.insertBehavior,0,1); if (settings.exportLoops<0.0) settings.exportLoops=0.0; if (settings.exportFadeOut<0.0) settings.exportFadeOut=0.0; @@ -3079,6 +3086,7 @@ void FurnaceGUI::commitSettings() { e->setConf("newPatternFormat",settings.newPatternFormat); e->setConf("renderBackend",settings.renderBackend); e->setConf("renderClearPos",settings.renderClearPos); + e->setConf("insertBehavior",settings.insertBehavior); // colors for (int i=0; i