From 1d84348c5a3e24919d9862bf0c8ad0a4fbf39d41 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 29 Jun 2013 12:52:58 +0000 Subject: [PATCH] Add support for horizontal mouse wheel scrolling in wxSTC. Handle horizontal mouse wheel scrolling events in a similar (but simpler, as they always scroll and never change the font size) way to the vertical ones in wxStyledTextCtrl. Closes #15266. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74312 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + src/stc/ScintillaWX.cpp | 34 +++++++++++++++++++++++++--------- src/stc/ScintillaWX.h | 7 +++++-- src/stc/stc.cpp | 4 +++- src/stc/stc.cpp.in | 4 +++- 5 files changed, 37 insertions(+), 13 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 5050dd6154..e149ab970e 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -671,6 +671,7 @@ All (GUI): - Fix wxStyledTextCtrl::SetInsertionPointEnd() (troelsk). - Add wxFileDialog::GetCurrentlySelectedFilename() (Carl Godkin). - Add wxMouseEvent::GetColumnsPerAction() (toiffel). +- Add support for horizontal mouse wheel scrolling in wxSTC (toiffel). - Improve wrapping of cell contents in wxGrid (nmset). wxGTK: diff --git a/src/stc/ScintillaWX.cpp b/src/stc/ScintillaWX.cpp index 9077933669..84c0d35baa 100644 --- a/src/stc/ScintillaWX.cpp +++ b/src/stc/ScintillaWX.cpp @@ -244,7 +244,8 @@ ScintillaWX::ScintillaWX(wxStyledTextCtrl* win) { focusEvent = false; wMain = win; stc = win; - wheelRotation = 0; + wheelVRotation = 0; + wheelHRotation = 0; Initialise(); #ifdef __WXMSW__ sysCaretBitmap = 0; @@ -830,13 +831,28 @@ void ScintillaWX::DoVScroll(int type, int pos) { ScrollTo(topLineNew); } -void ScintillaWX::DoMouseWheel(int rotation, int delta, - int linesPerAction, int ctrlDown, - bool isPageScroll ) { +void ScintillaWX::DoMouseWheel(wxMouseWheelAxis axis, int rotation, int delta, + int linesPerAction, int columnsPerAction, + bool ctrlDown, bool isPageScroll) { int topLineNew = topLine; int lines; - - if (ctrlDown) { // Zoom the fonts if Ctrl key down + int xPos = xOffset; + int pixels; + + if (axis == wxMOUSE_WHEEL_HORIZONTAL) { + wheelHRotation += rotation * (columnsPerAction * vs.spaceWidth); + pixels = wheelHRotation / delta; + wheelHRotation -= pixels * delta; + if (pixels != 0) { + xPos += pixels; + PRectangle rcText = GetTextRectangle(); + if (xPos > scrollWidth - rcText.Width()) { + xPos = scrollWidth - rcText.Width(); + } + HorizontalScrollTo(xPos); + } + } + else if (ctrlDown) { // Zoom the fonts if Ctrl key down if (rotation > 0) { KeyCommand(SCI_ZOOMIN); } @@ -847,9 +863,9 @@ void ScintillaWX::DoMouseWheel(int rotation, int delta, else { // otherwise just scroll the window if ( !delta ) delta = 120; - wheelRotation += rotation; - lines = wheelRotation / delta; - wheelRotation -= lines * delta; + wheelVRotation += rotation; + lines = wheelVRotation / delta; + wheelVRotation -= lines * delta; if (lines != 0) { if (isPageScroll) lines = lines * LinesOnScreen(); // lines is either +1 or -1 diff --git a/src/stc/ScintillaWX.h b/src/stc/ScintillaWX.h index a7ac8023e0..0f06c0a6d2 100644 --- a/src/stc/ScintillaWX.h +++ b/src/stc/ScintillaWX.h @@ -152,7 +152,9 @@ public: void DoLeftButtonUp(Point pt, unsigned int curTime, bool ctrl); void DoLeftButtonMove(Point pt); void DoMiddleButtonUp(Point pt); - void DoMouseWheel(int rotation, int delta, int linesPerAction, int ctrlDown, bool isPageScroll); + void DoMouseWheel(wxMouseWheelAxis axis, int rotation, int delta, + int linesPerAction, int columnsPerAction, + bool ctrlDown, bool isPageScroll); void DoAddChar(int key); int DoKeyDown(const wxKeyEvent& event, bool* consumed); void DoTick() { Tick(); } @@ -191,7 +193,8 @@ private: wxDragResult dragResult; #endif - int wheelRotation; + int wheelVRotation; + int wheelHRotation; // For use in creating a system caret bool HasCaretSizeChanged(); diff --git a/src/stc/stc.cpp b/src/stc/stc.cpp index d4190e23fb..64c3c3fd45 100644 --- a/src/stc/stc.cpp +++ b/src/stc/stc.cpp @@ -4695,9 +4695,11 @@ void wxStyledTextCtrl::OnContextMenu(wxContextMenuEvent& evt) { void wxStyledTextCtrl::OnMouseWheel(wxMouseEvent& evt) { - m_swx->DoMouseWheel(evt.GetWheelRotation(), + m_swx->DoMouseWheel(evt.GetWheelAxis(), + evt.GetWheelRotation(), evt.GetWheelDelta(), evt.GetLinesPerAction(), + evt.GetColumnsPerAction(), evt.ControlDown(), evt.IsPageScroll()); } diff --git a/src/stc/stc.cpp.in b/src/stc/stc.cpp.in index 9a6562eed3..f407276bbf 100644 --- a/src/stc/stc.cpp.in +++ b/src/stc/stc.cpp.in @@ -833,9 +833,11 @@ void wxStyledTextCtrl::OnContextMenu(wxContextMenuEvent& evt) { void wxStyledTextCtrl::OnMouseWheel(wxMouseEvent& evt) { - m_swx->DoMouseWheel(evt.GetWheelRotation(), + m_swx->DoMouseWheel(evt.GetWheelAxis(), + evt.GetWheelRotation(), evt.GetWheelDelta(), evt.GetLinesPerAction(), + evt.GetColumnsPerAction(), evt.ControlDown(), evt.IsPageScroll()); } -- 2.45.2