KiCad PCB EDA Suite
Loading...
Searching...
No Matches
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 <[email protected]>
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#include <wx/ffile.h>
66
67
68CVPCB_MAINFRAME::CVPCB_MAINFRAME( KIWAY* aKiway, wxWindow* aParent ) :
69 KIWAY_PLAYER( aKiway, aParent, FRAME_CVPCB, _( "Assign Footprints" ), wxDefaultPosition,
70 wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE, wxT( "CvpcbFrame" ),
71 unityScale ),
72 m_footprintListBox( nullptr ),
73 m_librariesListBox( nullptr ),
74 m_symbolsListBox( nullptr ),
75 m_tcFilterString( nullptr ),
77{
78 m_modified = false;
79 m_cannotClose = false;
83 m_initialized = false;
84 m_aboutTitle = _( "Assign Footprints" );
85
86 // Give an icon
87 wxIcon icon;
88 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_cvpcb ) );
89 SetIcon( icon );
90
91 SetAutoLayout( true );
92
94
95 setupTools();
97
102
105
108
111
113
114 m_auimgr.SetManagedWindow( this );
115
116 m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( "TopMainToolbar" ).Top().Layer(6) );
117
118 m_auimgr.AddPane( m_librariesListBox, EDA_PANE().Palette().Name( "Libraries" ).Left().Layer(1)
119 .Caption( _( "Footprint Libraries" ) )
120 .BestSize((int) ( m_frameSize.x * 0.20 ), m_frameSize.y ) );
121
122 m_auimgr.AddPane( m_symbolsListBox, EDA_PANE().Palette().Name( "Symbols" ).Center().Layer(0)
123 .Caption( _( "Symbol : Footprint Assignments" ) ) );
124
125 m_auimgr.AddPane( m_footprintListBox, EDA_PANE().Palette().Name( "Footprints" ).Right().Layer(1)
126 .Caption( _( "Filtered Footprints" ) )
127 .BestSize((int) ( m_frameSize.x * 0.30 ), m_frameSize.y ) );
128
129 // Build the bottom panel, to display 2 status texts and the buttons:
130 auto bottomPanel = new wxPanel( this );
131 auto panelSizer = new wxBoxSizer( wxVERTICAL );
132
133 wxFlexGridSizer* fgSizerStatus = new wxFlexGridSizer( 3, 1, 0, 0 );
134 fgSizerStatus->SetFlexibleDirection( wxBOTH );
135 fgSizerStatus->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
136
137 m_statusLine1 = new wxStaticText( bottomPanel, wxID_ANY, wxEmptyString );
138 fgSizerStatus->Add( m_statusLine1, 0, 0, 5 );
139
140 m_statusLine2 = new wxStaticText( bottomPanel, wxID_ANY, wxEmptyString );
141 fgSizerStatus->Add( m_statusLine2, 0, 0, 5 );
142
143 m_statusLine3 = new wxStaticText( bottomPanel, wxID_ANY, wxEmptyString );
144 fgSizerStatus->Add( m_statusLine3, 0, wxBOTTOM, 3 );
145
146 panelSizer->Add( fgSizerStatus, 1, wxEXPAND|wxLEFT, 2 );
147
148 m_statusLine1->SetFont( KIUI::GetStatusFont( this ) );
149 m_statusLine2->SetFont( KIUI::GetStatusFont( this ) );
150 m_statusLine3->SetFont( KIUI::GetStatusFont( this ) );
151
152 // Add buttons:
153 auto buttonsSizer = new wxBoxSizer( wxHORIZONTAL );
154 auto sdbSizer = new wxStdDialogButtonSizer();
155
156 m_saveAndContinue = new wxButton( bottomPanel, wxID_ANY,
157 _( "Apply, Save Schematic && Continue" ) );
158 buttonsSizer->Add( m_saveAndContinue, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 20 );
159
160 auto sdbSizerOK = new wxButton( bottomPanel, wxID_OK );
161 sdbSizer->AddButton( sdbSizerOK );
162 auto sdbSizerCancel = new wxButton( bottomPanel, wxID_CANCEL );
163 sdbSizer->AddButton( sdbSizerCancel );
164 sdbSizer->Realize();
165
166 buttonsSizer->Add( sdbSizer, 0, 0, 5 );
167 panelSizer->Add( buttonsSizer, 0, wxALIGN_RIGHT|wxALL, 5 );
168
169 bottomPanel->SetSizer( panelSizer );
170 bottomPanel->Fit();
171
172 sdbSizerOK->SetDefault();
174
175 m_auimgr.AddPane( bottomPanel, EDA_PANE().HToolbar().Name( "Buttons" ).Bottom().Layer(6) );
176
177 m_auimgr.Update();
178 m_initialized = true;
179
180 auto setPaneWidth =
181 [this]( wxAuiPaneInfo& pane, int width )
182 {
183 // wxAUI hack: force width by setting MinSize() and then Fixed()
184 // thanks to ZenJu http://trac.wxwidgets.org/ticket/13180
185 pane.MinSize( width, -1 );
186 pane.BestSize( width, -1 );
187 pane.MaxSize( width, -1 );
188 pane.Fixed();
189 m_auimgr.Update();
190
191 // now make it resizable again
192 pane.MinSize( 20, -1 );
193 pane.Resizable();
194 m_auimgr.Update();
195 };
196
197 if( CVPCB_SETTINGS* cfg = dynamic_cast<CVPCB_SETTINGS*>( config() ) )
198 {
199 m_tcFilterString->ChangeValue( cfg->m_FilterString );
200
201 if( cfg->m_LibrariesWidth > 0 )
202 setPaneWidth( m_auimgr.GetPane( "Libraries" ), cfg->m_LibrariesWidth );
203
204 if( cfg->m_FootprintsWidth > 0 )
205 setPaneWidth( m_auimgr.GetPane( "Footprints" ), cfg->m_FootprintsWidth );
206 }
207
208 // Connect Events
210
211 // Toolbar events
212 Bind( wxEVT_TEXT, &CVPCB_MAINFRAME::onTextFilterChanged, this );
213
214 // Attach the events to the tool dispatcher
216 Bind( wxEVT_CHAR_HOOK, &TOOL_DISPATCHER::DispatchWxEvent, m_toolDispatcher );
217
218 m_filterTimer = new wxTimer( this );
219 Bind( wxEVT_TIMER, &CVPCB_MAINFRAME::onTextFilterChangedTimer, this, m_filterTimer->GetId() );
220
221 // Start the main processing loop
222 m_toolManager->InvokeTool( "cvpcb.Control" );
223
224 m_filterTimer->StartOnce( 100 );
225
226 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "Symbol to footprint changes are unsaved" ) );
227}
228
229
231{
232 Unbind( wxEVT_TEXT, &CVPCB_MAINFRAME::onTextFilterChanged, this );
234 Unbind( wxEVT_CHAR_HOOK, &TOOL_DISPATCHER::DispatchWxEvent, m_toolDispatcher );
235
236 Unbind( wxEVT_TIMER, &CVPCB_MAINFRAME::onTextFilterChangedTimer, this, m_filterTimer->GetId() );
237 Unbind( wxEVT_IDLE, &CVPCB_MAINFRAME::updateFootprintViewerOnIdle, this );
238
239 // Clean up the tool infrastructure
240 delete m_actions;
241 delete m_toolManager;
242 delete m_toolDispatcher;
243
244 m_auimgr.UnInit();
245}
246
247
249{
250 // Create the manager
251 m_actions = new CVPCB_ACTIONS();
253 m_toolManager->SetEnvironment( nullptr, nullptr, nullptr, config(), this );
255
256 // Register tools
257 m_toolManager->RegisterTool( new COMMON_CONTROL );
258 m_toolManager->RegisterTool( new CVPCB_CONTROL );
259 m_toolManager->RegisterTool( new CVPCB_ASSOCIATION_TOOL );
260 m_toolManager->InitTools();
261
262 CVPCB_CONTROL* tool = m_toolManager->GetTool<CVPCB_CONTROL>();
263
264 // Even though these menus will open with the right-click, we treat them as a normal
265 // menu instead of a context menu because we don't care about their position and want
266 // to be able to tell the difference between a menu click and a hotkey activation.
267
268 // Create the context menu for the symbols list box
269 m_symbolsContextMenu = new ACTION_MENU( false, tool );
271 m_symbolsContextMenu->AppendSeparator();
275 m_symbolsContextMenu->AppendSeparator();
277
278 // Create the context menu for the footprint list box
279 m_footprintContextMenu = new ACTION_MENU( false, tool );
281}
282
283
285{
287
288 ACTION_MANAGER* mgr = m_toolManager->GetActionManager();
289 EDITOR_CONDITIONS cond( this );
290
291 wxASSERT( mgr );
292
293#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
294#define CHECK( x ) ACTION_CONDITIONS().Check( x )
295
300
301 auto compFilter =
302 [this] ( const SELECTION& )
303 {
305 };
306
307 auto libFilter =
308 [this] ( const SELECTION& )
309 {
311 };
312
313 auto pinFilter =
314 [this] ( const SELECTION& )
315 {
317 };
318
322
323#undef CHECK
324#undef ENABLE
325}
326
327
329{
330 // Connect the handlers to launch the context menus in the listboxes
331 m_footprintListBox->Bind( wxEVT_RIGHT_DOWN,
332 [this]( wxMouseEvent& )
333 {
334 PopupMenu( m_footprintContextMenu );
335 } );
336
337 m_symbolsListBox->Bind( wxEVT_RIGHT_DOWN,
338 [this]( wxMouseEvent& )
339 {
340 PopupMenu( m_symbolsContextMenu );
341 } );
342
343 // Connect the handler for the save button
344 m_saveAndContinue->Bind( wxEVT_COMMAND_BUTTON_CLICKED,
345 [this]( wxCommandEvent& )
346 {
347 // saveAssociations must be run immediately
349 } );
350
351 // Connect the handlers for the ok/cancel buttons
352 Bind( wxEVT_BUTTON,
353 [this]( wxCommandEvent& )
354 {
355 // saveAssociations must be run immediately, before running Close( true )
357 Close( true );
358 }, wxID_OK );
359
360 Bind( wxEVT_BUTTON,
361 [this]( wxCommandEvent& )
362 {
363 Close( false );
364 }, wxID_CANCEL );
365
366 // Connect the handlers for the close events
367 Bind( wxEVT_MENU,
368 [this]( wxCommandEvent& )
369 {
370 Close( false );
371 }, wxID_CLOSE );
372 Bind( wxEVT_MENU,
373 [this]( wxCommandEvent& )
374 {
375 Close( false );
376 }, wxID_EXIT );
377
378 // Just skip the resize events
379 Bind( wxEVT_SIZE,
380 []( wxSizeEvent& aEvent )
381 {
382 aEvent.Skip();
383 } );
384}
385
386
387bool CVPCB_MAINFRAME::canCloseWindow( wxCloseEvent& aEvent )
388{
389 if( m_modified )
390 {
391 // Shutdown blocks must be determined and vetoed as early as possible
392 if( KIPLATFORM::APP::SupportsShutdownBlockReason() && aEvent.GetId() == wxEVT_QUERY_END_SESSION )
393 return false;
394
395 if( !HandleUnsavedChanges( this, _( "Symbol to Footprint links have been modified. Save changes?" ),
396 [&]() -> bool
397 {
398 return SaveFootprintAssociation( false );
399 } ) )
400 {
401 return false;
402 }
403 }
404
405 if( m_cannotClose )
406 return false;
407
408 return true;
409}
410
411
413{
414 m_symbolsListBox->Shutdown();
415 m_footprintListBox->Shutdown();
416
418 GetFootprintViewerFrame()->Close( true );
419
420 m_modified = false;
421
422 // Stop the timer during destruction early to avoid potential race conditions (that do happen)
423 m_filterTimer->Stop();
424
425 // Shutdown all running tools
426 if( m_toolManager )
427 m_toolManager->ShutdownAllTools();
428
429 // clear symbol selection in schematic:
431}
432
433
434void CVPCB_MAINFRAME::onTextFilterChanged( wxCommandEvent& event )
435{
436 // Called when changing the filter string in main toolbar.
437 // If the option FOOTPRINTS_LISTBOX::FILTERING_BY_TEXT_PATTERN is set, update the list
438 // of available footprints which match the filter
439
440 m_filterTimer->StartOnce( 200 );
441}
442
443
445{
446 // GTK loses the search-control's focus on a Refresh event, so we record the focus and
447 // insertion point here and then restore them at the end.
448 bool searchCtrlHasFocus = m_tcFilterString->HasFocus();
449 long pos = m_tcFilterString->GetInsertionPoint();
450
452 wxString libraryName = m_librariesListBox->GetSelectedLibrary();
453
454 m_footprintListBox->SetFootprints( *m_FootprintsList, libraryName, symbol,
456
457 if( symbol && symbol->GetFPID().IsValid() )
458 m_footprintListBox->SetSelectedFootprint( symbol->GetFPID() );
459 else if( m_footprintListBox->GetSelection() >= 0 )
460 m_footprintListBox->SetSelection( m_footprintListBox->GetSelection(), false );
461
463
465
466 if( searchCtrlHasFocus && !m_tcFilterString->HasFocus() )
467 {
468 m_tcFilterString->SetFocus();
469 m_tcFilterString->SetInsertionPoint( pos );
470 }
471}
472
473
474void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event )
475{
477 return;
478
480 wxString libraryName = m_librariesListBox->GetSelectedLibrary();
481
482 m_footprintListBox->SetFootprints( *m_FootprintsList, libraryName, symbol,
484
485 if( symbol && symbol->GetFPID().IsValid() )
486 m_footprintListBox->SetSelectedFootprint( symbol->GetFPID() );
487 else if( m_footprintListBox->GetSelection() >= 0 )
488 m_footprintListBox->SetSelection( m_footprintListBox->GetSelection(), false );
489
491
492 refreshAfterSymbolSearch( symbol );
493}
494
495
504
505
507{
508 Unbind( wxEVT_IDLE, &CVPCB_MAINFRAME::updateFootprintViewerOnIdle, this );
509 m_viewerPendingUpdate = false;
510
511 // On some platforms (OSX) the focus is lost when the viewers (fp and 3D viewers)
512 // are opened and refreshed when a new footprint is selected.
513 // If the listbox has the focus before selecting a new footprint, it will be forced
514 // after selection.
515 bool footprintListHasFocus = m_footprintListBox->HasFocus();
516 bool symbolListHasFocus = m_symbolsListBox->HasFocus();
517
518 // If the footprint view window is displayed, update the footprint.
521
523
524 if( footprintListHasFocus )
525 m_footprintListBox->SetFocus();
526 else if( symbolListHasFocus )
527 m_symbolsListBox->SetFocus();
528}
529
530
532{
534
535 if( CVPCB_SETTINGS* cfg = dynamic_cast<CVPCB_SETTINGS*>( aCfg ) )
536 m_filteringOptions = cfg->m_FilterFlags;
537}
538
539
541{
543
544 if( CVPCB_SETTINGS* cfg = dynamic_cast<CVPCB_SETTINGS*>( aCfg ) )
545 {
546 cfg->m_FilterFlags = m_filteringOptions;
547 cfg->m_FilterString = m_tcFilterString->GetValue();
548
549 cfg->m_LibrariesWidth = m_librariesListBox->GetSize().x;
550 cfg->m_FootprintsWidth = m_footprintListBox->GetSize().x;
551 }
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() ) )
660 m_symbolsListBox->AppendWarning( idx );
661 else
662 m_symbolsListBox->RemoveWarning( idx );
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
725 m_footprintListBox->SetSelection( m_footprintListBox->GetSelection(), false );
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 {
801 int pc = symbol->GetPinCount();
802 wxLogTrace( "CVPCB_PINCOUNT", wxT( "DisplayStatus: selected '%s' pinCount=%d" ),
803 symbol->GetReference(), pc );
804 msg = wxString::Format( wxT( "%i" ), pc );
805 }
806
807 if( !filters.IsEmpty() )
808 filters += wxT( ", " );
809
810 filters += _( "Pin Count" );
811
812 if( !msg.IsEmpty() )
813 filters += wxString::Format( wxT( " (%s)" ), msg );
814 }
815
817 {
818 msg = m_librariesListBox->GetSelectedLibrary();
819
820 if( !filters.IsEmpty() )
821 filters += wxT( ", " );
822
823 filters += _( "Library" );
824
825 if( !msg.IsEmpty() )
826 filters += wxString::Format( wxT( " (%s)" ), msg );
827 }
828
829 wxString textFilter = m_tcFilterString->GetValue();
830
831 if( !textFilter.IsEmpty() )
832 {
833 if( !filters.IsEmpty() )
834 filters += wxT( ", " );
835
836 filters += _( "Search Text" ) + wxString::Format( wxT( " (%s)" ), textFilter );
837 }
838
839 if( filters.IsEmpty() )
840 msg = _( "No Filtering" );
841 else
842 msg.Printf( _( "Filtered by %s" ), filters );
843
844 msg += wxString::Format( _( ": %i matching footprints" ), m_footprintListBox->GetCount() );
845
846 SetStatusText( msg );
847
848
849 msg.Empty();
850 wxString footprintName = GetSelectedFootprint();
851
852 FOOTPRINT_INFO* fp = m_FootprintsList->GetFootprintInfo( footprintName );
853
854 if( fp ) // can be NULL if no netlist loaded
855 {
856 msg = wxString::Format( _( "Description: %s; Keywords: %s" ),
857 fp->GetDesc(),
858 fp->GetKeywords() );
859 }
860
861 SetStatusText( msg, 1 );
862
863 msg.Empty();
864 wxString lib;
865
866 // Choose the footprint to get the information on
867 if( fp )
868 {
869 // Use the footprint in the footprint viewer
870 lib = fp->GetLibNickname();
871 }
873 {
874 // Use the footprint of the selected symbol
875 if( symbol )
876 lib = symbol->GetFPID().GetUniStringLibNickname();
877 }
879 {
880 // Use the library that is selected
881 lib = m_librariesListBox->GetSelectedLibrary();
882 }
883
884 // Extract the library information
886
887 if( fptbl->HasLibrary( lib ) )
888 msg = wxString::Format( _( "Library location: %s" ), fptbl->GetFullURI( lib ) );
889 else
890 msg = wxString::Format( _( "Library location: unknown" ) );
891
892 SetStatusText( msg, 2 );
893}
894
895
897{
899
900 // Check if there are footprint libraries in the footprint library table.
901 if( !fptbl || !fptbl->GetLogicalLibs().size() )
902 {
903 wxMessageBox( _( "No PCB footprint libraries are listed in the current footprint "
904 "library table." ), _( "Configuration Error" ), wxOK | wxICON_ERROR );
905 return false;
906 }
907
908 WX_PROGRESS_REPORTER progressReporter( this, _( "Load Footprint Libraries" ), 1, PR_CAN_ABORT );
909
910 m_FootprintsList->ReadFootprintFiles( fptbl, nullptr, &progressReporter );
911
912 if( m_FootprintsList->GetErrorCount() )
913 m_FootprintsList->DisplayErrors( this );
914
915 return true;
916}
917
918
919void CVPCB_MAINFRAME::SendComponentSelectionToSch( bool aClearSelectionOnly )
920{
921 if( m_netlist.IsEmpty() )
922 return;
923
924 std::string command = "$SELECT: ";
925
926 if( aClearSelectionOnly )
927 {
928 // Sending an empty list means clearing the selection.
929 if( Kiface().IsSingle() )
930 SendCommand( MSG_TO_SCH, command );
931 else
932 Kiway().ExpressMail( FRAME_SCH, MAIL_SELECTION, command, this );
933
934 return;
935 }
936
937 int selection = m_symbolsListBox->GetSelection();
938
939 if( selection < 0 ) // Nothing selected
940 return;
941
942 if( m_netlist.GetComponent( selection ) == nullptr )
943 return;
944
945 // Now select the corresponding symbol on the schematic:
946 wxString ref = m_netlist.GetComponent( selection )->GetReference();
947
948 // The prefix 0,F before the reference is for selecting the symbol
949 // (one can select a pin with a different prefix)
950 command += wxT( "0,F" ) + EscapeString( ref, CTX_IPC );
951
952 if( Kiface().IsSingle() )
953 SendCommand( MSG_TO_SCH, command );
954 else
955 Kiway().ExpressMail( FRAME_SCH, MAIL_SELECTION, command, this );
956}
957
958
959int CVPCB_MAINFRAME::readSchematicNetlist( const std::string& aNetlist )
960{
961 STRING_LINE_READER* stringReader = new STRING_LINE_READER( aNetlist, "Eeschema via Kiway" );
962 KICAD_NETLIST_READER netlistReader( stringReader, &m_netlist );
963
964 m_netlist.Clear();
965
966 // Trace basic payload characteristics to verify libparts are present and visible here
967 wxLogTrace( "CVPCB_PINCOUNT",
968 wxT( "readSchematicNetlist: payload size=%zu has_libparts=%d has_libpart=%d" ),
969 aNetlist.size(), aNetlist.find( "(libparts" ) != std::string::npos,
970 aNetlist.find( "(libpart" ) != std::string::npos );
971
972 try
973 {
974 netlistReader.LoadNetlist();
975 }
976 catch( const IO_ERROR& ioe )
977 {
978 wxString msg = wxString::Format( _( "Error loading schematic.\n%s" ),
979 ioe.What().GetData() );
980 wxMessageBox( msg, _( "Load Error" ), wxOK | wxICON_ERROR );
981 return 1;
982 }
983
984 // We also remove footprint name if it is "$noname" because this is a dummy name,
985 // not the actual name of the footprint.
986 for( unsigned ii = 0; ii < m_netlist.GetCount(); ii++ )
987 {
988 if( m_netlist.GetComponent( ii )->GetFPID().GetLibItemName() == std::string( "$noname" ) )
989 m_netlist.GetComponent( ii )->SetFPID( LIB_ID() );
990 }
991
992 // Sort symbols by reference:
993 m_netlist.SortByReference();
994
995 return 0;
996}
997
998
1000{
1001 m_footprintListBox->SetFootprints( *m_FootprintsList, wxEmptyString, nullptr, wxEmptyString,
1003 DisplayStatus();
1004}
1005
1006
1008{
1012
1013 // Use same sorting algorithm as LIB_TREE_NODE::AssignIntrinsicRanks
1014 struct library_sort
1015 {
1016 bool operator()( const wxString& lhs, const wxString& rhs ) const
1017 {
1018 return StrNumCmp( lhs, rhs, true ) < 0;
1019 }
1020 };
1021
1022 std::set<wxString, library_sort> pinnedMatches;
1023 std::set<wxString, library_sort> otherMatches;
1024
1025 m_librariesListBox->ClearList();
1026
1027 auto process =
1028 [&]( const wxString& aNickname )
1029 {
1030 if( alg::contains( project.m_PinnedFootprintLibs, aNickname )
1031 || alg::contains( cfg->m_Session.pinned_fp_libs, aNickname ) )
1032 {
1033 pinnedMatches.insert( aNickname );
1034 }
1035 else
1036 {
1037 otherMatches.insert( aNickname );
1038 }
1039 };
1040
1041
1042 if( tbl )
1043 {
1044 std::vector<wxString> libNickNames = tbl->GetLogicalLibs();
1045
1046 for( const wxString& libNickName : libNickNames )
1047 process( libNickName );
1048 }
1049
1050 for( const wxString& nickname : pinnedMatches )
1052
1053 for( const wxString& nickname : otherMatches )
1054 m_librariesListBox->AppendLine( nickname );
1055
1056 m_librariesListBox->Finish();
1057}
1058
1059
1061{
1062 int selection = m_symbolsListBox->GetSelection();
1063
1064 if( selection >= 0 && selection < (int) m_netlist.GetCount() )
1065 return m_netlist.GetComponent( selection );
1066
1067 return nullptr;
1068}
1069
1070
1071void CVPCB_MAINFRAME::SetSelectedComponent( int aIndex, bool aSkipUpdate )
1072{
1073 m_skipComponentSelect = aSkipUpdate;
1074
1075 if( aIndex < 0 )
1076 {
1077 m_symbolsListBox->DeselectAll();
1078 }
1079 else if( aIndex < m_symbolsListBox->GetCount() )
1080 {
1081 m_symbolsListBox->DeselectAll();
1082 m_symbolsListBox->SetSelection( aIndex );
1084 }
1085
1086 m_skipComponentSelect = false;
1087}
1088
1089
1090std::vector<unsigned int>
1092{
1093 std::vector<unsigned int> idx;
1094 int lastIdx;
1095
1096 // Make sure a netlist has been loaded and the box has contents
1097 if( m_netlist.IsEmpty() || m_symbolsListBox->GetCount() == 0 )
1098 return idx;
1099
1100 switch( aCriteria )
1101 {
1103 idx.resize( m_netlist.GetCount() );
1104 std::iota( idx.begin(), idx.end(), 0 );
1105 break;
1106
1108 // Check to see if anything is selected
1109 if( m_symbolsListBox->GetSelectedItemCount() < 1 )
1110 break;
1111
1112 // Get the symbols
1113 lastIdx = m_symbolsListBox->GetFirstSelected();
1114 idx.emplace_back( lastIdx );
1115
1116 lastIdx = m_symbolsListBox->GetNextSelected( lastIdx );
1117 while( lastIdx > 0 )
1118 {
1119 idx.emplace_back( lastIdx );
1120 lastIdx = m_symbolsListBox->GetNextSelected( lastIdx );
1121 }
1122 break;
1123
1125 for( unsigned int i = 0; i < m_netlist.GetCount(); i++ )
1126 {
1127 if( m_netlist.GetComponent( i )->GetFPID().empty() )
1128 idx.emplace_back( i );
1129 }
1130 break;
1131
1133 for( unsigned int i = 0; i < m_netlist.GetCount(); i++ )
1134 {
1135 if( !m_netlist.GetComponent( i )->GetFPID().empty() )
1136 idx.emplace_back( i );
1137 }
1138 break;
1139
1140 default:
1141 wxASSERT_MSG( false, "Invalid symbol selection criteria" );
1142 }
1143
1144 return idx;
1145}
1146
1147
1149{
1150 // returns the Footprint Viewer frame, if exists, or NULL
1151 wxWindow* window = wxWindow::FindWindowByName( FOOTPRINTVIEWER_FRAME_NAME );
1152 return dynamic_cast<DISPLAY_FOOTPRINTS_FRAME*>( window );
1153}
1154
1155
1157{
1158 return GetFootprintViewerFrame();
1159}
1160
1161
1169
1170
1172{
1173 switch( aLB )
1174 {
1178 default: break;
1179 }
1180}
1181
1182
1184{
1185 // returns the LIB_ID of the selected footprint in footprint listview
1186 // or a empty string
1187 return m_footprintListBox->GetSelectedFootprint();
1188}
1189
1190
1191void CVPCB_MAINFRAME::SetStatusText( const wxString& aText, int aNumber )
1192{
1193 switch( aNumber )
1194 {
1195 case 0: m_statusLine1->SetLabel( aText ); break;
1196 case 1: m_statusLine2->SetLabel( aText ); break;
1197 case 2: m_statusLine3->SetLabel( aText ); break;
1198 default: wxFAIL_MSG( wxT( "Invalid status row number" ) ); break;
1199 }
1200}
1201
1202
1209
1210
1212{
1213 const std::string& payload = mail.GetPayload();
1214
1215 switch( mail.Command() )
1216 {
1218 // Disable Close events during readNetListAndFpFiles() to avoid crash when updating
1219 // widgets:
1220 m_cannotClose = true;
1221 readNetListAndFpFiles( payload );
1222 m_cannotClose = false;
1223
1224 /* @todo
1225 Go into SCH_EDIT_FRAME::OnOpenCvpcb( wxCommandEvent& event ) and trim GNL_ALL down.
1226 */
1227 break;
1228
1229 case MAIL_RELOAD_LIB:
1230 m_cannotClose = true;
1234 m_cannotClose = false;
1235 break;
1236
1237 default:
1238 ; // ignore most
1239 }
1240}
constexpr EDA_IU_SCALE unityScale
Definition base_units.h:115
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:80
static TOOL_ACTION copy
Definition actions.h:78
static TOOL_ACTION undo
Definition actions.h:75
static TOOL_ACTION redo
Definition actions.h:76
static TOOL_ACTION cut
Definition actions.h:77
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:47
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
Handle actions that are shared between different applications.
Store all of the related footprint information found in a netlist.
const wxString & GetReference() const
const wxString & GetValue() const
int GetPinCount() const
void SetFPID(const LIB_ID &aFPID)
const wxArrayString & GetFootprintFilters() const
const std::vector< KIID > & GetKIIDs() const
const LIB_ID & GetFPID() const
Gather all the actions that are shared by tools.
static TOOL_ACTION saveAssociationsToFile
static TOOL_ACTION FilterFPbyLibrary
static TOOL_ACTION filterFPbyPin
static TOOL_ACTION deleteAssoc
static TOOL_ACTION FilterFPbyFPFilters
Footprint Filtering actions.
static TOOL_ACTION saveAssociationsToSchematic
Management actions.
static TOOL_ACTION showFootprintViewer
Open the footprint viewer.
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.
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.
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.
FP_FILTER_T
Filter setting constants.
Definition listboxes.h:99
@ FILTERING_BY_COMPONENT_FP_FILTERS
Definition listboxes.h:101
wxString GetLibNickname() const override
wxString GetKeywords()
wxString GetDesc() override
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.
virtual const wxString What() const
A composite of Problem() and Where()
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.
std::string & GetPayload()
Return the payload, which can be any text but it typically self identifying s-expression.
MAIL_T Command()
Returns the MAIL_T associated with this mail.
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.
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:286
virtual void ExpressMail(FRAME_T aDestination, MAIL_T aCommand, std::string &aPayload, wxWindow *aSource=nullptr)
Send aPayload to aDestination from aSource.
Definition kiway.cpp:499
virtual PROJECT & Prj() const
Return the PROJECT associated with this KIWAY.
Definition kiway.cpp:192
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
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()
virtual COMMON_SETTINGS * GetCommonSettings() const
Definition pgm_base.cpp:576
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition pgm_base.h:125
The backing store for a PROJECT, in JSON format.
static FP_LIB_TABLE * PcbFootprintLibs(PROJECT *aProject)
Return the table of footprint libraries without Kiway.
virtual PROJECT_FILE & GetProjectFile() const
Definition project.h:204
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
TOOL_MANAGER * m_toolManager
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
ACTIONS * m_actions
virtual void DispatchWxEvent(wxEvent &aEvent)
Process wxEvents (mostly UI events), translate them to TOOL_EVENTs, and make tools handle those.
Master controller class:
bool RunAction(const std::string &aActionName, T aParam)
Run the specified action immediately, pausing the current action to run the new one.
const char * c_str() const
Definition utf8.h:109
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:129
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:163
KICOMMON_API wxFont GetMonospacedUIFont()
Definition ui_common.cpp:93
KICOMMON_API wxFont GetStatusFont(wxWindow *aWindow)
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:910
PGM_BASE & Pgm()
The global program "get" accessor.
Definition pgm_base.cpp:913
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
std::vector< wxString > pinned_fp_libs
#define PR_CAN_ABORT