KiCad PCB EDA Suite
Loading...
Searching...
No Matches
pcb_base_edit_frame.cpp
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) 2014 CERN
5 * Copyright (C) 2020-2023 KiCad Developers, see AUTHORS.txt for contributors.
6 * @author Maciej Suminski <[email protected]>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, you may find one here:
20 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21 * or you may search the http://www.gnu.org website for the version 2 license,
22 * or you may write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24 */
25
26#include <kiface_base.h>
27#include <kiplatform/ui.h>
28#include <pcb_base_edit_frame.h>
30#include <tool/tool_manager.h>
31#include <tools/pcb_actions.h>
33#include <pgm_base.h>
34#include <board.h>
37#include <pcb_dimension.h>
38#include <footprint.h>
39#include <footprint_info_impl.h>
40#include <layer_pairs.h>
41#include <project.h>
49
50
52 FRAME_T aFrameType, const wxString& aTitle,
53 const wxPoint& aPos, const wxSize& aSize, long aStyle,
54 const wxString& aFrameName ) :
55 PCB_BASE_FRAME( aKiway, aParent, aFrameType, aTitle, aPos, aSize, aStyle, aFrameName ),
56 m_undoRedoBlocked( false ),
57 m_selectionFilterPanel( nullptr ),
58 m_appearancePanel( nullptr ),
59 m_tabbedPanel( nullptr )
60{
62
63 Bind( wxEVT_IDLE,
64 [this]( wxIdleEvent& aEvent )
65 {
66 // Handle cursor adjustments. While we can get motion and key events through
67 // wxWidgets, we can't get modifier-key-up events.
68 if( m_toolManager )
69 {
71
72 if( selTool )
73 selTool->OnIdle( aEvent );
74 }
75
77 {
80 }
81 } );
82}
83
84
86{
87 GetCanvas()->GetView()->Clear();
88}
89
90
92{
94 wxFileName projectName( Prj().GetProjectFullName() );
95
96 if( mgr->IsProjectOpen() && wxFileName::IsDirWritable( projectName.GetPath() )
97 && projectName.Exists() )
98 {
99 GFootprintList.WriteCacheToFile( Prj().GetProjectPath() + wxT( "fp-info-cache" ) );
100 }
101
102 // Close the project if we are standalone, so it gets cleaned up properly
103 if( mgr->IsProjectOpen() && Kiface().IsSingle() )
104 mgr->UnloadProject( &Prj(), false );
105}
106
107
108bool PCB_BASE_EDIT_FRAME::TryBefore( wxEvent& aEvent )
109{
110 static bool s_presetSwitcherShown = false;
111 static bool s_viewportSwitcherShown = false;
112
113 // wxWidgets generates no key events for the tab key when the ctrl key is held down. One
114 // way around this is to look at all events and inspect the keyboard state of the tab key.
115 // However, this runs into issues on some linux VMs where querying the keyboard state is
116 // very slow. Fortunately we only use ctrl-tab on Mac, so we implement this lovely hack:
117#ifdef __WXMAC__
118 if( wxGetKeyState( WXK_TAB ) )
119#else
120 if( ( aEvent.GetEventType() == wxEVT_CHAR || aEvent.GetEventType() == wxEVT_CHAR_HOOK )
121 && static_cast<wxKeyEvent&>( aEvent ).GetKeyCode() == WXK_TAB )
122#endif
123 {
124 if( !s_presetSwitcherShown && wxGetKeyState( PRESET_SWITCH_KEY ) )
125 {
126 if( m_appearancePanel && this->IsActive() )
127 {
128 const wxArrayString& mru = m_appearancePanel->GetLayerPresetsMRU();
129
130 if( mru.size() > 0 )
131 {
132 EDA_VIEW_SWITCHER switcher( this, mru, PRESET_SWITCH_KEY );
133
134 s_presetSwitcherShown = true;
135 const int switcherDialogRet = switcher.ShowModal();
136 s_presetSwitcherShown = false;
137
138 if( switcherDialogRet == wxID_OK )
139 {
140 int idx = switcher.GetSelection();
141
142 if( idx >= 0 && idx < (int) mru.size() )
144 }
145
146 return true;
147 }
148 }
149 }
150 else if( !s_viewportSwitcherShown && wxGetKeyState( VIEWPORT_SWITCH_KEY ) )
151 {
152 if( m_appearancePanel && this->IsActive() )
153 {
154 const wxArrayString& mru = m_appearancePanel->GetViewportsMRU();
155
156 if( mru.size() > 0 )
157 {
158 EDA_VIEW_SWITCHER switcher( this, mru, VIEWPORT_SWITCH_KEY );
159
160 s_viewportSwitcherShown = true;
161 const int switcherDialogRet = switcher.ShowModal();
162 s_viewportSwitcherShown = false;
163
164 if( switcherDialogRet == wxID_OK )
165 {
166 int idx = switcher.GetSelection();
167
168 if( idx >= 0 && idx < (int) mru.size() )
169 m_appearancePanel->ApplyViewport( mru[idx] );
170 }
171
172 return true;
173 }
174 }
175 }
176 }
177
178 return PCB_BASE_FRAME::TryBefore( aEvent );
179}
180
181
183{
184 // Return a default angle (90 degrees) used for rotate operations.
185 return ANGLE_90;
186}
187
188
190{
192
194}
195
196
198{
199 bool is_new_board = ( aBoard != m_pcb );
200
201 if( is_new_board )
202 {
203 if( m_toolManager )
205
206 GetCanvas()->GetView()->Clear();
208 }
209
210 PCB_BASE_FRAME::SetBoard( aBoard, aReporter );
211
213
214 if( is_new_board )
215 {
217 bds.m_DRCEngine = std::make_shared<DRC_ENGINE>( aBoard, &bds );
218 }
219
220 // update the tool manager with the new board and its view.
221 if( m_toolManager )
222 {
223 GetCanvas()->DisplayBoard( aBoard, aReporter );
224
226 m_toolManager->SetEnvironment( aBoard, GetCanvas()->GetView(),
227 GetCanvas()->GetViewControls(), config(), this );
228
229 if( is_new_board )
231 }
232}
233
234
236{
238
239 if( BOARD* board = GetBoard() )
240 {
241 board->UpdateUserUnits( board, GetCanvas()->GetView() );
243 }
244
247}
248
249
251{
253
254 // Update the grid checkbox in the layer widget
257}
258
259
261{
263 m_appearancePanel->SetObjectVisible( aLayer, aVisible );
264}
265
266
268{
269 return Pgm().GetSettingsManager().GetColorSettings( GetPcbNewSettings()->m_ColorTheme );
270}
271
272
274{
275 if( !GetBoard() )
276 return wxEmptyString;
277
278 wxFileName fn = GetBoard()->GetFileName();
280 return Prj().AbsolutePath( fn.GetFullName() );
281}
282
283
284void PCB_BASE_EDIT_FRAME::handleActivateEvent( wxActivateEvent& aEvent )
285{
287
288 // The text in the collapsible pane headers need to be updated
291}
292
293
295{
297
299
300 if( viewer )
301 viewer->OnDarkModeToggle();
302}
303
304
306{
307 if( !m_propertiesPanel )
308 return;
309
310 bool show = !m_propertiesPanel->IsShownOnScreen();
311
312 wxAuiPaneInfo& propertiesPaneInfo = m_auimgr.GetPane( PropertiesPaneName() );
313 propertiesPaneInfo.Show( show );
314
316
317 if( show )
318 {
319 SetAuiPaneSize( m_auimgr, propertiesPaneInfo,
320 settings->m_AuiPanels.properties_panel_width, -1 );
321 }
322 else
323 {
325 m_auimgr.Update();
326 }
327}
328
329
330void PCB_BASE_EDIT_FRAME::GetContextualTextVars( BOARD_ITEM* aSourceItem, const wxString& aCrossRef,
331 wxArrayString* aTokens )
332{
333 BOARD* board = aSourceItem->GetBoard();
334
335 if( !aCrossRef.IsEmpty() )
336 {
337 for( FOOTPRINT* candidate : board->Footprints() )
338 {
339 if( candidate->GetReference() == aCrossRef )
340 {
341 candidate->GetContextualTextVars( aTokens );
342 break;
343 }
344 }
345 }
346 else
347 {
348 board->GetContextualTextVars( aTokens );
349
350 if( FOOTPRINT* footprint = aSourceItem->GetParentFootprint() )
351 footprint->GetContextualTextVars( aTokens );
352 }
353}
354
355
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
void ApplyLayerPreset(const wxString &aPresetName)
const wxArrayString & GetViewportsMRU()
void RefreshCollapsiblePanes()
Function to force a redraw of the collapsible panes in this control.
const wxArrayString & GetLayerPresetsMRU()
Return a list of viewports created by the user.
void OnDarkModeToggle()
Update the widget when the active board layer is changed.
void SetObjectVisible(GAL_LAYER_ID aLayer, bool isVisible=true)
void ApplyViewport(const wxString &aPresetName)
Container for design settings for a BOARD object.
std::shared_ptr< DRC_ENGINE > m_DRCEngine
const VECTOR2I & GetGridOrigin()
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:79
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
Definition: board_item.cpp:47
FOOTPRINT * GetParentFootprint() const
Definition: board_item.cpp:298
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:290
void GetContextualTextVars(wxArrayString *aVars) const
Definition: board.cpp:407
const FOOTPRINTS & Footprints() const
Definition: board.h:331
const wxString & GetFileName() const
Definition: board.h:327
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition: board.cpp:892
Color settings are a bit different than most of the settings objects in that there can be more than o...
int ShowModal() override
Create and handle a window for the 3d viewer connected to a Kiway and a pcbboard.
virtual APP_SETTINGS_BASE * config() const
Returns the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
SETTINGS_MANAGER * GetSettingsManager() const
wxAuiManager m_auimgr
static const wxString PropertiesPaneName()
virtual void ReCreateAuxiliaryToolbar()
virtual void SetGridVisibility(bool aVisible)
PROPERTIES_PANEL * m_propertiesPanel
KIGFX::GAL * GetGAL() const
Return a pointer to the GAL instance used in the panel.
int GetSelection() const
static const TOOL_EVENT SelectedItemsModified
Selected items were moved, this can be very high frequency on the canvas, use with care.
Definition: actions.h:299
void WriteCacheToFile(const wxString &aFilePath) override
void SetGridOrigin(const VECTOR2D &aGridOrigin)
Set the origin point for the grid.
void Clear()
Remove all items from the view.
Definition: view.cpp:1117
void InitPreview()
Definition: view.cpp:1696
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition: kiway.h:284
AUI_PANELS m_AuiPanels
COLOR_SETTINGS * GetColorSettings(bool aForceRefresh=false) const override
Helper to retrieve the current color settings.
wxString GetDesignRulesPath()
Return the absolute path to the design rules file for the currently-loaded board.
bool m_darkMode
Panel with Layers and Object Inspector tabs.
void doCloseWindow() override
void SetGridVisibility(bool aVisible) override
Override this function in the PCB_BASE_EDIT_FRAME to refill the layer widget.
virtual EDA_ANGLE GetRotationAngle() const
Return the angle used for rotate operations.
void unitsChangeRefresh() override
Called when when the units setting has changed to allow for any derived classes to handle refreshing ...
bool TryBefore(wxEvent &aEvent) override
virtual void SetBoard(BOARD *aBoard, PROGRESS_REPORTER *aReporter=nullptr) override
Set the #m_Pcb member in such as way as to ensure deleting any previous BOARD.
void ToggleProperties() override
PCB_BASE_EDIT_FRAME(KIWAY *aKiway, wxWindow *aParent, FRAME_T aFrameType, const wxString &aTitle, const wxPoint &aPos, const wxSize &aSize, long aStyle, const wxString &aFrameName)
APPEARANCE_CONTROLS * m_appearancePanel
void SetObjectVisible(GAL_LAYER_ID aLayer, bool aVisible=true)
void GetContextualTextVars(BOARD_ITEM *aSourceItem, const wxString &aCrossRef, wxArrayString *aTokens)
void handleActivateEvent(wxActivateEvent &aEvent) override
Handle a window activation event.
virtual void onDarkModeToggle()
void ActivateGalCanvas() override
Set the #m_Pcb member in such as way as to ensure deleting any previous BOARD.
Base PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.
void handleActivateEvent(wxActivateEvent &aEvent) override
Handle a window activation event.
virtual void unitsChangeRefresh() override
Called when when the units setting has changed to allow for any derived classes to handle refreshing ...
PCBNEW_SETTINGS * GetPcbNewSettings() const
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
virtual void ActivateGalCanvas() override
Use to start up the GAL drawing canvas.
virtual void SetBoard(BOARD *aBoard, PROGRESS_REPORTER *aReporter=nullptr)
Set the #m_Pcb member in such as way as to ensure deleting any previous BOARD.
BOARD * GetBoard() const
EDA_3D_VIEWER_FRAME * Get3DViewerFrame()
void UpdateColors()
Update the color settings in the painter and GAL.
virtual KIGFX::PCB_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
void DisplayBoard(BOARD *aBoard, PROGRESS_REPORTER *aReporter=nullptr)
Add all items from the current board to the VIEW, so they can be displayed by GAL.
void SyncLayersVisibility(const BOARD *aBoard)
Update "visibility" property of each layer of a given BOARD.
The selection tool: currently supports:
void OnIdle(wxIdleEvent &aEvent)
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition: pgm_base.h:142
A progress reporter interface for use in multi-threaded environments.
virtual const wxString AbsolutePath(const wxString &aFileName) const
Fix up aFileName if it is relative to the project's directory to be an absolute path and filename.
Definition: project.cpp:359
COLOR_SETTINGS * GetColorSettings(const wxString &aName="user")
Retrieves a color settings object that applications can read colors from.
bool IsProjectOpen() const
Helper for checking if we have a project open TODO: This should be deprecated along with Prj() once w...
bool UnloadProject(PROJECT *aProject, bool aSave=true)
Saves, unloads and unregisters the given PROJECT.
TOOL_MANAGER * m_toolManager
Definition: tools_holder.h:167
@ MODEL_RELOAD
Model changes (the sheet for a schematic)
Definition: tool_base.h:80
void PostEvent(const TOOL_EVENT &aEvent)
Put an event to the event queue to be processed at the end of event processing cycle.
void ResetTools(TOOL_BASE::RESET_REASON aReason)
Reset all tools (i.e.
void SetEnvironment(EDA_ITEM *aModel, KIGFX::VIEW *aView, KIGFX::VIEW_CONTROLS *aViewControls, APP_SETTINGS_BASE *aSettings, TOOLS_HOLDER *aFrame)
Set the work environment (model, view, view controls and the parent window).
Declaration of the eda_3d_viewer class.
static constexpr EDA_ANGLE ANGLE_90
Definition: eda_angle.h:403
#define VIEWPORT_SWITCH_KEY
#define PRESET_SWITCH_KEY
FOOTPRINT_LIST_IMPL GFootprintList
The global footprint info table.
Definition: cvpcb.cpp:156
FRAME_T
The set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
Definition: frame_type.h:33
static const std::string DesignRulesFileExtension
PROJECT & Prj()
Definition: kicad.cpp:595
GAL_LAYER_ID
GAL layers are "virtual" layers, i.e.
Definition: layer_ids.h:191
@ LAYER_GRID
Definition: layer_ids.h:206
bool IsDarkTheme()
Determine if the desktop interface is currently using a dark theme or a light theme.
Definition: wxgtk/ui.cpp:48
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: pgm_base.cpp:1060
see class PGM_BASE
VECTOR2< double > VECTOR2D
Definition: vector2d.h:690
Definition of file extensions used in Kicad.
void SetAuiPaneSize(wxAuiManager &aManager, wxAuiPaneInfo &aPane, int aWidth, int aHeight)
Sets the size of an AUI pane, working around http://trac.wxwidgets.org/ticket/13180.