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-2022 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#include <mutex>
39
40#include <gal/cursors.h>
41
42class BOARD;
43class EDA_DRAW_FRAME;
44class TOOL_DISPATCHER;
45class PROF_COUNTER;
46
47namespace KIGFX
48{
49class GAL;
50class VIEW;
51class WX_VIEW_CONTROLS;
52class VIEW_CONTROLS;
53class PAINTER;
54class GAL_DISPLAY_OPTIONS;
55class VIEW_OVERLAY;
56}
57
58
59class EDA_DRAW_PANEL_GAL : public wxScrolledCanvas
60{
61public:
62 enum GAL_TYPE {
68 };
69
70#ifdef __WXMAC__
71 // Cairo doesn't work on OSX so we really have no fallback available.
72 static constexpr GAL_TYPE GAL_FALLBACK = GAL_TYPE_OPENGL;
73#else
75#endif
76
85 EDA_DRAW_PANEL_GAL( wxWindow* aParentWindow, wxWindowID aWindowId,
86 const wxPoint& aPosition, const wxSize& aSize,
88 GAL_TYPE aGalType = GAL_TYPE_OPENGL );
90
91 void SetFocus() override;
92
94 {
95 return m_statusPopup && m_statusPopup->HasFocus();
96 }
97
98 void SetStatusPopup( wxWindow* aPopup )
99 {
100 m_statusPopup = aPopup;
101 }
102
108 virtual bool SwitchBackend( GAL_TYPE aGalType );
109
113 inline GAL_TYPE GetBackend() const { return m_backend; }
114
120 KIGFX::GAL* GetGAL() const { return m_gal; }
121
127 virtual KIGFX::VIEW* GetView() const { return m_view; }
128
135 {
137 }
138
140 virtual void Refresh( bool aEraseBackground = true, const wxRect* aRect = nullptr ) override;
141
145 void ForceRefresh();
146
155 void SetEventDispatcher( TOOL_DISPATCHER* aEventDispatcher );
156
160 void StartDrawing();
161
166 void StopDrawing();
167
171 virtual void SetHighContrastLayer( int aLayer );
172
176 virtual void SetTopLayer( int aLayer );
177
178 virtual void GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
179 {
180 wxASSERT( false );
181 }
182
187
188 bool IsDialogPreview() const { return m_parent != (wxWindow*) m_edaFrame; }
189
193 virtual void OnShow() {}
194
201 void SetStealsFocus( bool aStealsFocus ) { m_stealsFocus = aStealsFocus; }
202
206 void SetCurrentCursor( KICURSOR aCursor );
207
214 virtual BOX2I GetDefaultViewBBox() const { return BOX2I(); }
215
219 void OnEvent( wxEvent& aEvent );
220
228 void DoRePaint();
229
233 std::shared_ptr<KIGFX::VIEW_OVERLAY> DebugOverlay();
234
235
239 void ClearDebugOverlay();
240
247
248 std::unique_ptr<PROF_COUNTER> m_PaintEventCounter;
249
250protected:
251 virtual void onPaint( wxPaintEvent& WXUNUSED( aEvent ) );
252 void onSize( wxSizeEvent& aEvent );
253 void onEnter( wxMouseEvent& aEvent );
254 void onLostFocus( wxFocusEvent& aEvent );
255 void onRefreshTimer( wxTimerEvent& aEvent );
256 void onShowTimer( wxTimerEvent& aEvent );
257
258 static const int MinRefreshPeriod = 17;
259
260 wxWindow* m_parent;
262
263 wxLongLong m_lastRefresh;
266
267 std::mutex m_refreshMutex;
268
271
274
277
280
283
285 std::unique_ptr<KIGFX::PAINTER> m_painter;
286
289
293
296
300
304
305 wxWindow* m_statusPopup;
306
308 std::shared_ptr<KIGFX::VIEW_OVERLAY> m_debugOverlay;
309};
310
311#endif
BOX2< VECTOR2I > BOX2I
Definition: box2.h:847
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:265
The base class for create windows for drawing purpose.
std::unique_ptr< PROF_COUNTER > m_PaintEventCounter
EDA_DRAW_FRAME * m_edaFrame
Parent EDA_DRAW_FRAME (if available)
virtual void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList)
void onLostFocus(wxFocusEvent &aEvent)
static constexpr GAL_TYPE GAL_FALLBACK
std::unique_ptr< KIGFX::PAINTER > m_painter
Contains information about how to draw items using GAL.
void onSize(wxSizeEvent &aEvent)
GAL_TYPE GetBackend() const
Return the type of backend currently used by GAL canvas.
virtual void SetHighContrastLayer(int aLayer)
Take care of display settings for the given layer to be displayed in high contrast mode.
bool m_stealsFocus
Flag to indicate whether the panel should take focus at certain times (when moused over,...
virtual BOX2I GetDefaultViewBBox() const
Return the bounding box of the view that should be used if model is not valid.
KIGFX::GAL_DISPLAY_OPTIONS & m_options
void StopDrawing()
Prevent the GAL canvas from further drawing until it is recreated or StartDrawing() is called.
KIGFX::VIEW_CONTROLS * GetViewControls() const
Return a pointer to the #VIEW_CONTROLS instance used in the panel.
virtual void SetTopLayer(int aLayer)
Move the selected layer to the top, so it is displayed above all others.
void ClearDebugOverlay()
Clear the contents of the debug overlay and removes it from the VIEW.
virtual KIGFX::VIEW * GetView() const
Return a pointer to the #VIEW instance used in the panel.
void ForceRefresh()
Force a redraw.
bool m_drawing
True if GAL is currently redrawing the view.
void onShowTimer(wxTimerEvent &aEvent)
KIGFX::GAL * m_gal
Interface for drawing objects on a 2D-surface.
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.
wxLongLong m_lastRefresh
Last timestamp when the panel was refreshed.
bool m_pendingRefresh
Is there a redraw event requested?
void onRefreshTimer(wxTimerEvent &aEvent)
void SetCurrentCursor(KICURSOR aCursor)
Set the current cursor shape for this panel.
virtual void onPaint(wxPaintEvent &WXUNUSED(aEvent))
bool m_lostFocus
Flag to indicate that focus should be regained on the next mouse event.
virtual void OnShow()
Called when the window is shown for the first time.
std::shared_ptr< KIGFX::VIEW_OVERLAY > m_debugOverlay
Optional overlay for drawing transient debug objects.
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...
wxTimer m_refreshTimer
Timer to prevent too-frequent refreshing.
TOOL_DISPATCHER * m_eventDispatcher
Processes and forwards events to tools.
wxWindow * m_parent
Pointer to the parent window.
@ GAL_TYPE_LAST
Sentinel, do not use as a parameter.
@ GAL_TYPE_UNKNOWN
not specified: a GAL engine must be set by the client
@ GAL_TYPE_OPENGL
OpenGL implementation.
@ GAL_TYPE_CAIRO
Cairo implementation.
@ GAL_TYPE_NONE
GAL not used (the legacy wxDC engine is used)
KIGFX::VIEW * m_view
Stores view settings (scale, center, etc.) and items to be drawn.
bool m_MouseCapturedLost
used on wxMSW: true after a wxEVT_MOUSE_CAPTURE_LOST was received false after the mouse is recaptured...
KIGFX::WX_VIEW_CONTROLS * m_viewControls
Control for VIEW (moving, zooming, etc.)
KIGFX::GAL * GetGAL() const
Return a pointer to the GAL instance used in the panel.
void SetFocus() override
static const int MinRefreshPeriod
60 FPS.
void DoRePaint()
Repaint the canvas, and fix scrollbar cursors.
void SetEventDispatcher(TOOL_DISPATCHER *aEventDispatcher)
Set a dispatcher that processes events and forwards them to tools.
void onEnter(wxMouseEvent &aEvent)
void SetStatusPopup(wxWindow *aPopup)
std::mutex m_refreshMutex
Blocks multiple calls to the draw.
virtual bool SwitchBackend(GAL_TYPE aGalType)
Switch method of rendering graphics.
void StartDrawing()
Begin drawing if it was stopped previously.
void OnEvent(wxEvent &aEvent)
Used to forward events to the canvas from popups, etc.
void SetStealsFocus(bool aStealsFocus)
Set whether focus is taken on certain events (mouseover, keys, etc).
bool m_drawingEnabled
Flag that determines if VIEW may use GAL for redrawing the screen.
std::shared_ptr< KIGFX::VIEW_OVERLAY > DebugOverlay()
Create an overlay for rendering debug graphics.
GAL_TYPE m_backend
Currently used GAL.
wxTimer m_onShowTimer
Timer used to execute OnShow() when the window finally appears on the screen.
EDA_DRAW_FRAME * GetParentEDAFrame() const
Returns parent EDA_DRAW_FRAME, if available or NULL otherwise.
Abstract interface for drawing on a 2D-surface.
An interface for classes handling user events controlling the view behavior such as zooming,...
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:69
An implementation of class VIEW_CONTROLS for wxWidgets library.
A thread-safe event counter.
Definition: profile.h:226
KICURSOR
Definition: cursors.h:34
Message panel definition file.
The Cairo implementation of the graphics abstraction layer.
Definition: color4d.cpp:266