KiCad PCB EDA Suite
class_draw_panel_gal.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) 2013-2018 CERN
5  * Copyright (C) 2013-2021 KiCad Developers, see AUTHORS.txt for contributors.
6  *
7  * @author Tomasz Wlostowski <[email protected]>
8  * @author Maciej Suminski <[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 
28 #ifndef PANELGAL_WXSTRUCT_H
29 #define PANELGAL_WXSTRUCT_H
30 
31 #include <wx/window.h>
32 #include <wx/timer.h>
33 #include <wx/grid.h> // needed for MSVC to see wxScrolledCanvas indirectly exported
34 #include <math/box2.h>
35 #include <math/vector2d.h>
36 #include <widgets/msgpanel.h>
37 #include <memory>
38 
39 #include <gal/cursors.h>
40 
41 class BOARD;
42 class EDA_DRAW_FRAME;
43 class TOOL_DISPATCHER;
44 class PROF_COUNTER;
45 
46 namespace KIGFX
47 {
48 class GAL;
49 class VIEW;
50 class WX_VIEW_CONTROLS;
51 class VIEW_CONTROLS;
52 class PAINTER;
53 class GAL_DISPLAY_OPTIONS;
54 class VIEW_OVERLAY;
55 }
56 
57 
58 class EDA_DRAW_PANEL_GAL : public wxScrolledCanvas
59 {
60 public:
61  enum GAL_TYPE {
67  };
68 
69 #ifdef __WXMAC__
70  // Cairo doesn't work on OSX so we really have no fallback available.
71  static constexpr GAL_TYPE GAL_FALLBACK = GAL_TYPE_OPENGL;
72 #else
73  static constexpr GAL_TYPE GAL_FALLBACK = GAL_TYPE_CAIRO;
74 #endif
75 
84  EDA_DRAW_PANEL_GAL( wxWindow* aParentWindow, wxWindowID aWindowId,
85  const wxPoint& aPosition, const wxSize& aSize,
87  GAL_TYPE aGalType = GAL_TYPE_OPENGL );
89 
90  virtual void SetFocus() override;
91 
97  virtual bool SwitchBackend( GAL_TYPE aGalType );
98 
102  inline GAL_TYPE GetBackend() const { return m_backend; }
103 
109  KIGFX::GAL* GetGAL() const { return m_gal; }
110 
116  virtual KIGFX::VIEW* GetView() const { return m_view; }
117 
124  {
126  }
127 
129  virtual void Refresh( bool aEraseBackground = true, const wxRect* aRect = nullptr ) override;
130 
134  void ForceRefresh();
135 
144  void SetEventDispatcher( TOOL_DISPATCHER* aEventDispatcher );
145 
149  void StartDrawing();
150 
155  void StopDrawing();
156 
160  virtual void SetHighContrastLayer( int aLayer );
161 
165  virtual void SetTopLayer( int aLayer );
166 
167  virtual void GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
168  {
169  wxASSERT( false );
170  }
171 
176 
177  bool IsDialogPreview() const { return m_parent != (wxWindow*) m_edaFrame; }
178 
182  virtual void OnShow() {}
183 
190  void SetStealsFocus( bool aStealsFocus ) { m_stealsFocus = aStealsFocus; }
191 
195  void SetCurrentCursor( KICURSOR aCursor );
196 
203  virtual BOX2I GetDefaultViewBBox() const { return BOX2I(); }
204 
208  void OnEvent( wxEvent& aEvent );
209 
217  void DoRePaint();
218 
222  std::shared_ptr<KIGFX::VIEW_OVERLAY> DebugOverlay();
223 
224 
228  void ClearDebugOverlay();
229 
236 
237  std::unique_ptr<PROF_COUNTER> m_PaintEventCounter;
238 
239 protected:
240  virtual void onPaint( wxPaintEvent& WXUNUSED( aEvent ) );
241  void onSize( wxSizeEvent& aEvent );
242  void onEnter( wxMouseEvent& aEvent );
243  void onLostFocus( wxFocusEvent& aEvent );
244  void onRefreshTimer( wxTimerEvent& aEvent );
245  void onShowTimer( wxTimerEvent& aEvent );
246 
247  static const int MinRefreshPeriod = 17;
248 
249  wxWindow* m_parent;
251 
252  wxLongLong m_lastRefresh;
254  wxTimer m_refreshTimer;
255 
257  bool m_drawing;
258 
261 
263  wxTimer m_onShowTimer;
264 
267 
270 
272  std::unique_ptr<KIGFX::PAINTER> m_painter;
273 
276 
280 
283 
287 
291 
293  std::shared_ptr<KIGFX::VIEW_OVERLAY> m_debugOverlay;
294 };
295 
296 #endif
bool m_pendingRefresh
Is there a redraw event requested?
wxTimer m_refreshTimer
Timer to prevent too-frequent refreshing.
KIGFX::GAL * m_gal
Interface for drawing objects on a 2D-surface.
BOX2< VECTOR2I > BOX2I
Definition: box2.h:506
virtual void SetHighContrastLayer(int aLayer)
Take care of display settings for the given layer to be displayed in high contrast mode.
void ForceRefresh()
Force a redraw.
KIGFX::VIEW_CONTROLS * GetViewControls() const
Return a pointer to the #VIEW_CONTROLS instance used in the panel.
void SetCurrentCursor(KICURSOR aCursor)
Set the current cursor shape for this panel.
KIGFX::WX_VIEW_CONTROLS * m_viewControls
Control for VIEW (moving, zooming, etc.)
GAL_TYPE m_backend
Currently used GAL.
The Cairo implementation of the graphics abstraction layer.
Definition: color4d.cpp:243
void OnEvent(wxEvent &aEvent)
Used to forward events to the canvas from popups, etc.
An implementation of class VIEW_CONTROLS for wxWidgets library.
virtual bool SwitchBackend(GAL_TYPE aGalType)
Switch method of rendering graphics.
KIGFX::GAL_DISPLAY_OPTIONS & m_options
virtual void OnShow()
Called when the window is shown for the first time.
static constexpr GAL_TYPE GAL_FALLBACK
void onLostFocus(wxFocusEvent &aEvent)
KICURSOR
Definition: cursors.h:33
void DoRePaint()
Repaint the canvas, and fix scrollbar cursors.
Sentinel, do not use as a parameter.
void onShowTimer(wxTimerEvent &aEvent)
The base class for create windows for drawing purpose.
A thread-safe event counter.
Definition: profile.h:225
not specified: a GAL engine must be set by the client
void ClearDebugOverlay()
Clear the contents of the debug overlay and removes it from the VIEW.
void onEnter(wxMouseEvent &aEvent)
void onRefreshTimer(wxTimerEvent &aEvent)
bool m_drawing
True if GAL is currently redrawing the view.
wxWindow * m_parent
Pointer to the parent window.
virtual void onPaint(wxPaintEvent &WXUNUSED(aEvent))
GAL not used (the legacy wxDC engine is used)
static const int MinRefreshPeriod
60 FPS.
std::unique_ptr< KIGFX::PAINTER > m_painter
Contains information about how to draw items using GAL.
virtual void SetTopLayer(int aLayer)
Move the selected layer to the top, so it is displayed above all others.
void SetStealsFocus(bool aStealsFocus)
Set whether focus is taken on certain events (mouseover, keys, etc).
std::unique_ptr< PROF_COUNTER > m_PaintEventCounter
An interface for classes handling user events controlling the view behavior such as zooming,...
EDA_DRAW_PANEL_GAL(wxWindow *aParentWindow, wxWindowID aWindowId, const wxPoint &aPosition, const wxSize &aSize, KIGFX::GAL_DISPLAY_OPTIONS &aOptions, GAL_TYPE aGalType=GAL_TYPE_OPENGL)
Create a drawing panel that is contained inside aParentWindow.
KIGFX::GAL * GetGAL() const
Return a pointer to the GAL instance used in the panel.
bool m_lostFocus
Flag to indicate that focus should be regained on the next mouse event.
virtual KIGFX::VIEW * GetView() const
Return a pointer to the #VIEW instance used in the panel.
virtual void SetFocus() override
virtual void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList)
EDA_DRAW_FRAME * m_edaFrame
Parent EDA_DRAW_FRAME (if available)
void onSize(wxSizeEvent &aEvent)
void StartDrawing()
Begin drawing if it was stopped previously.
TOOL_DISPATCHER * m_eventDispatcher
Processes and forwards events to tools.
wxTimer m_onShowTimer
Timer used to execute OnShow() when the window finally appears on the screen.
bool m_MouseCapturedLost
used on wxMSW: true after a wxEVT_MOUSE_CAPTURE_LOST was received false after the mouse is recaptured...
std::shared_ptr< KIGFX::VIEW_OVERLAY > m_debugOverlay
Optional overlay for drawing transient debug objects.
KIGFX::VIEW * m_view
Stores view settings (scale, center, etc.) and items to be drawn.
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:191
void SetEventDispatcher(TOOL_DISPATCHER *aEventDispatcher)
Set a dispatcher that processes events and forwards them to tools.
EDA_DRAW_FRAME * GetParentEDAFrame() const
Returns parent EDA_DRAW_FRAME, if available or NULL otherwise.
bool m_drawingEnabled
Flag that determines if VIEW may use GAL for redrawing the screen.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
Update the board display after modifying it by a python script (note: it is automatically called by a...
wxLongLong m_lastRefresh
Last timestamp when the panel was refreshed.
GAL_TYPE GetBackend() const
Return the type of backend currently used by GAL canvas.
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:68
bool m_stealsFocus
Flag to indicate whether the panel should take focus at certain times (when moused over,...
Message panel definition file.
std::shared_ptr< KIGFX::VIEW_OVERLAY > DebugOverlay()
Create an overlay for rendering debug graphics.
virtual BOX2I GetDefaultViewBBox() const
Return the bounding box of the view that should be used if model is not valid.
void StopDrawing()
Prevent the GAL canvas from further drawing until it is recreated or StartDrawing() is called.
Abstract interface for drawing on a 2D-surface.