KiCad PCB EDA Suite
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
cvpcb_mainframe.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) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 2011 Wayne Stambaugh <stambaughw@gmail.com>
6 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
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 <pgm_base.h>
27#include <bitmaps.h>
28#include <confirm.h>
29#include <eda_dde.h>
30#include <fp_lib_table.h>
31#include <kiface_base.h>
32#include <kiplatform/app.h>
33#include <kiway_express.h>
34#include <string_utils.h>
38#include <numeric>
39#include <tool/action_manager.h>
40#include <tool/action_toolbar.h>
41#include <tool/common_control.h>
44#include <tool/tool_manager.h>
46
47#include <cvpcb_association.h>
48#include <cvpcb_id.h>
49#include <cvpcb_mainframe.h>
53#include <kiplatform/ui.h>
54#include <listboxes.h>
55#include <tools/cvpcb_actions.h>
57#include <tools/cvpcb_control.h>
58#include <project_pcb.h>
59#include <toolbars_cvpcb.h>
60
61#include <wx/statline.h>
62#include <wx/stattext.h>
63#include <wx/button.h>
64#include <wx/msgdlg.h>
65
66
67CVPCB_MAINFRAME::CVPCB_MAINFRAME( KIWAY* aKiway, wxWindow* aParent ) :
68 KIWAY_PLAYER( aKiway, aParent, FRAME_CVPCB, _( "Assign Footprints" ), wxDefaultPosition,
69 wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE, wxT( "CvpcbFrame" ),
70 unityScale ),
71 m_footprintListBox( nullptr ),
72 m_librariesListBox( nullptr ),
73 m_symbolsListBox( nullptr ),
74 m_tcFilterString( nullptr ),
75 m_viewerPendingUpdate( false )
76{
77 m_modified = false;
78 m_cannotClose = false;
82 m_initialized = false;
83 m_aboutTitle = _( "Assign Footprints" );
84
85 // Give an icon
86 wxIcon icon;
87 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_cvpcb ) );
88 SetIcon( icon );
89
90 SetAutoLayout( true );
91
93
94 setupTools();
96
101
104
107
110
112
113 m_auimgr.SetManagedWindow( this );
114
115 m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( "TopMainToolbar" ).Top().Layer(6) );
116
117 m_auimgr.AddPane( m_librariesListBox, EDA_PANE().Palette().Name( "Libraries" ).Left().Layer(1)
118 .Caption( _( "Footprint Libraries" ) )
119 .BestSize((int) ( m_frameSize.x * 0.20 ), m_frameSize.y ) );
120
121 m_auimgr.AddPane( m_symbolsListBox, EDA_PANE().Palette().Name( "Symbols" ).Center().Layer(0)
122 .Caption( _( "Symbol : Footprint Assignments" ) ) );
123
124 m_auimgr.AddPane( m_footprintListBox, EDA_PANE().Palette().Name( "Footprints" ).Right().Layer(1)
125 .Caption( _( "Filtered Footprints" ) )
126 .BestSize((int) ( m_frameSize.x * 0.30 ), m_frameSize.y ) );
127
128 // Build the bottom panel, to display 2 status texts and the buttons:
129 auto bottomPanel = new wxPanel( this );
130 auto panelSizer = new wxBoxSizer( wxVERTICAL );
131
132 wxFlexGridSizer* fgSizerStatus = new wxFlexGridSizer( 3, 1, 0, 0 );
133 fgSizerStatus->SetFlexibleDirection( wxBOTH );
134 fgSizerStatus->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
135
136 m_statusLine1 = new wxStaticText( bottomPanel, wxID_ANY, wxEmptyString );
137 fgSizerStatus->Add( m_statusLine1, 0, 0, 5 );
138
139 m_statusLine2 = new wxStaticText( bottomPanel, wxID_ANY, wxEmptyString );
140 fgSizerStatus->Add( m_statusLine2, 0, 0, 5 );
141
142 m_statusLine3 = new wxStaticText( bottomPanel, wxID_ANY, wxEmptyString );
143 fgSizerStatus->Add( m_statusLine3, 0, wxBOTTOM, 3 );
144
145 panelSizer->Add( fgSizerStatus, 1, wxEXPAND|wxLEFT, 2 );
146
147 m_statusLine1->SetFont( KIUI::GetStatusFont( this ) );
148 m_statusLine2->SetFont( KIUI::GetStatusFont( this ) );
149 m_statusLine3->SetFont( KIUI::GetStatusFont( this ) );
150
151 // Add buttons:
152 auto buttonsSizer = new wxBoxSizer( wxHORIZONTAL );
153 auto sdbSizer = new wxStdDialogButtonSizer();
154
155 m_saveAndContinue = new wxButton( bottomPanel, wxID_ANY,
156 _( "Apply, Save Schematic && Continue" ) );
157 buttonsSizer->Add( m_saveAndContinue, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 20 );
158
159 auto sdbSizerOK = new wxButton( bottomPanel, wxID_OK );
160 sdbSizer->AddButton( sdbSizerOK );
161 auto sdbSizerCancel = new wxButton( bottomPanel, wxID_CANCEL );
162 sdbSizer->AddButton( sdbSizerCancel );
163 sdbSizer->Realize();
164
165 buttonsSizer->Add( sdbSizer, 0, 0, 5 );
166 panelSizer->Add( buttonsSizer, 0, wxALIGN_RIGHT|wxALL, 5 );
167
168 bottomPanel->SetSizer( panelSizer );
169 bottomPanel->Fit();
170
171 sdbSizerOK->SetDefault();
173
174 m_auimgr.AddPane( bottomPanel, EDA_PANE().HToolbar().Name( "Buttons" ).Bottom().Layer(6) );
175
176 m_auimgr.Update();
177 m_initialized = true;
178
179 auto setPaneWidth =
180 [this]( wxAuiPaneInfo& pane, int width )
181 {
182 // wxAUI hack: force width by setting MinSize() and then Fixed()
183 // thanks to ZenJu http://trac.wxwidgets.org/ticket/13180
184 pane.MinSize( width, -1 );
185 pane.BestSize( width, -1 );
186 pane.MaxSize( width, -1 );
187 pane.Fixed();
188 m_auimgr.Update();
189
190 // now make it resizable again
191 pane.MinSize( 20, -1 );
192 pane.Resizable();
193 m_auimgr.Update();
194 };
195
196 if( CVPCB_SETTINGS* cfg = dynamic_cast<CVPCB_SETTINGS*>( config() ) )
197 {
198 m_tcFilterString->ChangeValue( cfg->m_FilterString );
199
200 if( cfg->m_LibrariesWidth > 0 )
201 setPaneWidth( m_auimgr.GetPane( "Libraries" ), cfg->m_LibrariesWidth );
202
203 if( cfg->m_FootprintsWidth > 0 )
204 setPaneWidth( m_auimgr.GetPane( "Footprints" ), cfg->m_FootprintsWidth );
205 }
206
207 // Connect Events
209
210 // Start the main processing loop
211 m_toolManager->InvokeTool( "cvpcb.Control" );
212
213 m_filterTimer->StartOnce( 100 );
214
215 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "Symbol to footprint changes are unsaved" ) );
216}
217
218
220{
221 Unbind( wxEVT_TEXT, &CVPCB_MAINFRAME::onTextFilterChanged, this );
223 Unbind( wxEVT_CHAR_HOOK, &TOOL_DISPATCHER::DispatchWxEvent, m_toolDispatcher );
224
225 Unbind( wxEVT_TIMER, &CVPCB_MAINFRAME::onTextFilterChangedTimer, this, m_filterTimer->GetId() );
226 Unbind( wxEVT_IDLE, &CVPCB_MAINFRAME::updateFootprintViewerOnIdle, this );
227
228 // Stop the timer during destruction early to avoid potential race conditions (that do happen)
229 m_filterTimer->Stop();
230
231 // Shutdown all running tools
232 if( m_toolManager )
234
235 // Clean up the tool infrastructure
236 delete m_actions;
237 delete m_toolManager;
238 delete m_toolDispatcher;
239
240 m_auimgr.UnInit();
241}
242
243
245{
246 // Create the manager
247 m_actions = new CVPCB_ACTIONS();
249 m_toolManager->SetEnvironment( nullptr, nullptr, nullptr, config(), this );
251
252 // Register tools
257
259
260 // Even though these menus will open with the right-click, we treat them as a normal
261 // menu instead of a context menu because we don't care about their position and want
262 // to be able to tell the difference between a menu click and a hotkey activation.
263
264 // Create the context menu for the symbols list box
265 m_symbolsContextMenu = new ACTION_MENU( false, tool );
267 m_symbolsContextMenu->AppendSeparator();
271 m_symbolsContextMenu->AppendSeparator();
273
274 // Create the context menu for the footprint list box
275 m_footprintContextMenu = new ACTION_MENU( false, tool );
277}
278
279
281{
283
285 EDITOR_CONDITIONS cond( this );
286
287 wxASSERT( mgr );
288
289#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
290#define CHECK( x ) ACTION_CONDITIONS().Check( x )
291
293 ENABLE( cond.ContentModified() ) );
297
298 auto compFilter =
299 [this] ( const SELECTION& )
300 {
302 };
303
304 auto libFilter =
305 [this] ( const SELECTION& )
306 {
308 };
309
310 auto pinFilter =
311 [this] ( const SELECTION& )
312 {
314 };
315
319
320#undef CHECK
321#undef ENABLE
322}
323
324
326{
327 // Connect the handlers to launch the context menus in the listboxes
328 m_footprintListBox->Bind( wxEVT_RIGHT_DOWN,
329 [this]( wxMouseEvent& )
330 {
331 PopupMenu( m_footprintContextMenu );
332 } );
333
334 m_symbolsListBox->Bind( wxEVT_RIGHT_DOWN,
335 [this]( wxMouseEvent& )
336 {
337 PopupMenu( m_symbolsContextMenu );
338 } );
339
340 // Connect the handler for the save button
341 m_saveAndContinue->Bind( wxEVT_COMMAND_BUTTON_CLICKED,
342 [this]( wxCommandEvent& )
343 {
344 // saveAssociations must be run immediately
346 } );
347
348 // Connect the handlers for the ok/cancel buttons
349 Bind( wxEVT_BUTTON,
350 [this]( wxCommandEvent& )
351 {
352 // saveAssociations must be run immediately, before running Close( true )
354 Close( true );
355 }, wxID_OK );
356
357 Bind( wxEVT_BUTTON,
358 [this]( wxCommandEvent& )
359 {
360 Close( false );
361 }, wxID_CANCEL );
362
363 // Connect the handlers for the close events
364 Bind( wxEVT_MENU,
365 [this]( wxCommandEvent& )
366 {
367 Close( false );
368 }, wxID_CLOSE );
369 Bind( wxEVT_MENU,
370 [this]( wxCommandEvent& )
371 {
372 Close( false );
373 }, wxID_EXIT );
374
375 // Toolbar events
376 Bind( wxEVT_TEXT, &CVPCB_MAINFRAME::onTextFilterChanged, this );
377
378 // Just skip the resize events
379 Bind( wxEVT_SIZE,
380 []( wxSizeEvent& aEvent )
381 {
382 aEvent.Skip();
383 } );
384
385 // Attach the events to the tool dispatcher
387 Bind( wxEVT_CHAR_HOOK, &TOOL_DISPATCHER::DispatchWxEvent, m_toolDispatcher );
388
389 m_filterTimer = new wxTimer( this );
390 Bind( wxEVT_TIMER, &CVPCB_MAINFRAME::onTextFilterChangedTimer, this, m_filterTimer->GetId() );
391}
392
393
394bool CVPCB_MAINFRAME::canCloseWindow( wxCloseEvent& aEvent )
395{
396 if( m_modified )
397 {
398 // Shutdown blocks must be determined and vetoed as early as possible
400 && aEvent.GetId() == wxEVT_QUERY_END_SESSION )
401 {
402 return false;
403 }
404
405 if( !HandleUnsavedChanges( this, _( "Symbol to Footprint links have been modified. "
406 "Save changes?" ),
407 [&]() -> bool
408 {
409 return SaveFootprintAssociation( false );
410 } ) )
411 {
412 return false;
413 }
414 }
415
416 if( m_cannotClose )
417 return false;
418
419 return true;
420}
421
422
424{
426 GetFootprintViewerFrame()->Close( true );
427
428 m_modified = false;
429
430 // clear symbol selection in schematic:
432}
433
434
435void CVPCB_MAINFRAME::onTextFilterChanged( wxCommandEvent& event )
436{
437 // Called when changing the filter string in main toolbar.
438 // If the option FOOTPRINTS_LISTBOX::FILTERING_BY_TEXT_PATTERN is set, update the list
439 // of available footprints which match the filter
440
441 m_filterTimer->StartOnce( 200 );
442}
443
444
446{
447 // GTK loses the search-control's focus on a Refresh event, so we record the focus and
448 // insertion point here and then restore them at the end.
449 bool searchCtrlHasFocus = m_tcFilterString->HasFocus();
450 long pos = m_tcFilterString->GetInsertionPoint();
451
453 wxString libraryName = m_librariesListBox->GetSelectedLibrary();
454
455 m_footprintListBox->SetFootprints( *m_FootprintsList, libraryName, symbol,
457
458 if( symbol && symbol->GetFPID().IsValid() )
460 else if( m_footprintListBox->GetSelection() >= 0 )
462
464
466
467 if( searchCtrlHasFocus && !m_tcFilterString->HasFocus() )
468 {
469 m_tcFilterString->SetFocus();
470 m_tcFilterString->SetInsertionPoint( pos );
471 }
472}
473
474
475void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event )
476{
478 return;
479
481 wxString libraryName = m_librariesListBox->GetSelectedLibrary();
482
483 m_footprintListBox->SetFootprints( *m_FootprintsList, libraryName, symbol,
485
486 if( symbol && symbol->GetFPID().IsValid() )
488 else if( m_footprintListBox->GetSelection() >= 0 )
490
492
493 refreshAfterSymbolSearch( symbol );
494}
495
496
498{
500 {
501 Bind( wxEVT_IDLE, &CVPCB_MAINFRAME::updateFootprintViewerOnIdle, this );
503 }
504}
505
506
508{
509 Unbind( wxEVT_IDLE, &CVPCB_MAINFRAME::updateFootprintViewerOnIdle, this );
510 m_viewerPendingUpdate = false;
511
512 // On some platforms (OSX) the focus is lost when the viewers (fp and 3D viewers)
513 // are opened and refreshed when a new footprint is selected.
514 // If the listbox has the focus before selecting a new footprint, it will be forced
515 // after selection.
516 bool footprintListHasFocus = m_footprintListBox->HasFocus();
517 bool symbolListHasFocus = m_symbolsListBox->HasFocus();
518
519 // If the footprint view window is displayed, update the footprint.
522
524
525 if( footprintListHasFocus )
526 m_footprintListBox->SetFocus();
527 else if( symbolListHasFocus )
528 m_symbolsListBox->SetFocus();
529}
530
531
533{
535
536 CVPCB_SETTINGS* cfg = static_cast<CVPCB_SETTINGS*>( aCfg );
537
539}
540
541
543{
545
546 CVPCB_SETTINGS* cfg = static_cast<CVPCB_SETTINGS*>( aCfg );
548 cfg->m_FilterString = m_tcFilterString->GetValue();
549
550 cfg->m_LibrariesWidth = m_librariesListBox->GetSize().x;
551 cfg->m_FootprintsWidth = m_footprintListBox->GetSize().x;
552}
553
554
556{
557 if( m_undoList.size() == 0 )
558 return;
559
560 CVPCB_UNDO_REDO_ENTRIES redoEntries;
561 CVPCB_UNDO_REDO_ENTRIES curEntry = m_undoList.back();
562 m_undoList.pop_back();
563
564 // Iterate over the entries to undo
565 for( const auto& assoc : curEntry )
566 {
567 AssociateFootprint( assoc, true, false );
568 redoEntries.emplace_back( assoc.Reverse() );
569 }
570
571 // Add the redo entries to the redo stack
572 m_redoList.emplace_back( redoEntries );
573}
574
575
577{
578 if( m_redoList.size() == 0 )
579 return;
580
581 CVPCB_UNDO_REDO_ENTRIES curEntry = m_redoList.back();
582 m_redoList.pop_back();
583
584 // Iterate over the entries to undo
585 bool firstAssoc = true;
586
587 for( const auto& assoc : curEntry )
588 {
589 AssociateFootprint( assoc, firstAssoc );
590 firstAssoc = false;
591 }
592}
593
594
595wxString CVPCB_MAINFRAME::formatSymbolDesc( int idx, const wxString& aReference,
596 const wxString& aValue, const wxString& aFootprint )
597{
598 // Work around a bug in wxString::Format with double-byte chars (and double-quote, for some
599 // reason).
600 wxString desc = wxString::Format( wxT( "%3d " ), idx );
601
602 for( int ii = aReference.Length(); ii < 8; ++ii )
603 desc += wxS( " " );
604
605 desc += aReference + wxT( " - " );
606
607 for( int ii = aValue.Length(); ii < 16; ++ii )
608 desc += wxS( " " );
609
610 desc += aValue + wxT( " : " ) + aFootprint;
611
612 return desc;
613}
614
615
617 bool aNewEntry, bool aAddUndoItem )
618{
619 if( m_netlist.IsEmpty() )
620 return;
621
622 COMPONENT* symbol = m_netlist.GetComponent( aAssociation.GetComponentIndex() );
623
624 if( symbol == nullptr )
625 return;
626
627 LIB_ID fpid = aAssociation.GetNewFootprint();
628 LIB_ID oldFpid = symbol->GetFPID();
629
630 // Test for validity of the requested footprint
631 if( !fpid.empty() && !fpid.IsValid() )
632 {
633 wxString msg = wxString::Format( _( "'%s' is not a valid footprint." ),
634 fpid.Format().wx_str() );
635 DisplayErrorMessage( this, msg );
636 return;
637 }
638
639 const KIID& id = symbol->GetKIIDs().front();
640
641 // Set new footprint to all instances of the selected symbol
642 for( unsigned int idx : GetComponentIndices() )
643 {
644 COMPONENT* candidate = m_netlist.GetComponent( idx );
645 const std::vector<KIID>& kiids = candidate->GetKIIDs();
646
647 if( std::find( kiids.begin(), kiids.end(), id ) != kiids.end() )
648 {
649 // Set the new footprint
650 candidate->SetFPID( fpid );
651
652 // create the new symbol description and set it
653 wxString description = formatSymbolDesc( idx + 1,
654 candidate->GetReference(),
655 candidate->GetValue(),
656 candidate->GetFPID().Format().wx_str() );
657 m_symbolsListBox->SetString( idx, description );
658
659 if( !m_FootprintsList->GetFootprintInfo( symbol->GetFPID().Format().wx_str() ) )
661 else
663 }
664 }
665
666 // Mark the data as being modified
667 m_modified = true;
668
669 // Update the statusbar and refresh the list
671 m_symbolsListBox->Refresh();
672
673 if( !aAddUndoItem )
674 return;
675
676 // Update the undo list
677 if ( aNewEntry )
678 {
679 // Create a new entry for this association
681 newEntry.emplace_back( CVPCB_ASSOCIATION( aAssociation.GetComponentIndex(), oldFpid,
682 aAssociation.GetNewFootprint() ) );
683 m_undoList.emplace_back( newEntry );
684
685 // Clear the redo list
686 m_redoList.clear();
687 }
688 else
689 {
690 m_undoList.back().emplace_back( CVPCB_ASSOCIATION( aAssociation.GetComponentIndex(),
691 oldFpid,
692 aAssociation.GetNewFootprint() ) );
693 }
694
695}
696
697
698bool CVPCB_MAINFRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, int aCtl )
699{
700 return true;
701}
702
703
705{
706 // Tell AuiMgr that objects are changed !
707 if( m_auimgr.GetManagedWindow() ) // Be sure Aui Manager is initialized
708 m_auimgr.Update(); // (could be not the case when starting CvPcb)
709
710 if( aSymbol == nullptr )
711 {
713 return;
714 }
715
716 // Preview of the already assigned footprint.
717 // Find the footprint that was already chosen for this aSymbol and select it,
718 // but only if the selection is made from the aSymbol list or the library list.
719 // If the selection is made from the footprint list, do not change the current
720 // selected footprint.
721 if( FindFocus() == m_symbolsListBox || FindFocus() == m_librariesListBox )
722 {
723 wxString footprintName = From_UTF8( aSymbol->GetFPID().Format().c_str() );
724
726
727 for( int ii = 0; ii < m_footprintListBox->GetCount(); ii++ )
728 {
729 wxString candidateName;
730 wxString msg = m_footprintListBox->OnGetItemText( ii, 0 );
731 msg.Trim( true );
732 msg.Trim( false );
733 candidateName = msg.AfterFirst( wxChar( ' ' ) );
734
735 if( footprintName.Cmp( candidateName ) == 0 )
736 {
737 m_footprintListBox->SetSelection( ii, true );
738 break;
739 }
740 }
741 }
742
745}
746
747
750{
751 int option = aFilter;
752
753 // Apply the filter accordingly
754 switch( aAction )
755 {
759 }
760
761 wxListEvent l_event;
762 OnSelectComponent( l_event );
763}
764
765
767{
768 if( !m_initialized )
769 return;
770
771 wxString filters, msg;
773
775 {
776 msg.Empty();
777
778 if( symbol )
779 {
780 for( unsigned ii = 0; ii < symbol->GetFootprintFilters().GetCount(); ii++ )
781 {
782 if( msg.IsEmpty() )
783 msg += symbol->GetFootprintFilters()[ii];
784 else
785 msg += wxT( ", " ) + symbol->GetFootprintFilters()[ii];
786 }
787 }
788
789 filters += _( "Keywords" );
790
791 if( !msg.IsEmpty() )
792 filters += wxString::Format( wxT( " (%s)" ), msg );
793 }
794
796 {
797 msg.Empty();
798
799 if( symbol )
800 msg = wxString::Format( wxT( "%i" ), symbol->GetPinCount() );
801
802 if( !filters.IsEmpty() )
803 filters += wxT( ", " );
804
805 filters += _( "Pin Count" );
806
807 if( !msg.IsEmpty() )
808 filters += wxString::Format( wxT( " (%s)" ), msg );
809 }
810
812 {
814
815 if( !filters.IsEmpty() )
816 filters += wxT( ", " );
817
818 filters += _( "Library" );
819
820 if( !msg.IsEmpty() )
821 filters += wxString::Format( wxT( " (%s)" ), msg );
822 }
823
824 wxString textFilter = m_tcFilterString->GetValue();
825
826 if( !textFilter.IsEmpty() )
827 {
828 if( !filters.IsEmpty() )
829 filters += wxT( ", " );
830
831 filters += _( "Search Text" ) + wxString::Format( wxT( " (%s)" ), textFilter );
832 }
833
834 if( filters.IsEmpty() )
835 msg = _( "No Filtering" );
836 else
837 msg.Printf( _( "Filtered by %s" ), filters );
838
839 msg += wxString::Format( _( ": %i matching footprints" ), m_footprintListBox->GetCount() );
840
841 SetStatusText( msg );
842
843
844 msg.Empty();
845 wxString footprintName = GetSelectedFootprint();
846
847 FOOTPRINT_INFO* fp = m_FootprintsList->GetFootprintInfo( footprintName );
848
849 if( fp ) // can be NULL if no netlist loaded
850 {
851 msg = wxString::Format( _( "Description: %s; Keywords: %s" ),
852 fp->GetDesc(),
853 fp->GetKeywords() );
854 }
855
856 SetStatusText( msg, 1 );
857
858 msg.Empty();
859 wxString lib;
860
861 // Choose the footprint to get the information on
862 if( fp )
863 {
864 // Use the footprint in the footprint viewer
865 lib = fp->GetLibNickname();
866 }
868 {
869 // Use the footprint of the selected symbol
870 if( symbol )
871 lib = symbol->GetFPID().GetUniStringLibNickname();
872 }
874 {
875 // Use the library that is selected
877 }
878
879 // Extract the library information
881
882 if( fptbl->HasLibrary( lib ) )
883 msg = wxString::Format( _( "Library location: %s" ), fptbl->GetFullURI( lib ) );
884 else
885 msg = wxString::Format( _( "Library location: unknown" ) );
886
887 SetStatusText( msg, 2 );
888}
889
890
892{
894
895 // Check if there are footprint libraries in the footprint library table.
896 if( !fptbl || !fptbl->GetLogicalLibs().size() )
897 {
898 wxMessageBox( _( "No PCB footprint libraries are listed in the current footprint "
899 "library table." ), _( "Configuration Error" ), wxOK | wxICON_ERROR );
900 return false;
901 }
902
903 WX_PROGRESS_REPORTER progressReporter( this, _( "Loading Footprint Libraries" ), 1 );
904
905 m_FootprintsList->ReadFootprintFiles( fptbl, nullptr, &progressReporter );
906
909
910 return true;
911}
912
913
914void CVPCB_MAINFRAME::SendComponentSelectionToSch( bool aClearSelectionOnly )
915{
916 if( m_netlist.IsEmpty() )
917 return;
918
919 std::string command = "$SELECT: ";
920
921 if( aClearSelectionOnly )
922 {
923 // Sending an empty list means clearing the selection.
924 if( Kiface().IsSingle() )
925 SendCommand( MSG_TO_SCH, command );
926 else
927 Kiway().ExpressMail( FRAME_SCH, MAIL_SELECTION, command, this );
928
929 return;
930 }
931
932 int selection = m_symbolsListBox->GetSelection();
933
934 if( selection < 0 ) // Nothing selected
935 return;
936
937 if( m_netlist.GetComponent( selection ) == nullptr )
938 return;
939
940 // Now select the corresponding symbol on the schematic:
941 wxString ref = m_netlist.GetComponent( selection )->GetReference();
942
943 // The prefix 0,F before the reference is for selecting the symbol
944 // (one can select a pin with a different prefix)
945 command += wxT( "0,F" ) + EscapeString( ref, CTX_IPC );
946
947 if( Kiface().IsSingle() )
948 SendCommand( MSG_TO_SCH, command );
949 else
950 Kiway().ExpressMail( FRAME_SCH, MAIL_SELECTION, command, this );
951}
952
953
954int CVPCB_MAINFRAME::readSchematicNetlist( const std::string& aNetlist )
955{
956 STRING_LINE_READER* stringReader = new STRING_LINE_READER( aNetlist, "Eeschema via Kiway" );
957 KICAD_NETLIST_READER netlistReader( stringReader, &m_netlist );
958
960
961 try
962 {
963 netlistReader.LoadNetlist();
964 }
965 catch( const IO_ERROR& ioe )
966 {
967 wxString msg = wxString::Format( _( "Error loading schematic.\n%s" ),
968 ioe.What().GetData() );
969 wxMessageBox( msg, _( "Load Error" ), wxOK | wxICON_ERROR );
970 return 1;
971 }
972
973 // We also remove footprint name if it is "$noname" because this is a dummy name,
974 // not the actual name of the footprint.
975 for( unsigned ii = 0; ii < m_netlist.GetCount(); ii++ )
976 {
977 if( m_netlist.GetComponent( ii )->GetFPID().GetLibItemName() == std::string( "$noname" ) )
979 }
980
981 // Sort symbols by reference:
983
984 return 0;
985}
986
987
989{
990 m_footprintListBox->SetFootprints( *m_FootprintsList, wxEmptyString, nullptr, wxEmptyString,
993}
994
995
997{
1001
1002 // Use same sorting algorithm as LIB_TREE_NODE::AssignIntrinsicRanks
1003 struct library_sort
1004 {
1005 bool operator()( const wxString& lhs, const wxString& rhs ) const
1006 {
1007 return StrNumCmp( lhs, rhs, true ) < 0;
1008 }
1009 };
1010
1011 std::set<wxString, library_sort> pinnedMatches;
1012 std::set<wxString, library_sort> otherMatches;
1013
1015
1016 auto process =
1017 [&]( const wxString& aNickname )
1018 {
1019 if( alg::contains( project.m_PinnedFootprintLibs, aNickname )
1020 || alg::contains( cfg->m_Session.pinned_fp_libs, aNickname ) )
1021 {
1022 pinnedMatches.insert( aNickname );
1023 }
1024 else
1025 {
1026 otherMatches.insert( aNickname );
1027 }
1028 };
1029
1030
1031 if( tbl )
1032 {
1033 wxArrayString libNames;
1034
1035 std::vector< wxString > libNickNames = tbl->GetLogicalLibs();
1036
1037 for( const wxString& libNickName : libNickNames )
1038 process( libNickName );
1039 }
1040
1041 for( const wxString& nickname : pinnedMatches )
1043
1044 for( const wxString& nickname : otherMatches )
1045 m_librariesListBox->AppendLine( nickname );
1046
1048}
1049
1050
1052{
1053 int selection = m_symbolsListBox->GetSelection();
1054
1055 if( selection >= 0 && selection < (int) m_netlist.GetCount() )
1056 return m_netlist.GetComponent( selection );
1057
1058 return nullptr;
1059}
1060
1061
1062void CVPCB_MAINFRAME::SetSelectedComponent( int aIndex, bool aSkipUpdate )
1063{
1064 m_skipComponentSelect = aSkipUpdate;
1065
1066 if( aIndex < 0 )
1067 {
1069 }
1070 else if( aIndex < m_symbolsListBox->GetCount() )
1071 {
1073 m_symbolsListBox->SetSelection( aIndex );
1075 }
1076
1077 m_skipComponentSelect = false;
1078}
1079
1080
1081std::vector<unsigned int>
1083{
1084 std::vector<unsigned int> idx;
1085 int lastIdx;
1086
1087 // Make sure a netlist has been loaded and the box has contents
1088 if( m_netlist.IsEmpty() || m_symbolsListBox->GetCount() == 0 )
1089 return idx;
1090
1091 switch( aCriteria )
1092 {
1094 idx.resize( m_netlist.GetCount() );
1095 std::iota( idx.begin(), idx.end(), 0 );
1096 break;
1097
1099 // Check to see if anything is selected
1100 if( m_symbolsListBox->GetSelectedItemCount() < 1 )
1101 break;
1102
1103 // Get the symbols
1104 lastIdx = m_symbolsListBox->GetFirstSelected();
1105 idx.emplace_back( lastIdx );
1106
1107 lastIdx = m_symbolsListBox->GetNextSelected( lastIdx );
1108 while( lastIdx > 0 )
1109 {
1110 idx.emplace_back( lastIdx );
1111 lastIdx = m_symbolsListBox->GetNextSelected( lastIdx );
1112 }
1113 break;
1114
1116 for( unsigned int i = 0; i < m_netlist.GetCount(); i++ )
1117 {
1118 if( m_netlist.GetComponent( i )->GetFPID().empty() )
1119 idx.emplace_back( i );
1120 }
1121 break;
1122
1124 for( unsigned int i = 0; i < m_netlist.GetCount(); i++ )
1125 {
1126 if( !m_netlist.GetComponent( i )->GetFPID().empty() )
1127 idx.emplace_back( i );
1128 }
1129 break;
1130
1131 default:
1132 wxASSERT_MSG( false, "Invalid symbol selection criteria" );
1133 }
1134
1135 return idx;
1136}
1137
1138
1140{
1141 // returns the Footprint Viewer frame, if exists, or NULL
1142 wxWindow* window = wxWindow::FindWindowByName( FOOTPRINTVIEWER_FRAME_NAME );
1143 return dynamic_cast<DISPLAY_FOOTPRINTS_FRAME*>( window );
1144}
1145
1146
1148{
1149 return GetFootprintViewerFrame();
1150}
1151
1152
1154{
1156 else if( m_symbolsListBox->HasFocus() ) return CVPCB_MAINFRAME::CONTROL_COMPONENT;
1157 else if( m_footprintListBox->HasFocus() ) return CVPCB_MAINFRAME::CONTROL_FOOTPRINT;
1159}
1160
1161
1163{
1164 switch( aLB )
1165 {
1169 default: break;
1170 }
1171}
1172
1173
1175{
1176 // returns the LIB_ID of the selected footprint in footprint listview
1177 // or a empty string
1179}
1180
1181
1182void CVPCB_MAINFRAME::SetStatusText( const wxString& aText, int aNumber )
1183{
1184 switch( aNumber )
1185 {
1186 case 0: m_statusLine1->SetLabel( aText ); break;
1187 case 1: m_statusLine2->SetLabel( aText ); break;
1188 case 2: m_statusLine3->SetLabel( aText ); break;
1189 default: wxFAIL_MSG( wxT( "Invalid status row number" ) ); break;
1190 }
1191}
1192
1193
1195{
1198 DisplayStatus();
1199}
1200
1201
1203{
1204 const std::string& payload = mail.GetPayload();
1205
1206 switch( mail.Command() )
1207 {
1209 // Disable Close events during readNetListAndFpFiles() to avoid crash when updating
1210 // widgets:
1211 m_cannotClose = true;
1212 readNetListAndFpFiles( payload );
1213 m_cannotClose = false;
1214
1215 /* @todo
1216 Go into SCH_EDIT_FRAME::OnOpenCvpcb( wxCommandEvent& event ) and trim GNL_ALL down.
1217 */
1218 break;
1219
1220 case MAIL_RELOAD_LIB:
1221 m_cannotClose = true;
1225 m_cannotClose = false;
1226 break;
1227
1228 default:
1229 ; // ignore most
1230 }
1231}
constexpr EDA_IU_SCALE unityScale
Definition: base_units.h:111
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
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
static TOOL_ACTION paste
Definition: actions.h:73
static TOOL_ACTION copy
Definition: actions.h:71
static TOOL_ACTION undo
Definition: actions.h:68
static TOOL_ACTION redo
Definition: actions.h:69
static TOOL_ACTION cut
Definition: actions.h:70
Manage TOOL_ACTION objects.
void SetConditions(const TOOL_ACTION &aAction, const ACTION_CONDITIONS &aConditions)
Set the conditions the UI elements for activating a specific tool action should use for determining t...
Define the structure of a menu based on ACTIONs.
Definition: action_menu.h:49
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.
Definition: app_settings.h:92
Handle actions that are shared between different applications.
Store all of the related footprint information found in a netlist.
Definition: pcb_netlist.h:88
const wxString & GetReference() const
Definition: pcb_netlist.h:130
const wxString & GetValue() const
Definition: pcb_netlist.h:133
int GetPinCount() const
Definition: pcb_netlist.h:161
void SetFPID(const LIB_ID &aFPID)
Definition: pcb_netlist.h:147
const wxArrayString & GetFootprintFilters() const
Definition: pcb_netlist.h:158
const std::vector< KIID > & GetKIIDs() const
Definition: pcb_netlist.h:155
const LIB_ID & GetFPID() const
Definition: pcb_netlist.h:148
Gather all the actions that are shared by tools.
Definition: cvpcb_actions.h:38
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 deleteAssoc
Definition: cvpcb_actions.h:64
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
Handles action in main CvPcb window.
A class to define a footprint association to be made in cvpcb.
unsigned int GetComponentIndex() const
Get the index of the component to modify the association of.
LIB_ID GetNewFootprint() const
Get the new footprint to associate to the component.
Handles actions in main CvPcb window.
Definition: cvpcb_control.h:34
bool readNetListAndFpFiles(const std::string &aNetlist)
Load the netlist file built on the fly by Eeschema and loads footprint libraries from fp lib tables.
wxTimer * m_filterTimer
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
void ShowChangedLanguage() override
void SendComponentSelectionToSch(bool aClearSelectionOnly=false)
Send a remote command to Eeschema via a socket,.
bool OpenProjectFiles(const std::vector< wxString > &aFileSet, int aCtl=0) override
Open a project or set of files given by aFileList.
void doCloseWindow() override
CVPCB_UNDO_REDO_LIST m_redoList
ACTION_MENU * m_symbolsContextMenu
wxStaticText * m_statusLine3
CVPCB_MAINFRAME::CONTROL_TYPE GetFocusedControl() const
Find out which control currently has focus.
CVPCB_FILTER_ACTION
The action to apply to a footprint filter when it is modified.
@ FILTER_DISABLE
Turn off the filter.
@ FILTER_ENABLE
Turn on the filter.
@ FILTER_TOGGLE
Toggle the filter state.
void onTextFilterChangedTimer(wxTimerEvent &aEvent)
void onTextFilterChanged(wxCommandEvent &event)
LIBRARY_LISTBOX * m_librariesListBox
void setupTools()
Setup the tool system for the CVPCB main frame.
DISPLAY_FOOTPRINTS_FRAME * GetFootprintViewerFrame() const
wxButton * m_saveAndContinue
void RedoAssociation()
Redo the most recently undone association.
bool LoadFootprintFiles()
Read the list of footprint (*.mod files) and generate the list of footprints.
void SetStatusText(const wxString &aText, int aNumber=0) override
wxString GetSelectedFootprint()
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
CVPCB_MAINFRAME(KIWAY *aKiway, wxWindow *aParent)
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.
wxStaticText * m_statusLine1
void setupEventHandlers()
Setup event handlers.
void setupUIConditions() override
Setup the UI conditions for the various actions and their controls in this frame.
void SetSelectedComponent(int aIndex, bool aSkipUpdate=false)
Set the currently selected component in the components listbox.
ACTION_MENU * m_footprintContextMenu
CONTROL_TYPE
The type of the controls present in the application.
@ CONTROL_NONE
No controls have focus.
@ CONTROL_LIBRARY
Library listbox.
@ CONTROL_FOOTPRINT
Footprint listbox.
@ CONTROL_COMPONENT
Component listbox.
wxString formatSymbolDesc(int idx, const wxString &aReference, const wxString &aValue, const wxString &aFootprint)
void SetFocusedControl(CVPCB_MAINFRAME::CONTROL_TYPE aControl)
Set the focus to a specific control.
void KiwayMailIn(KIWAY_EXPRESS &aEvent) override
Receive KIWAY_EXPRESS messages from other players.
void OnSelectComponent(wxListEvent &event)
Called when clicking on a component in component list window:
void UndoAssociation()
Undo the most recent associations that were performed.
void DisplayStatus()
Update the information displayed on the status bar at bottom of the main frame.
CVPCB_UNDO_REDO_LIST m_undoList
bool canCloseWindow(wxCloseEvent &aCloseEvent) override
FOOTPRINT_LIST * m_FootprintsList
wxWindow * GetToolCanvas() const override
Canvas access.
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.
void AssociateFootprint(const CVPCB_ASSOCIATION &aAssociation, bool aNewEntry=true, bool aAddUndoItem=true)
Associate a footprint with a specific component in the list.
void configureToolbars() override
void updateFootprintViewerOnIdle(wxIdleEvent &aEvent)
void refreshAfterSymbolSearch(COMPONENT *aSymbol)
wxStaticText * m_statusLine2
FOOTPRINTS_LISTBOX * m_footprintListBox
CRITERIA
Criteria to use to identify sets of components.
@ ALL_COMPONENTS
All components.
@ NA_COMPONENTS
Not associated components.
@ SEL_COMPONENTS
Selected components.
@ ASSOC_COMPONENTS
Associated components.
SYMBOLS_LISTBOX * m_symbolsListBox
TOOL_DISPATCHER * m_toolDispatcher
int readSchematicNetlist(const std::string &aNetlist)
Read the netlist (.net) file built on the fly by Eeschema.
bool SaveFootprintAssociation(bool doSaveSchematic)
Save the edits that the user has done by sending them back to Eeschema via the kiway.
wxTextCtrl * m_tcFilterString
COMPONENT * GetSelectedComponent()
Get the selected component from the component listbox.
wxString m_FilterString
Toolbar configuration for cvpcb.
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.
TOOLBAR_SETTINGS * m_toolbarSettings
wxAuiManager m_auimgr
virtual void RecreateToolbars()
virtual void LoadSettings(APP_SETTINGS_BASE *aCfg)
Load common frame parameters from a configuration file.
virtual void SaveSettings(APP_SETTINGS_BASE *aCfg)
Save common frame parameters to a configuration data file.
ACTION_TOOLBAR * m_tbTopMain
wxString m_aboutTitle
void ReCreateMenuBar()
Recreate the menu bar.
Specialization of the wxAuiPaneInfo class for KiCad panels.
Class that groups generic conditions for editor states.
SELECTION_CONDITION RedoAvailable()
Create a functor that tests if there are any items in the redo queue.
virtual SELECTION_CONDITION UndoAvailable()
Create a functor that tests if there are any items in the undo queue.
SELECTION_CONDITION ContentModified()
Create a functor that tests if the content of the frame is modified.
void SetSelectedFootprint(const LIB_ID &aFPID)
void SetFootprints(FOOTPRINT_LIST &aList, const wxString &aLibName, COMPONENT *aComponent, const wxString &aFootPrintFilterPattern, int aFilterType)
Populate the wxListCtrl with the footprints from aList that meet the filter criteria defined by aFilt...
FP_FILTER_T
Filter setting constants.
Definition: listboxes.h:93
@ FILTERING_BY_COMPONENT_FP_FILTERS
Definition: listboxes.h:95
wxString OnGetItemText(long item, long column) const override
This overloaded function MUST be provided for the wxLC_VIRTUAL mode because real data is not handled ...
void SetSelection(int aIndex, bool aState=true)
wxString GetLibNickname() const override
wxString GetKeywords()
wxString GetDesc() override
void DisplayErrors(wxTopLevelWindow *aCaller=nullptr)
unsigned GetErrorCount() const
virtual bool ReadFootprintFiles(FP_LIB_TABLE *aTable, const wxString *aNickname=nullptr, PROGRESS_REPORTER *aProgressReporter=nullptr)=0
Read all the footprints provided by the combination of aTable and aNickname.
FOOTPRINT_INFO * GetFootprintInfo(const wxString &aFootprintName)
Get info for a footprint by id.
static FOOTPRINT_LIST * GetInstance(KIWAY &aKiway)
Factory function to return a FOOTPRINT_LIST via Kiway.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
Definition: ki_exception.h:77
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:30
void DeselectAll()
Remove all selection in lists which can have more than one item selected.
Read the new s-expression based KiCad netlist format.
virtual void LoadNetlist() override
Load the contents of the netlist file into aNetlist.
Definition: kiid.h:49
Carry a payload from one KIWAY_PLAYER to another within a PROJECT.
Definition: kiway_express.h:40
std::string & GetPayload()
Return the payload, which can be any text but it typically self identifying s-expression.
Definition: kiway_express.h:58
MAIL_T Command()
Returns the MAIL_T associated with this mail.
Definition: kiway_express.h:50
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
KIWAY & Kiway() const
Return a reference to the KIWAY that this object has an opportunity to participate in.
Definition: kiway_holder.h:55
A wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of a KiCad project.
Definition: kiway_player.h:65
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition: kiway.h:285
virtual void ExpressMail(FRAME_T aDestination, MAIL_T aCommand, std::string &aPayload, wxWindow *aSource=nullptr)
Send aPayload to aDestination from aSource.
Definition: kiway.cpp:527
virtual PROJECT & Prj() const
Return the PROJECT associated with this KIWAY.
Definition: kiway.cpp:195
void AppendLine(const wxString &text)
wxString GetSelectedLibrary()
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:49
bool IsValid() const
Check if this LID_ID is valid.
Definition: lib_id.h:172
bool empty() const
Definition: lib_id.h:193
UTF8 Format() const
Definition: lib_id.cpp:119
const wxString GetUniStringLibNickname() const
Definition: lib_id.h:88
const UTF8 & GetLibItemName() const
Definition: lib_id.h:102
std::vector< wxString > GetLogicalLibs()
Return the logical library names, all of them that are pertinent to a look up done on this LIB_TABLE.
bool HasLibrary(const wxString &aNickname, bool aCheckEnabled=false) const
Test for the existence of aNickname in the library table.
wxString GetFullURI(const wxString &aLibNickname, bool aExpandEnvVars=true) const
Return the full URI of the library mapped to aLibNickname.
static const wxString GetPinningSymbol()
unsigned GetCount() const
Definition: pcb_netlist.h:276
bool IsEmpty() const
Definition: pcb_netlist.h:266
void Clear()
Remove all components from the netlist.
Definition: pcb_netlist.h:271
COMPONENT * GetComponent(unsigned aIndex)
Return the COMPONENT at aIndex.
Definition: pcb_netlist.h:284
void SortByReference()
virtual COMMON_SETTINGS * GetCommonSettings() const
Definition: pgm_base.cpp:687
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition: pgm_base.h:125
The backing store for a PROJECT, in JSON format.
Definition: project_file.h:73
static FP_LIB_TABLE * PcbFootprintLibs(PROJECT *aProject)
Return the table of footprint libraries without Kiway.
Definition: project_pcb.cpp:37
virtual PROJECT_FILE & GetProjectFile() const
Definition: project.h:203
T * GetToolbarSettings(const wxString &aFilename)
Return a handle to the given toolbar settings.
Is a LINE_READER that reads from a multiline 8 bit wide std::string.
Definition: richio.h:253
void SetString(unsigned linecount, const wxString &text)
void SetSelection(int index, bool State=true)
void AppendWarning(int index)
void RemoveWarning(int index)
TOOL_MANAGER * m_toolManager
Definition: tools_holder.h:171
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:55
ACTIONS * m_actions
Definition: tools_holder.h:172
virtual void DispatchWxEvent(wxEvent &aEvent)
Process wxEvents (mostly UI events), translate them to TOOL_EVENTs, and make tools handle those.
Master controller class:
Definition: tool_manager.h:62
bool RunAction(const std::string &aActionName, T aParam)
Run the specified action immediately, pausing the current action to run the new one.
Definition: tool_manager.h:150
bool InvokeTool(TOOL_ID aToolId)
Call a tool by sending a tool activation event to tool of given ID.
ACTION_MANAGER * GetActionManager() const
Definition: tool_manager.h:306
void RegisterTool(TOOL_BASE *aTool)
Add a tool to the manager set and sets it up.
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).
void InitTools()
Initialize all registered tools.
void ShutdownAllTools()
Shutdown all tools with a currently registered event loop in this tool manager by waking them up with...
const char * c_str() const
Definition: utf8.h:103
wxString wx_str() const
Definition: utf8.cpp:45
Multi-thread safe progress reporter dialog, intended for use of tasks that parallel reporting back of...
bool HandleUnsavedChanges(wxWindow *aParent, const wxString &aMessage, const std::function< bool()> &aSaveFunction)
Display a dialog with Save, Cancel and Discard Changes buttons.
Definition: confirm.cpp:130
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition: confirm.cpp:194
This file is part of the common library.
@ ID_CVPCB_LIBRARY_LIST
Definition: cvpcb_id.h:33
@ ID_CVPCB_FOOTPRINT_LIST
Definition: cvpcb_id.h:32
@ ID_CVPCB_COMPONENT_LIST
Definition: cvpcb_id.h:31
#define CHECK(x)
#define ENABLE(x)
std::vector< CVPCB_ASSOCIATION > CVPCB_UNDO_REDO_ENTRIES
#define FOOTPRINTVIEWER_FRAME_NAME
#define _(s)
#define KICAD_DEFAULT_DRAWFRAME_STYLE
bool SendCommand(int aService, const std::string &aMessage)
Used by a client to sent (by a socket connection) a data to a server.
Definition: eda_dde.cpp:310
DDE server & client.
#define MSG_TO_SCH
Definition: eda_dde.h:50
@ FRAME_SCH
Definition: frame_type.h:34
@ FRAME_CVPCB
Definition: frame_type.h:52
@ MAIL_SELECTION
Definition: mail_type.h:40
@ MAIL_RELOAD_LIB
Definition: mail_type.h:57
@ MAIL_EESCHEMA_NETLIST
Definition: mail_type.h:44
void SetShutdownBlockReason(wxWindow *aWindow, const wxString &aReason)
Sets the block reason why the window/application is preventing OS shutdown.
Definition: unix/app.cpp:90
bool SupportsShutdownBlockReason()
Whether or not the window supports setting a shutdown block reason.
Definition: unix/app.cpp:79
void FixupCancelButtonCmdKeyCollision(wxWindow *aWindow)
Definition: wxgtk/ui.cpp:151
KICOMMON_API wxFont GetMonospacedUIFont()
Definition: ui_common.cpp:93
KICOMMON_API wxFont GetStatusFont(wxWindow *aWindow)
Definition: ui_common.cpp:132
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
Definition: kicad_algo.h:100
static PGM_BASE * process
Definition: pgm_base.cpp:1068
PGM_BASE & Pgm()
The global program "get" accessor.
Definition: pgm_base.cpp:1071
see class PGM_BASE
int StrNumCmp(const wxString &aString1, const wxString &aString2, bool aIgnoreCase)
Compare two strings with alphanumerical content.
wxString From_UTF8(const char *cstring)
wxString EscapeString(const wxString &aSource, ESCAPE_CONTEXT aContext)
The Escape/Unescape routines use HTML-entity-reference-style encoding to handle characters which are:...
@ CTX_IPC
Definition: string_utils.h:56
std::vector< wxString > pinned_fp_libs