KiCad PCB EDA Suite
Loading...
Searching...
No Matches
cvpcb_control.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) 2019 Ian McInerney <[email protected]>
5 * Copyright (C) 2023 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software: you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation, either version 3 of the License, or (at your
10 * option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20
21#include <confirm.h>
22#include <cstdint>
23#include <functional>
24#include <kiface_base.h>
25#include <kiway_express.h>
26#include <lib_id.h>
27#include <tool/actions.h>
28#include <tool/tool_manager.h>
29
30#include <cvpcb_mainframe.h>
33#include <listboxes.h>
34#include <tools/cvpcb_actions.h>
35#include <tools/cvpcb_control.h>
36#include <wx/settings.h>
37
38using namespace std::placeholders;
39
40
42 TOOL_INTERACTIVE( "cvpcb.Control" ),
43 m_frame( nullptr )
44{
45}
46
47
49{
50 m_frame = getEditFrame<CVPCB_MAINFRAME>();
51}
52
53
54int CVPCB_CONTROL::Main( const TOOL_EVENT& aEvent )
55{
56 // Main loop: keep receiving events
57 while( TOOL_EVENT* evt = Wait() )
58 {
59 bool handled = false;
60
61 // The escape key maps to the cancel event, which is used to close the window
62 if( evt->IsCancel() )
63 {
64 m_frame->Close( false );
65 handled = true;
66 }
67 else if( evt->IsKeyPressed() )
68 {
69 switch( evt->KeyCode() )
70 {
71 // The right arrow moves focus to the focusable object to the right
72 case WXK_RIGHT:
74 handled = true;
75 break;
76
77 // The left arrow moves focus to the focusable object to the left
78 case WXK_LEFT:
80 handled = true;
81 break;
82
83 default:
84 // Let every other key continue processing to the controls of the window
85 break;
86 }
87 }
88
89 if( !handled )
90 evt->SetPassEvent();
91 }
92
93 return 0;
94}
95
96
98{
99 int tmp = aEvent.Parameter<intptr_t>();
101 static_cast<CVPCB_MAINFRAME::FOCUS_DIR>( tmp );
102
103 switch( dir )
104 {
106 switch( m_frame->GetFocusedControl() )
107 {
110 break;
111
114 break;
115
118 break;
119
121 default:
122 break;
123 }
124
125 break;
126
128 switch( m_frame->GetFocusedControl() )
129 {
132 break;
133
136 break;
137
140 break;
141
143 default:
144 break;
145 }
146
147 break;
148
149 default:
150 break;
151 }
152
153 return 0;
154}
155
156
158{
159
161
162 if( !fpframe )
163 {
164 // DISPLAY_FOOTPRINTS_FRAME needs a PCBNEW_SETTINGS because most of its settings
165 // come from it, and needs _pcbnew.dll/so code. So load it if the dll is not yet loaded
166 // (for instance if the board editor was never loaded)
167 if( !m_frame->Kiway().KiFACE( KIWAY::FACE_PCB, false ) )
168 {
169 try
170 {
172 }
173 catch( ... )
174 {
175 // _pcbnew.dll/so is not available (install problem).
176 }
177 }
178
180 m_frame );
181 if( !fpframe )
182 {
183 wxMessageBox( _( "Unable to create the footprint viewer frame" ) );
184 return 0;
185 }
186
187 fpframe->Show( true );
188 }
189 else
190 {
191 if( wxWindow* blocking_win = fpframe->Kiway().GetBlockingDialog() )
192 blocking_win->Close( true );
193
194 if( fpframe->IsIconized() )
195 fpframe->Iconize( false );
196
197 // The display footprint window might be buried under some other
198 // windows, so CreateScreenCmp() on an existing window would not
199 // show any difference, leaving the user confused.
200 // So we want to put it to front, second after our CVPCB_MAINFRAME.
201 // We do this by a little dance of bringing it to front then the main
202 // frame back.
203 wxWindow* focus = m_frame->FindFocus();
204
205 fpframe->Raise(); // Make sure that is visible.
206 m_frame->Raise(); // .. but still we want the focus.
207
208 if( focus )
209 focus->SetFocus();
210 }
211
212 fpframe->InitDisplay();
213
214 return 0;
215}
216
217
219{
221 static_cast<FOOTPRINTS_LISTBOX::FP_FILTER_T>( aEvent.Parameter<intptr_t>() ),
223
224 return 0;
225}
226
227
229{
231 dlg.ShowModal();
232
233 return 0;
234}
235
236
238{
240 return 0;
241}
242
243
245{
247 return 0;
248}
249
250
251int CVPCB_CONTROL::ToNA( const TOOL_EVENT& aEvent )
252{
253 int tmp = aEvent.Parameter<intptr_t>();
255 static_cast<CVPCB_MAINFRAME::ITEM_DIR>( tmp );
256
257 std::vector<unsigned int> naComp = m_frame->GetComponentIndices( CVPCB_MAINFRAME::NA_COMPONENTS );
258 std::vector<unsigned int> tempSel = m_frame->GetComponentIndices( CVPCB_MAINFRAME::SEL_COMPONENTS );
259
260 // No unassociated components
261 if( naComp.empty() )
262 return 0;
263
264 // Extract the current selection
265 bool changeSel = false;
266 unsigned int newSel = UINT_MAX;
267
268 switch( dir )
269 {
271 if( !tempSel.empty() )
272 newSel = tempSel.front();
273
274 // Find the next index in the component list
275 for( unsigned int idx : naComp )
276 {
277 if( idx > newSel )
278 {
279 changeSel = true;
280 newSel = idx;
281 break;
282 }
283 }
284
285 break;
286
288 if( !tempSel.empty() )
289 {
290 newSel = tempSel.front();
291
292 // Find the previous index in the component list
293 for( int jj = naComp.size()-1; jj >= 0; jj-- )
294 {
295 unsigned idx = naComp[jj];
296
297 if( idx < newSel )
298 {
299 changeSel = true;
300 newSel = idx;
301 break;
302 }
303 }
304 }
305
306 break;
307
308 default:
309 wxASSERT_MSG( false, "Invalid direction" );
310 }
311
312 // Set the new component selection
313 if( changeSel )
314 m_frame->SetSelectedComponent( newSel );
315
316 return 0;
317}
318
319
321{
322 ACTION_MENU* actionMenu = aEvent.Parameter<ACTION_MENU*>();
323 CONDITIONAL_MENU* conditionalMenu = dynamic_cast<CONDITIONAL_MENU*>( actionMenu );
324 SELECTION dummySel;
325
326 if( conditionalMenu )
327 conditionalMenu->Evaluate( dummySel );
328
329 if( actionMenu )
330 actionMenu->UpdateAll();
331
332 return 0;
333}
334
335
337{
338 // Control actions
343
344 // Run the footprint viewer
346
347 // Management actions
351
352 // Navigation actions
355
356 // Filter the footprints
360}
static TOOL_ACTION updateMenu
Definition: actions.h:172
Defines the structure of a menu based on ACTIONs.
Definition: action_menu.h:49
void UpdateAll()
Run update handlers for the menu and its submenus.
static TOOL_ACTION showEquFileTable
Definition: cvpcb_actions.h:58
static TOOL_ACTION gotoPreviousNA
Navigate the component tree.
Definition: cvpcb_actions.h:52
static TOOL_ACTION changeFocusLeft
Definition: cvpcb_actions.h:46
static TOOL_ACTION gotoNextNA
Definition: cvpcb_actions.h:53
static TOOL_ACTION saveAssociationsToFile
Definition: cvpcb_actions.h:57
static TOOL_ACTION FilterFPbyLibrary
Definition: cvpcb_actions.h:69
static TOOL_ACTION filterFPbyPin
Definition: cvpcb_actions.h:68
static TOOL_ACTION changeFocusRight
Window control actions.
Definition: cvpcb_actions.h:45
static TOOL_ACTION controlActivate
Definition: cvpcb_actions.h:42
static TOOL_ACTION FilterFPbyFPFilters
Footprint Filtering actions.
Definition: cvpcb_actions.h:67
static TOOL_ACTION saveAssociationsToSchematic
Management actions.
Definition: cvpcb_actions.h:56
static TOOL_ACTION showFootprintViewer
Open the footprint viewer.
Definition: cvpcb_actions.h:49
CVPCB_MAINFRAME * m_frame
int SaveAssociationsToFile(const TOOL_EVENT &aEvent)
Save the associations to the schematic and save schematic to file.
int Main(const TOOL_EVENT &aEvent)
Main processing loop for the CVPCB window.
void setTransitions() override
This method is meant to be overridden in order to specify handlers for events.
int SaveAssociationsToSchematic(const TOOL_EVENT &aEvent)
Save the associations to the schematic.
int UpdateMenu(const TOOL_EVENT &aEvent)
Update the menu to reflect the current tool states.
int ShowFootprintViewer(const TOOL_EVENT &aEvent)
Create or Update the frame showing the current highlighted footprint and (if showed) the 3D display f...
void Reset(RESET_REASON aReason) override
Bring the tool to a known, initial state.
int ChangeFocus(const TOOL_EVENT &aEvent)
Rotate focus in the CVPCB window.
int ShowEquFileTable(const TOOL_EVENT &aEvent)
Show the dialog to modify the included footprint association files (.equ)
int ToNA(const TOOL_EVENT &aEvent)
Move the selected component to the not associated one in the specified direction.
int ToggleFootprintFilter(const TOOL_EVENT &aEvent)
Filter the footprint list by toggling the given filter type.
ITEM_DIR
Directions to move when selecting items.
@ ITEM_NEXT
The next item.
@ ITEM_PREV
The previous item.
CVPCB_MAINFRAME::CONTROL_TYPE GetFocusedControl() const
Find out which control currently has focus.
@ FILTER_TOGGLE
Toggle the filter state.
DISPLAY_FOOTPRINTS_FRAME * GetFootprintViewerFrame() const
void SetFootprintFilter(FOOTPRINTS_LISTBOX::FP_FILTER_T aFilter, CVPCB_MAINFRAME::CVPCB_FILTER_ACTION aAction)
Set a filter criteria to either on/off or toggle the criteria.
void SetSelectedComponent(int aIndex, bool aSkipUpdate=false)
Set the currently selected component in the components listbox.
@ CONTROL_NONE
No controls have focus.
@ CONTROL_LIBRARY
Library listbox.
@ CONTROL_FOOTPRINT
Footprint listbox.
@ CONTROL_COMPONENT
Component listbox.
void SetFocusedControl(CVPCB_MAINFRAME::CONTROL_TYPE aControl)
Set the focus to a specific control.
std::vector< unsigned int > GetComponentIndices(CVPCB_MAINFRAME::CRITERIA aCriteria=CVPCB_MAINFRAME::ALL_COMPONENTS)
Get the indices for all the components meeting the specified criteria in the components listbox.
@ NA_COMPONENTS
Not associated components.
@ SEL_COMPONENTS
Selected components.
bool SaveFootprintAssociation(bool doSaveSchematic)
Save the edits that the user has done by sending them back to Eeschema via the kiway.
FOCUS_DIR
Directions to rotate the focus through the listboxes is.
void InitDisplay()
Refresh the full display for this frame: Set the title, the status line and redraw the canvas Must be...
FP_FILTER_T
Filter setting constants.
Definition: listboxes.h:93
KIWAY & Kiway() const
Return a reference to the KIWAY that this object has an opportunity to participate in.
Definition: kiway_holder.h:53
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition: kiway.cpp:432
wxWindow * GetBlockingDialog()
Gets the window pointer to the blocking dialog (to send it signals)
Definition: kiway.cpp:685
virtual KIFACE * KiFACE(FACE_T aFaceId, bool doLoad=true)
Return the KIFACE* given a FACE_T.
Definition: kiway.cpp:202
@ FACE_PCB
pcbnew DSO
Definition: kiway.h:287
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:216
RESET_REASON
Determine the reason of reset for a tool.
Definition: tool_base.h:78
Generic, UI-independent tool event.
Definition: tool_event.h:156
T Parameter() const
Return a non-standard parameter assigned to the event.
Definition: tool_event.h:442
void Go(int(T::*aStateFunc)(const TOOL_EVENT &), const TOOL_EVENT_LIST &aConditions=TOOL_EVENT(TC_ANY, TA_ANY))
Define which state (aStateFunc) to go when a certain event arrives (aConditions).
TOOL_EVENT * Wait(const TOOL_EVENT_LIST &aEventList=TOOL_EVENT(TC_ANY, TA_ANY))
Suspend execution of the tool until an event specified in aEventList arrives.
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Run the specified action.
Definition: tool_manager.h:142
This file is part of the common library.
#define _(s)
@ FRAME_CVPCB_DISPLAY
Definition: frame_type.h:49