KiCad PCB EDA Suite
wx_view_controls.h
Go to the documentation of this file.
1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2012 Torsten Hueter, torstenhtr <at> gmx.de
5  * Copyright (C) 2013 CERN
6  * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
7  *
8  * @author Tomasz Wlostowski <[email protected]>
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, you may find one here:
22  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
23  * or you may search the http://www.gnu.org website for the version 2 license,
24  * or you may write to the Free Software Foundation, Inc.,
25  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
26  */
27 
33 #ifndef __WX_VIEW_CONTROLS_H
34 #define __WX_VIEW_CONTROLS_H
35 
36 #include <view/view_controls.h>
37 #include <wx/timer.h>
38 #include <memory>
39 
40 class EDA_DRAW_PANEL_GAL;
41 class PROF_COUNTER;
42 
43 namespace KIGFX
44 {
45 
46 class ZOOM_CONTROLLER;
47 
51 class WX_VIEW_CONTROLS : public VIEW_CONTROLS, public wxEvtHandler
52 {
53 public:
54  WX_VIEW_CONTROLS( VIEW* aView, EDA_DRAW_PANEL_GAL* aParentPanel );
55  virtual ~WX_VIEW_CONTROLS();
56 
58  void onWheel( wxMouseEvent& aEvent );
59  void onMotion( wxMouseEvent& aEvent );
60 #if wxCHECK_VERSION( 3, 1, 0 ) || defined( USE_OSX_MAGNIFY_EVENT )
61  void onMagnify( wxMouseEvent& aEvent );
62 #endif
63  void onButton( wxMouseEvent& aEvent );
64  void onEnter( wxMouseEvent& WXUNUSED( aEvent ) );
65  void onLeave( wxMouseEvent& WXUNUSED( aEvent ) );
66  void onTimer( wxTimerEvent& WXUNUSED( aEvent ) );
67  void onScroll( wxScrollWinEvent& aEvent );
68  void onCaptureLost( wxMouseEvent& WXUNUSED( aEvent ) );
69 
70 
76  void CaptureCursor( bool aEnabled ) override;
77 
78 
80  VECTOR2D GetMousePosition( bool aWorldCoordinates = true ) const override;
81 
83 
85  VECTOR2D GetCursorPosition( bool aSnappingEnabled ) const override;
86 
88  VECTOR2D GetRawCursorPosition( bool aSnappingEnabled = true ) const override;
89 
90  void SetCursorPosition( const VECTOR2D& aPosition, bool warpView,
91  bool aTriggeredByArrows, long aArrowCommand ) override;
92 
94  void SetCrossHairCursorPosition( const VECTOR2D& aPosition, bool aWarpView ) override;
95 
97  void WarpCursor( const VECTOR2D& aPosition, bool aWorldCoordinates = false,
98  bool aWarpView = false ) override;
99 
101  void CenterOnCursor() const override;
102 
104  void UpdateScrollbars();
105 
107  void CancelDrag();
108 
109  void ForceCursorPosition( bool aEnabled,
110  const VECTOR2D& aPosition = VECTOR2D( 0, 0 ) ) override;
111 
113  void LoadSettings() override;
114 
117  static const wxEventType EVT_REFRESH_MOUSE;
118 
119  std::unique_ptr<PROF_COUNTER> m_MotionEventCounter;
120 
121 private:
123  enum STATE
124  {
125  IDLE = 1,
129  };
130 
138  bool handleAutoPanning( const wxMouseEvent& aEvent );
139 
146  void handleCursorCapture( int x, int y );
147 
155  void refreshMouse();
156 
160  wxPoint getMouseScreenPosition() const;
161 
164 
167 
170 
173 
176 
178  wxTimer m_panTimer;
179 
182 
185 
188 
191 
192 #ifdef __WXGTK3__
193  long int m_lastTimestamp;
195 #endif
196 
199 
202 
204  std::unique_ptr<ZOOM_CONTROLLER> m_zoomController;
205 };
206 } // namespace KIGFX
207 
208 #endif
VECTOR2D m_lookStartPoint
Current direction of panning (only autopanning mode).
void LoadSettings() override
Event that forces mouse move event in the dispatcher (eg.
EDA_DRAW_PANEL_GAL * m_parentPanel
Store information about point where dragging has started.
The Cairo implementation of the graphics abstraction layer.
Definition: color4d.cpp:243
Panning with mouse button pressed.
static const wxEventType EVT_REFRESH_MOUSE
An implementation of class VIEW_CONTROLS for wxWidgets library.
wxPoint getMouseScreenPosition() const
Get the cursor position in the screen coordinates.
VECTOR2D GetMousePosition(bool aWorldCoordinates=true) const override
Return the current mouse pointer position.
std::unique_ptr< ZOOM_CONTROLLER > m_zoomController
void onButton(wxMouseEvent &aEvent)
A thread-safe event counter.
Definition: profile.h:225
VECTOR2D m_scrollScale
Current scrollbar position.
void UpdateScrollbars()
End any mouse drag action still in progress.
void onCaptureLost(wxMouseEvent &WXUNUSED(aEvent))
Zooming with mouse button pressed.
VECTOR2D GetRawCursorPosition(bool aSnappingEnabled=true) const override
Return the current cursor position in world coordinates ignoring the cursorUp position force mode.
void onWheel(wxMouseEvent &aEvent)
Handler functions.
Panning on approaching borders of the frame.
VECTOR2< double > VECTOR2D
Definition: vector2d.h:621
void SetCrossHairCursorPosition(const VECTOR2D &aPosition, bool aWarpView) override
void CaptureCursor(bool aEnabled) override
Force the cursor to stay within the drawing panel area.
An interface for classes handling user events controlling the view behavior such as zooming,...
STATE
< Possible states for WX_VIEW_CONTROLS.
void refreshMouse()
Send an event to refresh mouse position.
void handleCursorCapture(int x, int y)
Limit the cursor position to within the canvas by warping it.
void onMotion(wxMouseEvent &aEvent)
void WarpCursor(const VECTOR2D &aPosition, bool aWorldCoordinates=false, bool aWarpView=false) override
Set the viewport center to the current cursor position and warps the cursor to the screen center.
void ForceCursorPosition(bool aEnabled, const VECTOR2D &aPosition=VECTOR2D(0, 0)) override
Applies VIEW_CONTROLS settings from the program COMMON_SETTINGS.
VECTOR2D m_zoomStartPoint
Current cursor position (world coordinates).
std::unique_ptr< PROF_COUNTER > m_MotionEventCounter
void onTimer(wxTimerEvent &WXUNUSED(aEvent))
VECTOR2D m_panDirection
Timer responsible for handling autopanning.
bool m_updateCursor
A #ZOOM_CONTROLLER that determines zoom steps. This is platform-specific.
double m_initialZoomScale
The mouse position when a drag zoom started.
VECTOR2I m_scrollPos
The zoom scale when a drag zoom started.
bool handleAutoPanning(const wxMouseEvent &aEvent)
Compute new viewport settings while in autopanning mode.
void onEnter(wxMouseEvent &WXUNUSED(aEvent))
VECTOR2D m_dragStartPoint
Stores information about the center of viewport when dragging has started.
void SetCursorPosition(const VECTOR2D &aPosition, bool warpView, bool aTriggeredByArrows, long aArrowCommand) override
Move the graphic crosshair cursor to the requested position expressed in world coordinates.
STATE m_state
Panel that is affected by VIEW_CONTROLS.
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:68
void CenterOnCursor() const override
Adjusts the scrollbars position to match the current viewport.
void onScroll(wxScrollWinEvent &aEvent)
WX_VIEW_CONTROLS(VIEW *aView, EDA_DRAW_PANEL_GAL *aParentPanel)
VECTOR2D GetCursorPosition() const
Return the current cursor position in world coordinates.
void onLeave(wxMouseEvent &WXUNUSED(aEvent))
VECTOR2D m_cursorPos
Flag deciding whether the cursor position should be calculated using the mouse position.
wxTimer m_panTimer
Ratio used for scaling world coordinates to scrollbar position.