From 7c7d9c3e3f9ac9d94b5d4e4b91969b6d07e4a18a Mon Sep 17 00:00:00 2001 From: Jonatan Liljedahl Date: Tue, 19 Nov 2019 15:58:32 +0100 Subject: [PATCH] Eeschema: simulator plot: allow standard mac pan and pinch to zoom --- common/widgets/mathplot.cpp | 87 +++++++++++++++++++++++++-------- eeschema/sim/sim_plot_frame.cpp | 3 ++ include/widgets/mathplot.h | 8 +++ 3 files changed, 77 insertions(+), 21 deletions(-) diff --git a/common/widgets/mathplot.cpp b/common/widgets/mathplot.cpp index 151323bbdc..9cc5d1de12 100644 --- a/common/widgets/mathplot.cpp +++ b/common/widgets/mathplot.cpp @@ -61,7 +61,7 @@ #define mpSCROLL_NUM_PIXELS_PER_LINE 10 // See doxygen comments. -double mpWindow::zoomIncrementalFactor = 1.5; +double mpWindow::zoomIncrementalFactor = 1.1; // ----------------------------------------------------------------------------- // mpLayer @@ -1716,6 +1716,9 @@ EVT_SCROLLWIN_BOTTOM( mpWindow::OnScrollBottom ) EVT_MIDDLE_DOWN( mpWindow::OnMouseMiddleDown ) // JLB EVT_RIGHT_UP( mpWindow::OnShowPopupMenu ) EVT_MOUSEWHEEL( mpWindow::OnMouseWheel ) // JLB +#if wxCHECK_VERSION( 3, 1, 0 ) || defined( USE_OSX_MAGNIFY_EVENT ) +EVT_MAGNIFY( mpWindow::OnMagnify ) +#endif EVT_MOTION( mpWindow::OnMouseMove ) // JLB EVT_LEFT_DOWN( mpWindow::OnMouseLeftDown ) EVT_LEFT_UP( mpWindow::OnMouseLeftRelease ) @@ -1797,6 +1800,23 @@ void mpWindow::OnMouseMiddleDown( wxMouseEvent& event ) m_mouseMClick.y = event.GetY(); } +#if wxCHECK_VERSION( 3, 1, 0 ) || defined( USE_OSX_MAGNIFY_EVENT ) +void mpWindow::OnMagnify( wxMouseEvent& event ) +{ + if( !m_enableMouseNavigation ) + { + event.Skip(); + return; + } + + float zoom = event.GetMagnification() + 1.0f; + wxPoint pos( event.GetX(), event.GetY() ); + if( zoom > 1.0f ) + ZoomIn( pos, zoom ); + else if( zoom < 1.0f ) + ZoomOut( pos, 1.0f / zoom ); +} +#endif // Process mouse wheel events // JLB @@ -1808,22 +1828,35 @@ void mpWindow::OnMouseWheel( wxMouseEvent& event ) return; } - // Scroll vertically or horizontally (this is SHIFT is hold down). - int change = -event.GetWheelRotation(); // Opposite direction (More intuitive)! - double changeUnitsX = change / m_scaleX; - double changeUnitsY = change / m_scaleY; + int change = event.GetWheelRotation(); + const int axis = event.GetWheelAxis(); + double changeUnitsX = change / m_scaleX; + double changeUnitsY = change / m_scaleY; - if( event.m_controlDown ) + if( ( !m_enableMouseWheelPan && ( event.ControlDown() || event.ShiftDown() ) ) + || ( m_enableMouseWheelPan && !event.ControlDown() ) ) { - // horizontal scroll - SetXView( m_posX + changeUnitsX, m_desiredXmax + changeUnitsX, - m_desiredXmin + changeUnitsX ); - } - else if( event.m_shiftDown ) - { - // vertical scroll - SetYView( m_posY - changeUnitsY, m_desiredYmax - changeUnitsY, - m_desiredYmin - changeUnitsY ); + // Scrolling + if( m_enableMouseWheelPan ) + { + if( axis == wxMOUSE_WHEEL_HORIZONTAL || event.ShiftDown() ) + SetXView( m_posX + changeUnitsX, m_desiredXmax + changeUnitsX, + m_desiredXmin + changeUnitsX ); + else + SetYView( m_posY + changeUnitsY, m_desiredYmax + changeUnitsY, + m_desiredYmin + changeUnitsY ); + } + else + { + if( event.ControlDown() ) + SetXView( m_posX + changeUnitsX, m_desiredXmax + changeUnitsX, + m_desiredXmin + changeUnitsX ); + else + SetYView( m_posY + changeUnitsY, m_desiredYmax + changeUnitsY, + m_desiredYmin + changeUnitsY ); + } + + UpdateAll(); } else { @@ -1834,9 +1867,9 @@ void mpWindow::OnMouseWheel( wxMouseEvent& event ) ZoomIn( clickPt ); else ZoomOut( clickPt ); - } - UpdateAll(); + return; + } } @@ -2241,6 +2274,12 @@ bool mpWindow::SetYView( double pos, double desiredMax, double desiredMin ) void mpWindow::ZoomIn( const wxPoint& centerPoint ) +{ + ZoomIn( centerPoint, zoomIncrementalFactor ); +} + + +void mpWindow::ZoomIn( const wxPoint& centerPoint, double zoomFactor ) { wxPoint c( centerPoint ); @@ -2264,8 +2303,8 @@ void mpWindow::ZoomIn( const wxPoint& centerPoint ) // Zoom in: const double MAX_SCALE = 1e6; - double newScaleX = m_scaleX * zoomIncrementalFactor; - double newScaleY = m_scaleY * zoomIncrementalFactor; + double newScaleX = m_scaleX * zoomFactor; + double newScaleY = m_scaleY * zoomFactor; // Baaaaad things happen when you zoom in too much.. if( newScaleX <= MAX_SCALE && newScaleY <= MAX_SCALE ) @@ -2298,6 +2337,12 @@ void mpWindow::ZoomIn( const wxPoint& centerPoint ) void mpWindow::ZoomOut( const wxPoint& centerPoint ) +{ + ZoomOut( centerPoint, zoomIncrementalFactor ); +} + + +void mpWindow::ZoomOut( const wxPoint& centerPoint, double zoomFactor ) { wxPoint c( centerPoint ); @@ -2313,8 +2358,8 @@ void mpWindow::ZoomOut( const wxPoint& centerPoint ) double prior_layer_y = p2y( c.y ); // Zoom out: - m_scaleX = m_scaleX / zoomIncrementalFactor; - m_scaleY = m_scaleY / zoomIncrementalFactor; + m_scaleX = m_scaleX / zoomFactor; + m_scaleY = m_scaleY / zoomFactor; // Adjust the new m_posx/y: m_posX = prior_layer_x - c.x / m_scaleX; diff --git a/eeschema/sim/sim_plot_frame.cpp b/eeschema/sim/sim_plot_frame.cpp index c24b0e165d..3b9831ce22 100644 --- a/eeschema/sim/sim_plot_frame.cpp +++ b/eeschema/sim/sim_plot_frame.cpp @@ -395,6 +395,9 @@ SIM_PLOT_PANEL* SIM_PLOT_FRAME::NewPlotPanel( SIM_TYPE aSimType ) { SIM_PLOT_PANEL* plotPanel = new SIM_PLOT_PANEL( aSimType, m_plotNotebook, wxID_ANY ); + plotPanel->EnableMouseWheelPan( + m_schematicFrame->GetCanvas()->GetViewControls()->IsMousewheelPanEnabled() ); + if( m_welcomePanel ) { m_plotNotebook->DeletePage( 0 ); diff --git a/include/widgets/mathplot.h b/include/widgets/mathplot.h index 116f4fe2bd..c9832e0877 100644 --- a/include/widgets/mathplot.h +++ b/include/widgets/mathplot.h @@ -1208,6 +1208,10 @@ public: */ void EnableMousePanZoom( bool enabled ) { m_enableMouseNavigation = enabled; } + /** Enable/disable trackpad friendly panning (2-axis scroll wheel) + */ + void EnableMouseWheelPan( bool enabled ) { m_enableMouseWheelPan = enabled; } + /** Enable or disable X/Y scale aspect locking for the view. * @note Explicit calls to mpWindow::SetScaleX and mpWindow::SetScaleY will set * an unlocked aspect, but any other action changing the view scale will @@ -1241,12 +1245,14 @@ public: * position on the screen after the zoom (by default, the center of the mpWindow). */ void ZoomIn( const wxPoint& centerPoint = wxDefaultPosition ); + void ZoomIn( const wxPoint& centerPoint, double zoomFactor ); /** Zoom out current view and refresh display * @param centerPoint The point (pixel coordinates) that will stay in the same * position on the screen after the zoom (by default, the center of the mpWindow). */ void ZoomOut( const wxPoint& centerPoint = wxDefaultPosition ); + void ZoomOut( const wxPoint& centerPoint, double zoomFactor ); /** Zoom in current view along X and refresh display */ void ZoomInX(); @@ -1433,6 +1439,7 @@ protected: void OnZoomOut( wxCommandEvent& event ); // !< Context menu handler void OnLockAspect( wxCommandEvent& event ); // !< Context menu handler void OnMouseWheel( wxMouseEvent& event ); // !< Mouse handler for the wheel + void OnMagnify( wxMouseEvent& event ); // !< Pinch zoom handler void OnMouseMove( wxMouseEvent& event ); // !< Mouse handler for mouse motion (for pan) void OnMouseLeftDown( wxMouseEvent& event ); // !< Mouse left click (for rect zoom) void OnMouseLeftRelease( wxMouseEvent& event ); // !< Mouse left click (for rect zoom) @@ -1516,6 +1523,7 @@ protected: wxBitmap* m_buff_bmp; // !< For double buffering bool m_enableDoubleBuffer; // !< For double buffering bool m_enableMouseNavigation; // !< For pan/zoom with the mouse. + bool m_enableMouseWheelPan; // !< Trackpad pan/zoom bool m_enableLimitedView; wxPoint m_mouseMClick; // !< For the middle button "drag" feature wxPoint m_mouseLClick; // !< Starting coords for rectangular zoom selection