KiCad PCB EDA Suite
Loading...
Searching...
No Matches
bitmap2cmp_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) 1992-2010 jean-pierre.charras
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25#include <bitmap2component.h>
26#include <bitmap2cmp_frame.h>
27#include <bitmap2cmp_panel.h>
28#include <bitmap2cmp_settings.h>
29#include <bitmap_io.h>
30#include <bitmaps.h>
31#include <common.h>
32#include <id.h>
33#include <widgets/wx_menubar.h>
35#include <file_history.h>
36#include <tool/tool_manager.h>
38#include <tool/common_control.h>
39#include <tool/action_manager.h>
40#include <bitmap2cmp_control.h>
41#include <tool/actions.h>
42
43#include <wx/filedlg.h>
44#include <wx/msgdlg.h>
45
46
47#define DEFAULT_DPI 300 // the image DPI used in formats that do not define a DPI
48
56
57
59{
60 // Safety-check to guarantee no divide-by-zero
61 m_originalDPI = std::max( 1, m_originalDPI );
62
63 // Set the m_outputSize value from the m_originalSizePixels and the selected unit
64 if( m_unit == EDA_UNITS::MM )
66 else if( m_unit == EDA_UNITS::INCH )
68 else
70}
71
72
74{
75 int outputDPI;
76
77 if( m_unit == EDA_UNITS::MM )
78 outputDPI = GetOriginalSizePixels() / ( m_outputSize / 25.4 );
79 else if( m_unit == EDA_UNITS::INCH )
80 outputDPI = GetOriginalSizePixels() / m_outputSize;
81 else
82 outputDPI = KiROUND( m_outputSize );
83
84 // Zero is not a DPI, and may cause divide-by-zero errors...
85 outputDPI = std::max( 1, outputDPI );
86
87 return outputDPI;
88}
89
90
92{
93 // Set the unit used for m_outputSize, and convert the old m_outputSize value
94 // to the value in new unit
95 if( aUnit == m_unit )
96 return;
97
98 // Convert m_outputSize to mm:
99 double size_mm;
100
101 if( m_unit == EDA_UNITS::MM )
102 {
103 size_mm = m_outputSize;
104 }
105 else if( m_unit == EDA_UNITS::INCH )
106 {
107 size_mm = m_outputSize * 25.4;
108 }
109 else
110 {
111 // m_outputSize is the DPI, not an image size
112 // the image size is m_originalSizePixels / m_outputSize (in inches)
113 if( m_outputSize )
114 size_mm = m_originalSizePixels / m_outputSize * 25.4;
115 else
116 size_mm = 0;
117 }
118
119 // Convert m_outputSize to new value:
120 if( aUnit == EDA_UNITS::MM )
121 {
122 m_outputSize = size_mm;
123 }
124 else if( aUnit == EDA_UNITS::INCH )
125 {
126 m_outputSize = size_mm / 25.4;
127 }
128 else
129 {
130 if( size_mm )
131 m_outputSize = m_originalSizePixels / size_mm * 25.4;
132 else
133 m_outputSize = 0;
134 }
135
136 m_unit = aUnit;
137}
138
139
140BEGIN_EVENT_TABLE( BITMAP2CMP_FRAME, KIWAY_PLAYER )
141 EVT_MENU( wxID_CLOSE, BITMAP2CMP_FRAME::OnExit )
142 EVT_MENU( wxID_EXIT, BITMAP2CMP_FRAME::OnExit )
143
146END_EVENT_TABLE()
147
148
149BITMAP2CMP_FRAME::BITMAP2CMP_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
150 KIWAY_PLAYER( aKiway, aParent, FRAME_BM2CMP, _( "Image Converter" ), wxDefaultPosition,
151 wxDefaultSize, wxDEFAULT_FRAME_STYLE, wxT( "bitmap2cmp" ), unityScale ),
152 m_panel( nullptr ),
153 m_statusBar( nullptr )
154{
155 m_aboutTitle = _HKI( "KiCad Image Converter" );
156
157 // Give an icon
158 wxIcon icon;
159 wxIconBundle icon_bundle;
160
161 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_bitmap2component, 48 ) );
162 icon_bundle.AddIcon( icon );
163 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_bitmap2component, 128 ) );
164 icon_bundle.AddIcon( icon );
165 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_bitmap2component, 256 ) );
166 icon_bundle.AddIcon( icon );
167 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_bitmap2component_32 ) );
168 icon_bundle.AddIcon( icon );
169 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_bitmap2component_16 ) );
170 icon_bundle.AddIcon( icon );
171
172 SetIcons( icon_bundle );
173
174 wxBoxSizer* mainSizer = new wxBoxSizer( wxVERTICAL );
175 SetSizer( mainSizer );
176
177 m_panel = new BITMAP2CMP_PANEL( this );
178 mainSizer->Add( m_panel, 1, wxEXPAND, 5 );
179
180 m_statusBar = this->CreateStatusBar( 1, wxSTB_SIZEGRIP, wxID_ANY );
181
182 LoadSettings( config() );
183
185 m_toolManager->SetEnvironment( nullptr, nullptr, nullptr, config(), this );
186
188
189 // Register tools
190 m_toolManager->RegisterTool( new COMMON_CONTROL );
191 m_toolManager->RegisterTool( new BITMAP2CMP_CONTROL );
192 m_toolManager->InitTools();
193
196
197 GetSizer()->SetSizeHints( this );
198
199 SetSize( m_framePos.x, m_framePos.y, m_frameSize.x, m_frameSize.y );
200
201 if ( m_framePos == wxDefaultPosition )
202 Centre();
203}
204
205
207{
208 // Shutdown all running tools
209 if( m_toolManager )
210 m_toolManager->ShutdownAllTools();
211
212 SaveSettings( config() );
213
214 /*
215 * This needed for OSX: avoids further OnDraw processing after this
216 * destructor and before the native window is destroyed
217 */
218 Freeze();
219}
220
221
222void BITMAP2CMP_FRAME::OnExit( wxCommandEvent& aEvent )
223{
224 // Just generate a wxCloseEvent
225 Close( false );
226}
227
228
230{
231 return m_panel->GetCurrentPage();
232}
233
234
235void BITMAP2CMP_FRAME::OnFileHistory( wxCommandEvent& event )
236{
237 wxString fn = GetFileFromHistory( event.GetId(), _( "Image files" ) );
238
239 if( !fn.IsEmpty() )
240 {
241 OpenProjectFiles( std::vector<wxString>( 1, fn ) );
242 Refresh();
243 }
244}
245
246
247void BITMAP2CMP_FRAME::OnClearFileHistory( wxCommandEvent& aEvent )
248{
250}
251
252
254{
255 COMMON_CONTROL* tool = m_toolManager->GetTool<COMMON_CONTROL>();
256 EDA_BASE_FRAME* base_frame = dynamic_cast<EDA_BASE_FRAME*>( this );
257
258 // base_frame == nullptr should not happen, but it makes Coverity happy
259 wxCHECK( base_frame, /* void */ );
260
261 // wxWidgets handles the OSX Application menu behind the scenes, but that means
262 // we always have to start from scratch with a new wxMenuBar.
263 wxMenuBar* oldMenuBar = base_frame->GetMenuBar();
264 WX_MENUBAR* menuBar = new WX_MENUBAR();
265
266 //-- File menu -----------------------------------------------------------
267 //
268 ACTION_MENU* fileMenu = new ACTION_MENU( false, tool );
269
270 fileMenu->Add( ACTIONS::open );
271
272 static ACTION_MENU* openRecentMenu;
273 FILE_HISTORY& fileHistory = GetFileHistory();
274
275 // Create the menu if it does not exist. Adding a file to/from the history
276 // will automatically refresh the menu.
277 if( !openRecentMenu )
278 {
279 openRecentMenu = new ACTION_MENU( false, tool );
280 openRecentMenu->SetIcon( BITMAPS::recent );
281
282 fileHistory.UseMenu( openRecentMenu );
283 fileHistory.AddFilesToMenu();
284 }
285
286 // Ensure the title is up to date after changing language
287 openRecentMenu->SetTitle( _( "Open Recent" ) );
288 fileHistory.UpdateClearText( openRecentMenu, _( "Clear Recent Files" ) );
289
290 wxMenuItem* item = fileMenu->Add( openRecentMenu->Clone() );
291
292 // Add the file menu condition here since it needs the item ID for the submenu
294 cond.Enable( FILE_HISTORY::FileHistoryNotEmpty( fileHistory ) );
295 RegisterUIUpdateHandler( item->GetId(), cond );
296
297 fileMenu->AppendSeparator();
298 fileMenu->AddQuit( _( "Image Converter" ) );
299
300 //-- Preferences menu -----------------------------------------------
301 //
302 ACTION_MENU* prefsMenu = new ACTION_MENU( false, tool );
303
304 prefsMenu->Add( ACTIONS::openPreferences );
305
306 prefsMenu->AppendSeparator();
307 AddMenuLanguageList( prefsMenu, tool );
308
309
310 //-- Menubar -------------------------------------------------------------
311 //
312 menuBar->Append( fileMenu, _( "&File" ) );
313 menuBar->Append( prefsMenu, _( "&Preferences" ) );
314 base_frame->AddStandardHelpMenu( menuBar );
315
316 base_frame->SetMenuBar( menuBar );
317 delete oldMenuBar;
318}
319
320
322{
324
325 UpdateTitle();
326
327 SaveSettings( config() );
328 IMAGE_SIZE imageSizeX = m_panel->GetOutputSizeX();
329 IMAGE_SIZE imageSizeY = m_panel->GetOutputSizeY();
330 Freeze();
331
332 wxSizer* mainSizer = m_panel->GetContainingSizer();
333 mainSizer->Detach( m_panel );
334 m_panel->Destroy();
335
336 m_panel = new BITMAP2CMP_PANEL( this );
337 mainSizer->Add( m_panel, 1, wxEXPAND, 5 );
338 Layout();
339
340 if( !m_srcFileName.IsEmpty() )
341 OpenProjectFiles( std::vector<wxString>( 1, m_srcFileName ) );
342
343 LoadSettings( config() );
344 m_panel->SetOutputSize( imageSizeX, imageSizeY );
345
346 Thaw();
347 Refresh();
348}
349
350
352{
353 wxString title;
354
355 if( !m_srcFileName.IsEmpty() )
356 {
357 wxFileName filename( m_srcFileName );
358 title = filename.GetFullName() + wxT( " \u2014 " );
359 }
360
361 title += _( "Image Converter" );
362
363 SetTitle( title );
364}
365
366
368{
370
371 if( BITMAP2CMP_SETTINGS* cfg = dynamic_cast<BITMAP2CMP_SETTINGS*>( aCfg ) )
372 {
373 m_srcFileName = cfg->m_BitmapFileName;
374 m_outFileName = cfg->m_ConvertedFileName;
375 m_panel->LoadSettings( cfg );
376 }
377}
378
379
381{
383
384 if( BITMAP2CMP_SETTINGS* cfg = dynamic_cast<BITMAP2CMP_SETTINGS*>( aCfg ) )
385 {
386 cfg->m_BitmapFileName = m_srcFileName;
387 cfg->m_ConvertedFileName = m_outFileName;
388 m_panel->SaveSettings( cfg );
389 }
390}
391
392
394{
395 wxFileName fn( m_srcFileName );
396 wxString path = fn.GetPath();
397
398 if( path.IsEmpty() || !wxDirExists( path ) )
399 path = m_mruPath;
400
401 wxFileDialog fileDlg( this, _( "Choose Image" ), path, wxEmptyString,
402 _( "Image Files" ) + wxS( " " )+ wxImage::GetImageExtWildcard(),
403 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
404
405 if( fileDlg.ShowModal() != wxID_OK )
406 return;
407
408 wxString fullFilename = fileDlg.GetPath();
409
410 if( !OpenProjectFiles( std::vector<wxString>( 1, fullFilename ) ) )
411 return;
412
413 fn = fullFilename;
414 m_mruPath = fn.GetPath();
415 SetStatusText( fullFilename );
416 UpdateTitle();
417 Refresh();
418}
419
420
421bool BITMAP2CMP_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, int aCtl )
422{
423 m_srcFileName = aFileSet[0];
424
425 if( m_panel->OpenProjectFiles( aFileSet, aCtl ) )
426 {
428 return true;
429 }
430
431 return false;
432}
433
434
436{
437 wxFileName fn( m_outFileName );
438 wxString path = fn.GetPath();
439
440 if( path.IsEmpty() || !wxDirExists(path) )
441 path = ::wxGetCwd();
442
443 wxFileDialog fileDlg( this, _( "Create Drawing Sheet File" ), path, wxEmptyString,
444 FILEEXT::DrawingSheetFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
445
446 if( fileDlg.ShowModal() != wxID_OK )
447 return;
448
449 fn = fileDlg.GetPath();
451 m_outFileName = fn.GetFullPath();
452
453 FILE* outfile = wxFopen( m_outFileName, wxT( "w" ) );
454
455 if( !outfile )
456 {
457 wxMessageBox( wxString::Format( _( "File '%s' could not be created." ), m_outFileName ) );
458 return;
459 }
460
461 std::string buffer;
462 m_panel->ExportToBuffer( buffer, DRAWING_SHEET_FMT );
463 fputs( buffer.c_str(), outfile );
464 fclose( outfile );
465}
466
467
469{
470 wxFileName fn( m_outFileName );
471 wxString path = fn.GetPath();
472
473 if( path.IsEmpty() || !wxDirExists( path ) )
474 path = ::wxGetCwd();
475
476 wxFileDialog fileDlg( this, _( "Create PostScript File" ), path, wxEmptyString,
477 FILEEXT::PSFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
478
479 if( fileDlg.ShowModal() != wxID_OK )
480 return;
481
482 fn = fileDlg.GetPath();
483 fn.SetExt( wxT( "ps" ) );
484 m_outFileName = fn.GetFullPath();
485
486 FILE* outfile = wxFopen( m_outFileName, wxT( "w" ) );
487
488 if( !outfile )
489 {
490 wxMessageBox( wxString::Format( _( "File '%s' could not be created." ), m_outFileName ) );
491 return;
492 }
493
494 std::string buffer;
495 m_panel->ExportToBuffer( buffer, POSTSCRIPT_FMT );
496 fputs( buffer.c_str(), outfile );
497 fclose( outfile );
498}
499
500
502{
503 wxFileName fn( m_outFileName );
504 wxString path = fn.GetPath();
505
506 if( path.IsEmpty() || !wxDirExists( path ) )
507 path = ::wxGetCwd();
508
509 wxFileDialog fileDlg( this, _( "Create Symbol Library" ), path, wxEmptyString,
511 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
512
513 if( fileDlg.ShowModal() != wxID_OK )
514 return;
515
517 m_outFileName = fn.GetFullPath();
518
519 FILE* outfile = wxFopen( m_outFileName, wxT( "w" ) );
520
521 if( !outfile )
522 {
523 wxMessageBox( wxString::Format( _( "File '%s' could not be created." ), m_outFileName ) );
524 return;
525 }
526
527 std::string buffer;
528 m_panel->ExportToBuffer( buffer, SYMBOL_FMT );
529 fputs( buffer.c_str(), outfile );
530 fclose( outfile );
531}
532
533
535{
536 wxFileName fn( m_outFileName );
537 wxString path = fn.GetPath();
538
539 if( path.IsEmpty() || !wxDirExists( path ) )
540 path = m_mruPath;
541
542 wxFileDialog fileDlg( this, _( "Create Footprint Library" ), path, wxEmptyString,
544 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
545
546 if( fileDlg.ShowModal() != wxID_OK )
547 return;
548
550 m_outFileName = fn.GetFullPath();
551
552 FILE* outfile = wxFopen( m_outFileName, wxT( "w" ) );
553
554 if( !outfile )
555 {
556 wxMessageBox( wxString::Format( _( "File '%s' could not be created." ), m_outFileName ) );
557 return;
558 }
559
560 std::string buffer;
561 m_panel->ExportToBuffer( buffer, FOOTPRINT_FMT );
562 fputs( buffer.c_str(), outfile );
563 fclose( outfile );
564 m_mruPath = fn.GetPath();
565}
566
567
constexpr EDA_IU_SCALE unityScale
Definition base_units.h:115
#define DEFAULT_DPI
@ DRAWING_SHEET_FMT
@ SYMBOL_FMT
@ POSTSCRIPT_FMT
@ FOOTPRINT_FMT
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
Definition bitmap.cpp:104
@ icon_bitmap2component
@ icon_bitmap2component_32
@ icon_bitmap2component_16
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition box2.h:990
static TOOL_ACTION openPreferences
Definition actions.h:280
static TOOL_ACTION open
Definition actions.h:57
Define the structure of a menu based on ACTIONs.
Definition action_menu.h:47
void AddQuit(const wxString &aAppname="")
Add a standard Quit item to the menu.
ACTION_MENU * Clone() const
Create a deep, recursive copy of this ACTION_MENU.
void SetTitle(const wxString &aTitle) override
Set title for the menu.
void SetIcon(BITMAPS aIcon)
Assign an icon for the entry.
wxMenuItem * Add(const wxString &aLabel, int aId, BITMAPS aIcon)
Add a wxWidgets-style entry to the menu.
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
Handle actions for the various symbol editor and viewers.
void ExportPcbnewFormat()
Generate a footprint in S expr format.
void ExportDrawingSheetFormat()
Generate a file suitable to be copied into a drawing sheet (.kicad_wks) file.
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
void ExportEeschemaFormat()
Generate a schematic library which contains one component: the logo.
wxStatusBar * m_statusBar
void OnExit(wxCommandEvent &aEvent)
Event handler for the wxID_EXIT and wxID_CLOSE events.
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
void OnFileHistory(wxCommandEvent &event)
BITMAP2CMP_FRAME(KIWAY *aKiway, wxWindow *aParent)
void doReCreateMenuBar() override
wxWindow * GetToolCanvas() const override
Canvas access.
void ExportPostScriptFormat()
Generate a postscript file.
BITMAP2CMP_PANEL * m_panel
bool OpenProjectFiles(const std::vector< wxString > &aFilenames, int aCtl=0) override
Open a project or set of files given by aFileList.
void OnClearFileHistory(wxCommandEvent &event)
void ShowChangedLanguage() override
Handle actions that are shared between different applications.
virtual APP_SETTINGS_BASE * config() const
Return the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
void ShowChangedLanguage() override
Redraw the menus and what not in current language.
virtual void setupUIConditions()
Setup the UI conditions for the various actions and their controls in this frame.
EDA_BASE_FRAME(wxWindow *aParent, FRAME_T aFrameType, const wxString &aTitle, const wxPoint &aPos, const wxSize &aSize, long aStyle, const wxString &aFrameName, KIWAY *aKiway, const EDA_IU_SCALE &aIuScale)
void AddMenuLanguageList(ACTION_MENU *aMasterMenu, TOOL_INTERACTIVE *aControlTool)
Create a menu list for language choice, and add it as submenu to MasterMenu.
void UpdateFileHistory(const wxString &FullFileName, FILE_HISTORY *aFileHistory=nullptr)
Update the list of recently opened files.
virtual void LoadSettings(APP_SETTINGS_BASE *aCfg)
Load common frame parameters from a configuration file.
FILE_HISTORY & GetFileHistory()
Get the frame's main file history.
virtual void ClearFileHistory()
Remove all files from the file history.
wxString GetFileFromHistory(int cmdId, const wxString &type, FILE_HISTORY *aFileHistory=nullptr)
Fetch the file name from the file history list.
virtual void SaveSettings(APP_SETTINGS_BASE *aCfg)
Save common frame parameters to a configuration data file.
virtual void RegisterUIUpdateHandler(int aID, const ACTION_CONDITIONS &aConditions) override
Register a UI update handler for the control with ID aID.
wxString m_aboutTitle
void ReCreateMenuBar()
Recreate the menu bar.
This class implements a file history object to store a list of files, that can then be added to a men...
static SELECTION_CONDITION FileHistoryNotEmpty(const FILE_HISTORY &aHistory)
Create a SELECTION_CONDITION that can be used to enable a menu item when the file history has items i...
void UpdateClearText(wxMenu *aMenu, wxString aClearText)
Update the text displayed on the menu item that clears the entire menu.
void AddFilesToMenu() override
Add the files to all registered menus.
void SetUnit(EDA_UNITS aUnit)
double m_outputSize
EDA_UNITS m_unit
int GetOriginalSizePixels()
void SetOutputSizeFromInitialImageSize()
A wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of a KiCad project.
KIWAY_PLAYER(KIWAY *aKiway, wxWindow *aParent, FRAME_T aFrameType, const wxString &aTitle, const wxPoint &aPos, const wxSize &aSize, long aStyle, const wxString &aFrameName, const EDA_IU_SCALE &aIuScale)
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition kiway.h:292
TOOL_MANAGER * m_toolManager
TOOL_DISPATCHER * m_toolDispatcher
Master controller class:
Wrapper around a wxMenuBar object that prevents the accelerator table from being used.
Definition wx_menubar.h:47
wxString EnsureFileExtension(const wxString &aFilename, const wxString &aExtension)
It's annoying to throw up nag dialogs when the extension isn't right.
Definition common.cpp:580
The common library.
#define _(s)
EDA_UNITS
Definition eda_units.h:48
EVT_MENU_RANGE(ID_GERBVIEW_DRILL_FILE1, ID_GERBVIEW_DRILL_FILEMAX, GERBVIEW_FRAME::OnDrlFileHistory) EVT_MENU_RANGE(ID_GERBVIEW_ZIP_FILE1
@ FRAME_BM2CMP
Definition frame_type.h:61
static const std::string KiCadSymbolLibFileExtension
static const std::string DrawingSheetFileExtension
static const std::string KiCadFootprintFileExtension
static wxString KiCadSymbolLibFileWildcard()
static wxString KiCadFootprintLibFileWildcard()
static wxString PSFileWildcard()
static wxString DrawingSheetFileWildcard()
@ ID_FILE_LIST_CLEAR
Definition id.h:62
@ ID_FILEMAX
Definition id.h:60
@ ID_FILE1
Definition id.h:59
#define _HKI(x)
Definition page_info.cpp:44
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
Functors that can be used to figure out how the action controls should be displayed in the UI and if ...
ACTION_CONDITIONS & Enable(const SELECTION_CONDITION &aCondition)
std::string path
Definition of file extensions used in Kicad.