33#include <lib_table_lexer.h>
53#include <wx/filedlg.h>
106 return m_rows.insert( aIterator, aRow );
113 return m_rows.erase( aFirst, aLast );
117 void SetValue(
int aRow,
int aCol,
const wxString &aValue )
override
119 wxCHECK( aRow < (
int)
size(), );
131 if( pluginType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
132 pluginType = SCH_IO_MGR::SCH_KICAD;
165 wxString result = options;
166 std::map<std::string, UTF8> choices;
170 pi->GetLibraryOptions( &choices );
175 if( options != result )
189 size_t ndx = cb_text.find(
"(sym_lib_table" );
191 if( ndx != std::string::npos )
197 LIB_TABLE_LEXER lexer( &slr );
203 tmp_tbl.
Parse( &lexer );
217 for(
unsigned i = 0; i < tmp_tbl.
GetCount(); ++i )
221 m_grid->AutoSizeColumns(
false );
228 m_grid->AutoSizeColumns(
false );
242 [&](
WX_GRID* aCurrGrid,
int aCol )
244 int prevWidth = aCurrGrid->GetColSize( aCol );
246 aCurrGrid->AutoSizeColumn( aCol,
false );
247 aCurrGrid->SetColSize( aCol, std::max( prevWidth, aCurrGrid->GetColSize( aCol ) ) );
253 for(
int ii = 0; ii < aGrid->GetNumberRows(); ++ii )
254 aGrid->SetRowSize( ii, aGrid->GetDefaultRowSize() + 4 );
259 aGrid->SetSelectionMode( wxGrid::wxGridSelectRows );
262 wxGridCellAttr* attr;
264 attr =
new wxGridCellAttr;
266 wxString fileFiltersStr;
267 wxString allWildcardsStr;
274 auto* libTable = static_cast<SYMBOL_LIB_TABLE_GRID*>( grid->GetTable() );
275 auto* tableRow = static_cast<SYMBOL_LIB_TABLE_ROW*>( libTable->at( row ) );
277 IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( tableRow->GetFileType() ) );
281 const IO_BASE::IO_FILE_DESC& desc = pi->GetLibraryDesc();
284 return desc.FileFilter();
287 return wxEmptyString;
289 aGrid->SetColAttr(
COL_URI, attr );
291 attr =
new wxGridCellAttr;
292 attr->SetEditor(
new wxGridCellChoiceEditor( m_pluginChoices ) );
293 aGrid->SetColAttr(
COL_TYPE, attr );
295 attr =
new wxGridCellAttr;
296 attr->SetRenderer(
new wxGridCellBoolRenderer() );
300 attr =
new wxGridCellAttr;
301 attr->SetRenderer(
new wxGridCellBoolRenderer() );
314 if( aGrid->GetNumberRows() > 0 )
315 aGrid->SelectRow( 0 );
321 const wxString& aGlobalTablePath,
323 const wxString& aProjectTablePath ) :
325 m_globalTable( aGlobalTable ),
326 m_projectTable( aProjectTable ),
327 m_project( aProject ),
334 for(
const SCH_IO_MGR::SCH_FILE_T& type : SCH_IO_MGR::SCH_FILE_T_vector )
415 wxFileName fn( aLibraryPath );
416 wxString ext = fn.GetExt().Lower();
437 for(
int r = 0; r < model->GetNumberRows(); )
439 wxString nick = model->GetValue( r,
COL_NICKNAME ).Trim(
false ).Trim();
440 wxString uri = model->GetValue( r,
COL_URI ).Trim(
false ).Trim();
441 unsigned illegalCh = 0;
446 msg =
_(
"A library table row nickname and path cells are empty." );
448 msg =
_(
"A library table row nickname cell is empty." );
450 msg =
_(
"A library table row path cell is empty." );
452 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
454 wxMessageDialog badCellDlg( topLevelParent, msg,
_(
"Invalid Row Definition" ),
455 wxYES_NO | wxCENTER | wxICON_QUESTION | wxYES_DEFAULT );
456 badCellDlg.SetExtendedMessage(
_(
"Empty cells will result in all rows that are "
457 "invalid to be removed from the table." ) );
458 badCellDlg.SetYesNoLabels( wxMessageDialog::ButtonLabel(
_(
"Remove Invalid Cells" ) ),
459 wxMessageDialog::ButtonLabel(
_(
"Cancel Table Update" ) ) );
463 if( badCellDlg.ShowModal() == wxID_NO )
466 wxBeginBusyCursor( wxHOURGLASS_CURSOR );
472 model->DeleteRows( r, 1 );
476 msg = wxString::Format(
_(
"Illegal character '%c' in nickname '%s'" ),
487 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
489 wxMessageDialog errdlg( topLevelParent, msg,
_(
"Library Nickname Error" ) );
501 model->SetValue( r,
COL_URI, uri );
504 wxString ltype = model->GetValue( r,
COL_TYPE );
505 model->LIB_TABLE_GRID::SetValue( r,
COL_URI, uri );
506 model->SetValue( r,
COL_TYPE, ltype );
520 for(
int r1 = 0; r1 < model->GetNumberRows() - 1; ++r1 )
524 for(
int r2=r1+1; r2 < model->GetNumberRows(); ++r2 )
530 msg = wxString::Format(
_(
"Multiple libraries cannot share the same "
531 "nickname ('%s')." ), nick1 );
541 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
544 wxMessageDialog errdlg( topLevelParent, msg,
_(
"Library Nickname Error" ) );
558 for(
unsigned int r = 0; r < table->GetCount(); ++r )
580 msg.Printf(
_(
"Symbol library '%s' failed to load." ), row.
GetNickName() );
582 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
584 wxMessageDialog errdlg( topLevelParent, msg + wxS(
"\n" ) + ioe.
What(),
585 _(
"Error Loading Library" ) );
604 wxString fileFiltersStr;
605 wxString allWildcardsStr;
607 for(
const SCH_IO_MGR::SCH_FILE_T&
fileType : SCH_IO_MGR::SCH_FILE_T_vector )
619 if( !fileFiltersStr.IsEmpty() )
620 fileFiltersStr += wxChar(
'|' );
628 fileFiltersStr =
_(
"All supported formats" ) + wxT(
"|" ) + allWildcardsStr + wxT(
"|" )
638 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
640 wxFileDialog dlg( topLevelParent,
_(
"Add Library" ), openDir, wxEmptyString, fileFiltersStr,
641 wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_MULTIPLE );
643 if( dlg.ShowModal() == wxID_CANCEL )
652 bool addDuplicates =
false;
653 bool applyToAll =
false;
654 wxString warning =
_(
"Warning: Duplicate Nickname" );
655 wxString msg =
_(
"A library nicknamed '%s' already exists." );
656 wxString detailedMsg =
_(
"One of the nicknames will need to be changed after "
657 "adding this library." );
659 wxArrayString filePathsList;
660 dlg.GetPaths( filePathsList );
662 for(
const wxString& filePath : filePathsList )
664 wxFileName fn( filePath );
668 if(
cur_model()->ContainsNickname( nickname ) )
674 wxString::Format( msg, nickname ),
675 detailedMsg,
_(
"Skip" ),
_(
"Add Anyway" ),
676 &applyToAll ) == wxID_CANCEL;
679 doAdd = addDuplicates;
684 int last_row =
m_cur_grid->GetNumberRows() - 1;
691 if( pluginType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
692 pluginType = SCH_IO_MGR::SCH_KICAD;
702 path = fn.GetFullPath();
708 if( !filePathsList.IsEmpty() )
749 wxArrayInt selectedRows =
m_cur_grid->GetSelectedRows();
750 wxGridCellCoordsArray cells =
m_cur_grid->GetSelectedCells();
751 wxGridCellCoordsArray blockTopLeft =
m_cur_grid->GetSelectionBlockTopLeft();
752 wxGridCellCoordsArray blockBotRight =
m_cur_grid->GetSelectionBlockBottomRight();
755 for(
unsigned ii = 0; ii < cells.GetCount(); ii++ )
756 selectedRows.Add( cells[ii].GetRow() );
759 if( !blockTopLeft.IsEmpty() && !blockBotRight.IsEmpty() )
761 for(
int i = blockTopLeft[0].GetRow(); i <= blockBotRight[0].GetRow(); ++i )
762 selectedRows.Add( i );
766 if( selectedRows.size() == 0 &&
m_cur_grid->GetGridCursorRow() >= 0 )
767 selectedRows.Add(
m_cur_grid->GetGridCursorRow() );
769 if( selectedRows.size() == 0 )
775 std::sort( selectedRows.begin(), selectedRows.end() );
784 for(
int ii = selectedRows.GetCount()-1; ii >= 0; ii-- )
786 int row = selectedRows[ii];
788 if( row != last_row )
795 if(
m_cur_grid->GetNumberRows() > 0 && curRow >= 0 )
816 wxGridTableMessage msg( tbl, wxGRIDTABLE_NOTIFY_ROWS_INSERTED, curRow, 0 );
817 tbl->GetView()->ProcessTableMessage( msg );
835 if(
unsigned( curRow + 1 ) < tbl->
m_rows.size() )
842 wxGridTableMessage msg( tbl, wxGRIDTABLE_NOTIFY_ROWS_INSERTED, curRow - 1, 0 );
843 tbl->GetView()->ProcessTableMessage( msg );
859 !
IsOK(
this, wxString::Format(
_(
"This action will reset your global library table on "
860 "disk and cannot be undone." ) ) ) )
907 wxArrayInt selectedRows =
m_cur_grid->GetSelectedRows();
909 if( selectedRows.empty() &&
m_cur_grid->GetGridCursorRow() >= 0 )
910 selectedRows.push_back(
m_cur_grid->GetGridCursorRow() );
912 wxArrayInt legacyRows;
917 for(
int row : selectedRows )
922 legacyRows.push_back( row );
926 if( legacyRows.size() <= 0 )
928 wxMessageBox(
_(
"Select one or more rows containing libraries "
929 "to save as current KiCad format (*.kicad_sym)." ) );
934 if( legacyRows.size() == 1 )
936 msg.Printf(
_(
"Save '%s' as current KiCad format (*.kicad_sym) "
937 "and replace legacy entry in table?" ),
942 msg.Printf(
_(
"Save %d libraries as current KiCad format (*.kicad_sym) "
943 "and replace legacy entries in table?" ),
944 (
int) legacyRows.size() );
951 for(
int row : legacyRows )
956 wxFileName legacyLib( resolvedPath );
958 if( !legacyLib.Exists() )
960 msg.Printf(
_(
"Library '%s' not found." ), relPath );
962 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
968 wxFileName newLib( resolvedPath );
969 newLib.SetExt(
"kicad_sym" );
971 if( newLib.Exists() )
973 msg.Printf(
_(
"File '%s' already exists. Do you want overwrite this file?" ),
974 newLib.GetFullPath() );
976 switch( wxMessageBox( msg,
_(
"Migrate Library" ),
977 wxYES_NO | wxCANCEL | wxICON_QUESTION,
m_parent ) )
981 case wxCANCEL:
return;
990 relPath =
NormalizePath( newLib.GetFullPath(), &
Pgm().GetLocalEnvVariables(),
996 relPath = newLib.GetFullPath();
1004 msg.Printf(
_(
"Failed to save symbol library file '%s'." ), newLib.GetFullPath() );
1006 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
1040 wxRegEx re(
".*?(\\$\\{(.+?)\\})|(\\$\\((.+?)\\)).*?", wxRE_ADVANCED );
1041 wxASSERT( re.IsValid() );
1043 std::set< wxString > unique;
1053 for(
int row = 0; row < tbl->GetNumberRows(); ++row )
1055 wxString uri = tbl->GetValue( row,
COL_URI );
1057 while( re.Matches( uri ) )
1059 wxString envvar = re.GetMatch( uri, 2 );
1062 if( envvar.IsEmpty() )
1063 envvar = re.GetMatch( uri, 4 );
1066 unique.insert( envvar );
1069 uri.Replace( re.GetMatch( uri, 0 ), wxEmptyString );
1080 for(
const wxString& evName : unique )
1085 m_path_subs_grid->SetCellValue( row, 0, wxT(
"${" ) + evName + wxT(
"}" ) );
1089 wxGetEnv( evName, &evValue );
1142 wxGrid*
grid =
dynamic_cast<wxGrid*
>(
event.GetEventObject() );
1147 int row =
event.GetRow();
1148 int col =
event.GetCol();
1151 wxGridCellRenderer* renderer =
grid->GetCellRenderer( row, col );
1154 if(
dynamic_cast<wxGridCellBoolRenderer*
>( renderer ) )
1157 grid->SetGridCursor( row, col );
1179 wxString currentLib;
1187 currentLib = symbolEditor->GetCurLib();
1190 symbolEditor->FreezeLibraryTree();
1192 if( symbolEditor->HasLibModifications() )
1194 msg =
_(
"Modifications have been made to one or more symbol libraries.\n"
1195 "Changes must be saved or discarded before the symbol library "
1196 "table can be modified." );
1200 case wxID_YES: symbolEditor->SaveAll();
break;
1201 case wxID_NO: symbolEditor->RevertAll();
break;
1203 case wxID_CANCEL: symbolEditor->ThawLibraryTree();
return;
1212 projectTable, projectTableFn.GetFullPath() ) );
1217 symbolEditor->ThawLibraryTree();
1226 globalTable->
Save( globalTablePath );
1230 msg.Printf(
_(
"Error saving global library table:\n\n%s" ), ioe.
What() );
1231 wxMessageBox( msg,
_(
"File Save Error" ), wxOK | wxICON_ERROR );
1239 projectTable->
Save( projectTableFn.GetFullPath() );
1243 msg.Printf(
_(
"Error saving project-specific library table:\n\n%s" ), ioe.
What() );
1244 wxMessageBox( msg,
_(
"File Save Error" ), wxOK | wxICON_ERROR );
1250 symbolEditor->ThawLibraryTree();
1253 std::string payload =
"";
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap)
bool m_ProjectTableChanged
void InstallPanel(wxPanel *aPanel)
bool m_GlobalTableChanged
DIALOG_PLUGIN_OPTIONS is an options editor in the form of a two column name/value spreadsheet like (t...
void SetInitialFocus(wxWindow *aWindow)
Sets the window (usually a wxTextCtrl) that should be focused when the dialog is shown.
wxString m_lastSymbolLibDir
Editor for wxGrid cells that adds a file/folder browser to the grid input field.
Add mouse and command handling (such as cut, copy, and paste) to a WX_GRID instance.
virtual void paste_text(const wxString &cb_text)
WX_GRID * m_grid
I don't own the grid, but he owns me.
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()
void SetKiway(wxWindow *aDest, KIWAY *aKiway)
It is only used for debugging, since "this" is not a wxWindow*.
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
virtual void ExpressMail(FRAME_T aDestination, MAIL_T aCommand, std::string &aPayload, wxWindow *aSource=nullptr)
Send aPayload to aDestination from aSource.
virtual PROJECT & Prj() const
Return the PROJECT associated with this KIWAY.
static unsigned FindIllegalLibraryNameChar(const UTF8 &aLibraryName)
Looks for characters that are illegal in library nicknames.
static UTF8 FixIllegalChars(const UTF8 &aLibItemName, bool aLib)
Replace illegal LIB_ID item name characters with underscores '_'.
This abstract base class mixes any object derived from LIB_TABLE into wxGridTableBase so the result c...
void SetValue(int aRow, int aCol, const wxString &aValue) override
bool AppendRows(size_t aNumRows=1) override
int GetNumberRows() override
Hold a record identifying a library accessed by the appropriate plug in object in the LIB_TABLE.
const wxString & GetOptions() const
Return the options string, which may hold a password or anything else needed to instantiate the under...
virtual const wxString GetType() const =0
Return the type of library represented by this row.
void SetParent(LIB_TABLE *aParent)
const wxString & GetNickName() const
const wxString GetFullURI(bool aSubstituted=false) const
Return the full location specifying URI for the LIB, either in original UI form or in environment var...
LIB_TABLE_ROW * clone() const
bool GetIsEnabled() const
void SetOptions(const wxString &aOptions)
Change the library options strings.
bool ReplaceRow(size_t aIndex, LIB_TABLE_ROW *aRow)
Replaces the Nth row with the given new row.
static std::map< std::string, UTF8 > * ParseOptions(const std::string &aOptionsList)
Parses aOptionsList and places the result into a #PROPERTIES object which is returned.
LIB_TABLE_ROW & At(unsigned aIndex)
Get the 'n'th LIB_TABLE_ROW object.
void TransferRows(LIB_TABLE_ROWS &aRowsList)
Takes ownership of another list of rows; the original list will be freed.
LIB_TABLE_ROWS m_rows
Owning set of rows.
unsigned GetCount() const
Get the number of rows contained in the table.
bool ChangeRowOrder(size_t aIndex, int aOffset)
Moves a row within the table.
void Save(const wxString &aFileName) const
Write this library table to aFileName in s-expression form.
Class PANEL_SYM_LIB_TABLE_BASE.
STD_BITMAP_BUTTON * m_browse_button
STD_BITMAP_BUTTON * m_move_up_button
STD_BITMAP_BUTTON * m_delete_button
STD_BITMAP_BUTTON * m_move_down_button
STD_BITMAP_BUTTON * m_append_button
WX_GRID * m_path_subs_grid
Dialog to show and edit symbol library tables.
void OnUpdateUI(wxUpdateUIEvent &event) override
void moveUpHandler(wxCommandEvent &event) override
void onPageChange(wxBookCtrlEvent &event) override
virtual ~PANEL_SYM_LIB_TABLE()
bool allowAutomaticPluginTypeSelection(wxString &aLibraryPath)
SYMBOL_LIB_TABLE * m_projectTable
static size_t m_pageNdx
Remember the last notebook page selected.
void setupGrid(WX_GRID *aGrid)
void onReset(wxCommandEvent &event) override
void deleteRowHandler(wxCommandEvent &event) override
wxString m_lastProjectLibDir
void browseLibrariesHandler(wxCommandEvent &event) override
SYMBOL_LIB_TABLE_GRID * cur_model() const
PANEL_SYM_LIB_TABLE(DIALOG_EDIT_LIBRARY_TABLES *aParent, PROJECT *m_project, SYMBOL_LIB_TABLE *aGlobal, const wxString &aGlobalTablePath, SYMBOL_LIB_TABLE *aProject, const wxString &aProjectTablePath)
bool verifyTables()
Trim important fields, removes blank row entries, and checks for duplicates.
void adjustPathSubsGridColumns(int aWidth)
SYMBOL_LIB_TABLE_GRID * global_model() const
SYMBOL_LIB_TABLE * m_globalTable
void onSizeGrid(wxSizeEvent &event) override
void onConvertLegacyLibraries(wxCommandEvent &event) override
SYMBOL_LIB_TABLE_GRID * project_model() const
wxArrayString m_pluginChoices
void moveDownHandler(wxCommandEvent &event) override
void populateEnvironReadOnlyTable()
Populate the readonly environment variable table with names and values by examining all the full_uri ...
WX_GRID * m_cur_grid
changed based on tab choice
DIALOG_EDIT_LIBRARY_TABLES * m_parent
void onGridCellLeftClickHandler(wxGridEvent &event)
bool TransferDataFromWindow() override
void appendRowHandler(wxCommandEvent &event) override
static wxString GetDefaultUserSymbolsPath()
Gets the default path we point users to create projects.
virtual ENV_VAR_MAP & GetLocalEnvVariables() const
virtual SETTINGS_MANAGER & GetSettingsManager() const
static SYMBOL_LIB_TABLE * SchSymbolLibTable(PROJECT *aProject)
Accessor for project symbol library table.
Container for project specific data.
virtual const wxString GetProjectPath() const
Return the full path of the project.
virtual bool IsNullProject() const
Check if this project is a null project (i.e.
static bool ConvertLibrary(std::map< std::string, UTF8 > *aOldFileProps, const wxString &aOldFilePath, const wxString &aNewFilepath)
Convert a schematic symbol library to the latest KiCad format.
static SCH_FILE_T EnumFromStr(const wxString &aFileType)
Return the #SCH_FILE_T from the corresponding plugin type name: "kicad", "legacy",...
static const wxString ShowType(SCH_FILE_T aFileType)
Return a brief name for a plugin, given aFileType enum.
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.
T * GetAppSettings()
Returns a handle to the a given settings by type If the settings have already been loaded,...
Is a LINE_READER that reads from a multiline 8 bit wide std::string.
The symbol library editor main window.
bool supportsVisibilityColumn() override
DIALOG_EDIT_LIBRARY_TABLES * m_dialog
virtual void optionsEditor(int aRow) override
SYMBOL_GRID_TRICKS(DIALOG_EDIT_LIBRARY_TABLES *aParent, WX_GRID *aGrid)
virtual void paste_text(const wxString &cb_text) override
handle specialized clipboard text, with leading "(sym_lib_table" or spreadsheet formatted text.
Build a wxGridTableBase by wrapping an SYMBOL_LIB_TABLE object.
void SetValue(int aRow, int aCol, const wxString &aValue) override
LIB_TABLE_ROW * at(size_t aIndex) override
LIB_TABLE_ROWS_ITER erase(LIB_TABLE_ROWS_ITER aFirst, LIB_TABLE_ROWS_ITER aLast) override
LIB_TABLE_ROWS_ITER begin() override
LIB_TABLE_ROWS_ITER insert(LIB_TABLE_ROWS_ITER aIterator, LIB_TABLE_ROW *aRow) override
LIB_TABLE_ROW * makeNewRow() override
void push_back(LIB_TABLE_ROW *aRow) override
size_t size() const override
SYMBOL_LIB_TABLE_GRID(const SYMBOL_LIB_TABLE &aTableToEdit)
Hold a record identifying a symbol library accessed by the appropriate symbol library SCH_IO object i...
bool Refresh() override
Attempt to reload the library.
static SYMBOL_LIB_TABLE & GetGlobalLibTable()
virtual void Parse(LIB_TABLE_LEXER *aLexer) override
Parse the #LIB_TABLE_LEXER s-expression library table format into the appropriate LIB_TABLE_ROW objec...
static const wxString & GetSymbolLibTableFileName()
static wxString GetGlobalTableFileName()
Fetch the global symbol library table file name.
static const wxString GlobalPathEnvVariableName()
Return the name of the environment variable used to hold the directory of locally installed "KiCad sp...
void SetTable(wxGridTableBase *table, bool aTakeOwnership=false)
Hide wxGrid's SetTable() method with one which doesn't mess up the grid column widths when setting th...
void DestroyTable(wxGridTableBase *aTable)
Work-around for a bug in wxGrid which crashes when deleting the table if the cell edit control was no...
void ClearRows()
wxWidgets recently added an ASSERT which fires if the position is greater than or equal to the number...
bool CommitPendingChanges(bool aQuietMode=false)
Close any open cell edit controls.
const wxString ExpandEnvVarSubstitutions(const wxString &aString, const PROJECT *aProject)
Replace any environment variable & text variable references with their values.
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.
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
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.
This file is part of the common library.
@ ID_END_EESCHEMA_ID_LIST
wxString NormalizePath(const wxFileName &aFilePath, const ENV_VAR_MAP *aEnvVars, const wxString &aProjectPath)
Normalize a file path to an environmental variable, if possible.
@ FRAME_SCH_SYMBOL_EDITOR
static const std::string LegacySymbolLibFileExtension
std::map< wxString, ENV_VAR_ITEM > ENV_VAR_MAP
std::unique_ptr< T > IO_RELEASER
Helper to hold and release an IO_BASE object when exceptions are thrown.
LIB_TABLE_ROWS::iterator LIB_TABLE_ROWS_ITER
void InvokeSchEditSymbolLibTable(KIWAY *aKiway, wxWindow *aParent)
@ ID_PANEL_SYM_LIB_LEGACY
PGM_BASE & Pgm()
The global Program "get" accessor.
#define PROJECT_VAR_NAME
A variable name whose value holds the current project directory.
MODEL3D_FORMAT_TYPE fileType(const char *aFileName)
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Container that describes file type info.
std::vector< std::string > m_FileExtensions
Filter used for file pickers if m_IsFile is true.
wxString FileFilter() const
A filename or source description, a problem input line, a line number, a byte offset,...
Container that describes file type info for the add a library options.
bool m_IsFile
Whether the library is a folder or a file.
wxString m_Description
Description shown in the file picker dialog.
wxString m_FileFilter
Filter used for file pickers if m_IsFile is true.
SCH_IO_MGR::SCH_FILE_T m_Plugin
wxString m_FolderSearchExtension
In case of folders it stands for extensions of files stored inside.
wxString formatWildcardExt(const wxString &aWildcard)
Format wildcard extension to support case sensitive file dialogs.
Definition of file extensions used in Kicad.