From 49a3e7ec2def0fdb8a2e80e05dc11305ef4b5baa Mon Sep 17 00:00:00 2001 From: Jon Evans Date: Wed, 13 Sep 2017 20:07:29 -0400 Subject: [PATCH] Support scrollbar controls in GAL canvas --- common/view/wx_view_controls.cpp | 59 ++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 7 deletions(-) diff --git a/common/view/wx_view_controls.cpp b/common/view/wx_view_controls.cpp index 9f9dcdc8b9..d403e65813 100644 --- a/common/view/wx_view_controls.cpp +++ b/common/view/wx_view_controls.cpp @@ -63,6 +63,14 @@ WX_VIEW_CONTROLS::WX_VIEW_CONTROLS( VIEW* aView, wxScrolledCanvas* aParentPanel wxMouseEventHandler( WX_VIEW_CONTROLS::onLeave ), NULL, this ); m_parentPanel->Connect( wxEVT_SCROLLWIN_THUMBTRACK, wxScrollWinEventHandler( WX_VIEW_CONTROLS::onScroll ), NULL, this ); + m_parentPanel->Connect( wxEVT_SCROLLWIN_LINEUP, + wxScrollWinEventHandler( WX_VIEW_CONTROLS::onScroll ), NULL, this ); + m_parentPanel->Connect( wxEVT_SCROLLWIN_LINEDOWN, + wxScrollWinEventHandler( WX_VIEW_CONTROLS::onScroll ), NULL, this ); + m_parentPanel->Connect( wxEVT_SCROLLWIN_PAGEUP, + wxScrollWinEventHandler( WX_VIEW_CONTROLS::onScroll ), NULL, this ); + m_parentPanel->Connect( wxEVT_SCROLLWIN_PAGEDOWN, + wxScrollWinEventHandler( WX_VIEW_CONTROLS::onScroll ), NULL, this ); m_panTimer.SetOwner( this ); this->Connect( wxEVT_TIMER, @@ -335,15 +343,52 @@ void WX_VIEW_CONTROLS::onTimer( wxTimerEvent& aEvent ) void WX_VIEW_CONTROLS::onScroll( wxScrollWinEvent& aEvent ) { - VECTOR2D center = m_view->GetCenter(); - const BOX2I& boundary = m_view->GetBoundary(); + const double linePanDelta = 0.05; + const double pagePanDelta = 0.5; - if( aEvent.GetOrientation() == wxHORIZONTAL ) - center.x = boundary.GetLeft() + aEvent.GetPosition() / m_scrollScale.x; - else if( aEvent.GetOrientation() == wxVERTICAL ) - center.y = boundary.GetTop() + aEvent.GetPosition() / m_scrollScale.y; + int type = aEvent.GetEventType(); + int dir = aEvent.GetOrientation(); + + if( type == wxEVT_SCROLLWIN_THUMBTRACK ) + { + VECTOR2D center = m_view->GetCenter(); + const BOX2I& boundary = m_view->GetBoundary(); + + if( dir == wxHORIZONTAL ) + center.x = boundary.GetLeft() + aEvent.GetPosition() / m_scrollScale.x; + else + center.y = boundary.GetTop() + aEvent.GetPosition() / m_scrollScale.y; + + m_view->SetCenter( center ); + } + else + { + double dist = 0; + + if( type == wxEVT_SCROLLWIN_PAGEUP ) + dist = pagePanDelta; + else if( type == wxEVT_SCROLLWIN_PAGEDOWN ) + dist = -pagePanDelta; + else if( type == wxEVT_SCROLLWIN_LINEUP ) + dist = linePanDelta; + else if( type == wxEVT_SCROLLWIN_LINEDOWN ) + dist = -linePanDelta; + + VECTOR2D scroll = m_view->ToWorld( m_view->GetScreenPixelSize(), false ) * dist; + + double scrollX = 0.0; + double scrollY = 0.0; + + if ( dir == wxHORIZONTAL ) + scrollX = -scroll.x; + else + scrollY = -scroll.y; + + VECTOR2D delta( scrollX, scrollY ); + + m_view->SetCenter( m_view->GetCenter() + delta ); + } - m_view->SetCenter( center ); m_parentPanel->Refresh(); }