38#include <wx/filedlg.h>
46#include <lib_table_lexer.h>
97 virtual wxDirTraverseResult
OnFile(
const wxString& aFileName )
override
99 wxFileName file( aFileName );
103 if( file.GetExt().IsSameAs( ext,
false ) )
107 return wxDIR_CONTINUE;
110 virtual wxDirTraverseResult
OnOpenError(
const wxString& aOpenErrorName )
override
118 virtual wxDirTraverseResult
OnDir(
const wxString& aDirName )
override
121 return wxDIR_CONTINUE;
126 for( std::pair<const wxString, int>& foundDirsPair :
m_foundDirs )
127 aPathArray.Add( foundDirsPair.first );
132 for( std::pair<const wxString, int>& failedDirsPair :
m_failedDirs )
133 aPathArray.Add( failedDirsPair.first );
166 return m_rows.insert( aIterator, aRow );
173 return m_rows.erase( aFirst, aLast );
182 void SetValue(
int aRow,
int aCol,
const wxString& aValue )
override
184 wxCHECK( aRow < (
int)
size(), );
225 wxString result = options;
226 std::map<std::string, UTF8> choices;
231 pi->GetLibraryOptions( &choices );
236 if( options != result )
249 size_t ndx = cb_text.find(
"(design_block_lib_table" );
251 if( ndx != std::string::npos )
257 LIB_TABLE_LEXER lexer( &slr );
263 tmp_tbl.
Parse( &lexer );
277 for(
unsigned i = 0; i < tmp_tbl.
GetCount(); ++i )
281 m_grid->AutoSizeColumns(
false );
288 m_grid->AutoSizeColumns(
false );
297 const wxString& aGlobalTblPath,
299 const wxString& aProjectTblPath,
300 const wxString& aProjectBasePath ) :
302 m_globalTable( aGlobalTable ), m_projectTable( aProjectTable ), m_project( aProject ),
303 m_projectBasePath( aProjectBasePath ), m_parent( aParent )
312 wxArrayString choices;
329 auto autoSizeCol = [&](
WX_GRID* aGrid,
int aCol )
331 int prevWidth = aGrid->GetColSize( aCol );
333 aGrid->AutoSizeColumn( aCol,
false );
334 aGrid->SetColSize( aCol, std::max( prevWidth, aGrid->GetColSize( aCol ) ) );
337 auto setupGrid = [&](
WX_GRID* aGrid )
340 aGrid->SetDefaultRowSize( aGrid->GetDefaultRowSize() + 4 );
345 aGrid->SetSelectionMode( wxGrid::wxGridSelectRows );
347 wxGridCellAttr* attr;
349 attr =
new wxGridCellAttr;
364 return wxEmptyString;
366 aGrid->SetColAttr(
COL_URI, attr );
368 attr =
new wxGridCellAttr;
369 attr->SetEditor(
new wxGridCellChoiceEditor( choices ) );
370 aGrid->SetColAttr(
COL_TYPE, attr );
372 attr =
new wxGridCellAttr;
373 attr->SetRenderer(
new wxGridCellBoolRenderer() );
390 if( aGrid->GetNumberRows() > 0 )
391 aGrid->SelectRow( 0 );
439 auto joinExts = [](
const std::vector<std::string>& aExts )
443 for(
const std::string& ext : aExts )
445 if( !joined.empty() )
446 joined << wxS(
", " );
448 joined << wxS(
"*." ) << ext;
458 if( desc.m_IsFile && !desc.m_FileExtensions.empty() )
460 entryStr << wxString::Format( wxS(
" (%s)" ), joinExts( desc.m_FileExtensions ) );
462 else if( !desc.m_IsFile && !desc.m_ExtensionsInDir.empty() )
464 wxString midPart = wxString::Format(
_(
"folder with %s files" ),
465 joinExts( desc.m_ExtensionsInDir ) );
467 entryStr << wxString::Format( wxS(
" (%s)" ), midPart );
470 browseMenu->Append( type, entryStr );
472 browseMenu->Bind( wxEVT_COMMAND_MENU_SELECTED,
490 browseMenu->Unbind( wxEVT_COMMAND_MENU_SELECTED,
532 for(
int r = 0; r < model->GetNumberRows(); )
534 wxString nick = model->GetValue( r,
COL_NICKNAME ).Trim(
false ).Trim();
535 wxString uri = model->GetValue( r,
COL_URI ).Trim(
false ).Trim();
536 unsigned illegalCh = 0;
541 msg =
_(
"A library table row nickname and path cells are empty." );
543 msg =
_(
"A library table row nickname cell is empty." );
545 msg =
_(
"A library table row path cell is empty." );
547 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
549 wxMessageDialog badCellDlg( topLevelParent, msg,
_(
"Invalid Row Definition" ),
550 wxYES_NO | wxCENTER | wxICON_QUESTION | wxYES_DEFAULT );
551 badCellDlg.SetExtendedMessage(
_(
"Empty cells will result in all rows that are "
552 "invalid to be removed from the table." ) );
553 badCellDlg.SetYesNoLabels(
554 wxMessageDialog::ButtonLabel(
_(
"Remove Invalid Cells" ) ),
555 wxMessageDialog::ButtonLabel(
_(
"Cancel Table Update" ) ) );
557 if( badCellDlg.ShowModal() == wxID_NO )
564 model->DeleteRows( r, 1 );
568 msg = wxString::Format(
_(
"Illegal character '%c' in nickname '%s'." ), illegalCh,
578 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
580 wxMessageDialog errdlg( topLevelParent, msg,
_(
"Library Nickname Error" ) );
588 model->SetValue( r,
COL_URI, uri );
604 for(
int r1 = 0; r1 < model->GetNumberRows() - 1; ++r1 )
608 for(
int r2 = r1 + 1; r2 < model->GetNumberRows(); ++r2 )
614 msg = wxString::Format(
_(
"Multiple libraries cannot share the same "
615 "nickname ('%s')." ),
626 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
628 wxMessageDialog errdlg( topLevelParent, msg,
_(
"Library Nickname Error" ) );
654 int last_row =
m_cur_grid->GetNumberRows() - 1;
680 wxArrayInt selectedRows =
m_cur_grid->GetSelectedRows();
681 wxGridCellCoordsArray cells =
m_cur_grid->GetSelectedCells();
682 wxGridCellCoordsArray blockTopLeft =
m_cur_grid->GetSelectionBlockTopLeft();
683 wxGridCellCoordsArray blockBotRight =
m_cur_grid->GetSelectionBlockBottomRight();
686 for(
unsigned ii = 0; ii < cells.GetCount(); ii++ )
687 selectedRows.Add( cells[ii].GetRow() );
690 if( !blockTopLeft.IsEmpty() && !blockBotRight.IsEmpty() )
692 for(
int i = blockTopLeft[0].GetRow(); i <= blockBotRight[0].GetRow(); ++i )
693 selectedRows.Add( i );
697 if( selectedRows.size() == 0 &&
m_cur_grid->GetGridCursorRow() >= 0 )
698 selectedRows.Add(
m_cur_grid->GetGridCursorRow() );
700 if( selectedRows.size() == 0 )
706 std::sort( selectedRows.begin(), selectedRows.end() );
715 for(
int ii = selectedRows.GetCount() - 1; ii >= 0; ii-- )
717 int row = selectedRows[ii];
719 if( row != last_row )
726 if(
m_cur_grid->GetNumberRows() > 0 && curRow >= 0 )
742 boost::ptr_vector<LIB_TABLE_ROW>::auto_type move_me =
746 tbl->
m_rows.insert( tbl->
m_rows.begin() + curRow, move_me.release() );
751 wxGridTableMessage msg( tbl, wxGRIDTABLE_NOTIFY_ROWS_INSERTED, curRow, 0 );
752 tbl->GetView()->ProcessTableMessage( msg );
770 if(
unsigned( curRow + 1 ) < tbl->
m_rows.size() )
772 boost::ptr_vector<LIB_TABLE_ROW>::auto_type move_me =
776 tbl->
m_rows.insert( tbl->
m_rows.begin() + curRow, move_me.release() );
781 wxGridTableMessage msg( tbl, wxGRIDTABLE_NOTIFY_ROWS_INSERTED, curRow - 1, 0 );
782 tbl->GetView()->ProcessTableMessage( msg );
797 wxArrayInt selectedRows =
m_cur_grid->GetSelectedRows();
799 if( selectedRows.empty() &&
m_cur_grid->GetGridCursorRow() >= 0 )
800 selectedRows.push_back(
m_cur_grid->GetGridCursorRow() );
802 wxArrayInt rowsToMigrate;
806 for(
int row : selectedRows )
809 rowsToMigrate.push_back( row );
812 if( rowsToMigrate.size() <= 0 )
814 wxMessageBox( wxString::Format(
_(
"Select one or more rows containing libraries "
815 "to save as current KiCad format." ) ) );
820 if( rowsToMigrate.size() == 1 )
822 msg.Printf(
_(
"Save '%s' as current KiCad format "
823 "and replace entry in table?" ),
828 msg.Printf(
_(
"Save %d libraries as current KiCad format "
829 "and replace entries in table?" ),
830 (
int) rowsToMigrate.size() );
837 for(
int row : rowsToMigrate )
842 wxFileName legacyLib( resolvedPath );
844 if( !legacyLib.Exists() )
846 msg.Printf(
_(
"Library '%s' not found." ), relPath );
851 wxFileName newLib( resolvedPath );
853 newLib.SetName(
"" );
856 if( newLib.DirExists() )
858 msg.Printf(
_(
"Folder '%s' already exists. Do you want overwrite any existing design "
860 newLib.GetFullPath() );
862 switch( wxMessageBox( msg,
_(
"Migrate Library" ),
863 wxYES_NO | wxCANCEL | wxICON_QUESTION,
m_parent ) )
867 case wxCANCEL:
return;
872 std::unique_ptr<std::map<std::string, UTF8>> props(
876 newLib.GetFullPath() ) )
884 relPath = newLib.GetFullPath();
891 msg.Printf(
_(
"Failed to save design block library file '%s'." ),
892 newLib.GetFullPath() );
908 if( event.GetEventType() == wxEVT_BUTTON )
920 wxLogWarning( wxT(
"File type selection event received but could not find the file type "
938 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
942 wxFileDialog dlg( topLevelParent, title, openDir, wxEmptyString, fileDesc.
FileFilter(),
943 wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_MULTIPLE );
945 int result = dlg.ShowModal();
947 if( result == wxID_CANCEL )
950 dlg.GetPaths( files );
959 wxDirDialog dlg( topLevelParent, title, openDir,
960 wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST | wxDD_MULTIPLE );
962 int result = dlg.ShowModal();
964 if( result == wxID_CANCEL )
967 dlg.GetPaths( files );
969 if( !files.IsEmpty() )
971 wxFileName first( files.front() );
986 bool addDuplicates =
false;
987 bool applyToAll =
false;
988 wxString warning =
_(
"Warning: Duplicate Nicknames" );
989 wxString msg =
_(
"A library nicknamed '%s' already exists." );
990 wxString detailedMsg =
_(
"One of the nicknames will need to be changed after "
991 "adding this library." );
993 for(
const wxString& filePath : files )
995 wxFileName fn( filePath );
1003 if(
cur_model()->ContainsNickname( nickname ) )
1009 wxString::Format( msg, nickname ), detailedMsg,
1010 _(
"Skip" ),
_(
"Add Anyway" ), &applyToAll )
1014 doAdd = addDuplicates;
1019 int last_row =
m_cur_grid->GetNumberRows() - 1;
1031 if(
m_pageNdx == 0 &&
path.Contains( wxT(
"${KIPRJMOD}" ) ) )
1032 path = fn.GetFullPath();
1038 if( !files.IsEmpty() )
1040 int new_row =
m_cur_grid->GetNumberRows() - 1;
1098 wxRegEx re(
".*?(\\$\\{(.+?)\\})|(\\$\\((.+?)\\)).*?", wxRE_ADVANCED );
1099 wxASSERT( re.IsValid() );
1101 std::set<wxString> unique;
1111 for(
int row = 0; row < tbl->GetNumberRows(); ++row )
1113 wxString uri = tbl->GetValue( row,
COL_URI );
1115 while( re.Matches( uri ) )
1117 wxString envvar = re.GetMatch( uri, 2 );
1120 if( envvar.IsEmpty() )
1121 envvar = re.GetMatch( uri, 4 );
1124 unique.insert( envvar );
1127 uri.Replace( re.GetMatch( uri, 0 ), wxEmptyString );
1141 for(
const wxString& evName : unique )
1146 m_path_subs_grid->SetCellValue( row, 0, wxT(
"${" ) + evName + wxT(
"}" ) );
1150 wxGetEnv( evName, &evValue );
1179 projectTable =
nullptr;
1183 projectTable, projectTablePath,
1193 globalTable->
Save( globalTablePath );
1197 msg.Printf(
_(
"Error saving global library table:\n\n%s" ), ioe.
What() );
1198 wxMessageBox( msg,
_(
"File Save Error" ), wxOK | wxICON_ERROR );
1206 projectTable->
Save( projectTablePath );
1210 msg.Printf(
_(
"Error saving project-specific library table:\n\n%s" ), ioe.
What() );
1211 wxMessageBox( msg,
_(
"File Save Error" ), wxOK | wxICON_ERROR );
1215 std::string payload =
"";
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap)
void paste_text(const wxString &cb_text) override
handle specialized clipboard text, with leading "(design_block_lib_table", OR spreadsheet formatted t...
DIALOG_EDIT_LIBRARY_TABLES * m_dialog
void optionsEditor(int aRow) override
DESIGN_BLOCK_GRID_TRICKS(DIALOG_EDIT_LIBRARY_TABLES *aParent, WX_GRID *aGrid)
@ KICAD_SEXP
S-expression KiCad file format.
static const wxString ShowType(DESIGN_BLOCK_FILE_T aFileType)
static DESIGN_BLOCK_FILE_T GuessPluginTypeFromLibPath(const wxString &aLibPath, int aCtl=0)
static DESIGN_BLOCK_FILE_T EnumFromStr(const wxString &aFileType)
static bool ConvertLibrary(std::map< std::string, UTF8 > *aOldFileProps, const wxString &aOldFilePath, const wxString &aNewFilePath)
Convert a design block library to the latest KiCad format.
static DESIGN_BLOCK_IO * FindPlugin(DESIGN_BLOCK_FILE_T aFileType)
This class builds a wxGridTableBase by wrapping an DESIGN_BLOCK_LIB_TABLE object.
LIB_TABLE_ROW * at(size_t aIndex) override
void push_back(LIB_TABLE_ROW *aRow) override
DESIGN_BLOCK_LIB_TABLE_GRID(const DESIGN_BLOCK_LIB_TABLE &aTableToEdit)
LIB_TABLE_ROWS_ITER erase(LIB_TABLE_ROWS_ITER aFirst, LIB_TABLE_ROWS_ITER aLast) override
LIB_TABLE_ROW * makeNewRow() override
void SetValue(int aRow, int aCol, const wxString &aValue) override
LIB_TABLE_ROWS_ITER insert(LIB_TABLE_ROWS_ITER aIterator, LIB_TABLE_ROW *aRow) override
LIB_TABLE_ROWS_ITER begin() override
size_t size() const override
Hold a record identifying a library accessed by the appropriate design block library #PLUGIN object i...
static wxString GetGlobalTableFileName()
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 GlobalPathEnvVariableName()
Return the name of the environment variable used to hold the directory of locally installed "KiCad sp...
static DESIGN_BLOCK_LIB_TABLE & GetGlobalLibTable()
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.
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()
wxString m_lastDesignBlockLibDir
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
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.
Traverser implementation that looks to find any and all "folder" libraries by looking for files with ...
void GetPaths(wxArrayString &aPathArray)
virtual wxDirTraverseResult OnOpenError(const wxString &aOpenErrorName) override
std::unordered_map< wxString, int > m_failedDirs
void GetFailedPaths(wxArrayString &aPathArray)
bool HasDirectoryOpenFailures()
std::unordered_map< wxString, int > m_foundDirs
LIBRARY_TRAVERSER(std::vector< std::string > aSearchExtensions, wxString aInitialDir)
virtual wxDirTraverseResult OnDir(const wxString &aDirName) override
virtual wxDirTraverseResult OnFile(const wxString &aFileName) override
std::vector< std::string > m_searchExtensions
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.
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
void SetOptions(const wxString &aOptions)
Change the library options strings.
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.
void Save(const wxString &aFileName) const
Write this library table to aFileName in s-expression form.
Class PANEL_DESIGN_BLOCK_LIB_TABLE_BASE.
WX_GRID * m_path_subs_grid
STD_BITMAP_BUTTON * m_move_up_button
STD_BITMAP_BUTTON * m_delete_button
wxButton * m_migrate_libs_button
SPLIT_BUTTON * m_browseButton
STD_BITMAP_BUTTON * m_append_button
STD_BITMAP_BUTTON * m_move_down_button
Dialog to show and edit symbol library tables.
void moveUpHandler(wxCommandEvent &event) override
void onMigrateLibraries(wxCommandEvent &event) override
void adjustPathSubsGridColumns(int aWidth)
DESIGN_BLOCK_LIB_TABLE_GRID * project_model() const
bool TransferDataFromWindow() override
void browseLibrariesHandler(wxCommandEvent &event)
void populateEnvironReadOnlyTable()
Populate the readonly environment variable table with names and values by examining all the full_uri ...
DESIGN_BLOCK_LIB_TABLE_GRID * cur_model() const
DESIGN_BLOCK_LIB_TABLE * m_globalTable
std::map< DESIGN_BLOCK_IO_MGR::DESIGN_BLOCK_FILE_T, IO_BASE::IO_FILE_DESC > m_supportedDesignBlockFiles
void moveDownHandler(wxCommandEvent &event) override
PANEL_DESIGN_BLOCK_LIB_TABLE(DIALOG_EDIT_LIBRARY_TABLES *aParent, PROJECT *aProject, DESIGN_BLOCK_LIB_TABLE *aGlobalTable, const wxString &aGlobalTblPath, DESIGN_BLOCK_LIB_TABLE *aProjectTable, const wxString &aProjectTblPath, const wxString &aProjectBasePath)
DIALOG_EDIT_LIBRARY_TABLES * m_parent
void OnUpdateUI(wxUpdateUIEvent &event) override
wxString m_lastProjectLibDir
void appendRowHandler(wxCommandEvent &event) override
wxString m_projectBasePath
DESIGN_BLOCK_LIB_TABLE_GRID * global_model() const
DESIGN_BLOCK_LIB_TABLE * m_projectTable
void populatePluginList()
~PANEL_DESIGN_BLOCK_LIB_TABLE() override
void onSizeGrid(wxSizeEvent &event) override
void deleteRowHandler(wxCommandEvent &event) override
bool verifyTables()
Trim important fields, removes blank row entries, and checks for duplicates.
static wxString GetDefaultUserDesignBlocksPath()
Gets the default path we point users to create projects.
virtual ENV_VAR_MAP & GetLocalEnvVariables() const
virtual SETTINGS_MANAGER & GetSettingsManager() const
Container for project specific data.
virtual const wxString DesignBlockLibTblName() const
Return the path and file name of this projects design block library table.
virtual const wxString GetProjectPath() const
Return the full path of the project.
virtual DESIGN_BLOCK_LIB_TABLE * DesignBlockLibs()
Return the table of design block libraries.
virtual bool IsNullProject() const
Check if this project is a null project (i.e.
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.
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.
This file is part of the common library.
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.
Functions related to environment variables, including help functions.
static const std::string KiCadDesignBlockLibPathExtension
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
This file contains miscellaneous commonly used macros and functions.
KICOMMON_API wxString GetVersionedEnvVarName(const wxString &aBaseName)
Construct a versioned environment variable based on this KiCad major version.
void InvokeEditDesignBlockLibTable(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.
bool m_IsFile
Whether the library is a folder or a file.
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.
DESIGN_BLOCK_IO_MGR::DESIGN_BLOCK_FILE_T m_Plugin
wxString m_FolderSearchExtension
In case of folders it stands for extensions of files stored inside.
Definition of file extensions used in Kicad.