KiCad PCB EDA Suite
Loading...
Searching...
No Matches
sch_base_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) 2012 SoftPLC Corporation, Dick Hollenbeck <[email protected]>
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 <advanced_config.h>
26#include <base_units.h>
27#include <kiway.h>
29#include <pgm_base.h>
30#include <eda_list_dialog.h>
33#include <eeschema_settings.h>
37#include <sch_draw_panel.h>
39#include <sch_group.h>
40#include <sch_view.h>
41#include <sch_painter.h>
42#include <sch_shape.h>
44#include <confirm.h>
46#include <project_sch.h>
47#include <symbol_library.h>
48#include <symbol_lib_table.h>
49#include <sch_base_frame.h>
51#include <design_block.h>
53#include <tool/actions.h>
54#include <tool/action_toolbar.h>
55#include <tool/tool_manager.h>
58#include <view/view_controls.h>
59#include <wx/choicdlg.h>
60#include <wx/fswatcher.h>
61#include <wx/log.h>
62#include <wx/msgdlg.h>
63
64#ifndef __linux__
66#include <wx/fdrepdlg.h>
67#else
69#endif
70
71
73 SYMBOL_LIB* aCacheLib, wxWindow* aParent, bool aShowErrorMsg )
74{
75 wxCHECK_MSG( aLibTable, nullptr, wxS( "Invalid symbol library table." ) );
76
77 LIB_SYMBOL* symbol = nullptr;
78
79 try
80 {
81 symbol = aLibTable->LoadSymbol( aLibId );
82
83 if( !symbol && aCacheLib )
84 {
85 wxCHECK_MSG( aCacheLib->IsCache(), nullptr, wxS( "Invalid cache library." ) );
86
87 wxString cacheName = aLibId.GetLibNickname().wx_str();
88 cacheName << "_" << aLibId.GetLibItemName();
89 symbol = aCacheLib->FindSymbol( cacheName );
90 }
91 }
92 catch( const IO_ERROR& ioe )
93 {
94 if( aShowErrorMsg )
95 {
96 wxString msg = wxString::Format( _( "Error loading symbol %s from library '%s'." ),
97 aLibId.GetLibItemName().wx_str(),
98 aLibId.GetLibNickname().wx_str() );
99 DisplayErrorMessage( aParent, msg, ioe.What() );
100 }
101 }
102
103 return symbol;
104}
105
106
107SCH_BASE_FRAME::SCH_BASE_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aWindowType,
108 const wxString& aTitle, const wxPoint& aPosition,
109 const wxSize& aSize, long aStyle, const wxString& aFrameName ) :
110 EDA_DRAW_FRAME( aKiway, aParent, aWindowType, aTitle, aPosition, aSize, aStyle,
111 aFrameName, schIUScale ),
112 m_selectionFilterPanel( nullptr ),
113 m_findReplaceDialog( nullptr ),
114 m_base_frame_defaults( nullptr, "base_Frame_defaults" ),
116{
117 m_findReplaceData = std::make_unique<SCH_SEARCH_DATA>();
118
119 if( ( aStyle & wxFRAME_NO_TASKBAR ) == 0 )
120 createCanvas();
121
122 Bind( wxEVT_IDLE,
123 [this]( wxIdleEvent& aEvent )
124 {
125 // Handle cursor adjustments. While we can get motion and key events through
126 // wxWidgets, we can't get modifier-key-up events.
127 if( m_toolManager )
128 {
130
131 if( selTool )
132 selTool->OnIdle( aEvent );
133 }
134 } );
135
137}
138
139
143
144
146{
147 GetCanvas()->SetEvtHandlerEnabled( false );
149
150 // Shutdown all running tools
151 if( m_toolManager )
152 m_toolManager->ShutdownAllTools();
153
154 // Close the find dialog and preserve its setting if it is displayed.
156 {
158 m_replaceStringHistoryList = m_findReplaceDialog->GetReplaceEntries();
159
160 m_findReplaceDialog->Destroy();
161 m_findReplaceDialog = nullptr;
162 }
163
164 // This class is pure virtual. Derived class will finish shutdown and Destroy().
165}
166
167
172
173
175{
176 return dynamic_cast<EESCHEMA_SETTINGS*>( config() );
177}
178
179
184
185
187{
188 switch( GetFrameType() )
189 {
190 case FRAME_SCH:
191 default:
192 return GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
193
195 case FRAME_SCH_VIEWER:
197 return GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
198 }
199}
200
201
202void SCH_BASE_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings )
203{
204 GetScreen()->SetPageSettings( aPageSettings );
205}
206
207
209{
210 return GetScreen()->GetPageSettings();
211}
212
213
215{
216 // GetSizeIU is compile time dependent:
217 return GetScreen()->GetPageSettings().GetSizeIU( schIUScale.IU_PER_MILS );
218}
219
220
222{
223 wxASSERT( GetScreen() );
224 return GetScreen()->GetTitleBlock();
225}
226
227
229{
230 wxASSERT( GetScreen() );
231 GetScreen()->SetTitleBlock( aTitleBlock );
232}
233
234
236{
237 wxString line;
238 BASE_SCREEN* screen = GetScreen();
239
240 if( !screen )
241 return;
242
244
245 // Display absolute and relative coordinates
247 VECTOR2D d = cursorPos - screen->m_LocalOrigin;
248
249 line.Printf( wxS( "X %s Y %s" ),
250 MessageTextFromValue( cursorPos.x, false ),
251 MessageTextFromValue( cursorPos.y, false ) );
252 SetStatusText( line, 2 );
253
254 line.Printf( wxS( "dx %s dy %s dist %s" ),
255 MessageTextFromValue( d.x, false ),
256 MessageTextFromValue( d.y, false ),
257 MessageTextFromValue( hypot( d.x, d.y ), false ) );
258 SetStatusText( line, 3 );
259
262}
263
264
265LIB_SYMBOL* SCH_BASE_FRAME::GetLibSymbol( const LIB_ID& aLibId, bool aUseCacheLib,
266 bool aShowErrorMsg )
267{
268 SYMBOL_LIB* cache =
269 ( aUseCacheLib ) ? PROJECT_SCH::SchLibs( &Prj() )->GetCacheLibrary() : nullptr;
270
271 return SchGetLibSymbol( aLibId, PROJECT_SCH::SchSymbolLibTable( &Prj() ), cache, this,
272 aShowErrorMsg );
273}
274
275
276bool SCH_BASE_FRAME::saveSymbolLibTables( bool aGlobal, bool aProject )
277{
278 wxString msg;
279 bool success = true;
280
281 if( aGlobal )
282 {
283 try
284 {
286 }
287 catch( const IO_ERROR& ioe )
288 {
289 success = false;
290 msg.Printf( _( "Error saving global symbol library table:\n%s" ), ioe.What() );
291 DisplayErrorMessage( this, msg );
292 }
293 }
294
295 if( aProject && !Prj().GetProjectName().IsEmpty() )
296 {
297 wxFileName fn( Prj().GetProjectPath(), SYMBOL_LIB_TABLE::GetSymbolLibTableFileName() );
298
299 try
300 {
301 PROJECT_SCH::SchSymbolLibTable( &Prj() )->Save( fn.GetFullPath() );
302 }
303 catch( const IO_ERROR& ioe )
304 {
305 success = false;
306 msg.Printf( _( "Error saving project-specific symbol library table:\n%s" ),
307 ioe.What() );
308 DisplayErrorMessage( this, msg );
309 }
310 }
311
312 return success;
313}
314
315
316void SCH_BASE_FRAME::RedrawScreen( const VECTOR2I& aCenterPoint, bool aWarpPointer )
317{
318 GetCanvas()->GetView()->SetCenter( aCenterPoint );
319
320 if( aWarpPointer )
322
323 GetCanvas()->Refresh();
324}
325
326
328{
329 if( GetCanvas() && GetCanvas()->GetView() )
330 {
333 }
334}
335
336
341
342
344{
345 if( GetCanvas() && GetCanvas()->GetView() )
346 {
347 if( KIGFX::PAINTER* painter = GetCanvas()->GetView()->GetPainter() )
348 return static_cast<SCH_RENDER_SETTINGS*>( painter->GetSettings() );
349 }
350
351 return nullptr;
352}
353
354
356{
358
359 SetCanvas( new SCH_DRAW_PANEL( this, wxID_ANY, wxPoint( 0, 0 ), m_frameSize,
362}
363
364
366{
368
369 try
370 {
371 if( !m_spaceMouse )
372 {
373#ifndef __linux__
374 m_spaceMouse = std::make_unique<NL_SCHEMATIC_PLUGIN>();
375#else
376 m_spaceMouse = std::make_unique<SPNAV_2D_PLUGIN>( GetCanvas() );
377 m_spaceMouse->SetScale( schIUScale.IU_PER_MILS / pcbIUScale.IU_PER_MILS );
378#endif
379 }
380
381 m_spaceMouse->SetCanvas( GetCanvas() );
382 }
383 catch( const std::system_error& e )
384 {
385 wxLogTrace( wxT( "KI_TRACE_NAVLIB" ), e.what() );
386 }
387}
388
389
390void SCH_BASE_FRAME::UpdateItem( EDA_ITEM* aItem, bool isAddOrDelete, bool aUpdateRtree )
391{
392 EDA_ITEM* parent = aItem->GetParent();
393
394 if( aItem->Type() == SCH_SHEET_PIN_T )
395 {
396 // Sheet pins aren't in the view. Refresh their parent.
397 if( parent )
398 GetCanvas()->GetView()->Update( parent );
399 }
400 else
401 {
402 if( aItem->Type() == SCH_SHAPE_T )
403 static_cast<SCH_SHAPE*>( aItem )->UpdateHatching();
404
405 if( !isAddOrDelete )
406 GetCanvas()->GetView()->Update( aItem );
407
408 // Some children are drawn from their parents. Mark them for re-paint.
409 if( parent && ( parent->Type() == SCH_SYMBOL_T
410 || parent->Type() == SCH_SHEET_T
411 || parent->Type() == SCH_LABEL_LOCATE_ANY_T
412 || parent->Type() == SCH_TABLE_T ) )
413 {
414 GetCanvas()->GetView()->Update( parent, KIGFX::REPAINT );
415 }
416 }
417
418 /*
419 * Be careful when calling this. Update will invalidate RTree iterators, so you cannot
420 * call this while doing things like `for( SCH_ITEM* item : screen->Items() )`
421 */
422 if( aUpdateRtree && dynamic_cast<SCH_ITEM*>( aItem ) )
423 {
424 GetScreen()->Update( static_cast<SCH_ITEM*>( aItem ) );
425
426 /*
427 * If we are updating the group, we also need to update all the children otherwise
428 * their positions will remain stale in the RTree
429 */
430 if( SCH_GROUP* group = dynamic_cast<SCH_GROUP*>( aItem ) )
431 {
432 group->RunOnChildren(
433 [&]( SCH_ITEM* item )
434 {
435 GetScreen()->Update( item );
436 },
438 }
439 }
440
441 // Calling Refresh() here introduces a bi-stable state: when doing operations on a
442 // large number of items if at some point the refresh timer times out and does a
443 // refresh it will take long enough that the next item will also time out, and the
444 // next, and the next, etc.
445 // GetCanvas()->Refresh();
446}
447
448
450{
451 // We currently have two zoom-dependent renderings: text, which is rendered as bitmap text
452 // when too small to see the difference, and selection shadows.
453 //
454 // Because non-selected text is cached by OpenGL, we only apply the bitmap performance hack
455 // to selected text items.
456 //
457 // Thus, as it currently stands, all zoom-dependent items can be found in the list of selected
458 // items.
459 if( m_toolManager )
460 {
461 SCH_SELECTION_TOOL* selectionTool = m_toolManager->GetTool<SCH_SELECTION_TOOL>();
462 SELECTION& selection = selectionTool->GetSelection();
463 KIGFX::SCH_VIEW* view = GetCanvas()->GetView();
464
465 for( EDA_ITEM* item : selection )
466 {
467 if( item->RenderAsBitmap( view->GetGAL()->GetWorldScale() ) != item->IsShownAsBitmap()
469 {
470 view->Update( item, KIGFX::REPAINT );
471
472 EDA_ITEM* parent = item->GetParent();
473
474 // Symbol children are drawn from their parents. Mark them for re-paint.
475 if( parent && parent->Type() == SCH_SYMBOL_T )
476 GetCanvas()->GetView()->Update( parent, KIGFX::REPAINT );
477 }
478 }
479 }
480}
481
482
484{
485 // Null pointers will cause boost::ptr_vector to raise a boost::bad_pointer exception which
486 // will be unhandled. There is no valid reason to pass an invalid EDA_ITEM pointer to the
487 // screen append function.
488 wxCHECK( aItem, /* void */ );
489
490 SCH_SCREEN* screen = aScreen;
491
492 if( aScreen == nullptr )
493 screen = GetScreen();
494
495 if( aItem->Type() != SCH_TABLECELL_T )
496 screen->Append( (SCH_ITEM*) aItem );
497
498 if( screen == GetScreen() )
499 {
500 GetCanvas()->GetView()->Add( aItem );
501 UpdateItem( aItem, true ); // handle any additional parent semantics
502 }
503}
504
505
507{
508 auto screen = aScreen;
509
510 if( aScreen == nullptr )
511 screen = GetScreen();
512
513 if( screen == GetScreen() )
514 GetCanvas()->GetView()->Remove( aItem );
515
516 if( aItem->Type() != SCH_TABLECELL_T )
517 screen->Remove( (SCH_ITEM*) aItem );
518
519 if( screen == GetScreen() )
520 UpdateItem( aItem, true ); // handle any additional parent semantics
521}
522
523
525{
526 // Let tools add things to the view if necessary
527 if( m_toolManager )
529
531}
532
533
538
539
541{
542 wxString findString;
543
544 SCH_SELECTION& selection = m_toolManager->GetTool<SCH_SELECTION_TOOL>()->GetSelection();
545
546 if( selection.Size() == 1 )
547 {
548 EDA_ITEM* front = selection.Front();
549
550 switch( front->Type() )
551 {
552 case SCH_SYMBOL_T:
553 {
554 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( front );
555 findString = UnescapeString( symbol->GetField( FIELD_T::VALUE )->GetText() );
556 break;
557 }
558
559 case SCH_FIELD_T:
560 findString = UnescapeString( static_cast<SCH_FIELD*>( front )->GetText() );
561 break;
562
563 case SCH_LABEL_T:
565 case SCH_HIER_LABEL_T:
566 case SCH_SHEET_PIN_T:
567 findString = UnescapeString( static_cast<SCH_LABEL_BASE*>( front )->GetText() );
568 break;
569
570 case SCH_TEXT_T:
571 findString = UnescapeString( static_cast<SCH_TEXT*>( front )->GetText() );
572
573 if( findString.Contains( wxT( "\n" ) ) )
574 findString = findString.Before( '\n' );
575
576 break;
577
578 default:
579 break;
580 }
581 }
582
584 m_findReplaceDialog->Destroy();
585
586 m_findReplaceDialog = new DIALOG_SCH_FIND( this, static_cast<SCH_SEARCH_DATA*>( m_findReplaceData.get() ),
587 wxDefaultPosition, wxDefaultSize, aReplace ? wxFR_REPLACEDIALOG : 0 );
588
589 m_findReplaceDialog->SetFindEntries( m_findStringHistoryList, findString );
591 m_findReplaceDialog->Show( true );
592}
593
594
595void SCH_BASE_FRAME::ShowFindReplaceStatus( const wxString& aMsg, int aStatusTime )
596{
597 // Prepare the infobar, since we don't know its state
598 m_infoBar->RemoveAllButtons();
599 m_infoBar->AddCloseButton();
600
601 m_infoBar->ShowMessageFor( aMsg, aStatusTime, wxICON_INFORMATION );
602}
603
604
606{
607 m_infoBar->Dismiss();
608}
609
610
612{
614 m_replaceStringHistoryList = m_findReplaceDialog->GetReplaceEntries();
615
616 m_findReplaceDialog->Destroy();
617 m_findReplaceDialog = nullptr;
618
620}
621
622
636
637
639{
640 if( !m_colorSettings || aForceRefresh )
641 {
643 wxString colorTheme = cfg ? cfg->m_ColorTheme : wxString( "" );
644
646 {
647 if( SYMBOL_EDITOR_SETTINGS* sym_edit_cfg = GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" ) )
648 {
649 if( !sym_edit_cfg->m_UseEeschemaColorSettings )
650 colorTheme = sym_edit_cfg->m_ColorTheme;
651 }
652 }
653
654 const_cast<SCH_BASE_FRAME*>( this )->m_colorSettings = ::GetColorSettings( colorTheme );
655 }
656
657 return m_colorSettings;
658}
659
660
665
666
667void SCH_BASE_FRAME::handleActivateEvent( wxActivateEvent& aEvent )
668{
670
671 if( m_spaceMouse )
672 m_spaceMouse->SetFocus( aEvent.GetActive() );
673}
674
675
676void SCH_BASE_FRAME::handleIconizeEvent( wxIconizeEvent& aEvent )
677{
679
680 if( m_spaceMouse )
681 m_spaceMouse->SetFocus( false );
682}
683
684
686 std::vector<wxArrayString>& aItemsToDisplay )
687{
691 std::vector<wxString> libNicknames = tbl->GetLogicalLibs();
692
693 aHeaders.Add( _( "Library" ) );
694 aHeaders.Add( _( "Description" ) );
695
696 for( const wxString& nickname : libNicknames )
697 {
698 if( alg::contains( project.m_PinnedSymbolLibs, nickname )
699 || alg::contains( cfg->m_Session.pinned_symbol_libs, nickname ) )
700 {
701 wxArrayString item;
702
703 item.Add( LIB_TREE_MODEL_ADAPTER::GetPinningSymbol() + nickname );
704 item.Add( tbl->GetDescription( nickname ) );
705 aItemsToDisplay.push_back( item );
706 }
707 }
708
709 for( const wxString& nickname : libNicknames )
710 {
711 if( !alg::contains( project.m_PinnedSymbolLibs, nickname )
712 && !alg::contains( cfg->m_Session.pinned_symbol_libs, nickname ) )
713 {
714 wxArrayString item;
715
716 item.Add( nickname );
717 item.Add( tbl->GetDescription( nickname ) );
718 aItemsToDisplay.push_back( item );
719 }
720 }
721}
722
723
724wxString SCH_BASE_FRAME::SelectLibrary( const wxString& aDialogTitle, const wxString& aListLabel,
725 const std::vector<std::pair<wxString, bool*>>& aExtraCheckboxes )
726{
727 static const int ID_MAKE_NEW_LIBRARY = wxID_HIGHEST;
728
729 // Keep asking the user for a new name until they give a valid one or cancel the operation
730 while( true )
731 {
732 wxArrayString headers;
733 std::vector<wxArrayString> itemsToDisplay;
734
735 GetLibraryItemsForListDialog( headers, itemsToDisplay );
736
737 wxString libraryName = Prj().GetRString( PROJECT::SCH_LIB_SELECT );
738
739 EDA_LIST_DIALOG dlg( this, aDialogTitle, headers, itemsToDisplay, libraryName, false );
740 dlg.SetListLabel( aListLabel );
741
742 for( const auto& [label, val] : aExtraCheckboxes )
743 dlg.AddExtraCheckbox( label, val );
744
745 wxButton* newLibraryButton = new wxButton( &dlg, ID_MAKE_NEW_LIBRARY, _( "New Library..." ) );
746 dlg.m_ButtonsSizer->Prepend( 80, 20 );
747 dlg.m_ButtonsSizer->Prepend( newLibraryButton, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 10 );
748
749 newLibraryButton->Bind( wxEVT_BUTTON,
750 [&dlg]( wxCommandEvent& )
751 {
752 dlg.EndModal( ID_MAKE_NEW_LIBRARY );
754
755 dlg.Layout();
756 dlg.GetSizer()->Fit( &dlg );
757
758 int ret = dlg.ShowModal();
759
760 switch( ret )
761 {
762 case wxID_CANCEL:
763 return wxEmptyString;
764
765 case wxID_OK:
766 libraryName = dlg.GetTextSelection();
767 Prj().SetRString( PROJECT::SCH_LIB_SELECT, libraryName );
769 return libraryName;
770
772 {
773 SYMBOL_LIBRARY_MANAGER mgr( *this );
774 wxFileName fn( Prj().GetRString( PROJECT::SCH_LIB_PATH ) );
775 bool useGlobalTable = false;
776 FILEDLG_HOOK_NEW_LIBRARY tableChooser( useGlobalTable );
777
778 if( !LibraryFileBrowser( _( "Create New Library" ), false, fn, FILEEXT::KiCadSymbolLibFileWildcard(),
779 FILEEXT::KiCadSymbolLibFileExtension, false, &tableChooser ) )
780 {
781 break;
782 }
783
784 libraryName = fn.GetName();
785 Prj().SetRString( PROJECT::SCH_LIB_PATH, fn.GetPath() );
786
787 useGlobalTable = tableChooser.GetUseGlobalTable();
788
789 SYMBOL_LIB_TABLE* libTable = useGlobalTable ? &SYMBOL_LIB_TABLE::GetGlobalLibTable()
791
792 if( libTable->HasLibrary( libraryName, false ) )
793 {
794 DisplayError( this, wxString::Format( _( "Library '%s' already exists." ), libraryName ) );
795 break;
796 }
797
798 if( !mgr.CreateLibrary( fn.GetFullPath(), *libTable ) )
799 DisplayError( this, wxString::Format( _( "Could not add library '%s'." ), libraryName ) );
800
801 break;
802 }
803
804 default:
805 break;
806 }
807 }
808}
809
810
812{
813 Unbind( wxEVT_FSWATCHER, &SCH_BASE_FRAME::OnSymChange, this );
814
815 if( m_watcher )
816 {
817 wxLogTrace( "KICAD_LIB_WATCH", "Remove watch" );
818 m_watcher->RemoveAll();
819 m_watcher->SetOwner( nullptr );
820 m_watcher.reset();
821 }
822
823 wxString libfullname;
825
826 if( !aID || !tbl )
827 return;
828
829 try
830 {
831 const SYMBOL_LIB_TABLE_ROW* row = tbl->FindRow( aID->GetLibNickname() );
832
833 if( !row )
834 return;
835
836 libfullname = row->GetFullURI( true );
837 }
838 catch( const std::exception& e )
839 {
840 DisplayInfoMessage( this, e.what() );
841 return;
842 }
843 catch( const IO_ERROR& error )
844 {
845 wxLogTrace( "KICAD_LIB_WATCH", "Error: %s", error.What() );
846 return;
847 }
848
849 wxLogTrace( "KICAD_LIB_WATCH", "Setting up watcher for %s", libfullname );
850 m_watcherFileName.Assign( libfullname );
851
852 if( !m_watcherFileName.FileExists() )
853 return;
854
855 wxLog::EnableLogging( false );
856 m_watcherLastModified = m_watcherFileName.GetModificationTime();
857 wxLog::EnableLogging( true );
858
859 Bind( wxEVT_FSWATCHER, &SCH_BASE_FRAME::OnSymChange, this );
860 m_watcher = std::make_unique<wxFileSystemWatcher>();
861 m_watcher->SetOwner( this );
862
863 wxFileName fn;
864 fn.AssignDir( m_watcherFileName.GetPath() );
865 fn.DontFollowLink();
866
867 {
868 // Silence OS errors that come from the watcher
869 wxLogNull silence;
870 m_watcher->Add( fn );
871 }
872}
873
874
875void SCH_BASE_FRAME::OnSymChange( wxFileSystemWatcherEvent& aEvent )
876{
878
879 wxLogTrace( "KICAD_LIB_WATCH", "OnSymChange: %s, watcher file: %s",
880 aEvent.GetPath().GetFullPath(), m_watcherFileName.GetFullPath() );
881
882 if( !libs || !m_watcher || !m_watcher.get() || m_watcherFileName.GetPath().IsEmpty() )
883 return;
884
885 if( aEvent.GetPath() != m_watcherFileName )
886 return;
887
888 // Start the debounce timer (set to 1 second)
889 if( !m_watcherDebounceTimer.StartOnce( 1000 ) )
890 {
891 wxLogTrace( "KICAD_LIB_WATCH", "Failed to start the debounce timer" );
892 return;
893 }
894}
895
896
898{
899 if( aEvent.GetId() != m_watcherDebounceTimer.GetId() )
900 {
901 aEvent.Skip();
902 return;
903 }
904
906 {
907 wxLogTrace( "KICAD_LIB_WATCH", "Restarting debounce timer" );
908 m_watcherDebounceTimer.StartOnce( 3000 );
909 }
910
911 wxLogTrace( "KICAD_LIB_WATCH", "OnSymChangeDebounceTimer" );
912
913 // Disable logging to avoid spurious messages and check if the file has changed
914 wxLog::EnableLogging( false );
915 wxDateTime lastModified = m_watcherFileName.GetModificationTime();
916 wxLog::EnableLogging( true );
917
918 if( lastModified == m_watcherLastModified || !lastModified.IsValid() )
919 return;
920
921 m_watcherLastModified = lastModified;
922
924
926 || IsOK( this, _( "The library containing the current symbol has changed.\n"
927 "Do you want to reload the library?" ) ) )
928 {
929 wxLogTrace( "KICAD_LIB_WATCH", "Sending refresh symbol mail" );
930 std::string libName = m_watcherFileName.GetFullPath().ToStdString();
933 }
934
936}
937
938
940{
941 if( m_toolManager )
942 return m_toolManager->GetTool<SCH_SELECTION_TOOL>();
943
944 return nullptr;
945}
946
947
949{
950 SCH_SELECTION_FILTER_EVENT evt( aOptions );
951 wxPostEvent( this, evt );
952}
constexpr EDA_IU_SCALE schIUScale
Definition base_units.h:114
constexpr EDA_IU_SCALE pcbIUScale
Definition base_units.h:112
static TOOL_ACTION updateFind
Definition actions.h:123
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
wxString m_ColorTheme
Active color theme name.
Handles how to draw a screen (a board, a schematic ...)
Definition base_screen.h:41
VECTOR2D m_LocalOrigin
Relative Screen cursor coordinate (on grid) in user units.
Definition base_screen.h:90
Color settings are a bit different than most of the settings objects in that there can be more than o...
COLOR4D GetColor(int aLayer) const
int ShowModal() override
FRAME_T GetFrameType() const
virtual APP_SETTINGS_BASE * config() const
Return the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
virtual void handleIconizeEvent(wxIconizeEvent &aEvent)
Handle a window iconize event.
WX_INFOBAR * m_infoBar
virtual bool IsContentModified() const
Get if the contents of the frame have been modified since the last save.
bool IsType(FRAME_T aType) const
wxArrayString m_replaceStringHistoryList
virtual void ActivateGalCanvas()
Use to start up the GAL drawing canvas.
COLOR_SETTINGS * m_colorSettings
EDA_DRAW_PANEL_GAL::GAL_TYPE m_canvasType
The current canvas type.
virtual BASE_SCREEN * GetScreen() const
Return a pointer to a BASE_SCREEN or one of its derivatives.
void DisplayUnitsMsg()
Display current unit pane in the status bar.
GAL_DISPLAY_OPTIONS_IMPL & GetGalDisplayOptions()
Return a reference to the gal rendering options used by GAL for rendering.
void SetCanvas(EDA_DRAW_PANEL_GAL *aPanel)
EDA_DRAW_FRAME(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)
bool LibraryFileBrowser(const wxString &aTitle, bool doOpen, wxFileName &aFilename, const wxString &wildcard, const wxString &ext, bool isDirectory, FILEDLG_HOOK_NEW_LIBRARY *aFileDlgHook=nullptr)
virtual void handleActivateEvent(wxActivateEvent &aEvent)
Handle a window activation event.
void UpdateStatusBar() override
Update the status bar information.
virtual EDA_DRAW_PANEL_GAL * GetCanvas() const
Return a pointer to GAL-based canvas of given EDA draw frame.
virtual void DisplayGridMsg()
Display current grid size in the status bar.
EDA_DRAW_PANEL_GAL::GAL_TYPE loadCanvasTypeSetting()
Return the canvas type stored in the application settings.
wxArrayString m_findStringHistoryList
std::unique_ptr< EDA_SEARCH_DATA > m_findReplaceData
void CommonSettingsChanged(int aFlags) override
Notification event that some of the common (suite-wide) settings have changed.
void StopDrawing()
Prevent the GAL canvas from further drawing until it is recreated or StartDrawing() is called.
KIGFX::VIEW_CONTROLS * GetViewControls() const
Return a pointer to the #VIEW_CONTROLS instance used in the panel.
void ForceRefresh()
Force a redraw.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
KIGFX::GAL * GetGAL() const
Return a pointer to the GAL instance used in the panel.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition eda_item.h:98
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:110
EDA_ITEM * GetParent() const
Definition eda_item.h:112
A dialog which shows:
wxString GetTextSelection(int aColumn=0)
Return the selected text from aColumn in the wxListCtrl in the dialog.
void SetListLabel(const wxString &aLabel)
void AddExtraCheckbox(const wxString &aLabel, bool *aValuePtr)
Add a checkbox value to the dialog.
void GetExtraCheckboxValues()
Fills in the value pointers from the checkboxes after the dialog has run.
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition eda_text.h:97
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()
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:104
void SetAxesColor(const COLOR4D &aAxesColor)
Set the axes color.
double GetWorldScale() const
Get the world scale.
Contains all the knowledge about how to draw graphical object onto any particular output device.
Definition painter.h:59
virtual RENDER_SETTINGS * GetSettings()=0
Return a pointer to current settings that are going to be used when drawing items.
virtual void LoadColors(const COLOR_SETTINGS *aSettings)
static std::vector< KICAD_T > g_ScaledSelectionTypes
void Update(const KIGFX::VIEW_ITEM *aItem, int aUpdateFlags) const override
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
Definition sch_view.cpp:60
virtual void CenterOnCursor()=0
Set the viewport center to the current cursor position and warps the cursor to the screen center.
VECTOR2D GetCursorPosition() const
Return the current cursor position in world coordinates.
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Add a VIEW_ITEM to the view.
Definition view.cpp:298
virtual void Remove(VIEW_ITEM *aItem)
Remove a VIEW_ITEM from the view.
Definition view.cpp:341
GAL * GetGAL() const
Return the GAL this view is using to draw graphical primitives.
Definition view.h:202
void RecacheAllItems()
Rebuild GAL display lists.
Definition view.cpp:1451
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition view.cpp:1561
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition view.h:220
void SetCenter(const VECTOR2D &aCenter)
Set the center point of the VIEW (i.e.
Definition view.cpp:596
void MarkTargetDirty(int aTarget)
Set or clear target 'dirty' flag.
Definition view.h:639
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
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
A logical library item identifier and consists of various portions much like a URI.
Definition lib_id.h:49
const UTF8 & GetLibItemName() const
Definition lib_id.h:102
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Definition lib_id.h:87
Define a library symbol object.
Definition lib_symbol.h:85
const wxString GetFullURI(bool aSubstituted=false) const
Return the full location specifying URI for the LIB, either in original UI form or in environment var...
const wxString GetDescription(const wxString &aNickname)
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.
void Save(const wxString &aFileName) const
Write this library table to aFileName in s-expression form.
static const wxString GetPinningSymbol()
Describe the page size and margins of a paper page on which to eventually print or plot.
Definition page_info.h:79
const VECTOR2D GetSizeIU(double aIUScale) const
Gets the page size in internal units.
Definition page_info.h:177
virtual COMMON_SETTINGS * GetCommonSettings() const
Definition pgm_base.cpp:576
The backing store for a PROJECT, in JSON format.
static SYMBOL_LIB_TABLE * SchSymbolLibTable(PROJECT *aProject)
Accessor for project symbol library table.
static SYMBOL_LIBS * SchLibs(PROJECT *aProject)
These are all prefaced with "Sch".
@ SCH_LIB_SELECT
Definition project.h:221
@ SCH_LIB_PATH
Definition project.h:220
virtual PROJECT_FILE & GetProjectFile() const
Definition project.h:204
virtual void SetRString(RSTRING_T aStringId, const wxString &aString)
Store a "retained string", which is any session and project specific string identified in enum RSTRIN...
Definition project.cpp:334
virtual const wxString & GetRString(RSTRING_T aStringId)
Return a "retained string", which is any session and project specific string identified in enum RSTRI...
Definition project.cpp:345
virtual void RedrawScreen(const VECTOR2I &aCenterPoint, bool aWarpPointer)
SCH_BASE_FRAME(KIWAY *aKiway, wxWindow *aParent, FRAME_T aWindowType, const wxString &aTitle, const wxPoint &aPosition, const wxSize &aSize, long aStyle, const wxString &aFrameName)
void UpdateStatusBar() override
Update the status bar information.
void RemoveFromScreen(EDA_ITEM *aItem, SCH_SCREEN *aScreen) override
Remove an item from the screen (and view) aScreen is the screen the item is located on,...
SCH_RENDER_SETTINGS * GetRenderSettings()
void doCloseWindow() override
void ActivateGalCanvas() override
Use to start up the GAL drawing canvas.
const VECTOR2I GetPageSizeIU() const override
Works off of GetPageSettings() to return the size of the paper page in the internal units of this par...
void SetPageSettings(const PAGE_INFO &aPageSettings) override
void handleIconizeEvent(wxIconizeEvent &aEvent) override
Handle a window iconize event.
void OnSymChange(wxFileSystemWatcherEvent &aEvent)
Handler for Symbol change events.
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
SYMBOL_EDITOR_SETTINGS * libeditconfig() const
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
APP_SETTINGS_BASE * GetViewerSettingsBase() const
void HighlightSelectionFilter(const SCH_SELECTION_FILTER_OPTIONS &aOptions)
void HardRedraw() override
Rebuild the GAL and redraws the screen.
DIALOG_SCH_FIND * m_findReplaceDialog
SCHEMATIC_SETTINGS m_base_frame_defaults
Only used by symbol_editor. Eeschema should be using the one inside the SCHEMATIC.
wxTimer m_watcherDebounceTimer
void CommonSettingsChanged(int aFlags) override
Notification event that some of the common (suite-wide) settings have changed.
void ShowFindReplaceDialog(bool aReplace)
Run the Find or Find & Replace dialog.
SCH_SELECTION_TOOL * GetSelectionTool() override
void SyncView()
Mark all items for refresh.
std::unique_ptr< NL_SCHEMATIC_PLUGIN > m_spaceMouse
void GetLibraryItemsForListDialog(wxArrayString &aHeaders, std::vector< wxArrayString > &aItemsToDisplay)
wxDateTime m_watcherLastModified
std::unique_ptr< wxFileSystemWatcher > m_watcher
These are file watchers for the symbol library tables.
wxString SelectLibrary(const wxString &aDialogTitle, const wxString &aListLabel, const std::vector< std::pair< wxString, bool * > > &aExtraCheckboxes={})
Display a list of loaded libraries and allows the user to select a library.
virtual ~SCH_BASE_FRAME()
Needs to be in the cpp file to encode the sizeof() for std::unique_ptr.
const TITLE_BLOCK & GetTitleBlock() const override
bool saveSymbolLibTables(bool aGlobal, bool aProject)
Save Symbol Library Tables to disk.
void RefreshZoomDependentItems()
Mark selected items for refresh.
EESCHEMA_SETTINGS * eeconfig() const
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock) override
PANEL_SCH_SELECTION_FILTER * m_selectionFilterPanel
LIB_SYMBOL * GetLibSymbol(const LIB_ID &aLibId, bool aUseCacheLib=false, bool aShowErrorMsg=false)
Load symbol from symbol library table.
virtual void UpdateItem(EDA_ITEM *aItem, bool isAddOrDelete=false, bool aUpdateRtree=false)
Mark an item for refresh.
void handleActivateEvent(wxActivateEvent &aEvent) override
Handle a window activation event.
COLOR_SETTINGS * GetColorSettings(bool aForceRefresh=false) const override
Returns a pointer to the active color theme settings.
void OnFindDialogClose()
Notification that the Find dialog has closed.
wxFileName m_watcherFileName
void setSymWatcher(const LIB_ID *aSymbol)
Creates (or removes) a watcher on the specified symbol library.
void AddToScreen(EDA_ITEM *aItem, SCH_SCREEN *aScreen=nullptr) override
Add an item to the screen (and view) aScreen is the screen the item is located on,...
const PAGE_INFO & GetPageSettings() const override
void ShowFindReplaceStatus(const wxString &aMsg, int aStatusTime)
COLOR4D GetDrawBgColor() const override
void OnSymChangeDebounceTimer(wxTimerEvent &aEvent)
Handler for the filesystem watcher debounce timer.
void ClearFindReplaceStatus()
COLOR4D GetLayerColor(SCH_LAYER_ID aLayer)
Helper to retrieve a layer color from the global color settings.
KIGFX::SCH_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
A set of SCH_ITEMs (i.e., without duplicates).
Definition sch_group.h:52
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition sch_item.h:167
const PAGE_INFO & GetPageSettings() const
Definition sch_screen.h:139
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock)
Definition sch_screen.h:165
void Append(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
void SetPageSettings(const PAGE_INFO &aPageSettings)
Definition sch_screen.h:140
const TITLE_BLOCK & GetTitleBlock() const
Definition sch_screen.h:163
void Update(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
Update aItem's bounding box in the tree.
SCH_SELECTION & GetSelection()
void OnIdle(wxIdleEvent &aEvent)
Zoom the screen to fit the bounding box for cross probing/selection sync.
Schematic symbol object.
Definition sch_symbol.h:75
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this symbol.
EDA_ITEM * Front() const
Definition selection.h:177
int Size() const
Returns the number of selected parts.
Definition selection.h:121
Class to handle modifications to the symbol libraries.
bool CreateLibrary(const wxString &aFilePath, SYMBOL_LIB_TABLE &aTable)
Create an empty library and adds it to the library table.
A collection of SYMBOL_LIB objects.
Hold a record identifying a symbol library accessed by the appropriate symbol library SCH_IO object i...
static SYMBOL_LIB_TABLE & GetGlobalLibTable()
static const wxString GetSymbolLibTableFileName()
static wxString GetGlobalTableFileName()
Fetch the global symbol library table file name.
LIB_SYMBOL * LoadSymbol(const wxString &aNickname, const wxString &aName)
Load a LIB_SYMBOL having aName from the library given by aNickname.
SYMBOL_LIB_TABLE_ROW * FindRow(const wxString &aNickName, bool aCheckIfEnabled=false)
Return an SYMBOL_LIB_TABLE_ROW if aNickName is found in this table or in any chained fallBack table f...
Object used to load, save, search, and otherwise manipulate symbol library files.
bool IsCache() const
LIB_SYMBOL * FindSymbol(const wxString &aName) const
Find LIB_SYMBOL by aName.
Hold the information shown in the lower right corner of a plot, printout, or editing view.
Definition title_block.h:41
TOOL_MANAGER * m_toolManager
@ MODEL_RELOAD
Model changes (the sheet for a schematic)
Definition tool_base.h:80
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
A lower-precision version of StringFromValue().
wxString wx_str() const
Definition utf8.cpp:45
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
Definition confirm.cpp:251
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
Definition confirm.cpp:222
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition confirm.cpp:194
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
Definition confirm.cpp:169
This file is part of the common library.
#define _(s)
@ RECURSE
Definition eda_item.h:51
FRAME_T
The set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
Definition frame_type.h:33
@ FRAME_SCH_SYMBOL_EDITOR
Definition frame_type.h:35
@ FRAME_SCH_VIEWER
Definition frame_type.h:36
@ FRAME_SCH
Definition frame_type.h:34
@ FRAME_SYMBOL_CHOOSER
Definition frame_type.h:37
static const std::string KiCadSymbolLibFileExtension
static wxString KiCadSymbolLibFileWildcard()
SCH_LAYER_ID
Eeschema drawing layers.
Definition layer_ids.h:448
@ LAYER_SCHEMATIC_GRID_AXES
Definition layer_ids.h:486
@ LAYER_SCHEMATIC_BACKGROUND
Definition layer_ids.h:487
@ MAIL_REFRESH_SYMBOL
Definition mail_type.h:59
@ REPAINT
Item needs to be redrawn.
Definition view_item.h:58
@ ALL
All except INITIAL_ADD.
Definition view_item.h:59
@ TARGET_NONCACHED
Auxiliary rendering target (noncached)
Definition definitions.h:38
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
Definition kicad_algo.h:100
Declaration of the NL_SCHEMATIC_PLUGIN class.
PGM_BASE & Pgm()
The global program "get" accessor.
Definition pgm_base.cpp:913
see class PGM_BASE
LIB_SYMBOL * SchGetLibSymbol(const LIB_ID &aLibId, SYMBOL_LIB_TABLE *aLibTable, SYMBOL_LIB *aCacheLib, wxWindow *aParent, bool aShowErrorMsg)
Load symbol from symbol library table.
LIB_SYMBOL * SchGetLibSymbol(const LIB_ID &aLibId, SYMBOL_LIB_TABLE *aLibTable, SYMBOL_LIB *aCacheLib=nullptr, wxWindow *aParent=nullptr, bool aShowErrorMsg=false)
Load symbol from symbol library table.
Class to handle a set of SCH_ITEMs.
T * GetAppSettings(const char *aFilename)
KIWAY Kiway(KFCTL_STANDALONE)
wxString UnescapeString(const wxString &aSource)
std::vector< wxString > pinned_symbol_libs
@ ID_MAKE_NEW_LIBRARY
Definition for symbol library class.
@ VALUE
Field Value of part, i.e. "3.3K".
@ SCH_TABLE_T
Definition typeinfo.h:167
@ SCH_SYMBOL_T
Definition typeinfo.h:174
@ SCH_TABLECELL_T
Definition typeinfo.h:168
@ SCH_FIELD_T
Definition typeinfo.h:152
@ SCH_LABEL_T
Definition typeinfo.h:169
@ SCH_SHEET_T
Definition typeinfo.h:177
@ SCH_SHAPE_T
Definition typeinfo.h:151
@ SCH_HIER_LABEL_T
Definition typeinfo.h:171
@ SCH_LABEL_LOCATE_ANY_T
Definition typeinfo.h:193
@ SCH_SHEET_PIN_T
Definition typeinfo.h:176
@ SCH_TEXT_T
Definition typeinfo.h:153
@ SCH_GLOBAL_LABEL_T
Definition typeinfo.h:170
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:695
VECTOR2< double > VECTOR2D
Definition vector2d.h:694