diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index d72a0555..04ccc258 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -6863,6 +6863,7 @@ FurnaceGUI::FurnaceGUI(): waveEditStyle(0), displayInsTypeListMakeInsSample(-1), mobileEditPage(0), + wheelCalmDown(0), mobileMenuPos(0.0f), autoButtonSize(0.0f), mobileEditAnim(0.0f), diff --git a/src/gui/gui.h b/src/gui/gui.h index 2707004f..410d59b5 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1342,6 +1342,7 @@ class FurnaceGUI { int waveEditStyle; int displayInsTypeListMakeInsSample; int mobileEditPage; + int wheelCalmDown; float mobileMenuPos, autoButtonSize, mobileEditAnim; ImVec2 mobileEditButtonPos, mobileEditButtonSize; const int* curSysSection; diff --git a/src/gui/pattern.cpp b/src/gui/pattern.cpp index b5e92b59..63b575c6 100644 --- a/src/gui/pattern.cpp +++ b/src/gui/pattern.cpp @@ -437,7 +437,7 @@ void FurnaceGUI::drawPattern() { ImGui::SetCursorPosX(ImGui::GetCursorPosX()+centerOff); } } - if (ImGui::BeginTable("PatternView",displayChans+2,ImGuiTableFlags_BordersInnerV|ImGuiTableFlags_ScrollX|ImGuiTableFlags_ScrollY|ImGuiTableFlags_NoPadInnerX|ImGuiTableFlags_NoBordersInFrozenArea|(settings.cursorFollowsWheel?ImGuiTableFlags_NoScrollWithMouse:0))) { + if (ImGui::BeginTable("PatternView",displayChans+2,ImGuiTableFlags_BordersInnerV|ImGuiTableFlags_ScrollX|ImGuiTableFlags_ScrollY|ImGuiTableFlags_NoPadInnerX|ImGuiTableFlags_NoBordersInFrozenArea|((settings.cursorFollowsWheel || wheelCalmDown)?ImGuiTableFlags_NoScrollWithMouse:0))) { ImGui::TableSetupColumn("pos",ImGuiTableColumnFlags_WidthFixed); char chanID[2048]; float lineHeight=(ImGui::GetTextLineHeight()+2*dpiScale); @@ -955,8 +955,8 @@ void FurnaceGUI::drawPattern() { } // overflow changes order - // TODO: this is very unreliable and sometimes it can warp you out of the song - if (settings.scrollChangesOrder && (!e->isPlaying() || !followPattern) && ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows) && !settings.cursorFollowsWheel) { + if (--wheelCalmDown<0) wheelCalmDown=0; + if (settings.scrollChangesOrder && (!e->isPlaying() || !followPattern) && ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows) && !settings.cursorFollowsWheel && !wheelCalmDown) { if (wheelY!=0) { if (wheelY>0) { if (ImGui::GetScrollY()<=0) { @@ -965,10 +965,12 @@ void FurnaceGUI::drawPattern() { setOrder(curOrder-1); ImGui::SetScrollY(ImGui::GetScrollMaxY()); updateScroll(e->curSubSong->patLen); + wheelCalmDown=2; } else if (settings.scrollChangesOrder==2) { setOrder(e->curSubSong->ordersLen-1); ImGui::SetScrollY(ImGui::GetScrollMaxY()); updateScroll(e->curSubSong->patLen); + wheelCalmDown=2; } haveHitBounds=false; } else { @@ -984,10 +986,12 @@ void FurnaceGUI::drawPattern() { setOrder(curOrder+1); ImGui::SetScrollY(0); updateScroll(0); + wheelCalmDown=2; } else if (settings.scrollChangesOrder==2) { setOrder(0); ImGui::SetScrollY(0); updateScroll(0); + wheelCalmDown=2; } haveHitBounds=false; } else {