diff --git a/src/gui/dataList.cpp b/src/gui/dataList.cpp index 0df3015a..36333e19 100644 --- a/src/gui/dataList.cpp +++ b/src/gui/dataList.cpp @@ -245,6 +245,7 @@ void FurnaceGUI::drawInsList() { if (ImGui::Selectable(name.c_str(),(i==-1)?(curIns<0 || curIns>=e->song.insLen):(curIns==i))) { curIns=i; } + if (wantScrollList && curIns==i) ImGui::SetScrollHereY(); if (settings.insFocusesPattern && patternOpen && ImGui::IsItemActivated()) { nextWindow=GUI_WINDOW_PATTERN; curIns=i; @@ -399,6 +400,7 @@ void FurnaceGUI::actualWaveList() { if (ImGui::Selectable(fmt::sprintf("%d##_WAVE%d\n",i,i).c_str(),curWave==i)) { curWave=i; } + if (wantScrollList && curWave==i) ImGui::SetScrollHereY(); if (ImGui::IsItemHovered()) { if (ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) { waveEditOpen=true; @@ -419,6 +421,7 @@ void FurnaceGUI::actualSampleList() { samplePos=0; updateSampleTex=true; } + if (wantScrollList && curSample==i) ImGui::SetScrollHereY(); if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Bank %d: %s",i/12,sampleNote[i%12]); if (ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) { diff --git a/src/gui/doAction.cpp b/src/gui/doAction.cpp index 9a364e23..493d1199 100644 --- a/src/gui/doAction.cpp +++ b/src/gui/doAction.cpp @@ -116,10 +116,16 @@ void FurnaceGUI::doAction(int what) { } break; case GUI_ACTION_INS_UP: - if (--curIns<-1) curIns=-1; + if (--curIns<-1) { + curIns=-1; + } + wantScrollList=true; break; case GUI_ACTION_INS_DOWN: - if (++curIns>=(int)e->song.ins.size()) curIns=((int)e->song.ins.size())-1; + if (++curIns>=(int)e->song.ins.size()) { + curIns=((int)e->song.ins.size())-1; + } + wantScrollList=true; break; case GUI_ACTION_STEP_UP: if (++editStep>64) editStep=64; @@ -528,6 +534,7 @@ void FurnaceGUI::doAction(int what) { if (curIns==-1) { showError("too many instruments!"); } else { + wantScrollList=true; MARK_MODIFIED; } break; @@ -539,6 +546,7 @@ void FurnaceGUI::doAction(int what) { showError("too many instruments!"); } else { (*e->song.ins[curIns])=(*e->song.ins[prevIns]); + wantScrollList=true; MARK_MODIFIED; } } @@ -553,14 +561,21 @@ void FurnaceGUI::doAction(int what) { if (curIns>=0 && curIns<(int)e->song.ins.size()) openFileDialog(GUI_FILE_INS_SAVE); break; case GUI_ACTION_INS_LIST_MOVE_UP: - if (e->moveInsUp(curIns)) curIns--; + if (e->moveInsUp(curIns)) { + curIns--; + wantScrollList=true; + } break; case GUI_ACTION_INS_LIST_MOVE_DOWN: - if (e->moveInsDown(curIns)) curIns++; + if (e->moveInsDown(curIns)) { + curIns++; + wantScrollList=true; + } break; case GUI_ACTION_INS_LIST_DELETE: if (curIns>=0 && curIns<(int)e->song.ins.size()) { e->delInstrument(curIns); + wantScrollList=true; MARK_MODIFIED; if (curIns>=(int)e->song.ins.size()) { curIns--; @@ -572,9 +587,11 @@ void FurnaceGUI::doAction(int what) { break; case GUI_ACTION_INS_LIST_UP: if (--curIns<0) curIns=0; + wantScrollList=true; break; case GUI_ACTION_INS_LIST_DOWN: if (++curIns>=(int)e->song.ins.size()) curIns=((int)e->song.ins.size())-1; + wantScrollList=true; break; case GUI_ACTION_WAVE_LIST_ADD: @@ -582,6 +599,7 @@ void FurnaceGUI::doAction(int what) { if (curWave==-1) { showError("too many wavetables!"); } else { + wantScrollList=true; MARK_MODIFIED; } break; @@ -593,6 +611,7 @@ void FurnaceGUI::doAction(int what) { showError("too many wavetables!"); } else { (*e->song.wave[curWave])=(*e->song.wave[prevWave]); + wantScrollList=true; MARK_MODIFIED; } } @@ -604,15 +623,22 @@ void FurnaceGUI::doAction(int what) { if (curWave>=0 && curWave<(int)e->song.wave.size()) openFileDialog(GUI_FILE_WAVE_SAVE); break; case GUI_ACTION_WAVE_LIST_MOVE_UP: - if (e->moveWaveUp(curWave)) curWave--; + if (e->moveWaveUp(curWave)) { + curWave--; + wantScrollList=true; + } break; case GUI_ACTION_WAVE_LIST_MOVE_DOWN: - if (e->moveWaveDown(curWave)) curWave++; + if (e->moveWaveDown(curWave)) { + curWave++; + wantScrollList=true; + } break; case GUI_ACTION_WAVE_LIST_DELETE: if (curWave>=0 && curWave<(int)e->song.wave.size()) { e->delWave(curWave); MARK_MODIFIED; + wantScrollList=true; if (curWave>=(int)e->song.wave.size()) { curWave--; } @@ -623,9 +649,11 @@ void FurnaceGUI::doAction(int what) { break; case GUI_ACTION_WAVE_LIST_UP: if (--curWave<0) curWave=0; + wantScrollList=true; break; case GUI_ACTION_WAVE_LIST_DOWN: if (++curWave>=(int)e->song.wave.size()) curWave=((int)e->song.wave.size())-1; + wantScrollList=true; break; case GUI_ACTION_SAMPLE_LIST_ADD: @@ -633,6 +661,7 @@ void FurnaceGUI::doAction(int what) { if (curSample==-1) { showError("too many samples!"); } else { + wantScrollList=true; MARK_MODIFIED; } updateSampleTex=true; @@ -660,6 +689,7 @@ void FurnaceGUI::doAction(int what) { } e->renderSamples(); }); + wantScrollList=true; MARK_MODIFIED; } updateSampleTex=true; @@ -674,17 +704,20 @@ void FurnaceGUI::doAction(int what) { case GUI_ACTION_SAMPLE_LIST_MOVE_UP: if (e->moveSampleUp(curSample)) { curSample--; + wantScrollList=true; updateSampleTex=true; } break; case GUI_ACTION_SAMPLE_LIST_MOVE_DOWN: if (e->moveSampleDown(curSample)) { curSample++; + wantScrollList=true; updateSampleTex=true; } break; case GUI_ACTION_SAMPLE_LIST_DELETE: e->delSample(curSample); + wantScrollList=true; MARK_MODIFIED; if (curSample>=(int)e->song.sample.size()) { curSample--; @@ -696,10 +729,12 @@ void FurnaceGUI::doAction(int what) { break; case GUI_ACTION_SAMPLE_LIST_UP: if (--curSample<0) curSample=0; + wantScrollList=true; updateSampleTex=true; break; case GUI_ACTION_SAMPLE_LIST_DOWN: if (++curSample>=(int)e->song.sample.size()) curSample=((int)e->song.sample.size())-1; + wantScrollList=true; updateSampleTex=true; break; case GUI_ACTION_SAMPLE_LIST_PREVIEW: diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 73f7f778..78a2d257 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -3807,6 +3807,7 @@ bool FurnaceGUI::loop() { wheelX=0; wheelY=0; + wantScrollList=false; pressedPoints.clear(); releasedPoints.clear(); @@ -4117,6 +4118,7 @@ FurnaceGUI::FurnaceGUI(): displayNew(false), fullScreen(false), preserveChanPos(false), + wantScrollList(false), vgmExportVersion(0x171), drawHalt(10), macroPointSize(16), diff --git a/src/gui/gui.h b/src/gui/gui.h index 8c8ea1f1..65f15c4c 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -810,7 +810,7 @@ class FurnaceGUI { String mmlStringW; bool quit, warnQuit, willCommit, edit, modified, displayError, displayExporting, vgmExportLoop, wantCaptureKeyboard, oldWantCaptureKeyboard, displayMacroMenu; - bool displayNew, fullScreen, preserveChanPos; + bool displayNew, fullScreen, preserveChanPos, wantScrollList; bool willExport[32]; int vgmExportVersion; int drawHalt;