KiCad PCB EDA Suite
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 <Ian.S.McInerney@ieee.org>
5  * Copyright (C) 2019 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_i.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 
37 using namespace std::placeholders;
38 
39 
41  TOOL_INTERACTIVE( "cvpcb.Control" ),
42  m_frame( nullptr )
43 {
44 }
45 
46 
48 {
49  m_frame = getEditFrame<CVPCB_MAINFRAME>();
50 }
51 
52 
53 int CVPCB_CONTROL::Main( const TOOL_EVENT& aEvent )
54 {
55  // Main loop: keep receiving events
56  while( TOOL_EVENT* evt = Wait() )
57  {
58  bool handled = false;
59 
60  // The escape key maps to the cancel event, which is used to close the window
61  if( evt->IsCancel() )
62  {
63  wxCloseEvent dummy;
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  // This tool is supposed to be active forever
94  wxASSERT( false );
95 
96  return 0;
97 }
98 
99 
101 {
102  int tmp = aEvent.Parameter<intptr_t>();
104  static_cast<CVPCB_MAINFRAME::FOCUS_DIR>( tmp );
105 
106  switch( dir )
107  {
109  switch( m_frame->GetFocusedControl() )
110  {
113  break;
114 
117  break;
118 
121  break;
122 
124  default:
125  break;
126  }
127 
128  break;
129 
131  switch( m_frame->GetFocusedControl() )
132  {
135  break;
136 
139  break;
140 
143  break;
144 
146  default:
147  break;
148  }
149 
150  break;
151 
152  default:
153  break;
154  }
155 
156  return 0;
157 }
158 
159 
161 {
162 
164 
165  if( !fpframe )
166  {
168  FRAME_CVPCB_DISPLAY, true, m_frame );
169  fpframe->Show( true );
170  }
171  else
172  {
173  if( fpframe->IsIconized() )
174  fpframe->Iconize( false );
175 
176  // The display footprint window might be buried under some other
177  // windows, so CreateScreenCmp() on an existing window would not
178  // show any difference, leaving the user confused.
179  // So we want to put it to front, second after our CVPCB_MAINFRAME.
180  // We do this by a little dance of bringing it to front then the main
181  // frame back.
182  wxWindow* focus = m_frame->FindFocus();
183 
184  fpframe->Raise(); // Make sure that is visible.
185  m_frame->Raise(); // .. but still we want the focus.
186 
187  if( focus )
188  focus->SetFocus();
189  }
190 
191  fpframe->InitDisplay();
192 
193  return 0;
194 }
195 
196 
198 {
200  static_cast<FOOTPRINTS_LISTBOX::FP_FILTER_T>( aEvent.Parameter<intptr_t>() ),
202 
203  return 0;
204 }
205 
206 
208 {
210  dlg.ShowModal();
211 
212  return 0;
213 }
214 
215 
217 {
219  return 0;
220 }
221 
222 
223 int CVPCB_CONTROL::ToNA( const TOOL_EVENT& aEvent )
224 {
225  int tmp = aEvent.Parameter<intptr_t>();
227  static_cast<CVPCB_MAINFRAME::ITEM_DIR>( tmp );
228 
229  std::vector<unsigned int> naComp = m_frame->GetComponentIndices( CVPCB_MAINFRAME::NA_COMPONENTS );
230  std::vector<unsigned int> tempSel = m_frame->GetComponentIndices( CVPCB_MAINFRAME::SEL_COMPONENTS );
231 
232  // No unassociated components
233  if( naComp.empty() )
234  return 0;
235 
236  // Extract the current selection
237  unsigned int curSel = -1;
238  unsigned int newSel = -1;
239  switch( dir )
240  {
242  if( !tempSel.empty() )
243  newSel = tempSel.front();
244 
245  // Find the next index in the component list
246  for( unsigned int i : naComp )
247  {
248  if( i > newSel )
249  {
250  newSel = i;
251  break;
252  }
253  }
254 
255  break;
256 
258  if( !tempSel.empty() )
259  {
260  newSel = tempSel.front();
261  curSel = newSel - 1; // Break one before the current selection
262  }
263 
264  break;
265 
266  default:
267  wxASSERT_MSG( false, "Invalid direction" );
268  }
269 
270  // Find the next index in the component list
271  for( unsigned int i : naComp )
272  {
273  if( i >= curSel )
274  {
275  newSel = i;
276  break;
277  }
278  }
279 
280  // Set the component selection
281  m_frame->SetSelectedComponent( newSel );
282 
283  return 0;
284 }
285 
286 
288 {
289  ACTION_MENU* actionMenu = aEvent.Parameter<ACTION_MENU*>();
290  CONDITIONAL_MENU* conditionalMenu = dynamic_cast<CONDITIONAL_MENU*>( actionMenu );
291  SELECTION dummySel;
292 
293  if( conditionalMenu )
294  conditionalMenu->Evaluate( dummySel );
295 
296  if( actionMenu )
297  actionMenu->UpdateAll();
298 
299  return 0;
300 }
301 
302 
304 {
305  // Control actions
310 
311  // Run the footprint viewer
313 
314  // Management actions
317 
318  // Navigation actions
321 
322  // Filter the footprints
327 }
int ShowEquFileTable(const TOOL_EVENT &aEvent)
Show the dialog to modify the included footprint association files (.equ)
static TOOL_ACTION showFootprintViewer
Open the footprint viewer.
Definition: cvpcb_actions.h:52
void setTransitions() override
This method is meant to be overridden in order to specify handlers for events.
KIWAY & Kiway() const
Function Kiway returns a reference to the KIWAY that this object has an opportunity to participate in...
Definition: kiway_holder.h:56
TOOL_EVENT * Wait(const TOOL_EVENT_LIST &aEventList=TOOL_EVENT(TC_ANY, TA_ANY))
Function Wait()
static TOOL_ACTION showEquFileTable
Definition: cvpcb_actions.h:60
static TOOL_ACTION gotoNextNA
Definition: cvpcb_actions.h:56
Class ACTION_MENU.
Definition: action_menu.h:43
This file is part of the common library.
static TOOL_ACTION gotoPreviousNA
Navigate the component tree.
Definition: cvpcb_actions.h:55
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:219
CVPCB_MAINFRAME * m_frame
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Function RunAction() Runs the specified action.
Definition: tool_manager.h:109
static TOOL_ACTION filterFPbyDisplayName
Definition: cvpcb_actions.h:72
static TOOL_ACTION changeFocusLeft
Definition: cvpcb_actions.h:49
void SetFocusedControl(CVPCB_MAINFRAME::CONTROL_TYPE aControl)
Set the focus to a specific control.
static TOOL_ACTION changeFocusRight
Window control actions.
Definition: cvpcb_actions.h:48
int SaveAssociations(const TOOL_EVENT &aEvent)
Save the associations to the schematic.
void UpdateAll()
Function UpdateAll() Runs update handlers for the menu and its submenus.
void Go(int(T::*aStateFunc)(const TOOL_EVENT &), const TOOL_EVENT_LIST &aConditions=TOOL_EVENT(TC_ANY, TA_ANY))
Function Go()
Class DISPLAY_FOOTPRINTS_FRAME is used to display footprints.
int ToNA(const TOOL_EVENT &aEvent)
Move the selected component to the not associated one in the specified direction.
int ChangeFocus(const TOOL_EVENT &aEvent)
Rotate focus in the CVPCB window.
VTBL_ENTRY KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=NULL)
Function Player returns the KIWAY_PLAYER* given a FRAME_T.
Definition: kiway.cpp:321
void SetSelectedComponent(int aIndex, bool aSkipUpdate=false)
Set the currently selected component in the components listbox.
T Parameter() const
Function Parameter() Returns a non-standard parameter assigned to the event.
Definition: tool_event.h:427
Class TOOL_EVENT.
Definition: tool_event.h:168
void Reset(RESET_REASON aReason) override
Function Reset() Brings the tool to a known, initial state.
No controls have focus.
int ToggleFootprintFilter(const TOOL_EVENT &aEvent)
Filter the footprint list by toggling the given filter type.
static TOOL_ACTION updateMenu
Definition: actions.h:157
static TOOL_ACTION saveAssociations
Management actions.
Definition: cvpcb_actions.h:59
FOCUS_DIR
Directions to rotate the focus through the listboxes is.
void OnCloseWindow(wxCloseEvent &Event)
OnCloseWindow.
void InitDisplay()
Function InitDisplay Refresh the full display for this frame: Set the title, the status line and redr...
DISPLAY_FOOTPRINTS_FRAME * GetFootprintViewerFrame()
static LIB_PART * dummy()
Used to draw a dummy shape when a LIB_PART is not found in library.
static TOOL_ACTION filterFPbyPin
Definition: cvpcb_actions.h:70
static TOOL_ACTION controlActivate
Definition: cvpcb_actions.h:45
size_t i
Definition: json11.cpp:597
ITEM_DIR
Directions to move when selecting items.
Toggle the filter state.
int ShowFootprintViewer(const TOOL_EVENT &aEvent)
Create or Update the frame showing the current highlighted footprint and (if showed) the 3D display f...
int Main(const TOOL_EVENT &aEvent)
Main processing loop for the CVPCB window.
RESET_REASON
Determines the reason of reset for a tool
Definition: tool_base.h:79
CVPCB_MAINFRAME::CONTROL_TYPE GetFocusedControl()
Find out which control currently has focus.
void SetFootprintFilter(FOOTPRINTS_LISTBOX::FP_FILTER_T aFilter, CVPCB_MAINFRAME::CVPCB_FILTER_ACTION aAction)
Function SetFootprintFilter Set a filter criteria to either on/off or toggle the criteria.
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.
Not associated components.
int UpdateMenu(const TOOL_EVENT &aEvent)
Update the menu to reflect the current tool states.
static TOOL_ACTION filterFPbyLibrary
Definition: cvpcb_actions.h:71
static TOOL_ACTION filterFPbyKeywords
Footprint Filtering actions.
Definition: cvpcb_actions.h:69
bool SaveFootprintAssociation(bool doSaveSchematic)
Function SaveFootprintAssociation saves the edits that the user has done by sending them back to eesc...