46#include <wx/clipbrd.h>
47#include <wx/filedlg.h>
66 title += wxS(
" " ) +
_(
"[from schematic]" );
76 title += wxS(
" " ) +
_(
"[Read Only Library]" );
80 title =
_(
"[no symbol loaded]" );
83 title += wxT(
" \u2014 " ) +
_(
"Symbol Editor" );
90 wxString selectedLib = aLibrary;
92 if( selectedLib.empty() )
93 selectedLib =
SelectLibrary(
_(
"Select Symbol Library" ),
_(
"Library:" ) );
95 if( !selectedLib.empty() )
126 if(
m_libMgr->IsLibraryReadOnly( libName ) )
128 wxString msg = wxString::Format(
_(
"Symbol library '%s' is not writable." ),
130 wxString msg2 =
_(
"You must save to a different location." );
153 if( lib->SchLibType() == SCH_IO_MGR::SCH_DATABASE
154 || lib->SchLibType() == SCH_IO_MGR::SCH_CADSTAR_ARCHIVE
155 || lib->SchLibType() == SCH_IO_MGR::SCH_HTTP )
169 msg.Printf(
_(
"Error loading symbol %s from library '%s'." ),
201 m_treePane->GetLibTree()->SelectLibId( libId );
202 m_treePane->GetLibTree()->ExpandLibId( libId );
235 msg.Printf(
_(
"Error loading symbol %s from library '%s'." ),
258 int aUnit,
int aBodyStyle )
260 bool rebuildMenuAndToolbar =
false;
262 if( !aEntry || aLibrary.empty() )
265 if( aEntry->
GetName().IsEmpty() )
267 wxLogWarning(
"Symbol in library '%s' has empty name field.", aLibrary );
283 rebuildMenuAndToolbar =
true;
287 wxCHECK( lib_symbol,
false );
289 m_unit = aUnit > 0 ? aUnit : 1;
299 if( rebuildMenuAndToolbar )
345 if( !
m_libMgr->LibraryExists( lib ) )
347 lib =
SelectLibrary(
_(
"New Symbol" ),
_(
"Create symbol in library:" ) );
349 if( !
m_libMgr->LibraryExists( lib ) )
353 const auto validator =
354 [&]( wxString newName ) ->
bool
356 if( newName.IsEmpty() )
358 wxMessageBox(
_(
"Symbol must have a name." ) );
362 if( !lib.empty() &&
m_libMgr->SymbolNameInUse( newName, lib ) )
366 msg.Printf(
_(
"Symbol '%s' already exists in library '%s'." ),
370 KIDIALOG errorDlg(
this, msg,
_(
"Confirmation" ),
371 wxOK | wxCANCEL | wxICON_WARNING );
373 errorDlg.SetOKLabel(
_(
"Overwrite" ) );
381 wxArrayString symbolNamesInLib;
382 m_libMgr->GetSymbolNames( lib, symbolNamesInLib );
386 dlg.SetMinSize( dlg.GetSize() );
411 m_libMgr->CreateNewSymbol( lib, props );
424 if( libName.empty() )
428 else if(
m_libMgr->IsLibraryReadOnly( libName ) )
430 wxString msg = wxString::Format(
_(
"Symbol library '%s' is not writable." ),
432 wxString msg2 =
_(
"You must save to a different location." );
453 if( !libName.IsEmpty() )
480 std::vector<LIB_SYMBOL_SPTR>
chain;
484 chain.push_back( sym );
489 chain.push_back( parent );
508 const wxString& aNewSymbolName,
509 const wxString& aNewLibraryName )
514 if( aNewLibraryName != oldLibraryName )
515 return {
false,
false };
519 return {
false,
false };
521 bool inAncestry =
false;
522 bool inDescendents =
false;
525 const std::vector<LIB_SYMBOL_SPTR> parentChainFromUs =
GetParentChain( aSymbol,
true );
528 for(
size_t i = 1; i < parentChainFromUs.size(); ++i )
531 if( parentChainFromUs[i]->GetName() == aNewSymbolName )
541 const std::vector<LIB_SYMBOL_SPTR> parentChainFromTarget =
GetParentChain( *targetSymbol,
true );
542 const wxString oldSymbolName = aSymbol.
GetName();
546 for(
size_t i = 1; i < parentChainFromTarget.size(); ++i )
548 if( parentChainFromTarget[i]->GetName() == oldSymbolName )
550 inDescendents =
true;
556 return { inAncestry, inDescendents };
570 const wxString& newSymbolName,
571 const wxString& newLibraryName )
573 std::vector<wxString> conflicts;
576 if( newLibraryName == oldLibraryName || aFlattenSymbol )
581 conflicts.push_back( newSymbolName );
586 const std::vector<LIB_SYMBOL_SPTR> parentChain =
GetParentChain( aSymbol,
true );
588 for(
size_t i = 0; i < parentChain.size(); ++i )
594 conflicts.push_back( newSymbolName );
601 conflicts.push_back( chainSymbol->
GetName() );
637 bool DoSave(
LIB_SYMBOL& symbol,
const wxString& aNewSymName,
const wxString& aNewLibName,
bool aFlattenSymbol )
639 std::unique_ptr<LIB_SYMBOL> flattenedSymbol;
640 std::vector<LIB_SYMBOL_SPTR> parentChain;
648 flattenedSymbol = symbol.
Flatten();
649 wxCHECK( flattenedSymbol,
false );
651 parentChain.push_back( flattenedSymbol->SharedPtr() );
657 parentChain.push_back( symbol.
SharedPtr() );
665 std::vector<wxString> newNames;
668 for(
int i = (
int) parentChain.size() - 1; i >= 0; --i )
678 newName = aNewSymName;
683 newName = oldSymbol->
GetName();
692 if( i == (
int) parentChain.size() - 1 )
703 wxASSERT( newParent );
707 newNames.push_back( newName );
708 m_libMgr.UpdateSymbol( &new_symbol, aNewLibName );
715 wxString
resolveConflict(
const wxString& proposed,
const wxString& aNewLibName )
const
731 wxString newName = wxString::Format(
"%s_%d", proposed, suffix );
733 if( !
m_libMgr.SymbolNameInUse( newName, aNewLibName ) )
743 wxFAIL_MSG(
"Invalid conflict strategy" );
777 const std::vector<wxString>& aParentSymbolNames ) :
784 wxArrayString headers;
785 std::vector<wxArrayString> itemsToDisplay;
787 if( aParentSymbolNames.size() )
793 wxString::Format(
"Flatten/remove symbol inheritance (current parent symbols: %s)", aParentNames ),
803 wxBoxSizer* bNameSizer =
new wxBoxSizer( wxHORIZONTAL );
805 wxStaticText* label =
new wxStaticText(
this, wxID_ANY,
_(
"Name:" ) );
806 bNameSizer->Add( label, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
813 m_ButtonsSizer->Prepend( newLibraryButton, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 10 );
815 GetSizer()->Prepend( bNameSizer, 0, wxEXPAND|wxTOP|wxLEFT|wxRIGHT, 5 );
818 [
this]( wxCommandEvent& )
832 GetSizer()->Fit(
this );
841 symbolName.Trim(
true );
842 symbolName.Trim(
false );
843 symbolName.Replace(
" ",
"_" );
864 if( ret == wxID_CANCEL )
895 bool flattenSymbol =
false;
899 const auto dialogValidatorFunc =
900 [&](
const wxString& newLib,
const wxString& newName ) ->
int
902 if( newLib.IsEmpty() )
904 wxMessageBox(
_(
"A library must be specified." ) );
908 if( newName.IsEmpty() )
910 wxMessageBox(
_(
"Symbol must have a name." ) );
914 if(
m_libMgr->IsLibraryReadOnly( newLib ) )
916 msg = wxString::Format(
_(
"Library '%s' is read-only. Choose a "
917 "different library to save the symbol '%s' to." ),
933 msg = wxString::Format(
_(
"Symbol '%s' cannot replace another symbol '%s' "
934 "that it descends from" ),
943 msg = wxString::Format(
_(
"Symbol '%s' cannot replace another symbol '%s' "
944 "that is a descendent of it." ),
951 const std::vector<wxString> conflicts =
954 if( conflicts.size() == 1 && conflicts.front() == newName )
957 msg = wxString::Format(
_(
"Symbol '%s' already exists in library '%s'. "
958 "Do you want to overwrite it?" ),
962 KIDIALOG errorDlg(
this, msg,
_(
"Confirmation" ), wxOK | wxCANCEL | wxICON_WARNING );
963 errorDlg.SetOKLabel(
_(
"Overwrite" ) );
967 else if( !conflicts.empty() )
973 msg = wxString::Format(
_(
"The following symbols in the inheritance chain of "
974 "'%s' already exist in library '%s':\n" ),
978 for(
const wxString& conflict : conflicts )
979 msg += wxString::Format(
" %s\n", conflict );
981 msg +=
_(
"\nDo you want to overwrite all of them, or rename the new symbols?" );
983 KIDIALOG errorDlg(
this, msg,
_(
"Confirmation" ), wxYES_NO | wxCANCEL | wxICON_WARNING );
984 errorDlg.SetYesNoCancelLabels(
_(
"Overwrite All" ),
_(
"Rename All" ),
_(
"Cancel" ) );
990 default:
return wxID_CANCEL;
999 std::vector<wxString> parentSymbolNames;
1003 std::vector<std::shared_ptr<LIB_SYMBOL>> parentChain =
GetParentChain( *symbol,
false );
1005 for(
const auto& parent : parentChain )
1006 parentSymbolNames.push_back( parent->GetName() );
1038 params.m_LibraryName = newLibrary.GetName();
1051 saver.
DoSave( *symbol, params.m_SymbolName, params.m_LibraryName, params.m_FlattenSymbol );
1056 LoadSymbol( params.m_SymbolName, params.m_LibraryName, 1 );
1073 fn.SetName( symbol->
GetName().Lower() );
1076 wxFileDialog dlg(
this,
_(
"Export Symbol" ),
m_mruPath, fn.GetFullName(),
1079 if( dlg.ShowModal() == wxID_CANCEL )
1087 wxString libraryName;
1088 std::unique_ptr<LIB_SYMBOL> flattenedSymbol = symbol->
Flatten();
1090 for(
const wxString& candidate :
m_libMgr->GetLibraryNames() )
1092 if(
m_libMgr->GetLibrary( candidate )->GetFullURI(
true ) == fn.GetFullPath() )
1093 libraryName = candidate;
1096 if( !libraryName.IsEmpty() )
1100 if(
m_libMgr->IsLibraryReadOnly( libraryName ) )
1102 msg = wxString::Format(
_(
"Library '%s' is read-only." ), libraryName );
1109 msg = wxString::Format(
_(
"Symbol '%s' already exists in library '%s'." ),
1110 symbol->
GetName(), libraryName );
1112 KIDIALOG errorDlg(
this, msg,
_(
"Confirmation" ), wxOK | wxCANCEL | wxICON_WARNING );
1113 errorDlg.SetOKLabel(
_(
"Overwrite" ) );
1116 if( errorDlg.
ShowModal() == wxID_CANCEL )
1120 saver.
DoSave( *flattenedSymbol, symbol->
GetName(), libraryName,
false );
1129 if( pluginType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
1130 pluginType = SCH_IO_MGR::SCH_KICAD;
1134 if( fn.FileExists() )
1138 old_symbol = pi->LoadSymbol( fn.GetFullPath(), symbol->
GetName() );
1142 msg.Printf(
_(
"Error occurred attempting to load symbol library file '%s'." ),
1150 msg.Printf(
_(
"Symbol %s already exists in library '%s'." ),
1154 KIDIALOG errorDlg(
this, msg,
_(
"Confirmation" ), wxOK | wxCANCEL | wxICON_WARNING );
1155 errorDlg.SetOKLabel(
_(
"Overwrite" ) );
1158 if( errorDlg.
ShowModal() == wxID_CANCEL )
1163 if( !fn.IsDirWritable() )
1165 msg.Printf(
_(
"Insufficient permissions to save library '%s'." ), fn.GetFullPath() );
1172 if( !fn.FileExists() )
1173 pi->CreateLibrary( fn.GetFullPath() );
1178 pi->SaveSymbol( fn.GetFullPath(), flattenedSymbol.release() );
1182 msg.Printf(
_(
"Failed to create symbol library file '%s'." ), fn.GetFullPath() );
1184 msg.Printf(
_(
"Error creating symbol library '%s'." ), fn.GetFullName() );
1185 SetStatusText( msg );
1191 msg.Printf(
_(
"Symbol %s saved to library '%s'." ),
1194 SetStatusText( msg );
1204 if( !lib.IsEmpty() && aOldName && *aOldName !=
m_symbol->GetName() )
1209 wxString msg = wxString::Format(
_(
"Symbol name '%s' already in use." ),
1240 if( toDelete.empty() )
1243 for(
LIB_ID& libId : toDelete )
1245 if(
m_libMgr->IsSymbolModified( libId.GetLibItemName(), libId.GetLibNickname() )
1246 && !
IsOK(
this, wxString::Format(
_(
"The symbol '%s' has been modified.\n"
1247 "Do you want to remove it from the library?" ),
1248 libId.GetUniStringLibItemName() ) ) )
1253 if(
m_libMgr->HasDerivedSymbols( libId.GetLibItemName(), libId.GetLibNickname() ) )
1258 _(
"The symbol %s is used to derive other symbols.\n"
1259 "Deleting this symbol will delete all of the symbols derived from it.\n\n"
1260 "Do you wish to delete this symbol and all of its derivatives?" ),
1261 libId.GetLibItemName().wx_str() );
1263 wxMessageDialog::ButtonLabel yesButtonLabel(
_(
"Delete Symbol" ) );
1264 wxMessageDialog::ButtonLabel noButtonLabel(
_(
"Keep Symbol" ) );
1266 wxMessageDialog dlg(
this, msg,
_(
"Warning" ),
1267 wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION | wxCENTER );
1268 dlg.SetYesNoLabels( yesButtonLabel, noButtonLabel );
1270 if( dlg.ShowModal() == wxID_NO )
1277 m_libMgr->RemoveSymbol( libId.GetLibItemName(), libId.GetLibNickname() );
1286 std::vector<LIB_ID> symbols;
1293 for(
LIB_ID& libId : symbols )
1296 libId.GetLibNickname() );
1301 std::unique_ptr<LIB_SYMBOL> tmp = symbol->
Flatten();
1305 std::string prettyData = formatter.
GetString();
1310 auto clipboard = wxTheClipboard;
1311 wxClipboardLocker clipboardLock( clipboard );
1313 if( !clipboardLock || !clipboard->IsOpened() )
1316 auto data =
new wxTextDataObject( wxString( prettyData.c_str(), wxConvUTF8 ) );
1317 clipboard->SetData( data );
1328 if( !
m_libMgr->LibraryExists( lib ) )
1331 std::vector<LIB_SYMBOL*> newSymbols;
1333 if( aFromClipboard )
1343 wxLogMessage( wxS(
"Can not paste: %s" ), e.
Problem() );
1348 newSymbols.emplace_back(
new LIB_SYMBOL( *srcSymbol ) );
1351 if( srcSymbol->IsDerived() )
1353 if( std::shared_ptr<LIB_SYMBOL> srcParent = srcSymbol->GetParent().lock() )
1354 newSymbols.back()->SetParent( srcParent.get() );
1358 if( newSymbols.empty() )
1364 m_libMgr->UpdateSymbol( symbol, lib );
1370 m_treePane->GetLibTree()->SelectLibId(
LIB_ID( lib, newSymbols[0]->GetName() ) );
1382 wxString newName = aSymbol->
GetName();
1385 while(
m_libMgr->SymbolNameInUse( newName, aLibrary ) )
1386 newName.Printf(
"%s_%d", aSymbol->
GetName(), i++ );
1401 wxString msg = wxString::Format(
_(
"Revert '%s' to last version saved?" ),
1402 symbolName.IsEmpty() ? libName : symbolName );
1407 bool reload_currentSymbol =
false;
1408 wxString curr_symbolName = symbolName;
1414 if( symbolName.IsEmpty() )
1419 if( reload_currentSymbol )
1430 if( reload_currentSymbol )
1433 if( symbolName.IsEmpty() )
1435 m_libMgr->RevertLibrary( libName );
1441 m_treePane->GetLibTree()->SelectLibId( libId );
1445 if( reload_currentSymbol &&
m_libMgr->SymbolExists( curr_symbolName, libName ) )
1446 LoadSymbol( curr_symbolName, libName, unit );
1454 wxCHECK_RET(
m_libMgr,
"Library manager object not created." );
1479 DisplayError(
this, wxString::Format(
_(
"Symbol %s not found in library '%s'." ),
1501 SCH_IO_MGR::SCH_FILE_T
fileType = SCH_IO_MGR::SCH_FILE_T::SCH_KICAD;
1522 fn.SetName( aLibrary );
1527 wxFileDialog dlg(
this, wxString::Format(
_(
"Save Library '%s' As..." ), aLibrary ), default_path,
1528 fn.GetFullName(), wildcards, wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
1531 dlg.SetCustomizeHook( saveAsHook );
1533 if( dlg.ShowModal() == wxID_CANCEL )
1540 if( fn.GetExt().IsEmpty() )
1550 if(
fileType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
1555 if( !aNewFile &&
m_libMgr->IsLibraryReadOnly( aLibrary ) )
1566 msg.Printf(
_(
"Failed to save changes to symbol library file '%s'." ),
1574 m_libMgr->ClearLibraryModified( aLibrary );
1582 bool resyncLibTree =
false;
1584 wxString forceRefresh;
1590 forceRefresh = originalLibNickname;
1614 msg.Printf(
_(
"Symbol library file '%s' saved." ), fn.GetFullPath() );
1626 bool applyToAll =
false;
1629 for(
const wxString& libNickname :
m_libMgr->GetLibraryNames() )
1631 if(
m_libMgr->IsLibraryModified( libNickname ) )
1635 for(
const wxString& libNickname :
m_libMgr->GetLibraryNames() )
1637 if(
m_libMgr->IsLibraryModified( libNickname ) )
1639 if( aRequireConfirmation && !applyToAll )
1641 msg.Printf(
_(
"Save changes to '%s' before closing?" ), libNickname );
1645 case wxID_YES: doSave =
true;
break;
1646 case wxID_NO: doSave =
false;
break;
1648 case wxID_CANCEL:
return false;
1656 if(
m_libMgr->IsLibraryReadOnly( libNickname ) )
1658 msg.Printf(
_(
"Symbol library '%s' is not writable." ), libNickname );
1659 msg2 =
_(
"You must save to a different location." );
1661 if( dirtyCount == 1 )
1672 m_infoBar->ShowMessageFor( msg + wxS(
" " ) + msg2,
1673 2000, wxICON_EXCLAMATION );
1705 wxString msg =
m_symbol->GetName();
1713 msg = parent ? parent->
GetName() :
_(
"Undefined!" );
1718 msg =
_(
"Power Symbol" );
1719 else if(
m_symbol->IsLocalPower() )
1720 msg =
_(
"Power Symbol (Local)" );
1722 msg =
_(
"Symbol" );
static TOOL_ACTION cancelInteractive
static TOOL_ACTION zoomFitScreen
void SetContentModified(bool aModified=true)
wxString GetParentSymbolName() const
bool GetIncludeOnBoard() const
wxString GetName() const override
bool GetUnitsInterchangeable()
bool GetTransferUserFields()
bool GetKeepContentUserFields()
bool GetAlternateBodyStyle()
bool GetIncludeInBom() const
void SetInitialFocus(wxWindow *aWindow)
Sets the window (usually a wxTextCtrl) that should be focused when the dialog is shown.
void SetupStandardButtons(std::map< int, wxString > aLabels={})
virtual void ClearUndoRedoList()
Clear the undo and redo list using ClearUndoORRedoList()
virtual void RecreateToolbars()
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...
void ReCreateMenuBar()
Recreate the menu bar.
WX_INFOBAR * GetInfoBar()
virtual void ClearMsgPanel()
Clear all messages from the message panel.
void AppendMsgPanel(const wxString &aTextUpper, const wxString &aTextLower, int aPadding=6)
Append a message to the message panel.
wxBoxSizer * m_ButtonsSizer
void SetOKLabel(const wxString &aLabel)
void initDialog(const wxArrayString &aItemHeaders, const std::vector< wxArrayString > &aItemList, const wxString &aPreselectText)
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.
EDA_LIST_DIALOG(wxWindow *aParent, const wxString &aTitle, const wxArrayString &aItemHeaders, const std::vector< wxArrayString > &aItemList, const wxString &aPreselectText=wxEmptyString, bool aSortList=true)
virtual const wxString & GetText() const
Return the string associated with the text object.
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()
virtual const wxString Problem() const
what was the problem?
Helper class to create more flexible dialogs, including 'do not show again' checkbox handling.
void DoNotShowCheckbox(wxString file, int line)
Shows the 'do not show again' checkbox.
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
A logical library item identifier and consists of various portions much like a URI.
bool IsValid() const
Check if this LID_ID is valid.
wxString GetUniStringLibId() const
const wxString GetUniStringLibItemName() const
Get strings for display messages in dialogs.
const wxString GetUniStringLibNickname() const
const UTF8 & GetLibItemName() const
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Symbol library management helper that is specific to the symbol library editor frame.
Define a library symbol object.
const LIB_ID & GetLibId() const override
bool UnitsLocked() const
Check whether symbol units are interchangeable.
LIB_ID GetSourceLibId() const
void SetParent(LIB_SYMBOL *aParent=nullptr)
wxString GetName() const override
SCH_FIELD & GetValueField()
Return reference to the value field.
bool IsMultiUnit() const override
LIB_SYMBOL_SPTR SharedPtr() const
http://www.boost.org/doc/libs/1_55_0/libs/smart_ptr/sp_techniques.html#weak_without_shared.
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
LIB_SYMBOL_REF & GetParent()
virtual void SetName(const wxString &aName)
std::vector< wxString > GetLogicalLibs()
Return the logical library names, all of them that are pertinent to a look up done on this LIB_TABLE.
wxString GetFullURI(const wxString &aLibNickname, bool aExpandEnvVars=true) const
Return the full URI of the library mapped to aLibNickname.
static SYMBOL_LIB_TABLE * SchSymbolLibTable(PROJECT *aProject)
Accessor for project symbol library table.
static SEARCH_STACK * SchSearchS(PROJECT *aProject)
Accessor for Eeschema search stack.
Container for project specific data.
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...
virtual const wxString & GetRString(RSTRING_T aStringId)
Return a "retained string", which is any session and project specific string identified in enum RSTRI...
bool TransferDataFromWindow() override
std::function< int(const wxString &libName, const wxString &symbolName)> SymLibNameValidator
bool TransferDataToWindow() override
SymLibNameValidator m_validator
SAVE_SYMBOL_AS_DIALOG(SYMBOL_EDIT_FRAME *aParent, PARAMS &aParams, SymLibNameValidator aValidator, const std::vector< wxString > &aParentSymbolNames)
wxString getSymbolName() const
wxTextCtrl * m_symbolNameCtrl
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
void GetLibraryItemsForListDialog(wxArrayString &aHeaders, std::vector< wxArrayString > &aItemsToDisplay)
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.
void SetSymModificationTime(const wxDateTime &aTime)
Set the modification time of the symbol library table file.
void setSymWatcher(const LIB_ID *aSymbol)
Creates (or removes) a watcher on the specified symbol library.
KIGFX::SCH_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
Schematic editor (Eeschema) main window.
void SaveSymbolToSchematic(const LIB_SYMBOL &aSymbol, const KIID &aSchematicSymbolUUID)
Update a schematic symbol from a LIB_SYMBOL.
void SetText(const wxString &aText) override
static void FormatLibSymbol(LIB_SYMBOL *aPart, OUTPUTFORMATTER &aFormatter)
static std::vector< LIB_SYMBOL * > ParseLibSymbols(std::string &aSymbolText, std::string aSource, int aFileVersion=SEXPR_SCHEMATIC_FILE_VERSION)
static SCH_FILE_T GuessPluginTypeFromLibPath(const wxString &aLibPath, int aCtl=0)
Return a plugin type given a symbol library using the file extension of aLibPath.
Look for files in a number of paths.
const wxString LastVisitedPath(const wxString &aSubPathToSearch=wxEmptyString)
A quirky function inherited from old code that seems to serve particular needs in the UI.
The symbol library editor main window.
bool m_isSymbolFromSchematic
void ClearMsgPanel() override
Clear all messages from the message panel.
void UpdateAfterSymbolProperties(wxString *aOldName=nullptr)
void SaveAll()
Save all modified symbols and libraries.
void DeleteSymbolFromLibrary()
bool addLibTableEntry(const wxString &aLibFile, TABLE_SCOPE aScope=GLOBAL_LIB_TABLE)
Add aLibFile to the symbol library table defined by aScope.
bool IsLibraryTreeShown() const override
wxString getTargetLib() const
bool IsCurrentSymbol(const LIB_ID &aLibId) const
Restore the empty editor screen, without any symbol or library selected.
bool backupFile(const wxFileName &aOriginalFile, const wxString &aBackupExt)
Return currently edited symbol.
void RebuildSymbolUnitAndBodyStyleLists()
int GetTreeLIBIDs(std::vector< LIB_ID > &aSelection) const
LIB_ID GetTreeLIBID(int *aUnit=nullptr) const
Return the LIB_ID of the library or symbol selected in the symbol tree.
LIB_SYMBOL_LIBRARY_MANAGER * m_libMgr
wxString GetCurLib() const
The nickname of the current library being edited and empty string if none.
void Save()
Save the selected symbol or library.
void LoadSymbol(const wxString &aLibrary, const wxString &aSymbol, int Unit)
bool m_SyncPinEdit
Set to true to synchronize pins at the same position when editing symbols with multiple units or mult...
void Revert(bool aConfirm=true)
Revert unsaved changes in a symbol, restoring to the last saved state.
void centerItemIdleHandler(wxIdleEvent &aEvent)
bool replaceLibTableEntry(const wxString &aLibNickname, const wxString &aLibFile)
Replace the file path of the symbol library table entry aLibNickname with aLibFile.
bool IsSymbolFromSchematic() const
void SetScreen(BASE_SCREEN *aScreen) override
void DuplicateSymbol(bool aFromClipboard)
Insert a duplicate symbol.
SCH_SCREEN * m_dummyScreen
< Helper screen used when no symbol is loaded
LIB_ID m_centerItemOnIdle
void saveSymbolCopyAs(bool aOpenCopy)
void SetCurSymbol(LIB_SYMBOL *aSymbol, bool aUpdateZoom)
Take ownership of aSymbol and notes that it is the one currently being edited.
KIID m_schematicSymbolUUID
RefDes of the symbol (only valid if symbol was loaded from schematic)
std::vector< LIB_ID > GetSelectedLibIds() const
void SyncLibraries(bool aShowProgress, bool aPreloadCancelled=false, const wxString &aForceRefresh=wxEmptyString)
Synchronize the library manager to the symbol library table, and then the symbol tree to the library ...
LIB_SYMBOL * GetCurSymbol() const
Return the current symbol being edited or NULL if none selected.
void UpdateSymbolMsgPanelInfo()
Display the documentation of the selected symbol.
LIB_ID GetTargetLibId() const override
Return either the symbol selected in the symbol tree (if context menu is active) or the symbol on the...
bool saveLibrary(const wxString &aLibrary, bool aNewFile)
Save the changes to the current library.
void SelectActiveLibrary(const wxString &aLibrary=wxEmptyString)
Set the current active library to aLibrary.
int m_bodyStyle
Flag if the symbol being edited was loaded directly from a schematic.
bool saveAllLibraries(bool aRequireConfirmation)
Save the current symbol.
void UpdateMsgPanel() override
Redraw the message panel.
void CreateNewSymbol(const wxString &newName=wxEmptyString)
Create a new symbol in the selected library.
wxString SetCurLib(const wxString &aLibNickname)
Set the current library nickname and returns the old library nickname.
void UpdateTitle()
Update the main window title bar with the current library name and read only status of the library.
bool LoadSymbolFromCurrentLib(const wxString &aSymbolName, int aUnit=0, int aBodyStyle=0)
Load a symbol from the current active library, optionally setting the selected unit and convert.
SYMBOL_TREE_PANE * m_treePane
bool LoadOneLibrarySymbolAux(LIB_SYMBOL *aLibEntry, const wxString &aLibrary, int aUnit, int aBodyStyle)
Create a copy of aLibEntry into memory.
bool saveCurrentSymbol()
Store the currently modified symbol in the library manager buffer.
void CopySymbolToClipboard()
void SaveSymbolCopyAs(bool aOpenCopy)
Save the currently selected symbol to a new name and/or location.
wxString AddLibraryFile(bool aCreateNew)
Create or add an existing library to the symbol library table.
void ensureUniqueName(LIB_SYMBOL *aSymbol, const wxString &aLibrary)
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.
bool IsContentModified() const override
Get if any symbols or libraries have been modified but not saved.
LIB_SYMBOL * getTargetSymbol() const
Return either the library selected in the symbol tree, if context menu is active or the library that ...
bool SymbolNameInUse(const wxString &aName, const wxString &aLibrary)
Return true if the symbol name is already in use in the specified library.
LIB_SYMBOL * GetSymbol(const wxString &aSymbolName, const wxString &aLibrary) const
Return either an alias of a working LIB_SYMBOL copy, or alias of the original symbol if there is no w...
SYMBOL_SAVEAS_TYPE GetOption() const
Hold a record identifying a symbol library accessed by the appropriate symbol library SCH_IO object i...
LIB_SYMBOL * LoadSymbol(const wxString &aNickname, const wxString &aName)
Load a LIB_SYMBOL having aName from the library given by aNickname.
This is a class that handles state involved in saving a symbol copy as a new symbol.
CONFLICT_STRATEGY m_strategy
wxString resolveConflict(const wxString &proposed, const wxString &aNewLibName) const
SYMBOL_SAVE_AS_HANDLER(LIB_SYMBOL_LIBRARY_MANAGER &aLibMgr, CONFLICT_STRATEGY aStrategy, bool aValueFollowsName)
LIB_SYMBOL_LIBRARY_MANAGER & m_libMgr
bool DoSave(LIB_SYMBOL &symbol, const wxString &aNewSymName, const wxString &aNewLibName, bool aFlattenSymbol)
void Dismiss() override
Dismisses the infobar and updates the containing layout and AUI manager (if one is provided).
std::string GetClipboardUTF8()
Return the information currently stored in the system clipboard.
int OKOrCancelDialog(wxWindow *aParent, const wxString &aWarning, const wxString &aMessage, const wxString &aDetailedMessage, const wxString &aOKLabel, const wxString &aCancelLabel, bool *aApplyToAll)
Display a warning dialog with aMessage and returns the user response.
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
bool HandleUnsavedChanges(wxWindow *aParent, const wxString &aMessage, const std::function< bool()> &aSaveFunction)
Display a dialog with Save, Cancel and Discard Changes buttons.
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
int UnsavedChangesDialog(wxWindow *parent, const wxString &aMessage, bool *aApplyToAll)
A specialized version of HandleUnsavedChanges which handles an apply-to-all checkbox.
bool ConfirmRevertDialog(wxWindow *parent, const wxString &aMessage)
Display a confirmation dialog for a revert action.
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
This file is part of the common library.
static const std::string KiCadSymbolLibFileExtension
static wxString KiCadSymbolLibFileWildcard()
std::unique_ptr< T > IO_RELEASER
Helper to hold and release an IO_BASE object when exceptions are thrown.
std::shared_ptr< LIB_SYMBOL > LIB_SYMBOL_SPTR
shared pointer to LIB_SYMBOL
@ ALL
All except INITIAL_ADD.
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
KIWAY Kiway(KFCTL_STANDALONE)
MODEL3D_FORMAT_TYPE fileType(const char *aFileName)
wxString UnescapeString(const wxString &aSource)
wxString EscapeString(const wxString &aSource, ESCAPE_CONTEXT aContext)
The Escape/Unescape routines use HTML-entity-reference-style encoding to handle characters which are:...
void AccumulateDescriptions(wxString &aDesc, const T &aItemCollection)
Build a comma-separated list from a collection of wxStrings.
wxString parentSymbolName
bool keepContentUserFields
bool unitsInterchangeable
SYMBOL_SAVE_AS_HANDLER::CONFLICT_STRATEGY m_ConflictStrategy
static std::vector< wxString > CheckForParentalChainConflicts(LIB_SYMBOL_LIBRARY_MANAGER &aLibMgr, LIB_SYMBOL &aSymbol, bool aFlattenSymbol, const wxString &newSymbolName, const wxString &newLibraryName)
Get a list of all the symbols in the parental chain of a symbol that have conflicts when transposed t...
static std::pair< bool, bool > CheckSavingIntoOwnInheritance(LIB_SYMBOL_LIBRARY_MANAGER &aLibMgr, LIB_SYMBOL &aSymbol, const wxString &aNewSymbolName, const wxString &aNewLibraryName)
Check if a planned overwrite would put a symbol into it's own inheritance chain.
static std::vector< LIB_SYMBOL_SPTR > GetParentChain(const LIB_SYMBOL &aSymbol, bool aIncludeLeaf=true)
Get a list of all the symbols in the parental chain of a symbol, with the "leaf" symbol at the start ...
Definition for symbol library class.
@ ADD_PROJECT_TABLE_ENTRY
const SHAPE_LINE_CHAIN chain
Definition of file extensions used in Kicad.