44#include <wx/clipbrd.h>
45#include <wx/filedlg.h>
59 SetTitle(
_(
"Symbol Editor" ) );
87 if(
m_libMgr->IsLibraryReadOnly( libName ) )
89 wxString msg = wxString::Format(
_(
"Symbol library '%s' is not writable." ),
91 wxString msg2 =
_(
"You must save to a different location." );
119 if( type == SCH_IO_MGR::SCH_DATABASE
120 || type == SCH_IO_MGR::SCH_CADSTAR_ARCHIVE
121 || type == SCH_IO_MGR::SCH_HTTP )
134 msg.Printf(
_(
"Error loading symbol %s from library '%s'." ),
166 m_treePane->GetLibTree()->SelectLibId( libId );
167 m_treePane->GetLibTree()->ExpandLibId( libId );
200 msg.Printf(
_(
"Error loading symbol %s from library '%s'." ),
220 bool rebuildMenuAndToolbar =
false;
222 if( !aEntry || aLibrary.empty() )
225 if( aEntry->
GetName().IsEmpty() )
227 wxLogWarning(
"Symbol in library '%s' has empty name field.", aLibrary );
236 rebuildMenuAndToolbar =
true;
239 wxCHECK( lib_symbol,
false );
241 m_unit = aUnit > 0 ? aUnit : 1;
245 bool wasCreated =
false;
249 wxCHECK( ctx,
false );
251 if( rebuildMenuAndToolbar )
295 if( !
m_libMgr->LibraryExists( lib ) )
297 lib =
SelectLibrary(
_(
"New Symbol" ),
_(
"Create symbol in library:" ) );
299 if( !
m_libMgr->LibraryExists( lib ) )
303 wxArrayString symbolNamesInLib;
304 wxArrayString derivedSymbols;
309 [&]( wxString newName ) ->
bool
311 if( newName.IsEmpty() )
313 wxMessageBox(
_(
"Symbol must have a name." ) );
317 if( !lib.empty() &&
m_libMgr->SymbolNameInUse( newName, lib ) )
321 msg.Printf(
_(
"Symbol '%s' already exists in library '%s'." ),
325 KIDIALOG errorDlg(
this, msg,
_(
"Confirmation" ),
326 wxOK | wxCANCEL | wxICON_WARNING );
328 errorDlg.SetOKLabel(
_(
"Overwrite" ) );
337 [&](
const wxString& aItem ) ->
int
339 for( wxString& candidate : derivedSymbols )
341 if( candidate.CmpNoCase( aItem ) == 0 )
350 dlg.SetMinSize( dlg.GetSize() );
375 m_libMgr->CreateNewSymbol( lib, props );
388 if( libName.empty() )
392 else if(
m_libMgr->IsLibraryReadOnly( libName ) )
394 wxString msg = wxString::Format(
_(
"Symbol library '%s' is not writable." ),
396 wxString msg2 =
_(
"You must save to a different location." );
415 if( !libName.IsEmpty() )
442 std::vector<std::shared_ptr<LIB_SYMBOL>>
chain;
443 std::shared_ptr<LIB_SYMBOL> sym = aSymbol.
SharedPtr();
446 chain.push_back( sym );
448 while( sym->IsDerived() )
450 std::shared_ptr<LIB_SYMBOL> parent = sym->GetParent().lock();
457 chain.push_back( parent );
476 const wxString& aNewSymbolName,
477 const wxString& aNewLibraryName )
482 if( aNewLibraryName != oldLibraryName )
483 return {
false,
false };
487 return {
false,
false };
489 bool inAncestry =
false;
490 bool inDescendents =
false;
493 const std::vector<std::shared_ptr<LIB_SYMBOL>> parentChainFromUs =
GetParentChain( aSymbol,
true );
496 for(
size_t i = 1; i < parentChainFromUs.size(); ++i )
499 if( parentChainFromUs[i]->GetName() == aNewSymbolName )
509 const std::vector<std::shared_ptr<LIB_SYMBOL>> parentChainFromTarget =
GetParentChain( *targetSymbol,
true );
510 const wxString oldSymbolName = aSymbol.
GetName();
514 for(
size_t i = 1; i < parentChainFromTarget.size(); ++i )
516 if( parentChainFromTarget[i]->GetName() == oldSymbolName )
518 inDescendents =
true;
524 return { inAncestry, inDescendents };
538 const wxString& newSymbolName,
539 const wxString& newLibraryName )
541 std::vector<wxString> conflicts;
544 if( newLibraryName == oldLibraryName || aFlattenSymbol )
549 conflicts.push_back( newSymbolName );
554 const std::vector<std::shared_ptr<LIB_SYMBOL>> parentChain =
GetParentChain( aSymbol,
true );
556 for(
size_t i = 0; i < parentChain.size(); ++i )
562 conflicts.push_back( newSymbolName );
566 std::shared_ptr<LIB_SYMBOL> chainSymbol = parentChain[i];
568 if( aLibMgr.
SymbolNameInUse( chainSymbol->GetName(), newLibraryName ) )
569 conflicts.push_back( chainSymbol->GetName() );
605 bool DoSave(
LIB_SYMBOL& symbol,
const wxString& aNewSymName,
const wxString& aNewLibName,
bool aFlattenSymbol )
607 std::unique_ptr<LIB_SYMBOL> flattenedSymbol;
608 std::vector<std::shared_ptr<LIB_SYMBOL>> parentChain;
616 flattenedSymbol = symbol.
Flatten();
617 wxCHECK( flattenedSymbol,
false );
619 parentChain.push_back( flattenedSymbol->SharedPtr() );
625 parentChain.push_back( symbol.
SharedPtr() );
633 std::vector<wxString> newNames;
636 for(
int i = (
int) parentChain.size() - 1; i >= 0; --i )
638 std::shared_ptr<LIB_SYMBOL>& oldSymbol = parentChain[i];
645 newName = aNewSymName;
650 newName = oldSymbol->GetName();
659 if( i == (
int) parentChain.size() - 1 )
670 wxASSERT( newParent );
679 newNames.push_back( newName );
680 m_libMgr.UpdateSymbol( &new_symbol, aNewLibName );
687 wxString
resolveConflict(
const wxString& proposed,
const wxString& aNewLibName )
const
703 wxString newName = wxString::Format(
"%s_%d", proposed, suffix );
705 if( !
m_libMgr.SymbolNameInUse( newName, aNewLibName ) )
715 wxFAIL_MSG(
"Invalid conflict strategy" );
749 const std::vector<wxString>& aParentSymbolNames ) :
754 wxArrayString headers;
755 std::vector<wxArrayString> itemsToDisplay;
757 if( aParentSymbolNames.size() )
761 const wxString aParentNames = AccumulateDescriptions( aParentSymbolNames );
763 wxString::Format(
"Flatten/remove symbol inheritance (current parent symbols: %s)", aParentNames ),
764 &m_params.m_FlattenSymbol );
773 wxBoxSizer* bNameSizer =
new wxBoxSizer( wxHORIZONTAL );
775 wxStaticText* label =
new wxStaticText(
this, wxID_ANY,
_(
"Name:" ) );
776 bNameSizer->Add( label, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
783 m_ButtonsSizer->Prepend( newLibraryButton, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 10 );
785 GetSizer()->Prepend( bNameSizer, 0, wxEXPAND|wxTOP|wxLEFT|wxRIGHT, 5 );
788 [
this]( wxCommandEvent& )
802 GetSizer()->Fit(
this );
811 symbolName.Trim(
true );
812 symbolName.Trim(
false );
813 symbolName.Replace(
" ",
"_" );
834 if( ret == wxID_CANCEL )
865 bool flattenSymbol =
false;
869 const auto dialogValidatorFunc =
870 [&](
const wxString& newLib,
const wxString& newName ) ->
int
872 if( newLib.IsEmpty() )
874 wxMessageBox(
_(
"A library must be specified." ) );
878 if( newName.IsEmpty() )
880 wxMessageBox(
_(
"Symbol must have a name." ) );
884 if(
m_libMgr->IsLibraryReadOnly( newLib ) )
886 msg = wxString::Format(
_(
"Library '%s' is read-only. Choose a "
887 "different library to save the symbol '%s' to." ),
903 msg = wxString::Format(
_(
"Symbol '%s' cannot replace another symbol '%s' "
904 "that it descends from" ),
913 msg = wxString::Format(
_(
"Symbol '%s' cannot replace another symbol '%s' "
914 "that is a descendent of it." ),
921 const std::vector<wxString> conflicts =
924 if( conflicts.size() == 1 && conflicts.front() == newName )
927 msg = wxString::Format(
_(
"Symbol '%s' already exists in library '%s'. "
928 "Do you want to overwrite it?" ),
932 KIDIALOG errorDlg(
this, msg,
_(
"Confirmation" ), wxOK | wxCANCEL | wxICON_WARNING );
933 errorDlg.SetOKLabel(
_(
"Overwrite" ) );
937 else if( !conflicts.empty() )
943 msg = wxString::Format(
_(
"The following symbols in the inheritance chain of "
944 "'%s' already exist in library '%s':\n" ),
948 for(
const wxString& conflict : conflicts )
949 msg += wxString::Format(
" %s\n", conflict );
951 msg +=
_(
"\nDo you want to overwrite all of them, or rename the new symbols?" );
953 KIDIALOG errorDlg(
this, msg,
_(
"Confirmation" ), wxYES_NO | wxCANCEL | wxICON_WARNING );
954 errorDlg.SetYesNoCancelLabels(
_(
"Overwrite All" ),
_(
"Rename All" ),
_(
"Cancel" ) );
960 default:
return wxID_CANCEL;
969 std::vector<wxString> parentSymbolNames;
974 std::vector<std::shared_ptr<LIB_SYMBOL>> parentChain =
GetParentChain( *symbol,
false );
976 for(
const std::shared_ptr<LIB_SYMBOL>& parent : parentChain )
977 parentSymbolNames.push_back( parent->GetName() );
1009 params.m_LibraryName = newLibrary.GetName();
1022 saver.
DoSave( *symbol, params.m_SymbolName, params.m_LibraryName, params.m_FlattenSymbol );
1027 LoadSymbol( params.m_SymbolName, params.m_LibraryName, 1 );
1044 fn.SetName( symbol->
GetName().Lower() );
1047 wxFileDialog dlg(
this,
_(
"Export Symbol" ),
m_mruPath, fn.GetFullName(),
1052 if( dlg.ShowModal() == wxID_CANCEL )
1062 wxString libraryName;
1063 std::unique_ptr<LIB_SYMBOL> flattenedSymbol = symbol->
Flatten();
1065 for(
const wxString& candidate :
m_libMgr->GetLibraryNames() )
1069 if( *uri == fn.GetFullPath() )
1070 libraryName = candidate;
1074 if( !libraryName.IsEmpty() )
1078 if(
m_libMgr->IsLibraryReadOnly( libraryName ) )
1080 msg = wxString::Format(
_(
"Library '%s' is read-only." ), libraryName );
1087 msg = wxString::Format(
_(
"Symbol '%s' already exists in library '%s'." ),
1088 symbol->
GetName(), libraryName );
1090 KIDIALOG errorDlg(
this, msg,
_(
"Confirmation" ), wxOK | wxCANCEL | wxICON_WARNING );
1091 errorDlg.SetOKLabel(
_(
"Overwrite" ) );
1094 if( errorDlg.
ShowModal() == wxID_CANCEL )
1098 saver.
DoSave( *flattenedSymbol, symbol->
GetName(), libraryName,
false );
1107 if( pluginType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
1108 pluginType = SCH_IO_MGR::SCH_KICAD;
1112 if( fn.FileExists() )
1116 old_symbol = pi->LoadSymbol( fn.GetFullPath(), symbol->
GetName() );
1120 msg.Printf(
_(
"Error occurred attempting to load symbol library file '%s'." ),
1128 msg.Printf(
_(
"Symbol %s already exists in library '%s'." ),
1132 KIDIALOG errorDlg(
this, msg,
_(
"Confirmation" ), wxOK | wxCANCEL | wxICON_WARNING );
1133 errorDlg.SetOKLabel(
_(
"Overwrite" ) );
1136 if( errorDlg.
ShowModal() == wxID_CANCEL )
1141 if( !fn.IsDirWritable() )
1143 msg.Printf(
_(
"Insufficient permissions to save library '%s'." ), fn.GetFullPath() );
1150 if( !fn.FileExists() )
1151 pi->CreateLibrary( fn.GetFullPath() );
1156 pi->SaveSymbol( fn.GetFullPath(), std::move( flattenedSymbol ) );
1160 msg.Printf(
_(
"Failed to create symbol library file '%s'." ), fn.GetFullPath() );
1162 msg.Printf(
_(
"Error creating symbol library '%s'." ), fn.GetFullName() );
1163 SetStatusText( msg );
1169 msg.Printf(
_(
"Symbol %s saved to library '%s'." ),
1172 SetStatusText( msg );
1185 if( !lib.IsEmpty() && aOldName && *aOldName !=
m_symbol->GetName() )
1190 wxString msg = wxString::Format(
_(
"Symbol name '%s' already in use." ),
1207 if( treeItem.IsOk() )
1228 if( toDelete.empty() )
1232 std::set<LIB_ID> removedWithBase;
1234 for(
LIB_ID& libId : toDelete )
1236 if( removedWithBase.count( libId ) )
1239 if(
m_libMgr->IsSymbolModified( libId.GetLibItemName(), libId.GetLibNickname() )
1240 && !
IsOK(
this, wxString::Format(
_(
"The symbol '%s' has been modified.\n"
1241 "Do you want to remove it from the library?" ),
1242 libId.GetUniStringLibItemName() ) ) )
1247 wxArrayString derived;
1249 if(
m_libMgr->GetDerivedSymbolNames( libId.GetLibItemName(), libId.GetLibNickname(), derived ) > 0 )
1251 wxString msg =
_(
"Deleting a base symbol will delete all symbols derived from it.\n\n" );
1253 msg += libId.GetLibItemName().wx_str() +
_(
" (base)\n" );
1255 for(
const wxString&
name : derived )
1256 msg +=
name + wxT(
"\n" );
1259 dlg.SetExtendedMessage( wxT(
" " ) );
1260 dlg.SetYesNoLabels(
_(
"Delete All Listed Symbols" ),
_(
"Cancel" ) );
1262 if( dlg.ShowModal() == wxID_NO )
1272 for(
const wxString& derivedName : derived )
1279 if( symbol->GetLibId() == libId )
1287 m_libMgr->RemoveSymbol( libId.GetLibItemName(), libId.GetLibNickname() );
1289 for(
const wxString& derivedName : derived )
1290 removedWithBase.emplace( libId.GetLibNickname().wx_str(), derivedName );
1299 std::vector<LIB_ID> symbols;
1306 for(
LIB_ID& libId : symbols )
1309 libId.GetLibNickname() );
1314 std::unique_ptr<LIB_SYMBOL> tmp = symbol->
Flatten();
1318 std::string prettyData = formatter.
GetString();
1323 auto clipboard = wxTheClipboard;
1324 wxClipboardLocker clipboardLock( clipboard );
1326 if( !clipboardLock || !clipboard->IsOpened() )
1329 auto data =
new wxTextDataObject( wxString( prettyData.c_str(), wxConvUTF8 ) );
1330 clipboard->SetData( data );
1341 if( !
m_libMgr->LibraryExists( lib ) )
1344 std::vector<LIB_SYMBOL*> newSymbols;
1346 if( aFromClipboard )
1356 wxLogMessage( wxS(
"Can not paste: %s" ), e.
Problem() );
1361 newSymbols.emplace_back(
new LIB_SYMBOL( *srcSymbol ) );
1364 if( srcSymbol->IsDerived() )
1366 if( std::shared_ptr<LIB_SYMBOL> srcParent = srcSymbol->GetParent().lock() )
1367 newSymbols.back()->SetParent( srcParent.get() );
1371 if( newSymbols.empty() )
1377 m_libMgr->UpdateSymbol( symbol, lib );
1383 m_treePane->GetLibTree()->SelectLibId(
LIB_ID( lib, newSymbols[0]->GetName() ) );
1395 wxString newName = aSymbol->
GetName();
1398 while(
m_libMgr->SymbolNameInUse( newName, aLibrary ) )
1399 newName.Printf(
"%s_%d", aSymbol->
GetName(), i++ );
1414 wxString msg = wxString::Format(
_(
"Revert '%s' to last version saved?" ),
1415 symbolName.IsEmpty() ? libName : symbolName );
1420 bool reload_currentSymbol =
false;
1421 wxString curr_symbolName = symbolName;
1427 if( symbolName.IsEmpty() )
1432 if( reload_currentSymbol )
1443 if( reload_currentSymbol )
1446 if( symbolName.IsEmpty() )
1448 m_libMgr->RevertLibrary( libName );
1454 m_treePane->GetLibTree()->SelectLibId( libId );
1458 if( reload_currentSymbol &&
m_libMgr->SymbolExists( curr_symbolName, libName ) )
1459 LoadSymbol( curr_symbolName, libName, unit );
1467 wxCHECK_RET(
m_libMgr,
"Library manager object not created." );
1492 DisplayError(
this, wxString::Format(
_(
"Symbol %s not found in library '%s'." ),
1513 SCH_IO_MGR::SCH_FILE_T
fileType = SCH_IO_MGR::SCH_FILE_T::SCH_KICAD;
1520 if( !aNewFile && ( aLibrary.empty() || !adapter->
HasLibrary( aLibrary ) ) )
1536 fn.SetName( aLibrary );
1541 wxFileDialog dlg(
this, wxString::Format(
_(
"Save Library '%s' As..." ), aLibrary ), default_path,
1542 fn.GetFullName(), wildcards, wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
1545 dlg.SetCustomizeHook( saveAsHook );
1549 if( dlg.ShowModal() == wxID_CANCEL )
1556 if( fn.GetExt().IsEmpty() )
1563 std::optional<LIBRARY_TABLE_ROW*> optRow = adapter->
GetRow( aLibrary );
1564 wxCHECK( optRow,
false );
1569 if(
fileType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
1574 if( !aNewFile &&
m_libMgr->IsLibraryReadOnly( aLibrary ) )
1585 msg.Printf(
_(
"Failed to save changes to symbol library file '%s'." ),
1593 m_libMgr->ClearLibraryModified( aLibrary );
1600 if( fn.DirExists() )
1606 else if( fn.FileExists() )
1615 bool resyncLibTree =
false;
1617 wxString forceRefresh;
1623 forceRefresh = originalLibNickname;
1647 msg.Printf(
_(
"Symbol library file '%s' saved." ), fn.GetFullPath() );
1659 bool applyToAll =
false;
1662 for(
const wxString& libNickname :
m_libMgr->GetLibraryNames() )
1664 if(
m_libMgr->IsLibraryModified( libNickname ) )
1668 for(
const wxString& libNickname :
m_libMgr->GetLibraryNames() )
1670 if(
m_libMgr->IsLibraryModified( libNickname ) )
1672 if( aRequireConfirmation && !applyToAll )
1674 msg.Printf(
_(
"Save changes to '%s' before closing?" ), libNickname );
1678 case wxID_YES: doSave =
true;
break;
1679 case wxID_NO: doSave =
false;
break;
1681 case wxID_CANCEL:
return false;
1689 if(
m_libMgr->IsLibraryReadOnly( libNickname ) )
1691 msg.Printf(
_(
"Symbol library '%s' is not writable." ), libNickname );
1692 msg2 =
_(
"You must save to a different location." );
1694 if( dirtyCount == 1 )
1705 m_infoBar->ShowMessageFor( msg + wxS(
" " ) + msg2, 5000, wxICON_EXCLAMATION );
1736 wxString msg =
m_symbol->GetName();
1742 std::shared_ptr<LIB_SYMBOL> parent =
m_symbol->GetParent().lock();
1744 msg = parent ? parent->GetName() :
_(
"Undefined!" );
1749 msg =
_(
"Power Symbol" );
1750 else if(
m_symbol->IsLocalPower() )
1751 msg =
_(
"Power Symbol (Local)" );
1753 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()
void ShowInfoBarError(const wxString &aErrorMsg, bool aShowCloseButton=false, INFOBAR_MESSAGE_TYPE aType=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...
virtual void RecreateToolbars()
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 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)
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.
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
bool HasLibrary(const wxString &aNickname, bool aCheckEnabled=false) const
Test for the existence of aNickname in the library tables.
std::optional< LIBRARY_TABLE_ROW * > GetRow(const wxString &aNickname, LIBRARY_TABLE_SCOPE aScope=LIBRARY_TABLE_SCOPE::BOTH) const
Like LIBRARY_MANAGER::GetRow but filtered to the LIBRARY_TABLE_TYPE of this adapter.
std::optional< wxString > GetFullURI(LIBRARY_TABLE_TYPE aType, const wxString &aNickname, bool aSubstituted=false)
Return the full location specifying URI for the LIB, either in original UI form or in environment var...
std::optional< LIBRARY_TABLE_ROW * > GetRow(LIBRARY_TABLE_TYPE aType, const wxString &aNickname, LIBRARY_TABLE_SCOPE aScope=LIBRARY_TABLE_SCOPE::BOTH)
const wxString & Type() const
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.
std::shared_ptr< LIB_SYMBOL > 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.
void SetParentName(const wxString &aParentName)
virtual void SetName(const wxString &aName)
virtual LIBRARY_MANAGER & GetLibraryManager() const
static SYMBOL_LIBRARY_ADAPTER * SymbolLibAdapter(PROJECT *aProject)
Accessor for project symbol library manager adapter.
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 setSymWatcher(const LIB_ID *aSymbol)
Creates (or removes) a watcher on the specified symbol library.
void SetSymModificationTime(long long aTimestamp)
Set the modification timestamp of the watched symbol library.
KIGFX::SCH_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
Schematic editor (Eeschema) main window.
bool SaveSymbolToSchematic(const LIB_SYMBOL &aSymbol, const KIID &aSchematicSymbolUUID)
Update a schematic symbol from a LIB_SYMBOL.
virtual const wxString & GetText() const override
Return the string associated with the text object.
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 EnumFromStr(const wxString &aFileType)
Return the #SCH_FILE_T from the corresponding plugin type name: "kicad", "legacy",...
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.
One open symbol tab owning a working LIB_SYMBOL and screen lent to the frame while active.
The symbol library editor main window.
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 IsLibraryTreeShown() const override
void RenameSymbolTab(const LIB_ID &aOldId, const LIB_ID &aNewId)
Update the open tab for aOldId, if any, to the renamed symbol aNewId so its label and key track the r...
wxString getTargetLib() const
bool LoadSymbolFromLib(const wxString &aLibName, const wxString &aSymbolName, int aUnit=0, int aBodyStyle=0)
Load a symbol from a library, optionally setting the selected unit and body style.
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.
EDITOR_TABS_PANEL * m_tabsPanel
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
void Save()
Save the selected symbol or library.
void LoadSymbol(const wxString &aLibrary, const wxString &aSymbol, int Unit)
bool addLibTableEntry(const wxString &aLibFile, LIBRARY_TABLE_SCOPE aScope=LIBRARY_TABLE_SCOPE::GLOBAL)
Add aLibFile to the symbol library table defined by aScope.
bool LoadOneLibrarySymbol(LIB_SYMBOL *aLibEntry, const wxString &aLibrary, int aUnit, int aBodyStyle)
Create a copy of aLibEntry into memory.
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 DuplicateSymbol(bool aFromClipboard)
Insert a duplicate symbol.
LIB_ID m_centerItemOnIdle
void saveSymbolCopyAs(bool aOpenCopy)
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 ...
SYMBOL_EDITOR_TAB_CONTEXT * findOrCreateSymbolTab(const wxString &aLib, const wxString &aName, int aUnit, int aBodyStyle, bool aAsPreview, bool *aWasCreated=nullptr)
Open aName from aLib in a tab, creating it when absent, and return the activated context.
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.
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.
void UpdateTitle()
Update the main window title bar with the current library name and read only status of the library.
SYMBOL_TREE_PANE * m_treePane
void SetDrawSpecificUnit(bool aSpecific)
void closeSymbolTab(const LIB_ID &aLibId)
Close the open tab for aLibId, if any, without prompting and leaving the other tabs open.
bool saveCurrentSymbol()
Rename LIB_SYMBOL aliases to avoid conflicts before adding a symbol to a library.
void CopySymbolToClipboard()
void SaveSymbolCopyAs(bool aOpenCopy)
Save the currently selected symbol to a new name and/or location.
void clearSymbolTabsModifiedForLibrary(const wxString &aLibrary)
Clear the unsaved-edits flag on every tab in a saved library so its dirty indicator clears.
wxString AddLibraryFile(bool aCreateNew)
Create or add an existing library to the symbol library table.
void ensureUniqueName(LIB_SYMBOL *aSymbol, const wxString &aLibrary)
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.
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 ...
An interface to the global shared library manager that is schematic-specific and linked to one projec...
LIB_SYMBOL * LoadSymbol(const wxString &aNickname, const wxString &aName)
Load a LIB_SYMBOL having aName from the library given by aNickname.
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
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.
#define KICAD_MESSAGE_DIALOG
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.
@ ALL
All except INITIAL_ADD.
PGM_BASE & Pgm()
The global program "get" accessor.
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:...
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::vector< std::shared_ptr< LIB_SYMBOL > > 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 ...
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.
@ ADD_PROJECT_TABLE_ENTRY
JSON_SCHEMA_VALIDATOR validator(schema)
const SHAPE_LINE_CHAIN chain
Definition of file extensions used in Kicad.