45#include <wx/clipbrd.h>
46#include <wx/filedlg.h>
68 title += wxS(
" " ) +
_(
"[from schematic]" );
78 title += wxS(
" " ) +
_(
"[Read Only Library]" );
82 title =
_(
"[no symbol loaded]" );
85 title += wxT(
" \u2014 " ) +
_(
"Symbol Editor" );
92 wxString selectedLib = aLibrary;
94 if( selectedLib.empty() )
95 selectedLib =
SelectLibrary(
_(
"Select Symbol Library" ),
_(
"Library:" ) );
97 if( !selectedLib.empty() )
128 if(
m_libMgr->IsLibraryReadOnly( libName ) )
130 wxString msg = wxString::Format(
_(
"Symbol library '%s' is not writable." ),
132 wxString msg2 =
_(
"You must save to a different location." );
161 if( type == SCH_IO_MGR::SCH_DATABASE
162 || type == SCH_IO_MGR::SCH_CADSTAR_ARCHIVE
163 || type == SCH_IO_MGR::SCH_HTTP )
176 msg.Printf(
_(
"Error loading symbol %s from library '%s'." ),
208 m_treePane->GetLibTree()->SelectLibId( libId );
209 m_treePane->GetLibTree()->ExpandLibId( libId );
242 msg.Printf(
_(
"Error loading symbol %s from library '%s'." ),
265 int aUnit,
int aBodyStyle )
267 bool rebuildMenuAndToolbar =
false;
269 if( !aEntry || aLibrary.empty() )
272 if( aEntry->
GetName().IsEmpty() )
274 wxLogWarning(
"Symbol in library '%s' has empty name field.", aLibrary );
290 rebuildMenuAndToolbar =
true;
294 wxCHECK( lib_symbol,
false );
296 m_unit = aUnit > 0 ? aUnit : 1;
306 if( rebuildMenuAndToolbar )
352 if( !
m_libMgr->LibraryExists( lib ) )
354 lib =
SelectLibrary(
_(
"New Symbol" ),
_(
"Create symbol in library:" ) );
356 if( !
m_libMgr->LibraryExists( lib ) )
360 const auto validator =
361 [&]( wxString newName ) ->
bool
363 if( newName.IsEmpty() )
365 wxMessageBox(
_(
"Symbol must have a name." ) );
369 if( !lib.empty() &&
m_libMgr->SymbolNameInUse( newName, lib ) )
373 msg.Printf(
_(
"Symbol '%s' already exists in library '%s'." ),
377 KIDIALOG errorDlg(
this, msg,
_(
"Confirmation" ),
378 wxOK | wxCANCEL | wxICON_WARNING );
380 errorDlg.SetOKLabel(
_(
"Overwrite" ) );
388 wxArrayString symbolNamesInLib;
389 m_libMgr->GetSymbolNames( lib, symbolNamesInLib );
393 dlg.SetMinSize( dlg.GetSize() );
418 m_libMgr->CreateNewSymbol( lib, props );
431 if( libName.empty() )
435 else if(
m_libMgr->IsLibraryReadOnly( libName ) )
437 wxString msg = wxString::Format(
_(
"Symbol library '%s' is not writable." ),
439 wxString msg2 =
_(
"You must save to a different location." );
460 if( !libName.IsEmpty() )
487 std::vector<std::shared_ptr<LIB_SYMBOL>>
chain;
488 std::shared_ptr<LIB_SYMBOL> sym = aSymbol.
SharedPtr();
491 chain.push_back( sym );
493 while( sym->IsDerived() )
495 std::shared_ptr<LIB_SYMBOL> parent = sym->GetParent().lock();
496 chain.push_back( parent );
515 const wxString& aNewSymbolName,
516 const wxString& aNewLibraryName )
521 if( aNewLibraryName != oldLibraryName )
522 return {
false,
false };
526 return {
false,
false };
528 bool inAncestry =
false;
529 bool inDescendents =
false;
532 const std::vector<std::shared_ptr<LIB_SYMBOL>> parentChainFromUs =
GetParentChain( aSymbol,
true );
535 for(
size_t i = 1; i < parentChainFromUs.size(); ++i )
538 if( parentChainFromUs[i]->GetName() == aNewSymbolName )
548 const std::vector<std::shared_ptr<LIB_SYMBOL>> parentChainFromTarget =
GetParentChain( *targetSymbol,
true );
549 const wxString oldSymbolName = aSymbol.
GetName();
553 for(
size_t i = 1; i < parentChainFromTarget.size(); ++i )
555 if( parentChainFromTarget[i]->GetName() == oldSymbolName )
557 inDescendents =
true;
563 return { inAncestry, inDescendents };
577 const wxString& newSymbolName,
578 const wxString& newLibraryName )
580 std::vector<wxString> conflicts;
583 if( newLibraryName == oldLibraryName || aFlattenSymbol )
588 conflicts.push_back( newSymbolName );
593 const std::vector<std::shared_ptr<LIB_SYMBOL>> parentChain =
GetParentChain( aSymbol,
true );
595 for(
size_t i = 0; i < parentChain.size(); ++i )
601 conflicts.push_back( newSymbolName );
605 std::shared_ptr<LIB_SYMBOL> chainSymbol = parentChain[i];
607 if( aLibMgr.
SymbolNameInUse( chainSymbol->GetName(), newLibraryName ) )
608 conflicts.push_back( chainSymbol->GetName() );
644 bool DoSave(
LIB_SYMBOL& symbol,
const wxString& aNewSymName,
const wxString& aNewLibName,
bool aFlattenSymbol )
646 std::unique_ptr<LIB_SYMBOL> flattenedSymbol;
647 std::vector<std::shared_ptr<LIB_SYMBOL>> parentChain;
655 flattenedSymbol = symbol.
Flatten();
656 wxCHECK( flattenedSymbol,
false );
658 parentChain.push_back( flattenedSymbol->SharedPtr() );
664 parentChain.push_back( symbol.
SharedPtr() );
672 std::vector<wxString> newNames;
675 for(
int i = (
int) parentChain.size() - 1; i >= 0; --i )
677 std::shared_ptr<LIB_SYMBOL>& oldSymbol = parentChain[i];
684 newName = aNewSymName;
689 newName = oldSymbol->GetName();
698 if( i == (
int) parentChain.size() - 1 )
709 wxASSERT( newParent );
713 newNames.push_back( newName );
714 m_libMgr.UpdateSymbol( &new_symbol, aNewLibName );
721 wxString
resolveConflict(
const wxString& proposed,
const wxString& aNewLibName )
const
737 wxString newName = wxString::Format(
"%s_%d", proposed, suffix );
739 if( !
m_libMgr.SymbolNameInUse( newName, aNewLibName ) )
749 wxFAIL_MSG(
"Invalid conflict strategy" );
783 const std::vector<wxString>& aParentSymbolNames ) :
788 wxArrayString headers;
789 std::vector<wxArrayString> itemsToDisplay;
791 if( aParentSymbolNames.size() )
795 const wxString aParentNames = AccumulateDescriptions( aParentSymbolNames );
797 wxString::Format(
"Flatten/remove symbol inheritance (current parent symbols: %s)", aParentNames ),
798 &m_params.m_FlattenSymbol );
807 wxBoxSizer* bNameSizer =
new wxBoxSizer( wxHORIZONTAL );
809 wxStaticText* label =
new wxStaticText(
this, wxID_ANY,
_(
"Name:" ) );
810 bNameSizer->Add( label, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
817 m_ButtonsSizer->Prepend( newLibraryButton, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 10 );
819 GetSizer()->Prepend( bNameSizer, 0, wxEXPAND|wxTOP|wxLEFT|wxRIGHT, 5 );
822 [
this]( wxCommandEvent& )
836 GetSizer()->Fit(
this );
845 symbolName.Trim(
true );
846 symbolName.Trim(
false );
847 symbolName.Replace(
" ",
"_" );
868 if( ret == wxID_CANCEL )
899 bool flattenSymbol =
false;
903 const auto dialogValidatorFunc =
904 [&](
const wxString& newLib,
const wxString& newName ) ->
int
906 if( newLib.IsEmpty() )
908 wxMessageBox(
_(
"A library must be specified." ) );
912 if( newName.IsEmpty() )
914 wxMessageBox(
_(
"Symbol must have a name." ) );
918 if(
m_libMgr->IsLibraryReadOnly( newLib ) )
920 msg = wxString::Format(
_(
"Library '%s' is read-only. Choose a "
921 "different library to save the symbol '%s' to." ),
937 msg = wxString::Format(
_(
"Symbol '%s' cannot replace another symbol '%s' "
938 "that it descends from" ),
947 msg = wxString::Format(
_(
"Symbol '%s' cannot replace another symbol '%s' "
948 "that is a descendent of it." ),
955 const std::vector<wxString> conflicts =
958 if( conflicts.size() == 1 && conflicts.front() == newName )
961 msg = wxString::Format(
_(
"Symbol '%s' already exists in library '%s'. "
962 "Do you want to overwrite it?" ),
966 KIDIALOG errorDlg(
this, msg,
_(
"Confirmation" ), wxOK | wxCANCEL | wxICON_WARNING );
967 errorDlg.SetOKLabel(
_(
"Overwrite" ) );
971 else if( !conflicts.empty() )
977 msg = wxString::Format(
_(
"The following symbols in the inheritance chain of "
978 "'%s' already exist in library '%s':\n" ),
982 for(
const wxString& conflict : conflicts )
983 msg += wxString::Format(
" %s\n", conflict );
985 msg +=
_(
"\nDo you want to overwrite all of them, or rename the new symbols?" );
987 KIDIALOG errorDlg(
this, msg,
_(
"Confirmation" ), wxYES_NO | wxCANCEL | wxICON_WARNING );
988 errorDlg.SetYesNoCancelLabels(
_(
"Overwrite All" ),
_(
"Rename All" ),
_(
"Cancel" ) );
994 default:
return wxID_CANCEL;
1003 std::vector<wxString> parentSymbolNames;
1007 std::vector<std::shared_ptr<LIB_SYMBOL>> parentChain =
GetParentChain( *symbol,
false );
1009 for(
const auto& parent : parentChain )
1010 parentSymbolNames.push_back( parent->GetName() );
1042 params.m_LibraryName = newLibrary.GetName();
1055 saver.
DoSave( *symbol, params.m_SymbolName, params.m_LibraryName, params.m_FlattenSymbol );
1060 LoadSymbol( params.m_SymbolName, params.m_LibraryName, 1 );
1077 fn.SetName( symbol->
GetName().Lower() );
1080 wxFileDialog dlg(
this,
_(
"Export Symbol" ),
m_mruPath, fn.GetFullName(),
1085 if( dlg.ShowModal() == wxID_CANCEL )
1095 wxString libraryName;
1096 std::unique_ptr<LIB_SYMBOL> flattenedSymbol = symbol->
Flatten();
1098 for(
const wxString& candidate :
m_libMgr->GetLibraryNames() )
1102 if( *uri == fn.GetFullPath() )
1103 libraryName = candidate;
1107 if( !libraryName.IsEmpty() )
1111 if(
m_libMgr->IsLibraryReadOnly( libraryName ) )
1113 msg = wxString::Format(
_(
"Library '%s' is read-only." ), libraryName );
1120 msg = wxString::Format(
_(
"Symbol '%s' already exists in library '%s'." ),
1121 symbol->
GetName(), libraryName );
1123 KIDIALOG errorDlg(
this, msg,
_(
"Confirmation" ), wxOK | wxCANCEL | wxICON_WARNING );
1124 errorDlg.SetOKLabel(
_(
"Overwrite" ) );
1127 if( errorDlg.
ShowModal() == wxID_CANCEL )
1131 saver.
DoSave( *flattenedSymbol, symbol->
GetName(), libraryName,
false );
1140 if( pluginType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
1141 pluginType = SCH_IO_MGR::SCH_KICAD;
1145 if( fn.FileExists() )
1149 old_symbol = pi->LoadSymbol( fn.GetFullPath(), symbol->
GetName() );
1153 msg.Printf(
_(
"Error occurred attempting to load symbol library file '%s'." ),
1161 msg.Printf(
_(
"Symbol %s already exists in library '%s'." ),
1165 KIDIALOG errorDlg(
this, msg,
_(
"Confirmation" ), wxOK | wxCANCEL | wxICON_WARNING );
1166 errorDlg.SetOKLabel(
_(
"Overwrite" ) );
1169 if( errorDlg.
ShowModal() == wxID_CANCEL )
1174 if( !fn.IsDirWritable() )
1176 msg.Printf(
_(
"Insufficient permissions to save library '%s'." ), fn.GetFullPath() );
1183 if( !fn.FileExists() )
1184 pi->CreateLibrary( fn.GetFullPath() );
1189 pi->SaveSymbol( fn.GetFullPath(), flattenedSymbol.release() );
1193 msg.Printf(
_(
"Failed to create symbol library file '%s'." ), fn.GetFullPath() );
1195 msg.Printf(
_(
"Error creating symbol library '%s'." ), fn.GetFullName() );
1196 SetStatusText( msg );
1202 msg.Printf(
_(
"Symbol %s saved to library '%s'." ),
1205 SetStatusText( msg );
1215 if( !lib.IsEmpty() && aOldName && *aOldName !=
m_symbol->GetName() )
1220 wxString msg = wxString::Format(
_(
"Symbol name '%s' already in use." ),
1237 if( treeItem.IsOk() )
1256 if( toDelete.empty() )
1259 for(
LIB_ID& libId : toDelete )
1261 if(
m_libMgr->IsSymbolModified( libId.GetLibItemName(), libId.GetLibNickname() )
1262 && !
IsOK(
this, wxString::Format(
_(
"The symbol '%s' has been modified.\n"
1263 "Do you want to remove it from the library?" ),
1264 libId.GetUniStringLibItemName() ) ) )
1269 wxArrayString derived;
1271 if(
m_libMgr->GetDerivedSymbolNames( libId.GetLibItemName(), libId.GetLibNickname(), derived ) > 0 )
1273 wxString msg =
_(
"Deleting a base symbol will delete all symbols derived from it.\n\n" );
1275 msg += libId.GetLibItemName().wx_str() +
_(
" (base)\n" );
1277 for(
const wxString&
name : derived )
1278 msg +=
name + wxT(
"\n" );
1281 dlg.SetExtendedMessage( wxT(
" " ) );
1282 dlg.SetYesNoLabels(
_(
"Delete All Listed Symbols" ),
_(
"Cancel" ) );
1284 if( dlg.ShowModal() == wxID_NO )
1292 if( symbol->GetLibId() == libId )
1300 m_libMgr->RemoveSymbol( libId.GetLibItemName(), libId.GetLibNickname() );
1309 std::vector<LIB_ID> symbols;
1316 for(
LIB_ID& libId : symbols )
1319 libId.GetLibNickname() );
1324 std::unique_ptr<LIB_SYMBOL> tmp = symbol->
Flatten();
1328 std::string prettyData = formatter.
GetString();
1333 auto clipboard = wxTheClipboard;
1334 wxClipboardLocker clipboardLock( clipboard );
1336 if( !clipboardLock || !clipboard->IsOpened() )
1339 auto data =
new wxTextDataObject( wxString( prettyData.c_str(), wxConvUTF8 ) );
1340 clipboard->SetData( data );
1351 if( !
m_libMgr->LibraryExists( lib ) )
1354 std::vector<LIB_SYMBOL*> newSymbols;
1356 if( aFromClipboard )
1366 wxLogMessage( wxS(
"Can not paste: %s" ), e.
Problem() );
1371 newSymbols.emplace_back(
new LIB_SYMBOL( *srcSymbol ) );
1374 if( srcSymbol->IsDerived() )
1376 if( std::shared_ptr<LIB_SYMBOL> srcParent = srcSymbol->GetParent().lock() )
1377 newSymbols.back()->SetParent( srcParent.get() );
1381 if( newSymbols.empty() )
1387 m_libMgr->UpdateSymbol( symbol, lib );
1393 m_treePane->GetLibTree()->SelectLibId(
LIB_ID( lib, newSymbols[0]->GetName() ) );
1405 wxString newName = aSymbol->
GetName();
1408 while(
m_libMgr->SymbolNameInUse( newName, aLibrary ) )
1409 newName.Printf(
"%s_%d", aSymbol->
GetName(), i++ );
1424 wxString msg = wxString::Format(
_(
"Revert '%s' to last version saved?" ),
1425 symbolName.IsEmpty() ? libName : symbolName );
1430 bool reload_currentSymbol =
false;
1431 wxString curr_symbolName = symbolName;
1437 if( symbolName.IsEmpty() )
1442 if( reload_currentSymbol )
1453 if( reload_currentSymbol )
1456 if( symbolName.IsEmpty() )
1458 m_libMgr->RevertLibrary( libName );
1464 m_treePane->GetLibTree()->SelectLibId( libId );
1468 if( reload_currentSymbol &&
m_libMgr->SymbolExists( curr_symbolName, libName ) )
1469 LoadSymbol( curr_symbolName, libName, unit );
1477 wxCHECK_RET(
m_libMgr,
"Library manager object not created." );
1502 DisplayError(
this, wxString::Format(
_(
"Symbol %s not found in library '%s'." ),
1524 SCH_IO_MGR::SCH_FILE_T
fileType = SCH_IO_MGR::SCH_FILE_T::SCH_KICAD;
1531 if( !aNewFile && ( aLibrary.empty() || !adapter->
HasLibrary( aLibrary ) ) )
1547 fn.SetName( aLibrary );
1552 wxFileDialog dlg(
this, wxString::Format(
_(
"Save Library '%s' As..." ), aLibrary ), default_path,
1553 fn.GetFullName(), wildcards, wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
1556 dlg.SetCustomizeHook( saveAsHook );
1560 if( dlg.ShowModal() == wxID_CANCEL )
1567 if( fn.GetExt().IsEmpty() )
1574 std::optional<LIBRARY_TABLE_ROW*> optRow = adapter->
GetRow( aLibrary );
1575 wxCHECK( optRow,
false );
1580 if(
fileType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
1585 if( !aNewFile &&
m_libMgr->IsLibraryReadOnly( aLibrary ) )
1596 msg.Printf(
_(
"Failed to save changes to symbol library file '%s'." ),
1604 m_libMgr->ClearLibraryModified( aLibrary );
1609 if( fn.DirExists() )
1615 else if( fn.FileExists() )
1624 bool resyncLibTree =
false;
1626 wxString forceRefresh;
1632 forceRefresh = originalLibNickname;
1656 msg.Printf(
_(
"Symbol library file '%s' saved." ), fn.GetFullPath() );
1668 bool applyToAll =
false;
1671 for(
const wxString& libNickname :
m_libMgr->GetLibraryNames() )
1673 if(
m_libMgr->IsLibraryModified( libNickname ) )
1677 for(
const wxString& libNickname :
m_libMgr->GetLibraryNames() )
1679 if(
m_libMgr->IsLibraryModified( libNickname ) )
1681 if( aRequireConfirmation && !applyToAll )
1683 msg.Printf(
_(
"Save changes to '%s' before closing?" ), libNickname );
1687 case wxID_YES: doSave =
true;
break;
1688 case wxID_NO: doSave =
false;
break;
1690 case wxID_CANCEL:
return false;
1698 if(
m_libMgr->IsLibraryReadOnly( libNickname ) )
1700 msg.Printf(
_(
"Symbol library '%s' is not writable." ), libNickname );
1701 msg2 =
_(
"You must save to a different location." );
1703 if( dirtyCount == 1 )
1714 m_infoBar->ShowMessageFor( msg + wxS(
" " ) + msg2,
1715 2000, wxICON_EXCLAMATION );
1747 wxString msg =
m_symbol->GetName();
1753 std::shared_ptr<LIB_SYMBOL> parent =
m_symbol->GetParent().lock();
1755 msg = parent ? parent->GetName() :
_(
"Undefined!" );
1760 msg =
_(
"Power Symbol" );
1761 else if(
m_symbol->IsLocalPower() )
1762 msg =
_(
"Power Symbol (Local)" );
1764 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.
bool IsMultiUnit() const override
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
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.
void 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.
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 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...
bool addLibTableEntry(const wxString &aLibFile, LIBRARY_TABLE_SCOPE aScope=LIBRARY_TABLE_SCOPE::GLOBAL)
Add aLibFile to the symbol library table defined by aScope.
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 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.
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:...
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
const SHAPE_LINE_CHAIN chain
Definition of file extensions used in Kicad.