33#include <lib_table_lexer.h>
53#include <wx/filedlg.h>
108 return m_rows.insert( aIterator, aRow );
115 return m_rows.erase( aFirst, aLast );
119 void SetValue(
int aRow,
int aCol,
const wxString &aValue )
override
121 wxCHECK( aRow < (
int)
size(), );
133 if( pluginType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
134 pluginType = SCH_IO_MGR::SCH_KICAD;
167 wxString result = options;
168 std::map<std::string, UTF8> choices;
172 pi->GetLibraryOptions( &choices );
177 if( options != result )
191 size_t ndx = cb_text.find(
"(sym_lib_table" );
193 if( ndx != std::string::npos )
199 LIB_TABLE_LEXER lexer( &slr );
205 tmp_tbl.
Parse( &lexer );
219 for(
unsigned i = 0; i < tmp_tbl.
GetCount(); ++i )
223 m_grid->AutoSizeColumns(
false );
230 m_grid->AutoSizeColumns(
false );
244 [&](
WX_GRID* aCurrGrid,
int aCol )
246 int prevWidth = aCurrGrid->GetColSize( aCol );
248 aCurrGrid->AutoSizeColumn( aCol,
false );
249 aCurrGrid->SetColSize( aCol, std::max( prevWidth, aCurrGrid->GetColSize( aCol ) ) );
256 for(
int ii = 0; ii < aGrid->GetNumberRows(); ++ii )
257 aGrid->SetRowSize( ii, aGrid->GetDefaultRowSize() + 4 );
262 aGrid->SetSelectionMode( wxGrid::wxGridSelectRows );
265 wxGridCellAttr* attr;
267 attr =
new wxGridCellAttr;
269 wxString fileFiltersStr;
270 wxString allWildcardsStr;
277 auto* libTable = static_cast<SYMBOL_LIB_TABLE_GRID*>( grid->GetTable() );
278 auto* tableRow = static_cast<SYMBOL_LIB_TABLE_ROW*>( libTable->at( row ) );
280 IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( tableRow->GetFileType() ) );
284 const IO_BASE::IO_FILE_DESC& desc = pi->GetLibraryDesc();
287 return desc.FileFilter();
290 return wxEmptyString;
292 aGrid->SetColAttr(
COL_URI, attr );
294 attr =
new wxGridCellAttr;
295 attr->SetEditor(
new wxGridCellChoiceEditor( m_pluginChoices ) );
296 aGrid->SetColAttr(
COL_TYPE, attr );
298 attr =
new wxGridCellAttr;
299 attr->SetRenderer(
new wxGridCellBoolRenderer() );
303 attr =
new wxGridCellAttr;
304 attr->SetRenderer(
new wxGridCellBoolRenderer() );
317 if( aGrid->GetNumberRows() > 0 )
318 aGrid->SelectRow( 0 );
324 const wxString& aGlobalTablePath,
326 const wxString& aProjectTablePath ) :
328 m_globalTable( aGlobalTable ),
329 m_projectTable( aProjectTable ),
330 m_project( aProject ),
337 for(
const SCH_IO_MGR::SCH_FILE_T& type : SCH_IO_MGR::SCH_FILE_T_vector )
423 wxFileName fn( aLibraryPath );
424 wxString ext = fn.GetExt().Lower();
438 std::unique_ptr<wxBusyCursor> wait;
439 wait.reset(
new wxBusyCursor );
446 for(
int r = 0; r < model->GetNumberRows(); )
448 wxString nick = model->GetValue( r,
COL_NICKNAME ).Trim(
false ).Trim();
449 wxString uri = model->GetValue( r,
COL_URI ).Trim(
false ).Trim();
450 unsigned illegalCh = 0;
455 msg =
_(
"A library table row nickname and path cells are empty." );
457 msg =
_(
"A library table row nickname cell is empty." );
459 msg =
_(
"A library table row path cell is empty." );
461 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
463 wxMessageDialog badCellDlg( topLevelParent, msg,
_(
"Invalid Row Definition" ),
464 wxYES_NO | wxCENTER | wxICON_QUESTION | wxYES_DEFAULT );
465 badCellDlg.SetExtendedMessage(
_(
"Empty cells will result in all rows that are "
466 "invalid to be removed from the table." ) );
467 badCellDlg.SetYesNoLabels(
468 wxMessageDialog::ButtonLabel(
_(
"Remove Invalid Cells" ) ),
469 wxMessageDialog::ButtonLabel(
_(
"Cancel Table Update" ) ) );
473 if( badCellDlg.ShowModal() == wxID_NO )
476 wait.reset(
new wxBusyCursor );
482 model->DeleteRows( r, 1 );
486 msg = wxString::Format(
_(
"Illegal character '%c' in nickname '%s'" ),
497 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
499 wxMessageDialog errdlg( topLevelParent, msg,
_(
"Library Nickname Error" ) );
512 model->SetValue( r,
COL_URI, uri );
516 wxString ltype = model->GetValue( r,
COL_TYPE );
517 model->LIB_TABLE_GRID::SetValue( r,
COL_URI, uri );
518 model->SetValue( r,
COL_TYPE, ltype );
532 for(
int r1 = 0; r1 < model->GetNumberRows() - 1; ++r1 )
536 for(
int r2 = r1 + 1; r2 < model->GetNumberRows(); ++r2 )
542 msg = wxString::Format(
_(
"Multiple libraries cannot share the same "
543 "nickname ('%s')." ), nick1 );
553 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
556 wxMessageDialog errdlg( topLevelParent, msg,
_(
"Library Nickname Error" ) );
570 for(
unsigned int r = 0; r < table->GetCount(); ++r )
592 msg.Printf(
_(
"Symbol library '%s' failed to load." ), row.
GetNickName() );
594 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
596 wxMessageDialog errdlg( topLevelParent, msg + wxS(
"\n" ) + ioe.
What(),
597 _(
"Error Loading Library" ) );
616 wxString fileFiltersStr;
617 wxString allWildcardsStr;
619 for(
const SCH_IO_MGR::SCH_FILE_T&
fileType : SCH_IO_MGR::SCH_FILE_T_vector )
631 if( !fileFiltersStr.IsEmpty() )
632 fileFiltersStr += wxChar(
'|' );
640 fileFiltersStr =
_(
"All supported formats" ) + wxT(
"|" ) + allWildcardsStr + wxT(
"|" )
651 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
653 wxFileDialog dlg( topLevelParent,
_(
"Add Library" ), openDir, wxEmptyString, fileFiltersStr,
654 wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_MULTIPLE );
656 if( dlg.ShowModal() == wxID_CANCEL )
665 bool addDuplicates =
false;
666 bool applyToAll =
false;
667 wxString warning =
_(
"Warning: Duplicate Nickname" );
668 wxString msg =
_(
"A library nicknamed '%s' already exists." );
669 wxString detailedMsg =
_(
"One of the nicknames will need to be changed after "
670 "adding this library." );
672 wxArrayString filePathsList;
673 dlg.GetPaths( filePathsList );
675 for(
const wxString& filePath : filePathsList )
677 wxFileName fn( filePath );
681 if(
cur_model()->ContainsNickname( nickname ) )
687 wxString::Format( msg, nickname ),
688 detailedMsg,
_(
"Skip" ),
_(
"Add Anyway" ),
689 &applyToAll ) == wxID_CANCEL;
692 doAdd = addDuplicates;
697 int last_row =
m_cur_grid->GetNumberRows() - 1;
704 if( pluginType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
705 pluginType = SCH_IO_MGR::SCH_KICAD;
715 path = fn.GetFullPath();
721 if( !filePathsList.IsEmpty() )
762 wxArrayInt selectedRows =
m_cur_grid->GetSelectedRows();
763 wxGridCellCoordsArray cells =
m_cur_grid->GetSelectedCells();
764 wxGridCellCoordsArray blockTopLeft =
m_cur_grid->GetSelectionBlockTopLeft();
765 wxGridCellCoordsArray blockBotRight =
m_cur_grid->GetSelectionBlockBottomRight();
768 for(
unsigned ii = 0; ii < cells.GetCount(); ii++ )
769 selectedRows.Add( cells[ii].GetRow() );
772 if( !blockTopLeft.IsEmpty() && !blockBotRight.IsEmpty() )
774 for(
int i = blockTopLeft[0].GetRow(); i <= blockBotRight[0].GetRow(); ++i )
775 selectedRows.Add( i );
779 if( selectedRows.size() == 0 &&
m_cur_grid->GetGridCursorRow() >= 0 )
780 selectedRows.Add(
m_cur_grid->GetGridCursorRow() );
782 if( selectedRows.size() == 0 )
788 std::sort( selectedRows.begin(), selectedRows.end() );
797 for(
int ii = selectedRows.GetCount()-1; ii >= 0; ii-- )
799 int row = selectedRows[ii];
801 if( row != last_row )
808 if(
m_cur_grid->GetNumberRows() > 0 && curRow >= 0 )
829 wxGridTableMessage msg( tbl, wxGRIDTABLE_NOTIFY_ROWS_INSERTED, curRow, 0 );
830 tbl->GetView()->ProcessTableMessage( msg );
848 if(
unsigned( curRow + 1 ) < tbl->
m_rows.size() )
855 wxGridTableMessage msg( tbl, wxGRIDTABLE_NOTIFY_ROWS_INSERTED, curRow - 1, 0 );
856 tbl->GetView()->ProcessTableMessage( msg );
872 !
IsOK(
this, wxString::Format(
_(
"This action will reset your global library table on "
873 "disk and cannot be undone." ) ) ) )
920 wxArrayInt selectedRows =
m_cur_grid->GetSelectedRows();
922 if( selectedRows.empty() &&
m_cur_grid->GetGridCursorRow() >= 0 )
923 selectedRows.push_back(
m_cur_grid->GetGridCursorRow() );
925 wxArrayInt legacyRows;
930 for(
int row : selectedRows )
935 legacyRows.push_back( row );
939 if( legacyRows.size() <= 0 )
941 wxMessageBox(
_(
"Select one or more rows containing libraries "
942 "to save as current KiCad format (*.kicad_sym)." ) );
947 if( legacyRows.size() == 1 )
949 msg.Printf(
_(
"Save '%s' as current KiCad format (*.kicad_sym) "
950 "and replace legacy entry in table?" ),
955 msg.Printf(
_(
"Save %d libraries as current KiCad format (*.kicad_sym) "
956 "and replace legacy entries in table?" ),
957 (
int) legacyRows.size() );
964 for(
int row : legacyRows )
969 wxFileName legacyLib( resolvedPath );
971 if( !legacyLib.Exists() )
973 msg.Printf(
_(
"Library '%s' not found." ), relPath );
975 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
981 wxFileName newLib( resolvedPath );
982 newLib.SetExt(
"kicad_sym" );
984 if( newLib.Exists() )
986 msg.Printf(
_(
"File '%s' already exists. Do you want overwrite this file?" ),
987 newLib.GetFullPath() );
989 switch( wxMessageBox( msg,
_(
"Migrate Library" ),
990 wxYES_NO | wxCANCEL | wxICON_QUESTION,
m_parent ) )
994 case wxCANCEL:
return;
999 std::unique_ptr<std::map<std::string, UTF8>> props(
1003 legacyLib.GetFullPath(), newLib.GetFullPath() ) )
1005 relPath =
NormalizePath( newLib.GetFullPath(), &
Pgm().GetLocalEnvVariables(),
1011 relPath = newLib.GetFullPath();
1019 msg.Printf(
_(
"Failed to save symbol library file '%s'." ), newLib.GetFullPath() );
1021 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
1055 wxRegEx re(
".*?(\\$\\{(.+?)\\})|(\\$\\((.+?)\\)).*?", wxRE_ADVANCED );
1056 wxASSERT( re.IsValid() );
1058 std::set< wxString > unique;
1068 for(
int row = 0; row < tbl->GetNumberRows(); ++row )
1070 wxString uri = tbl->GetValue( row,
COL_URI );
1072 while( re.Matches( uri ) )
1074 wxString envvar = re.GetMatch( uri, 2 );
1077 if( envvar.IsEmpty() )
1078 envvar = re.GetMatch( uri, 4 );
1081 unique.insert( envvar );
1084 uri.Replace( re.GetMatch( uri, 0 ), wxEmptyString );
1095 for(
const wxString& evName : unique )
1100 m_path_subs_grid->SetCellValue( row, 0, wxT(
"${" ) + evName + wxT(
"}" ) );
1104 wxGetEnv( evName, &evValue );
1157 wxGrid*
grid =
dynamic_cast<wxGrid*
>(
event.GetEventObject() );
1162 int row =
event.GetRow();
1163 int col =
event.GetCol();
1166 wxGridCellRenderer* renderer =
grid->GetCellRenderer( row, col );
1169 if(
dynamic_cast<wxGridCellBoolRenderer*
>( renderer ) )
1172 grid->SetGridCursor( row, col );
1194 wxString currentLib;
1202 currentLib = symbolEditor->GetCurLib();
1205 symbolEditor->FreezeLibraryTree();
1207 if( symbolEditor->HasLibModifications() )
1209 msg =
_(
"Modifications have been made to one or more symbol libraries.\n"
1210 "Changes must be saved or discarded before the symbol library "
1211 "table can be modified." );
1215 case wxID_YES: symbolEditor->SaveAll();
break;
1216 case wxID_NO: symbolEditor->RevertAll();
break;
1218 case wxID_CANCEL: symbolEditor->ThawLibraryTree();
return;
1227 projectTable, projectTableFn.GetFullPath() ) );
1232 symbolEditor->ThawLibraryTree();
1241 globalTable->
Save( globalTablePath );
1245 msg.Printf(
_(
"Error saving global library table:\n\n%s" ), ioe.
What() );
1246 wxMessageBox( msg,
_(
"File Save Error" ), wxOK | wxICON_ERROR );
1254 projectTable->
Save( projectTableFn.GetFullPath() );
1258 msg.Printf(
_(
"Error saving project-specific library table:\n\n%s" ), ioe.
What() );
1259 wxMessageBox( msg,
_(
"File Save Error" ), wxOK | wxICON_ERROR );
1265 symbolEditor->ThawLibraryTree();
1268 std::string payload =
"";
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap)
bool m_ProjectTableChanged
void InstallPanel(wxPanel *aPanel)
bool m_GlobalTableChanged
An options editor in the form of a two column name/value spreadsheet like (table) UI.
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
Transient (unsaved) last browsed folder when adding a project level library.
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(const wxString &aFilename)
Return a handle to the a given settings by type.
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.
Helper functions to substitute paths with environmental variables.
@ 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
@ ID_PANEL_SYM_LIB_LEGACY
void InvokeSchEditSymbolLibTable(KIWAY *aKiway, wxWindow *aParent)
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.