32#include <lib_table_lexer.h>
52#include <wx/filedlg.h>
104 return m_rows.insert( aIterator, aRow );
111 return m_rows.erase( aFirst, aLast );
115 void SetValue(
int aRow,
int aCol,
const wxString &aValue )
override
117 wxCHECK( aRow < (
int)
size(), );
129 if( pluginType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
130 pluginType = SCH_IO_MGR::SCH_KICAD;
163 wxString result = options;
168 pi->GetLibraryOptions( &choices );
173 if( options != result )
187 size_t ndx = cb_text.find(
"(sym_lib_table" );
189 if( ndx != std::string::npos )
195 LIB_TABLE_LEXER lexer( &slr );
201 tmp_tbl.
Parse( &lexer );
215 for(
unsigned i = 0; i < tmp_tbl.
GetCount(); ++i )
219 m_grid->AutoSizeColumns(
false );
226 m_grid->AutoSizeColumns(
false );
234 const wxString& aGlobalTablePath,
236 const wxString& aProjectTablePath ) :
238 m_globalTable( aGlobalTable ),
239 m_projectTable( aProjectTable ),
240 m_project( aProject ),
247 wxArrayString pluginChoices;
249 for(
const SCH_IO_MGR::SCH_FILE_T& type : SCH_IO_MGR::SCH_FILE_T_vector )
268 [&](
WX_GRID* aGrid,
int aCol )
270 int prevWidth = aGrid->GetColSize( aCol );
272 aGrid->AutoSizeColumn( aCol,
false );
273 aGrid->SetColSize( aCol, std::max( prevWidth, aGrid->GetColSize( aCol ) ) );
280 aGrid->SetDefaultRowSize( aGrid->GetDefaultRowSize() + 4 );
285 aGrid->SetSelectionMode( wxGrid::wxGridSelectRows );
288 wxGridCellAttr* attr;
290 attr =
new wxGridCellAttr;
292 wxString fileFiltersStr;
293 wxString allWildcardsStr;
313 return wxEmptyString;
315 aGrid->SetColAttr(
COL_URI, attr );
317 attr =
new wxGridCellAttr;
318 attr->SetEditor(
new wxGridCellChoiceEditor( pluginChoices ) );
319 aGrid->SetColAttr(
COL_TYPE, attr );
321 attr =
new wxGridCellAttr;
322 attr->SetRenderer(
new wxGridCellBoolRenderer() );
326 attr =
new wxGridCellAttr;
327 attr->SetRenderer(
new wxGridCellBoolRenderer() );
340 if( aGrid->GetNumberRows() > 0 )
341 aGrid->SelectRow( 0 );
400 wxFileName fn( aLibraryPath );
401 wxString ext = fn.GetExt().Lower();
421 for(
int r = 0; r < model->GetNumberRows(); )
423 wxString nick = model->GetValue( r,
COL_NICKNAME ).Trim(
false ).Trim();
424 wxString uri = model->GetValue( r,
COL_URI ).Trim(
false ).Trim();
425 unsigned illegalCh = 0;
430 msg =
_(
"A library table row nickname and path cells are empty." );
432 msg =
_(
"A library table row nickname cell is empty." );
434 msg =
_(
"A library table row path cell is empty." );
436 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
438 wxMessageDialog badCellDlg( topLevelParent, msg,
_(
"Invalid Row Definition" ),
439 wxYES_NO | wxCENTER | wxICON_QUESTION | wxYES_DEFAULT );
440 badCellDlg.SetExtendedMessage(
_(
"Empty cells will result in all rows that are "
441 "invalid to be removed from the table." ) );
442 badCellDlg.SetYesNoLabels( wxMessageDialog::ButtonLabel(
_(
"Remove Invalid Cells" ) ),
443 wxMessageDialog::ButtonLabel(
_(
"Cancel Table Update" ) ) );
445 if( badCellDlg.ShowModal() == wxID_NO )
452 model->DeleteRows( r, 1 );
456 msg = wxString::Format(
_(
"Illegal character '%c' in nickname '%s'" ),
467 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
469 wxMessageDialog errdlg( topLevelParent, msg,
_(
"Library Nickname Error" ) );
479 model->SetValue( r,
COL_URI, uri );
482 wxString ltype = model->GetValue( r,
COL_TYPE );
483 model->LIB_TABLE_GRID::SetValue( r,
COL_URI, uri );
484 model->SetValue( r,
COL_TYPE, ltype );
498 for(
int r1 = 0; r1 < model->GetNumberRows() - 1; ++r1 )
502 for(
int r2=r1+1; r2 < model->GetNumberRows(); ++r2 )
508 msg = wxString::Format(
_(
"Multiple libraries cannot share the same "
509 "nickname ('%s')." ), nick1 );
519 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
521 wxMessageDialog errdlg( topLevelParent, msg,
_(
"Library Nickname Error" ) );
535 for(
unsigned int r = 0; r < table->GetCount(); ++r )
557 msg.Printf(
_(
"Symbol library '%s' failed to load." ), row.
GetNickName() );
559 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
561 wxMessageDialog errdlg( topLevelParent, msg + wxS(
"\n" ) + ioe.
What(),
562 _(
"Error Loading Library" ) );
583 wxString fileFiltersStr;
584 wxString allWildcardsStr;
586 for(
const SCH_IO_MGR::SCH_FILE_T&
fileType : SCH_IO_MGR::SCH_FILE_T_vector )
598 if( !fileFiltersStr.IsEmpty() )
599 fileFiltersStr += wxChar(
'|' );
607 fileFiltersStr =
_(
"All supported formats" ) + wxT(
"|" ) + allWildcardsStr + wxT(
"|" )
617 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
619 wxFileDialog dlg( topLevelParent,
_(
"Add Library" ), openDir, wxEmptyString, fileFiltersStr,
620 wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_MULTIPLE );
622 if( dlg.ShowModal() == wxID_CANCEL )
631 bool addDuplicates =
false;
632 bool applyToAll =
false;
633 wxString warning =
_(
"Warning: Duplicate Nickname" );
634 wxString msg =
_(
"A library nicknamed '%s' already exists." );
635 wxString detailedMsg =
_(
"One of the nicknames will need to be changed after "
636 "adding this library." );
638 wxArrayString filePathsList;
639 dlg.GetPaths( filePathsList );
641 for(
const wxString& filePath : filePathsList )
643 wxFileName fn( filePath );
647 if(
cur_model()->ContainsNickname( nickname ) )
653 wxString::Format( msg, nickname ),
654 detailedMsg,
_(
"Skip" ),
_(
"Add Anyway" ),
655 &applyToAll ) == wxID_CANCEL;
658 doAdd = addDuplicates;
663 int last_row =
m_cur_grid->GetNumberRows() - 1;
670 if( pluginType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
671 pluginType = SCH_IO_MGR::SCH_KICAD;
681 path = fn.GetFullPath();
687 if( !filePathsList.IsEmpty() )
726 wxArrayInt selectedRows =
m_cur_grid->GetSelectedRows();
727 wxGridCellCoordsArray cells =
m_cur_grid->GetSelectedCells();
728 wxGridCellCoordsArray blockTopLeft =
m_cur_grid->GetSelectionBlockTopLeft();
729 wxGridCellCoordsArray blockBotRight =
m_cur_grid->GetSelectionBlockBottomRight();
732 for(
unsigned ii = 0; ii < cells.GetCount(); ii++ )
733 selectedRows.Add( cells[ii].GetRow() );
736 if( !blockTopLeft.IsEmpty() && !blockBotRight.IsEmpty() )
738 for(
int i = blockTopLeft[0].GetRow(); i <= blockBotRight[0].GetRow(); ++i )
739 selectedRows.Add( i );
743 if( selectedRows.size() == 0 &&
m_cur_grid->GetGridCursorRow() >= 0 )
744 selectedRows.Add(
m_cur_grid->GetGridCursorRow() );
746 if( selectedRows.size() == 0 )
752 std::sort( selectedRows.begin(), selectedRows.end() );
761 for(
int ii = selectedRows.GetCount()-1; ii >= 0; ii-- )
763 int row = selectedRows[ii];
765 if( row != last_row )
772 if(
m_cur_grid->GetNumberRows() > 0 && curRow >= 0 )
793 wxGridTableMessage msg( tbl, wxGRIDTABLE_NOTIFY_ROWS_INSERTED, curRow, 0 );
794 tbl->GetView()->ProcessTableMessage( msg );
812 if(
unsigned( curRow + 1 ) < tbl->
m_rows.size() )
819 wxGridTableMessage msg( tbl, wxGRIDTABLE_NOTIFY_ROWS_INSERTED, curRow - 1, 0 );
820 tbl->GetView()->ProcessTableMessage( msg );
834 wxArrayInt selectedRows =
m_cur_grid->GetSelectedRows();
836 if( selectedRows.empty() &&
m_cur_grid->GetGridCursorRow() >= 0 )
837 selectedRows.push_back(
m_cur_grid->GetGridCursorRow() );
839 wxArrayInt legacyRows;
844 for(
int row : selectedRows )
849 legacyRows.push_back( row );
853 if( legacyRows.size() <= 0 )
855 wxMessageBox(
_(
"Select one or more rows containing libraries "
856 "to save as current KiCad format (*.kicad_sym)." ) );
861 if( legacyRows.size() == 1 )
863 msg.Printf(
_(
"Save '%s' as current KiCad format (*.kicad_sym) "
864 "and replace legacy entry in table?" ),
869 msg.Printf(
_(
"Save %d libraries as current KiCad format (*.kicad_sym) "
870 "and replace legacy entries in table?" ),
871 (
int) legacyRows.size() );
878 for(
int row : legacyRows )
883 wxFileName legacyLib( resolvedPath );
885 if( !legacyLib.Exists() )
887 msg.Printf(
_(
"Library '%s' not found." ), relPath );
889 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
895 wxFileName newLib( resolvedPath );
896 newLib.SetExt(
"kicad_sym" );
898 if( newLib.Exists() )
900 msg.Printf(
_(
"File '%s' already exists. Do you want overwrite this file?" ),
901 newLib.GetFullPath() );
903 switch( wxMessageBox( msg,
_(
"Migrate Library" ),
904 wxYES_NO | wxCANCEL | wxICON_QUESTION,
m_parent ) )
908 case wxCANCEL:
return;
917 relPath =
NormalizePath( newLib.GetFullPath(), &
Pgm().GetLocalEnvVariables(),
923 relPath = newLib.GetFullPath();
931 msg.Printf(
_(
"Failed to save symbol library file '%s'." ), newLib.GetFullPath() );
933 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
971 wxRegEx re(
".*?(\\$\\{(.+?)\\})|(\\$\\((.+?)\\)).*?", wxRE_ADVANCED );
972 wxASSERT( re.IsValid() );
974 std::set< wxString > unique;
984 for(
int row = 0; row < tbl->GetNumberRows(); ++row )
986 wxString uri = tbl->GetValue( row,
COL_URI );
988 while( re.Matches( uri ) )
990 wxString envvar = re.GetMatch( uri, 2 );
993 if( envvar.IsEmpty() )
994 envvar = re.GetMatch( uri, 4 );
997 unique.insert( envvar );
1000 uri.Replace( re.GetMatch( uri, 0 ), wxEmptyString );
1011 for(
const wxString& evName : unique )
1016 m_path_subs_grid->SetCellValue( row, 0, wxT(
"${" ) + evName + wxT(
"}" ) );
1020 wxGetEnv( evName, &evValue );
1083 wxString currentLib;
1091 currentLib = symbolEditor->GetCurLib();
1094 symbolEditor->FreezeLibraryTree();
1096 if( symbolEditor->HasLibModifications() )
1098 msg =
_(
"Modifications have been made to one or more symbol libraries.\n"
1099 "Changes must be saved or discarded before the symbol library "
1100 "table can be modified." );
1104 case wxID_YES: symbolEditor->SaveAll();
break;
1105 case wxID_NO: symbolEditor->RevertAll();
break;
1107 case wxID_CANCEL: symbolEditor->ThawLibraryTree();
return;
1116 projectTable, projectTableFn.GetFullPath() ) );
1118 if( dlg.ShowModal() == wxID_CANCEL )
1121 symbolEditor->ThawLibraryTree();
1130 globalTable->
Save( globalTablePath );
1134 msg.Printf(
_(
"Error saving global library table:\n\n%s" ), ioe.
What() );
1135 wxMessageBox( msg,
_(
"File Save Error" ), wxOK | wxICON_ERROR );
1143 projectTable->
Save( projectTableFn.GetFullPath() );
1147 msg.Printf(
_(
"Error saving project-specific library table:\n\n%s" ), ioe.
What() );
1148 wxMessageBox( msg,
_(
"File Save Error" ), wxOK | wxICON_ERROR );
1154 symbolEditor->ThawLibraryTree();
1157 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.
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.
void Clear()
Delete all 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.
static STRING_UTF8_MAP * ParseOptions(const std::string &aOptionsList)
Parses aOptionsList and places the result into a #PROPERTIES object which is returned.
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
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 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
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
bool TransferDataFromWindow() override
void appendRowHandler(wxCommandEvent &event) override
static wxString GetDefaultUserSymbolsPath()
Gets the default path we point users to create projects.
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 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 bool ConvertLibrary(STRING_UTF8_MAP *aOldFileProps, const wxString &aOldFilePath, const wxString &aNewFilepath)
Convert a schematic symbol library to the latest KiCad format.
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.
Is a LINE_READER that reads from a multiline 8 bit wide std::string.
A name/value tuple with unique names and optional values.
The symbol library editor main window.
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 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
#define PROJECT_VAR_NAME
A variable name whose value holds the current project directory.
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
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.
bool m_IsFile
Whether the library is a folder or a file.
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.