From f878d03f67639ef5bca12e7e27689900cf4a5b13 Mon Sep 17 00:00:00 2001 From: Mirek Fidler Date: Sat, 17 Feb 2024 13:44:44 +0100 Subject: [PATCH] CtrlCore: Horizontal mouse wheel improvements --- uppsrc/CtrlCore/CtrlCore.h | 2 +- uppsrc/CtrlCore/CtrlMouse.cpp | 4 ++-- uppsrc/CtrlLib/LineEdit.cpp | 2 +- uppsrc/CtrlLib/ScrollBar.cpp | 11 +++++++++-- uppsrc/CtrlLib/ScrollBar.h | 1 + uppsrc/CtrlLib/TextEdit.h | 2 +- uppsrc/CtrlLib/TreeCtrl.cpp | 2 +- uppsrc/CtrlLib/TreeCtrl.h | 2 +- uppsrc/IconDes/IconDes.cpp | 5 ++++- uppsrc/IconDes/IconDes.h | 2 +- uppsrc/TextDiffCtrl/TextCtrl.cpp | 7 +++++-- uppsrc/TextDiffCtrl/TextDiffCtrl.h | 2 +- uppsrc/ide/LayDes/LayDes.h | 2 +- uppsrc/ide/LayDes/laydes.cpp | 5 ++++- 14 files changed, 33 insertions(+), 16 deletions(-) diff --git a/uppsrc/CtrlCore/CtrlCore.h b/uppsrc/CtrlCore/CtrlCore.h index f75e231a3..43006220e 100644 --- a/uppsrc/CtrlCore/CtrlCore.h +++ b/uppsrc/CtrlCore/CtrlCore.h @@ -988,7 +988,7 @@ public: virtual void MiddleHold(Point p, dword keyflags); virtual void MiddleUp(Point p, dword keyflags); virtual void MouseWheel(Point p, int zdelta, dword keyflags); - virtual void MouseWheelH(Point p, int zdelta, dword keyflags); + virtual void HorzMouseWheel(Point p, int zdelta, dword keyflags); virtual void MouseLeave(); virtual void Pen(Point p, const PenInfo& pen, dword keyflags); diff --git a/uppsrc/CtrlCore/CtrlMouse.cpp b/uppsrc/CtrlCore/CtrlMouse.cpp index 2e02352cb..42a3d27ca 100644 --- a/uppsrc/CtrlCore/CtrlMouse.cpp +++ b/uppsrc/CtrlCore/CtrlMouse.cpp @@ -129,7 +129,7 @@ void Ctrl::MouseWheel(Point p, int zd, dword kf) } } -void Ctrl::MouseWheelH(Point p, int zd, dword kf) +void Ctrl::HorzMouseWheel(Point p, int zd, dword kf) { Ctrl *parent = GetParent(); if(parent) { @@ -238,7 +238,7 @@ Image Ctrl::MouseEvent(int event, Point p, int zdelta, dword keyflags) MouseWheel(p, zdelta, keyflags); break; case MOUSEHWHEEL: - MouseWheelH(p, zdelta, keyflags); + HorzMouseWheel(p, zdelta, keyflags); break; case CURSORIMAGE: return CursorImage(p, keyflags); diff --git a/uppsrc/CtrlLib/LineEdit.cpp b/uppsrc/CtrlLib/LineEdit.cpp index 30730ce18..dac7000d7 100644 --- a/uppsrc/CtrlLib/LineEdit.cpp +++ b/uppsrc/CtrlLib/LineEdit.cpp @@ -45,7 +45,7 @@ void LineEdit::MouseWheel(Point, int zdelta, dword keyflags) { sb.WheelY(zdelta); } -void LineEdit::MouseWheelH(Point, int zdelta, dword) +void LineEdit::HorzMouseWheel(Point, int zdelta, dword) { sb.WheelX(zdelta); } diff --git a/uppsrc/CtrlLib/ScrollBar.cpp b/uppsrc/CtrlLib/ScrollBar.cpp index ec5e776e1..76e4fc838 100644 --- a/uppsrc/CtrlLib/ScrollBar.cpp +++ b/uppsrc/CtrlLib/ScrollBar.cpp @@ -480,8 +480,15 @@ void ScrollBar::NextPage() { Uset(pagepos + max(pagesize - linesize, 1)); } -void ScrollBar::Wheel(int zdelta, int lines) { - Uset(pagepos - lines * linesize * zdelta / 120); +void ScrollBar::Wheel(int zdelta, int lines) +{ + int granularity = 120 / max(1, lines); + wheelaccumulator += zdelta; + zdelta = granularity * (wheelaccumulator / granularity); + wheelaccumulator -= zdelta; + if(horz) + zdelta = -zdelta; + Uset(pagepos - linesize * zdelta / granularity); } void ScrollBar::Wheel(int zdelta) { diff --git a/uppsrc/CtrlLib/ScrollBar.h b/uppsrc/CtrlLib/ScrollBar.h index 4aa2b147d..c17387fa9 100644 --- a/uppsrc/CtrlLib/ScrollBar.h +++ b/uppsrc/CtrlLib/ScrollBar.h @@ -49,6 +49,7 @@ private: int totalsize; int linesize; int minthumb; + int16 wheelaccumulator; // improves touch experience int8 push; int8 light; bool horz:1; diff --git a/uppsrc/CtrlLib/TextEdit.h b/uppsrc/CtrlLib/TextEdit.h index 573b9d228..ff4df5dcd 100644 --- a/uppsrc/CtrlLib/TextEdit.h +++ b/uppsrc/CtrlLib/TextEdit.h @@ -292,7 +292,7 @@ public: virtual void LeftDrag(Point p, dword flags); virtual void MouseMove(Point p, dword flags); virtual void MouseWheel(Point, int zdelta, dword); - virtual void MouseWheelH(Point, int zdelta, dword); + virtual void HorzMouseWheel(Point, int zdelta, dword); virtual Image CursorImage(Point, dword); virtual void DragAndDrop(Point p, PasteClip& d); virtual void DragRepeat(Point p); diff --git a/uppsrc/CtrlLib/TreeCtrl.cpp b/uppsrc/CtrlLib/TreeCtrl.cpp index b9f09eafc..57b270d74 100644 --- a/uppsrc/CtrlLib/TreeCtrl.cpp +++ b/uppsrc/CtrlLib/TreeCtrl.cpp @@ -1222,7 +1222,7 @@ void TreeCtrl::MouseWheel(Point, int zdelta, dword keyflags) sb.WheelY(zdelta); } -void TreeCtrl::MouseWheelH(Point, int zdelta, dword keyflags) +void TreeCtrl::HorzMouseWheel(Point, int zdelta, dword keyflags) { sb.WheelX(zdelta); } diff --git a/uppsrc/CtrlLib/TreeCtrl.h b/uppsrc/CtrlLib/TreeCtrl.h index 4083a9a1c..ceb4298e4 100644 --- a/uppsrc/CtrlLib/TreeCtrl.h +++ b/uppsrc/CtrlLib/TreeCtrl.h @@ -9,7 +9,7 @@ public: virtual void LeftDrag(Point p, dword keyflags); virtual void RightDown(Point p, dword flags); virtual void MouseWheel(Point p, int zdelta, dword keyflags); - virtual void MouseWheelH(Point, int zdelta, dword keyflags); + virtual void HorzMouseWheel(Point, int zdelta, dword keyflags); virtual void MouseMove(Point, dword); virtual bool Key(dword key, int); virtual void GotFocus(); diff --git a/uppsrc/IconDes/IconDes.cpp b/uppsrc/IconDes/IconDes.cpp index 75834abe1..b0f5293eb 100644 --- a/uppsrc/IconDes/IconDes.cpp +++ b/uppsrc/IconDes/IconDes.cpp @@ -68,11 +68,14 @@ void IconDes::MouseWheel(Point pt, int zdelta, dword keyflags) else ZoomIn(); } + else + if(keyflags & K_SHIFT) + sb.WheelX(zdelta); else sb.WheelY(zdelta); } -void IconDes::MouseWheelH(Point pt, int zdelta, dword keyflags) +void IconDes::HorzMouseWheel(Point pt, int zdelta, dword keyflags) { sb.WheelX(zdelta); } diff --git a/uppsrc/IconDes/IconDes.h b/uppsrc/IconDes/IconDes.h index 4370b357f..92827d6f4 100644 --- a/uppsrc/IconDes/IconDes.h +++ b/uppsrc/IconDes/IconDes.h @@ -141,7 +141,7 @@ public: virtual void MouseLeave() { SyncStatus(); } virtual void LeftUp(Point p, dword keyflags); virtual void MouseWheel(Point p, int zdelta, dword keyflags); - virtual void MouseWheelH(Point pt, int zdelta, dword keyflags); + virtual void HorzMouseWheel(Point pt, int zdelta, dword keyflags); virtual void RightDown(Point p, dword keyflags); virtual bool Key(dword key, int count); virtual Image CursorImage(Point p, dword keyflags); diff --git a/uppsrc/TextDiffCtrl/TextCtrl.cpp b/uppsrc/TextDiffCtrl/TextCtrl.cpp index 254b148de..eb666fc06 100644 --- a/uppsrc/TextDiffCtrl/TextCtrl.cpp +++ b/uppsrc/TextDiffCtrl/TextCtrl.cpp @@ -427,10 +427,13 @@ void TextCompareCtrl::Layout() void TextCompareCtrl::MouseWheel(Point pt, int zdelta, dword keyflags) { - scroll.WheelY(zdelta); + if(keyflags & K_SHIFT) + scroll.WheelX(zdelta); + else + scroll.WheelY(zdelta); } -void TextCompareCtrl::MouseWheelH(Point pt, int zdelta, dword keyflags) +void TextCompareCtrl::HorzMouseWheel(Point pt, int zdelta, dword keyflags) { scroll.WheelX(zdelta); } diff --git a/uppsrc/TextDiffCtrl/TextDiffCtrl.h b/uppsrc/TextDiffCtrl/TextDiffCtrl.h index 857de423e..1aba347de 100644 --- a/uppsrc/TextDiffCtrl/TextDiffCtrl.h +++ b/uppsrc/TextDiffCtrl/TextDiffCtrl.h @@ -33,7 +33,7 @@ public: virtual void Paint(Draw& draw); virtual void Layout(); virtual void MouseWheel(Point pt, int zdelta, dword keyflags); - virtual void MouseWheelH(Point pt, int zdelta, dword keyflags); + virtual void HorzMouseWheel(Point pt, int zdelta, dword keyflags); virtual void MouseMove(Point pt, dword keyflags); virtual void LeftDown(Point pt, dword keyflags); virtual void LeftDouble(Point pt, dword keyflags); diff --git a/uppsrc/ide/LayDes/LayDes.h b/uppsrc/ide/LayDes/LayDes.h index 4cf512fd7..d8f7cb9ea 100644 --- a/uppsrc/ide/LayDes/LayDes.h +++ b/uppsrc/ide/LayDes/LayDes.h @@ -276,7 +276,7 @@ public: void LeftRepeat(Point p, dword keyflags) override; void MouseMove(Point p, dword keyflags) override; void MouseWheel(Point p, int zdelta, dword keyflags) override; - void MouseWheelH(Point, int zdelta, dword) override; + void HorzMouseWheel(Point, int zdelta, dword) override; void LeftUp(Point p, dword keyflags) override; void RightDown(Point p, dword keyflags) override; void Layout() override; diff --git a/uppsrc/ide/LayDes/laydes.cpp b/uppsrc/ide/LayDes/laydes.cpp index 50cb2bcec..190239f7a 100644 --- a/uppsrc/ide/LayDes/laydes.cpp +++ b/uppsrc/ide/LayDes/laydes.cpp @@ -290,11 +290,14 @@ void LayDes::MouseWheel(Point p, int zdelta, dword keyflags) SetBar(); SetSb(); } + else + if(keyflags & K_SHIFT) + sb.WheelX(zdelta); else sb.WheelY(zdelta); } -void LayDes::MouseWheelH(Point, int zdelta, dword) +void LayDes::HorzMouseWheel(Point, int zdelta, dword) { sb.WheelX(zdelta); }