KiCad PCB EDA Suite
Loading...
Searching...
No Matches
symbol_editor_control.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2019 CERN
5 * Copyright (C) 2019-2024 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
26
27#include <advanced_config.h>
28#include <kiway.h>
29#include <pgm_base.h>
30#include <sch_painter.h>
31#include <tool/tool_manager.h>
33#include <tools/ee_actions.h>
36#include <symbol_viewer_frame.h>
38#include <symbol_lib_table.h>
41#include <confirm.h>
42#include <kidialog.h>
43#include <launch_ext.h> // To default when file manager setting is empty
44#include <gestfich.h> // To open with a text editor
45#include <wx/filedlg.h>
46#include "string_utils.h"
47
49{
50 m_frame = getEditFrame<SCH_BASE_FRAME>();
53
55 {
57 CONDITIONAL_MENU& ctxMenu = m_menu->GetMenu();
58 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
59
60 wxCHECK( editFrame, false );
61
62 auto libSelectedCondition =
63 [ editFrame ]( const SELECTION& aSel )
64 {
65 LIB_ID sel = editFrame->GetTreeLIBID();
66 return !sel.GetLibNickname().empty() && sel.GetLibItemName().empty();
67 };
68
69 // The libInferredCondition allows you to do things like New Symbol and Paste with a
70 // symbol selected (in other words, when we know the library context even if the library
71 // itself isn't selected.
72 auto libInferredCondition =
73 [ editFrame ]( const SELECTION& aSel )
74 {
75 LIB_ID sel = editFrame->GetTreeLIBID();
76 return !sel.GetLibNickname().empty();
77 };
78
79 auto symbolSelectedCondition =
80 [ editFrame ]( const SELECTION& aSel )
81 {
82 LIB_ID sel = editFrame->GetTargetLibId();
83 return !sel.GetLibNickname().empty() && !sel.GetLibItemName().empty();
84 };
85
86/* not used, but used to be used
87 auto multiSelectedCondition =
88 [ editFrame ]( const SELECTION& aSel )
89 {
90 return editFrame->GetTreeSelectionCount() > 1;
91 };
92*/
93 auto multiSymbolSelectedCondition =
94 [ editFrame ]( const SELECTION& aSel )
95 {
96 if( editFrame->GetTreeSelectionCount() > 1 )
97 {
98 for( LIB_ID& sel : editFrame->GetSelectedLibIds() )
99 {
100 if( !sel.IsValid() )
101 return false;
102 }
103 return true;
104 }
105 return false;
106 };
107/* not used, yet
108 auto multiLibrarySelectedCondition =
109 [ editFrame ]( const SELECTION& aSel )
110 {
111 if( editFrame->GetTreeSelectionCount() > 1 )
112 {
113 for( LIB_ID& sel : editFrame->GetSelectedLibIds() )
114 {
115 if( sel.IsValid() )
116 return false;
117 }
118 return true;
119 }
120 return false;
121 };
122*/
123 auto canOpenExternally =
124 [ editFrame ]( const SELECTION& aSel )
125 {
126 // The option is shown if the lib has no current edits
127 LIB_SYMBOL_LIBRARY_MANAGER& libMgr = editFrame->GetLibManager();
128 wxString libName = editFrame->GetTargetLibId().GetLibNickname();
129 bool ret = !libMgr.IsLibraryModified( libName );
130 return ret;
131 };
132
133// clang-format off
134 ctxMenu.AddItem( EE_ACTIONS::newSymbol, libInferredCondition, 10 );
135 ctxMenu.AddItem( EE_ACTIONS::deriveFromExistingSymbol, symbolSelectedCondition, 10 );
136
137 ctxMenu.AddSeparator( 10 );
138 ctxMenu.AddItem( ACTIONS::save, symbolSelectedCondition || libInferredCondition, 10 );
139 ctxMenu.AddItem( EE_ACTIONS::saveLibraryAs, libSelectedCondition, 10 );
140 ctxMenu.AddItem( EE_ACTIONS::saveSymbolCopyAs, symbolSelectedCondition, 10 );
141 ctxMenu.AddItem( ACTIONS::revert, symbolSelectedCondition || libInferredCondition, 10 );
142
143 ctxMenu.AddSeparator( 10 );
144 ctxMenu.AddItem( EE_ACTIONS::cutSymbol, symbolSelectedCondition || multiSymbolSelectedCondition, 10 );
145 ctxMenu.AddItem( EE_ACTIONS::copySymbol, symbolSelectedCondition || multiSymbolSelectedCondition, 10 );
146 ctxMenu.AddItem( EE_ACTIONS::pasteSymbol, libInferredCondition, 10 );
147 ctxMenu.AddItem( EE_ACTIONS::duplicateSymbol, symbolSelectedCondition, 10 );
148 ctxMenu.AddItem( EE_ACTIONS::renameSymbol, symbolSelectedCondition, 10 );
149 ctxMenu.AddItem( EE_ACTIONS::deleteSymbol, symbolSelectedCondition || multiSymbolSelectedCondition, 10 );
150
151 ctxMenu.AddSeparator( 100 );
152 ctxMenu.AddItem( EE_ACTIONS::importSymbol, libInferredCondition, 100 );
153
155 {
156 ctxMenu.AddSeparator( 200 );
157 ctxMenu.AddItem( ACTIONS::openWithTextEditor, canOpenExternally && ( symbolSelectedCondition || libSelectedCondition ), 200 );
158 }
159
161 {
162 ctxMenu.AddSeparator( 200 );
163 ctxMenu.AddItem( ACTIONS::openDirectory, canOpenExternally && ( symbolSelectedCondition || libSelectedCondition ), 200 );
164 }
165
166 libraryTreeTool->AddContextMenuItems( &ctxMenu );
167 }
168// clang-format on
169
170 return true;
171}
172
173
175{
176 bool createNew = aEvent.IsAction( &ACTIONS::newLibrary );
177
179 static_cast<SYMBOL_EDIT_FRAME*>( m_frame )->AddLibraryFile( createNew );
180
181 return 0;
182}
183
184
186{
187 wxString libFile = *aEvent.Parameter<wxString*>();
188
190 static_cast<SYMBOL_EDIT_FRAME*>( m_frame )->DdAddLibrary( libFile );
191
192 return 0;
193}
194
195
197{
198 if( !m_isSymbolEditor )
199 return 0;
200
201 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
202 int unit = 0;
203 LIB_ID partId = editFrame->GetTreeLIBID( &unit );
204
205 editFrame->LoadSymbol( partId.GetLibItemName(), partId.GetLibNickname(), unit );
206 return 0;
207}
208
209
211{
212 if( !m_isSymbolEditor )
213 return 0;
214
215 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
216 LIB_ID target = editFrame->GetTargetLibId();
217 const wxString& libName = target.GetLibNickname();
218 wxString msg;
219
220 if( libName.IsEmpty() )
221 {
222 msg.Printf( _( "No symbol library selected." ) );
224 return 0;
225 }
226
227 if( editFrame->GetLibManager().IsLibraryReadOnly( libName ) )
228 {
229 msg.Printf( _( "Symbol library '%s' is not writable." ), libName );
231 return 0;
232 }
233
234 if( aEvent.IsAction( &EE_ACTIONS::newSymbol ) )
235 editFrame->CreateNewSymbol();
237 editFrame->CreateNewSymbol( target.GetLibItemName() );
238 else if( aEvent.IsAction( &EE_ACTIONS::importSymbol ) )
239 editFrame->ImportSymbol();
240
241 return 0;
242}
243
244
246{
247 if( !m_isSymbolEditor )
248 return 0;
249
250 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
251
252 if( aEvt.IsAction( &EE_ACTIONS::save ) )
253 editFrame->Save();
254 else if( aEvt.IsAction( &EE_ACTIONS::saveLibraryAs ) )
255 editFrame->SaveLibraryAs();
256 else if( aEvt.IsAction( &EE_ACTIONS::saveSymbolCopyAs ) )
257 editFrame->SaveSymbolCopyAs();
258 else if( aEvt.IsAction( &EE_ACTIONS::saveAll ) )
259 editFrame->SaveAll();
260
261 return 0;
262}
263
264
266{
268 static_cast<SYMBOL_EDIT_FRAME*>( m_frame )->Revert();
269
270 return 0;
271}
272
273
275{
276 if( !m_isSymbolEditor )
277 return 0;
278
279 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
280 LIB_SYMBOL_LIBRARY_MANAGER& libMgr = editFrame->GetLibManager();
281
282 LIB_ID libId = editFrame->GetTreeLIBID();
283
284 wxString libName = libId.GetLibNickname();
285 wxString libItemName = libMgr.GetLibrary( libName )->GetFullURI( true );
286
287 wxFileName fileName( libItemName );
288
289 wxString filePath = wxEmptyString;
290
292
293 wxString explCommand = cfg->m_System.file_explorer;
294
295 if( explCommand.IsEmpty() )
296 {
297 filePath = fileName.GetFullPath().BeforeLast( wxFileName::GetPathSeparator() );
298
299 if( !filePath.IsEmpty() && wxDirExists( filePath ) )
300 LaunchExternal( filePath );
301 return 0;
302 }
303
304 if( !explCommand.EndsWith( "%F" ) )
305 {
306 wxMessageBox( _( "Missing/malformed file explorer argument '%F' in common settings." ) );
307 return 0;
308 }
309
310 filePath = fileName.GetFullPath();
311 filePath.Replace( wxS( "\"" ), wxS( "_" ) );
312
313 wxString fileArg = '"' + filePath + '"';
314
315 explCommand.Replace( wxT( "%F" ), fileArg );
316
317 if( !explCommand.IsEmpty() )
318 wxExecute( explCommand );
319
320 return 0;
321}
322
323
325{
326 if( !m_isSymbolEditor )
327 return 0;
328
329 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
330 LIB_SYMBOL_LIBRARY_MANAGER& libMgr = editFrame->GetLibManager();
331 wxString textEditorName = Pgm().GetTextEditor();
332
333 if( textEditorName.IsEmpty() )
334 {
335 wxMessageBox( _( "No text editor selected in KiCad. Please choose one." ) );
336 return 0;
337 }
338
339 LIB_ID libId = editFrame->GetTreeLIBID();
340 wxString libName = libId.GetLibNickname();
341 wxString tempFName = libMgr.GetLibrary( libName )->GetFullURI( true ).wc_str();
342
343 if( !tempFName.IsEmpty() )
344 ExecuteFile( textEditorName, tempFName, nullptr, false );
345
346 return 0;
347}
348
349
351{
352 if( !m_isSymbolEditor )
353 return 0;
354
355 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
356
358 editFrame->CopySymbolToClipboard();
359
361 {
362 bool hasWritableLibs = false;
363 wxString msg;
364
365 for( LIB_ID& sel : editFrame->GetSelectedLibIds() )
366 {
367 const wxString& libName = sel.GetLibNickname();
368
369 if( editFrame->GetLibManager().IsLibraryReadOnly( libName ) )
370 msg.Printf( _( "Symbol library '%s' is not writable." ), libName );
371 else
372 hasWritableLibs = true;
373 }
374
375 if( !msg.IsEmpty() )
377
378 if( !hasWritableLibs )
379 return 0;
380
381 editFrame->DeleteSymbolFromLibrary();
382 }
383
384 return 0;
385}
386
387
389{
390 if( !m_isSymbolEditor )
391 return 0;
392
393 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
394 LIB_ID sel = editFrame->GetTargetLibId();
395 // DuplicateSymbol() is called to duplicate a symbol, or to paste a previously
396 // saved symbol in clipboard
397 bool isPasteAction = aEvent.IsAction( &EE_ACTIONS::pasteSymbol );
398 wxString msg;
399
400 if( !sel.IsValid() && !isPasteAction )
401 {
402 // When duplicating a symbol, a source symbol must exists.
403 msg.Printf( _( "No symbol selected" ) );
405 return 0;
406 }
407
408 const wxString& libName = sel.GetLibNickname();
409
410 if( editFrame->GetLibManager().IsLibraryReadOnly( libName ) )
411 {
412 msg.Printf( _( "Symbol library '%s' is not writable." ), libName );
414 return 0;
415 }
416
417 editFrame->DuplicateSymbol( isPasteAction );
418 return 0;
419}
420
421
423{
424 if( !m_isSymbolEditor )
425 return 0;
426
427 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
428 LIB_SYMBOL_LIBRARY_MANAGER& libMgr = editFrame->GetLibManager();
430
431 LIB_ID libId = editFrame->GetTreeLIBID();
432 wxString libName = libId.GetLibNickname();
433 wxString oldName = libId.GetLibItemName();
434 wxString newName;
435 wxString msg;
436
437 if( !libMgr.LibraryExists( libName ) )
438 return 0;
439
440 if( !libTool->RenameLibrary( _( "Change Symbol Name" ), oldName,
441 [&]( const wxString& aNewName )
442 {
443 newName = EscapeString( aNewName, CTX_LIBID );
444
445 if( newName.IsEmpty() )
446 {
447 wxMessageBox( _( "Symbol must have a name." ) );
448 return false;
449 }
450
451 if( libMgr.SymbolExists( newName, libName ) )
452 {
453 msg = wxString::Format( _( "Symbol '%s' already exists in library '%s'." ),
454 newName, libName );
455
456 KIDIALOG errorDlg( m_frame, msg, _( "Confirmation" ),
457 wxOK | wxCANCEL | wxICON_WARNING );
458 errorDlg.SetOKLabel( _( "Overwrite" ) );
459
460 return errorDlg.ShowModal() == wxID_OK;
461 }
462
463 return true;
464 } ) )
465 {
466 return 0; // cancelled by user
467 }
468
469 LIB_SYMBOL* libSymbol = libMgr.GetBufferedSymbol( oldName, libName );
470 bool isCurrentSymbol = editFrame->IsCurrentSymbol( libId );
471
472 if( !libSymbol )
473 return 0;
474
475 libSymbol->SetName( newName );
476
477 if( libSymbol->GetFieldById( VALUE_FIELD )->GetText() == oldName )
478 libSymbol->GetFieldById( VALUE_FIELD )->SetText( newName );
479
480 libMgr.UpdateSymbolAfterRename( libSymbol, newName, libName );
481 libMgr.SetSymbolModified( newName, libName );
482
483 if( isCurrentSymbol && editFrame->GetCurSymbol())
484 {
485 libSymbol = editFrame->GetCurSymbol();
486
487 libSymbol->SetName( newName );
488
489 if( libSymbol->GetFieldById( VALUE_FIELD )->GetText() == oldName )
490 libSymbol->GetFieldById( VALUE_FIELD )->SetText( newName );
491
492 editFrame->RebuildView();
493 editFrame->OnModify();
494 editFrame->UpdateTitle();
495
496 // N.B. The view needs to be rebuilt first as the Symbol Properties change may
497 // invalidate the view pointers by rebuilting the field table
498 editFrame->UpdateMsgPanel();
499 }
500
501 wxDataViewItem treeItem = libMgr.GetAdapter()->FindItem( libId );
502 editFrame->UpdateLibraryTree( treeItem, libSymbol );
503 editFrame->FocusOnLibId( LIB_ID( libName, newName ) );
504 return 0;
505}
506
507
509{
510 int bodyStyle = aEvent.IsAction( &EE_ACTIONS::showDeMorganStandard ) ? BODY_STYLE::BASE
511 : BODY_STYLE::DEMORGAN;
512
514 {
517
518 SYMBOL_EDIT_FRAME* symbolEditor = static_cast<SYMBOL_EDIT_FRAME*>( m_frame );
519 symbolEditor->SetBodyStyle( bodyStyle );
520
522 symbolEditor->RebuildView();
523 }
524 else if( m_frame->IsType( FRAME_SCH_VIEWER ) )
525 {
526 SYMBOL_VIEWER_FRAME* symbolViewer = static_cast<SYMBOL_VIEWER_FRAME*>( m_frame );
527 symbolViewer->SetUnitAndBodyStyle( symbolViewer->GetUnit(), bodyStyle );
528 }
529
530 return 0;
531}
532
533
535{
537 getEditFrame<SYMBOL_EDIT_FRAME>()->ToggleProperties();
538
539 return 0;
540}
541
542
544{
545 SCH_RENDER_SETTINGS* renderSettings = m_frame->GetRenderSettings();
546 renderSettings->m_ShowPinsElectricalType = !renderSettings->m_ShowPinsElectricalType;
547
548 // Update canvas
551
552 return 0;
553}
554
555
557{
558 SCH_RENDER_SETTINGS* renderSettings = m_frame->GetRenderSettings();
559 renderSettings->m_ShowPinNumbers = !renderSettings->m_ShowPinNumbers;
560
561 // Update canvas
564
565 return 0;
566}
567
568
570{
571 if( !m_isSymbolEditor )
572 return 0;
573
574 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
575 editFrame->m_SyncPinEdit = !editFrame->m_SyncPinEdit;
576
577 return 0;
578}
579
580
582{
583 if( !m_isSymbolEditor )
584 return 0;
585
588
589 getEditFrame<SYMBOL_EDIT_FRAME>()->GetRenderSettings()->m_ShowHiddenPins =
590 cfg->m_ShowHiddenPins;
591
594 return 0;
595}
596
597
599{
600 if( !m_isSymbolEditor )
601 return 0;
602
605
606 // TODO: Why is this needed in symbol edit and not in schematic edit?
607 getEditFrame<SYMBOL_EDIT_FRAME>()->GetRenderSettings()->m_ShowHiddenFields =
609
612 return 0;
613}
614
615
617{
618 if( !m_isSymbolEditor )
619 return 0;
620
623
625
628 return 0;
629}
630
631
633{
634 if( !m_isSymbolEditor )
635 return 0;
636
637 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
638 LIB_SYMBOL* symbol = editFrame->GetCurSymbol();
639
640 if( !symbol )
641 {
642 wxMessageBox( _( "No symbol to export" ) );
643 return 0;
644 }
645
646 wxFileName fn( symbol->GetName() );
647 fn.SetExt( "png" );
648
649 wxString projectPath = wxPathOnly( m_frame->Prj().GetProjectFullName() );
650
651 wxFileDialog dlg( editFrame, _( "Export View as PNG" ), projectPath, fn.GetFullName(),
652 FILEEXT::PngFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
653
654 if( dlg.ShowModal() == wxID_OK && !dlg.GetPath().IsEmpty() )
655 {
656 // calling wxYield is mandatory under Linux, after closing the file selector dialog
657 // to refresh the screen before creating the PNG or JPEG image from screen
658 wxYield();
659
660 if( !editFrame->SaveCanvasImageToFile( dlg.GetPath(), BITMAP_TYPE::PNG ) )
661 {
662 wxMessageBox( wxString::Format( _( "Can't save file '%s'." ), dlg.GetPath() ) );
663 }
664 }
665
666 return 0;
667}
668
669
671{
672 if( !m_isSymbolEditor )
673 return 0;
674
675 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
676 LIB_SYMBOL* symbol = editFrame->GetCurSymbol();
677
678 if( !symbol )
679 {
680 wxMessageBox( _( "No symbol to export" ) );
681 return 0;
682 }
683
684 wxFileName fn( symbol->GetName() );
685 fn.SetExt( FILEEXT::SVGFileExtension );
686
687 wxString pro_dir = wxPathOnly( m_frame->Prj().GetProjectFullName() );
688
689 wxString fullFileName = wxFileSelector( _( "SVG File Name" ), pro_dir, fn.GetFullName(),
691 wxFD_SAVE,
692 m_frame );
693
694 if( !fullFileName.IsEmpty() )
695 {
696 PAGE_INFO pageSave = editFrame->GetScreen()->GetPageSettings();
697 PAGE_INFO pageTemp = pageSave;
698
699 BOX2I symbolBBox = symbol->GetUnitBoundingBox( editFrame->GetUnit(),
700 editFrame->GetBodyStyle(), false );
701
702 // Add a small margin (10% of size)to the plot bounding box
703 symbolBBox.Inflate( symbolBBox.GetSize().x * 0.1, symbolBBox.GetSize().y * 0.1 );
704
705 pageTemp.SetWidthMils( schIUScale.IUToMils( symbolBBox.GetSize().x ) );
706 pageTemp.SetHeightMils( schIUScale.IUToMils( symbolBBox.GetSize().y ) );
707
708 // Add an offet to plot the symbol centered on the page.
709 VECTOR2I plot_offset = symbolBBox.GetOrigin();
710
711 editFrame->GetScreen()->SetPageSettings( pageTemp );
712 editFrame->SVGPlotSymbol( fullFileName, -plot_offset );
713 editFrame->GetScreen()->SetPageSettings( pageSave );
714 }
715
716 return 0;
717}
718
719
721{
722 LIB_SYMBOL* libSymbol = nullptr;
723 LIB_ID libId;
724 int unit, bodyStyle;
725
726 if( m_isSymbolEditor )
727 {
728 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
729
730 libSymbol = editFrame->GetCurSymbol();
731 unit = editFrame->GetUnit();
732 bodyStyle = editFrame->GetBodyStyle();
733
734 if( libSymbol )
735 libId = libSymbol->GetLibId();
736 }
737 else
738 {
739 SYMBOL_VIEWER_FRAME* viewerFrame = getEditFrame<SYMBOL_VIEWER_FRAME>();
740
741 libSymbol = viewerFrame->GetSelectedSymbol();
742 unit = viewerFrame->GetUnit();
743 bodyStyle = viewerFrame->GetBodyStyle();
744
745 if( libSymbol )
746 libId = libSymbol->GetLibId();
747 }
748
749 if( libSymbol )
750 {
751 SCH_EDIT_FRAME* schframe = (SCH_EDIT_FRAME*) m_frame->Kiway().Player( FRAME_SCH, false );
752
753 if( !schframe ) // happens when the schematic editor is not active (or closed)
754 {
755 DisplayErrorMessage( m_frame, _( "No schematic currently open." ) );
756 return 0;
757 }
758
759 wxWindow* blocking_dialog = schframe->Kiway().GetBlockingDialog();
760
761 if( blocking_dialog )
762 {
763 blocking_dialog->Raise();
764 wxBell();
765 return 0;
766 }
767
768 wxCHECK( libSymbol->GetLibId().IsValid(), 0 );
769
770 SCH_SYMBOL* symbol = new SCH_SYMBOL( *libSymbol, libId, &schframe->GetCurrentSheet(),
771 unit, bodyStyle );
772
773 symbol->SetParent( schframe->GetScreen() );
774
775 if( schframe->eeconfig()->m_AutoplaceFields.enable )
776 symbol->AutoplaceFields( /* aScreen */ nullptr, /* aManual */ false );
777
778 schframe->Raise();
779 schframe->GetToolManager()->PostAction( EE_ACTIONS::placeSymbol, symbol );
780 }
781
782 return 0;
783}
784
785
787{
788 if( !m_isSymbolEditor )
789 return 0;
790
791 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
792 const int deltaUnit = aEvent.Parameter<int>();
793
794 const int nUnits = editFrame->GetCurSymbol()->GetUnitCount();
795 const int newUnit = ( ( editFrame->GetUnit() - 1 + deltaUnit + nUnits ) % nUnits ) + 1;
796
797 editFrame->SetUnit( newUnit );
798
799 return 0;
800}
801
802
804{
805 // clang-format off
812
814
820
827
830
834
837
841
846
849 // clang-format on
850}
constexpr EDA_IU_SCALE schIUScale
Definition: base_units.h:110
static TOOL_ACTION cancelInteractive
Definition: actions.h:65
static TOOL_ACTION openWithTextEditor
Definition: actions.h:61
static TOOL_ACTION revert
Definition: actions.h:55
static TOOL_ACTION addLibrary
Definition: actions.h:49
static TOOL_ACTION openDirectory
Definition: actions.h:62
static TOOL_ACTION saveAll
Definition: actions.h:54
static TOOL_ACTION save
Definition: actions.h:51
static TOOL_ACTION showProperties
Definition: actions.h:206
static TOOL_ACTION newLibrary
Definition: actions.h:48
static TOOL_ACTION ddAddLibrary
Definition: actions.h:60
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition: box2.h:558
constexpr const Vec & GetOrigin() const
Definition: box2.h:210
constexpr const SizeVec & GetSize() const
Definition: box2.h:206
void ShowInfoBarError(const wxString &aErrorMsg, bool aShowCloseButton=false, WX_INFOBAR::MESSAGE_TYPE aType=WX_INFOBAR::MESSAGE_TYPE::GENERIC)
Show the WX_INFOBAR displayed on the top of the canvas with a message and an error icon on the left o...
bool IsType(FRAME_T aType) const
bool SaveCanvasImageToFile(const wxString &aFileName, BITMAP_TYPE aBitmapType)
Save the current view as an image file.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
virtual void SetParent(EDA_ITEM *aParent)
Definition: eda_item.h:104
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:94
AUTOPLACE_FIELDS m_AutoplaceFields
static TOOL_ACTION deleteSymbol
Definition: ee_actions.h:219
static TOOL_ACTION cutSymbol
Definition: ee_actions.h:220
static TOOL_ACTION placeSymbol
Definition: ee_actions.h:78
static TOOL_ACTION clearSelection
Clears the current selection.
Definition: ee_actions.h:55
static TOOL_ACTION showHiddenFields
Definition: ee_actions.h:248
static TOOL_ACTION duplicateSymbol
Definition: ee_actions.h:217
static TOOL_ACTION showDeMorganAlternate
Definition: ee_actions.h:140
static TOOL_ACTION newSymbol
Definition: ee_actions.h:214
static TOOL_ACTION showDeMorganStandard
Definition: ee_actions.h:139
static TOOL_ACTION editSymbol
Definition: ee_actions.h:216
static TOOL_ACTION saveLibraryAs
Definition: ee_actions.h:212
static TOOL_ACTION addSymbolToSchematic
Definition: ee_actions.h:186
static TOOL_ACTION showPinNumbers
Definition: ee_actions.h:264
static TOOL_ACTION togglePinAltIcons
Definition: ee_actions.h:256
static TOOL_ACTION exportSymbolAsSVG
Definition: ee_actions.h:269
static TOOL_ACTION importSymbol
Definition: ee_actions.h:223
static TOOL_ACTION saveSymbolCopyAs
Definition: ee_actions.h:213
static TOOL_ACTION copySymbol
Definition: ee_actions.h:221
static TOOL_ACTION renameSymbol
Definition: ee_actions.h:218
static TOOL_ACTION previousUnit
Definition: ee_actions.h:272
static TOOL_ACTION toggleSyncedPinsMode
Definition: ee_actions.h:257
static TOOL_ACTION nextUnit
Definition: ee_actions.h:273
static TOOL_ACTION showHiddenPins
Definition: ee_actions.h:247
static TOOL_ACTION exportSymbolView
Definition: ee_actions.h:268
static TOOL_ACTION deriveFromExistingSymbol
Definition: ee_actions.h:215
static TOOL_ACTION pasteSymbol
Definition: ee_actions.h:222
static TOOL_ACTION showElectricalTypes
Definition: ee_actions.h:263
EE_SELECTION_TOOL * m_selectionTool
Definition: ee_tool_base.h:200
Helper class to create more flexible dialogs, including 'do not show again' checkbox handling.
Definition: kidialog.h:43
int ShowModal() override
Definition: kidialog.cpp:95
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition: view.cpp:1563
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
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition: kiway.cpp:406
wxWindow * GetBlockingDialog()
Gets the window pointer to the blocking dialog (to send it signals)
Definition: kiway.cpp:669
Module editor specific tools.
bool RenameLibrary(const wxString &aTitle, const wxString &aName, std::function< bool(const wxString &aNewName)> aValidator)
void AddContextMenuItems(CONDITIONAL_MENU *aMenu)
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
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
Symbol library management helper that is specific to the symbol library editor frame.
wxObjectDataPtr< LIB_TREE_MODEL_ADAPTER > & GetAdapter()
Return the adapter object that provides the stored data.
Define a library symbol object.
Definition: lib_symbol.h:78
const LIB_ID & GetLibId() const override
Definition: lib_symbol.h:143
const BOX2I GetUnitBoundingBox(int aUnit, int aBodyStyle, bool aIgnoreHiddenFields=true) const
Get the bounding box for the symbol.
Definition: lib_symbol.cpp:931
SCH_FIELD * GetFieldById(int aId) const
Return pointer to the requested field.
wxString GetName() const override
Definition: lib_symbol.h:137
int GetUnitCount() const override
virtual void SetName(const wxString &aName)
Definition: lib_symbol.cpp:288
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...
Describe the page size and margins of a paper page on which to eventually print or plot.
Definition: page_info.h:59
void SetHeightMils(double aHeightInMils)
Definition: page_info.cpp:261
void SetWidthMils(double aWidthInMils)
Definition: page_info.cpp:247
virtual COMMON_SETTINGS * GetCommonSettings() const
Definition: pgm_base.cpp:679
virtual const wxString & GetTextEditor(bool aCanShowFileChooser=true)
Return the path to the preferred text editor application.
Definition: pgm_base.cpp:196
virtual const wxString GetProjectFullName() const
Return the full path and name of the project.
Definition: project.cpp:129
SCH_RENDER_SETTINGS * GetRenderSettings()
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.
EESCHEMA_SETTINGS * eeconfig() const
KIGFX::SCH_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
Schematic editor (Eeschema) main window.
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
SCH_SHEET_PATH & GetCurrentSheet() const
void SetText(const wxString &aText) override
Definition: sch_field.cpp:1212
const PAGE_INFO & GetPageSettings() const
Definition: sch_screen.h:130
void SetPageSettings(const PAGE_INFO &aPageSettings)
Definition: sch_screen.h:131
Schematic symbol object.
Definition: sch_symbol.h:104
void AutoplaceFields(SCH_SCREEN *aScreen, bool aManual) override
Automatically orient all the fields in the symbol.
int ToggleSyncedPinsMode(const TOOL_EVENT &aEvent)
int OnDeMorgan(const TOOL_EVENT &aEvent)
int Save(const TOOL_EVENT &aEvt)
int EditSymbol(const TOOL_EVENT &aEvent)
int ExportView(const TOOL_EVENT &aEvent)
int ShowElectricalTypes(const TOOL_EVENT &aEvent)
int OpenDirectory(const TOOL_EVENT &aEvent)
int RenameSymbol(const TOOL_EVENT &newName)
int DuplicateSymbol(const TOOL_EVENT &aEvent)
int ToggleHiddenPins(const TOOL_EVENT &aEvent)
int AddLibrary(const TOOL_EVENT &aEvent)
int AddSymbol(const TOOL_EVENT &aEvent)
int TogglePinAltIcons(const TOOL_EVENT &aEvent)
int ChangeUnit(const TOOL_EVENT &aEvent)
int Revert(const TOOL_EVENT &aEvent)
int ToggleHiddenFields(const TOOL_EVENT &aEvent)
int OpenWithTextEditor(const TOOL_EVENT &aEvent)
void setTransitions() override
< Set up handlers for various events.
int ToggleProperties(const TOOL_EVENT &aEvent)
bool Init() override
Init() is called once upon a registration of the tool.
int ExportSymbolAsSVG(const TOOL_EVENT &aEvent)
int ShowPinNumbers(const TOOL_EVENT &aEvent)
int DdAddLibrary(const TOOL_EVENT &aEvent)
int AddSymbolToSchematic(const TOOL_EVENT &aEvent)
int CutCopyDelete(const TOOL_EVENT &aEvent)
bool m_ShowPinAltIcons
When true, dragging an outline edge will drag pins rooted on it.
The symbol library editor main window.
void SaveAll()
Save all modified symbols and libraries.
void DeleteSymbolFromLibrary()
bool IsCurrentSymbol(const LIB_ID &aLibId) const
Restore the empty editor screen, without any symbol or library selected.
LIB_ID GetTreeLIBID(int *aUnit=nullptr) const
Return the LIB_ID of the library or symbol selected in the symbol tree.
void FocusOnLibId(const LIB_ID &aLibID)
void SVGPlotSymbol(const wxString &aFullFileName, const VECTOR2I &aOffset)
Create the SVG print file for the current edited symbol.
void Save()
Save the selected symbol or library.
void LoadSymbol(const wxString &aLibrary, const wxString &aSymbol, int Unit)
int GetBodyStyle() const
bool m_SyncPinEdit
Set to true to synchronize pins at the same position when editing symbols with multiple units or mult...
int GetTreeSelectionCount() const
void SaveSymbolCopyAs()
Save the currently selected symbol to a new name and/or location.
void DuplicateSymbol(bool aFromClipboard)
Insert a duplicate symbol.
std::vector< LIB_ID > GetSelectedLibIds() const
LIB_SYMBOL * GetCurSymbol() const
Return the current symbol being edited or NULL if none selected.
LIB_ID GetTargetLibId() const override
Return either the symbol selected in the symbol tree (if context menu is active) or the symbol on the...
void SetBodyStyle(int aBodyStyle)
void SetUnit(int aUnit)
void UpdateMsgPanel() override
Redraw the message panel.
void CreateNewSymbol(const wxString &newName=wxEmptyString)
Create a new symbol in the selected library.
void UpdateTitle()
Update the main window title bar with the current library name and read only status of the library.
LIB_SYMBOL_LIBRARY_MANAGER & GetLibManager()
void DdAddLibrary(wxString aLibFile)
Add a library dropped file to the symbol library table.
void UpdateLibraryTree(const wxDataViewItem &aTreeItem, LIB_SYMBOL *aSymbol)
Update a symbol node in the library tree.
void OnModify() override
Must be called after a schematic change in order to set the "modify" flag of the current symbol.
void SaveLibraryAs()
Save the currently selected library to a new file.
LIB_SYMBOL * GetBufferedSymbol(const wxString &aAlias, const wxString &aLibrary)
Return the symbol copy from the buffer.
bool UpdateSymbolAfterRename(LIB_SYMBOL *aSymbol, const wxString &oldAlias, const wxString &aLibrary)
Update the symbol buffer with a new version of the symbol when the name has changed.
bool IsLibraryReadOnly(const wxString &aLibrary) const
Return true if the library is stored in a read-only file.
bool LibraryExists(const wxString &aLibrary, bool aCheckEnabled=false) const
Return true if library exists.
bool IsLibraryModified(const wxString &aLibrary) const
Return true if library has unsaved modifications.
void SetSymbolModified(const wxString &aAlias, const wxString &aLibrary)
bool SymbolExists(const wxString &aAlias, const wxString &aLibrary) const
Return true if symbol with a specific alias exists in library (either original one or buffered).
SYMBOL_LIB_TABLE_ROW * GetLibrary(const wxString &aLibrary) const
Find a single library within the (aggregate) library table.
Symbol library viewer main window.
void SetUnitAndBodyStyle(int aUnit, int aBodyStyle)
Set unit and convert, and set flag preventing them from automatically resetting to 1.
LIB_SYMBOL * GetSelectedSymbol() const
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:55
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:218
KIGFX::VIEW * getView() const
Returns the instance of #VIEW object used in the application.
Definition: tool_base.cpp:36
@ MODEL_RELOAD
Model changes (the sheet for a schematic)
Definition: tool_base.h:80
Generic, UI-independent tool event.
Definition: tool_event.h:167
bool IsAction(const TOOL_ACTION *aAction) const
Test if the event contains an action issued upon activation of the given TOOL_ACTION.
Definition: tool_event.cpp:82
T Parameter() const
Return a parameter assigned to the event.
Definition: tool_event.h:460
void Go(int(T::*aStateFunc)(const TOOL_EVENT &), const TOOL_EVENT_LIST &aConditions=TOOL_EVENT(TC_ANY, TA_ANY))
Define which state (aStateFunc) to go when a certain event arrives (aConditions).
std::unique_ptr< TOOL_MENU > m_menu
The functions below are not yet implemented - their interface may change.
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 PostAction(const std::string &aActionName, T aParam)
Run the specified action after the current action (coroutine) ends.
Definition: tool_manager.h:235
void ResetTools(TOOL_BASE::RESET_REASON aReason)
Reset all tools (i.e.
bool empty() const
Definition: utf8.h:104
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition: confirm.cpp:195
This file is part of the common library.
#define _(s)
@ FRAME_SCH_SYMBOL_EDITOR
Definition: frame_type.h:35
@ FRAME_SCH_VIEWER
Definition: frame_type.h:36
@ FRAME_SCH
Definition: frame_type.h:34
int ExecuteFile(const wxString &aEditorName, const wxString &aFileName, wxProcess *aCallback, bool aFileForKicad)
Call the executable file aEditorName with the parameter aFileName.
Definition: gestfich.cpp:143
bool m_EnableLibDir
Enable option to open lib file directory.
bool m_EnableLibWithText
Enable option to load lib files with text editor.
static const std::string SVGFileExtension
static wxString PngFileWildcard()
static wxString SVGFileWildcard()
This file is part of the common library.
bool LaunchExternal(const wxString &aPath)
Launches the given file or folder in the host OS.
Definition: launch_ext.cpp:25
@ REPAINT
Item needs to be redrawn.
Definition: view_item.h:57
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: pgm_base.cpp:1060
see class PGM_BASE
wxString EscapeString(const wxString &aSource, ESCAPE_CONTEXT aContext)
The Escape/Unescape routines use HTML-entity-reference-style encoding to handle characters which are:...
@ CTX_LIBID
Definition: string_utils.h:54
constexpr int IUToMils(int iu) const
Definition: base_units.h:99
@ VALUE_FIELD
Field Value of part, i.e. "3.3K".
Definition of file extensions used in Kicad.