39#include <wx/filedlg.h>
48#include <lib_table_lexer.h>
101 return m_rows.insert( aIterator, aRow );
108 return m_rows.erase( aFirst, aLast );
118 void SetValue(
int aRow,
int aCol,
const wxString &aValue )
override
120 wxCHECK( aRow < (
int)
size(), );
161 wxString result = options;
162 std::map<std::string, UTF8> choices;
166 pi->GetLibraryOptions( &choices );
171 if( options != result )
184 size_t ndx = cb_text.find(
"(fp_lib_table" );
186 if( ndx != std::string::npos )
192 LIB_TABLE_LEXER lexer( &slr );
198 tmp_tbl.
Parse( &lexer );
212 for(
unsigned i = 0; i < tmp_tbl.
GetCount(); ++i )
216 m_grid->AutoSizeColumns(
false );
223 m_grid->AutoSizeColumns(
false );
228 bool toggleCell(
int aRow,
int aCol,
bool aPreserveSelection )
override
244 [&](
WX_GRID* aLocGrid,
int aCol )
246 int prevWidth = aLocGrid->GetColSize( aCol );
248 aLocGrid->AutoSizeColumn( aCol,
false );
249 aLocGrid->SetColSize( aCol, std::max( prevWidth, aLocGrid->GetColSize( aCol ) ) );
253 for(
int ii = 0; ii < aGrid->GetNumberRows(); ++ii )
254 aGrid->SetRowSize( ii, aGrid->GetDefaultRowSize() + 4 );
259 aGrid->SetSelectionMode( wxGrid::wxGridSelectRows );
261 wxGridCellAttr* attr;
263 attr =
new wxGridCellAttr;
265 if(
PCBNEW_SETTINGS* cfg = GetAppSettings<PCBNEW_SETTINGS>(
"pcbnew" ) )
271 auto* libTable = static_cast<FP_LIB_TABLE_GRID*>( grid->GetTable() );
272 auto* tableRow = static_cast<FP_LIB_TABLE_ROW*>( libTable->at( row ) );
273 PCB_IO_MGR::PCB_FILE_T fileType = tableRow->GetFileType();
274 const IO_BASE::IO_FILE_DESC& pluginDesc = m_supportedFpFiles.at( fileType );
276 if( pluginDesc.m_IsFile )
277 return pluginDesc.FileFilter();
279 return wxEmptyString;
283 aGrid->SetColAttr(
COL_URI, attr );
285 attr =
new wxGridCellAttr;
287 aGrid->SetColAttr(
COL_TYPE, attr );
289 attr =
new wxGridCellAttr;
290 attr->SetRenderer(
new wxGridCellBoolRenderer() );
294 attr =
new wxGridCellAttr;
295 attr->SetRenderer(
new wxGridCellBoolRenderer() );
311 if( aGrid->GetNumberRows() > 0 )
312 aGrid->SelectRow( 0 );
317 FP_LIB_TABLE* aGlobalTable,
const wxString& aGlobalTblPath,
318 FP_LIB_TABLE* aProjectTable,
const wxString& aProjectTblPath,
319 const wxString& aProjectBasePath ) :
321 m_globalTable( aGlobalTable ),
322 m_projectTable( aProjectTable ),
323 m_project( aProject ),
324 m_projectBasePath( aProjectBasePath ),
337 if(
PCBNEW_SETTINGS* cfg = GetAppSettings<PCBNEW_SETTINGS>(
"pcbnew" ) )
339 if( cfg->m_LastFootprintLibDir.IsEmpty() )
390 auto joinExts = [](
const std::vector<std::string>& aExts )
393 for(
const std::string& ext : aExts )
395 if( !joined.empty() )
396 joined << wxS(
", " );
398 joined << wxS(
"*." ) << ext;
408 if( desc.m_IsFile && !desc.m_FileExtensions.empty() )
410 entryStr << wxString::Format( wxS(
" (%s)" ), joinExts( desc.m_FileExtensions ) );
412 else if( !desc.m_IsFile && !desc.m_ExtensionsInDir.empty() )
414 wxString midPart = wxString::Format(
_(
"folder with %s files" ),
415 joinExts( desc.m_ExtensionsInDir ) );
417 entryStr << wxString::Format( wxS(
" (%s)" ), midPart );
420 browseMenu->Append( type, entryStr );
476 for(
int r = 0; r < model->GetNumberRows(); )
478 wxString nick = model->GetValue( r,
COL_NICKNAME ).Trim(
false ).Trim();
479 wxString uri = model->GetValue( r,
COL_URI ).Trim(
false ).Trim();
480 unsigned illegalCh = 0;
485 msg =
_(
"A library table row nickname and path cells are empty." );
487 msg =
_(
"A library table row nickname cell is empty." );
489 msg =
_(
"A library table row path cell is empty." );
491 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
493 wxMessageDialog badCellDlg( topLevelParent, msg,
_(
"Invalid Row Definition" ),
494 wxYES_NO | wxCENTER | wxICON_QUESTION | wxYES_DEFAULT );
495 badCellDlg.SetExtendedMessage(
_(
"Empty cells will result in all rows that are "
496 "invalid to be removed from the table." ) );
497 badCellDlg.SetYesNoLabels( wxMessageDialog::ButtonLabel(
_(
"Remove Invalid Cells" ) ),
498 wxMessageDialog::ButtonLabel(
_(
"Cancel Table Update" ) ) );
500 if( badCellDlg.ShowModal() == wxID_NO )
507 model->DeleteRows( r, 1 );
511 msg = wxString::Format(
_(
"Illegal character '%c' in nickname '%s'." ),
522 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
524 wxMessageDialog errdlg( topLevelParent, msg,
_(
"Library Nickname Error" ) );
532 model->SetValue( r,
COL_URI, uri );
548 for(
int r1 = 0; r1 < model->GetNumberRows() - 1; ++r1 )
552 for(
int r2 = r1 + 1; r2 < model->GetNumberRows(); ++r2 )
558 msg = wxString::Format(
_(
"Multiple libraries cannot share the same nickname ('%s')." ),
569 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
571 wxMessageDialog errdlg( topLevelParent, msg,
_(
"Library Nickname Error" ) );
591 [&]() -> std::pair<int, int>
614 wxArrayInt selectedRows =
m_cur_grid->GetSelectedRows();
615 wxGridCellCoordsArray cells =
m_cur_grid->GetSelectedCells();
616 wxGridCellCoordsArray blockTopLeft =
m_cur_grid->GetSelectionBlockTopLeft();
617 wxGridCellCoordsArray blockBotRight =
m_cur_grid->GetSelectionBlockBottomRight();
620 for(
unsigned ii = 0; ii < cells.GetCount(); ii++ )
621 selectedRows.Add( cells[ii].GetRow() );
624 if( !blockTopLeft.IsEmpty() && !blockBotRight.IsEmpty() )
626 for(
int i = blockTopLeft[0].GetRow(); i <= blockBotRight[0].GetRow(); ++i )
627 selectedRows.Add( i );
631 if( selectedRows.size() == 0 &&
m_cur_grid->GetGridCursorRow() >= 0 )
632 selectedRows.Add(
m_cur_grid->GetGridCursorRow() );
634 if( selectedRows.size() == 0 )
640 std::sort( selectedRows.begin(), selectedRows.end() );
649 for(
int ii = selectedRows.GetCount()-1; ii >= 0; ii-- )
651 int row = selectedRows[ii];
653 if( row != last_row )
660 if(
m_cur_grid->GetNumberRows() > 0 && curRow >= 0 )
671 boost::ptr_vector<LIB_TABLE_ROW>::auto_type move_me = tbl->
m_rows.release( tbl->
m_rows.begin() + row );
673 tbl->
m_rows.insert( tbl->
m_rows.begin() + row - 1, move_me.release() );
676 wxGridTableMessage msg( tbl, wxGRIDTABLE_NOTIFY_ROWS_INSERTED, row - 1, 0 );
677 tbl->GetView()->ProcessTableMessage( msg );
688 boost::ptr_vector<LIB_TABLE_ROW>::auto_type move_me = tbl->
m_rows.release( tbl->
m_rows.begin() + row );
690 tbl->
m_rows.insert( tbl->
m_rows.begin() + row + 1, move_me.release() );
693 wxGridTableMessage msg( tbl, wxGRIDTABLE_NOTIFY_ROWS_INSERTED, row, 0 );
694 tbl->GetView()->ProcessTableMessage( msg );
705 wxArrayInt selectedRows =
m_cur_grid->GetSelectedRows();
707 if( selectedRows.empty() &&
m_cur_grid->GetGridCursorRow() >= 0 )
708 selectedRows.push_back(
m_cur_grid->GetGridCursorRow() );
710 wxArrayInt rowsToMigrate;
715 for(
int row : selectedRows )
718 rowsToMigrate.push_back( row );
721 if( rowsToMigrate.size() <= 0 )
723 wxMessageBox( wxString::Format(
_(
"Select one or more rows containing libraries "
724 "to save as current KiCad format." ) ) );
729 if( rowsToMigrate.size() == 1 )
731 msg.Printf(
_(
"Save '%s' as current KiCad format and replace entry in table?" ),
736 msg.Printf(
_(
"Save %d libraries as current KiCad format and replace entries in table?" ),
737 (
int) rowsToMigrate.size() );
744 for(
int row : rowsToMigrate )
748 wxFileName legacyLib( resolvedPath );
750 if( !legacyLib.Exists() )
752 msg.Printf(
_(
"Library '%s' not found." ), relPath );
757 wxFileName newLib( resolvedPath );
759 newLib.SetName(
"" );
762 if( newLib.DirExists() )
764 msg.Printf(
_(
"Folder '%s' already exists. Do you want overwrite any existing footprints?" ),
765 newLib.GetFullPath() );
767 switch( wxMessageBox( msg,
_(
"Migrate Library" ), wxYES_NO|wxCANCEL|wxICON_QUESTION,
m_parent ) )
771 case wxCANCEL:
return;
786 relPath = newLib.GetFullPath();
793 msg.Printf(
_(
"Failed to save footprint library file '%s'." ), newLib.GetFullPath() );
815 if( event.GetEventType() == wxEVT_BUTTON )
827 wxLogWarning( wxT(
"File type selection event received but could not find the file type in the table" ) );
845 wxWindow* topLevelParent = wxGetTopLevelParent(
this );
849 wxFileDialog dlg( topLevelParent, title, *lastDir, wxEmptyString, fileDesc.
FileFilter(),
850 wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_MULTIPLE );
852 if( dlg.ShowModal() == wxID_CANCEL )
855 dlg.GetPaths( files );
856 *lastDir = dlg.GetDirectory();
860 wxDirDialog dlg( topLevelParent, title, *lastDir,
861 wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST | wxDD_MULTIPLE );
863 if( dlg.ShowModal() == wxID_CANCEL )
866 dlg.GetPaths( files );
868 if( !files.IsEmpty() )
870 wxFileName first( files.front() );
871 *lastDir = first.GetPath();
880 bool addDuplicates =
false;
881 bool applyToAll =
false;
882 wxString warning =
_(
"Warning: Duplicate Nicknames" );
883 wxString msg =
_(
"A library nicknamed '%s' already exists." );
884 wxString detailedMsg =
_(
"One of the nicknames will need to be changed after "
885 "adding this library." );
887 for(
const wxString& filePath : files )
889 wxFileName fn( filePath );
899 if(
cur_model()->ContainsNickname( nickname ) )
905 wxString::Format( msg, nickname ),
906 detailedMsg,
_(
"Skip" ),
_(
"Add Anyway" ),
907 &applyToAll ) == wxID_CANCEL;
910 doAdd = addDuplicates;
915 int last_row =
m_cur_grid->GetNumberRows() - 1;
926 if(
m_pageNdx == 0 &&
path.Contains( wxT(
"${KIPRJMOD}" ) ) )
927 path = fn.GetFullPath();
933 if( !files.IsEmpty() )
935 int new_row =
m_cur_grid->GetNumberRows() - 1;
968 !
IsOK(
this, wxString::Format(
_(
"This action will reset your global library table on "
969 "disk and cannot be undone." ) ) ) )
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 );
1083 for(
const wxString& evName : unique )
1088 m_path_subs_grid->SetCellValue( row, 0, wxT(
"${" ) + evName + wxT(
"}" ) );
1092 wxGetEnv( evName, &evValue );
1120 projectTable =
nullptr;
1123 projectTable, projectTablePath,
1133 globalTable->
Save( globalTablePath );
1137 msg.Printf(
_(
"Error saving global library table:\n\n%s" ), ioe.
What() );
1138 wxMessageBox( msg,
_(
"File Save Error" ), wxOK | wxICON_ERROR );
1146 projectTable->
Save( projectTablePath );
1150 msg.Printf(
_(
"Error saving project-specific library table:\n\n%s" ), ioe.
What() );
1151 wxMessageBox( msg,
_(
"File Save Error" ), wxOK | wxICON_ERROR );
1155 std::string payload =
"";
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
bool m_ProjectTableChanged
void InstallPanel(wxPanel *aPanel)
void ShowInfoBarError(const wxString &aErrorMsg, bool aShowCloseButton=false, WX_INFOBAR::MESSAGE_TYPE aType=WX_INFOBAR::MESSAGE_TYPE::GENERIC)
bool m_GlobalTableChanged
Class DIALOG_HTML_REPORTER.
WX_HTML_REPORT_BOX * m_Reporter
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.
void paste_text(const wxString &cb_text) override
handle specialized clipboard text, with leading "(fp_lib_table", OR spreadsheet formatted text.
DIALOG_EDIT_LIBRARY_TABLES * m_dialog
FP_GRID_TRICKS(DIALOG_EDIT_LIBRARY_TABLES *aParent, WX_GRID *aGrid)
void optionsEditor(int aRow) override
bool toggleCell(int aRow, int aCol, bool aPreserveSelection) override
This class builds a wxGridTableBase by wrapping an FP_LIB_TABLE object.
size_t size() const override
FP_LIB_TABLE_GRID(const FP_LIB_TABLE &aTableToEdit)
void SetValue(int aRow, int aCol, const wxString &aValue) override
LIB_TABLE_ROWS_ITER begin() override
LIB_TABLE_ROWS_ITER erase(LIB_TABLE_ROWS_ITER aFirst, LIB_TABLE_ROWS_ITER aLast) override
LIB_TABLE_ROW * makeNewRow() override
LIB_TABLE_ROW * at(size_t aIndex) override
void push_back(LIB_TABLE_ROW *aRow) override
LIB_TABLE_ROWS_ITER insert(LIB_TABLE_ROWS_ITER aIterator, LIB_TABLE_ROW *aRow) override
Hold a record identifying a library accessed by the appropriate footprint library #PLUGIN object in t...
static const wxString GlobalPathEnvVariableName()
Return the name of the environment variable used to hold the directory of locally installed "KiCad sp...
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 wxString GetGlobalTableFileName()
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.
virtual bool toggleCell(int aRow, int aCol, bool aPreserveSelection=false)
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 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.
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_FP_LIB_TABLE_BASE.
STD_BITMAP_BUTTON * m_move_up_button
WX_GRID * m_path_subs_grid
STD_BITMAP_BUTTON * m_append_button
STD_BITMAP_BUTTON * m_move_down_button
STD_BITMAP_BUTTON * m_delete_button
SPLIT_BUTTON * m_browseButton
Dialog to show and edit symbol library tables.
FP_LIB_TABLE * m_globalTable
bool verifyTables()
Trim important fields, removes blank row entries, and checks for duplicates.
std::map< PCB_IO_MGR::PCB_FILE_T, IO_BASE::IO_FILE_DESC > m_supportedFpFiles
void onSizeGrid(wxSizeEvent &event) override
void moveUpHandler(wxCommandEvent &event) override
void adjustPathSubsGridColumns(int aWidth)
FP_LIB_TABLE_GRID * cur_model() const
FP_LIB_TABLE_GRID * project_model() const
void moveDownHandler(wxCommandEvent &event) override
wxArrayString m_pluginChoices
void setupGrid(WX_GRID *aGrid)
FP_LIB_TABLE_GRID * global_model() const
wxString m_lastProjectLibDir
void populateEnvironReadOnlyTable()
Populate the readonly environment variable table with names and values by examining all the full_uri ...
~PANEL_FP_LIB_TABLE() override
FP_LIB_TABLE * m_projectTable
void deleteRowHandler(wxCommandEvent &event) override
void populatePluginList()
void onReset(wxCommandEvent &event) override
void onMigrateLibraries(wxCommandEvent &event) override
void browseLibrariesHandler(wxCommandEvent &event)
bool TransferDataFromWindow() override
PANEL_FP_LIB_TABLE(DIALOG_EDIT_LIBRARY_TABLES *aParent, PROJECT *aProject, FP_LIB_TABLE *aGlobalTable, const wxString &aGlobalTblPath, FP_LIB_TABLE *aProjectTable, const wxString &aProjectTblPath, const wxString &aProjectBasePath)
wxString m_projectBasePath
DIALOG_EDIT_LIBRARY_TABLES * m_parent
void OnUpdateUI(wxUpdateUIEvent &event) override
void onPageChange(wxBookCtrlEvent &event) override
void appendRowHandler(wxCommandEvent &event) override
static wxString GetDefaultUserFootprintsPath()
Gets the default path we point users to create projects.
wxString m_LastFootprintLibDir
static PLUGIN_REGISTRY * Instance()
static PCB_IO * PluginFind(PCB_FILE_T aFileType)
Return a #PLUGIN which the caller can use to import, export, save, or load design documents.
static PCB_FILE_T EnumFromStr(const wxString &aFileType)
Return the PCB_FILE_T from the corresponding plugin type name: "kicad", "legacy", etc.
PCB_FILE_T
The set of file types that the PCB_IO_MGR knows about, and for which there has been a plugin written,...
@ KICAD_SEXP
S-expression Pcbnew file format.
static bool ConvertLibrary(std::map< std::string, UTF8 > *aOldFileProps, const wxString &aOldFilePath, const wxString &aNewFilePath, REPORTER *aReporter)
Convert a schematic symbol library to the latest KiCad format.
static PCB_FILE_T GuessPluginTypeFromLibPath(const wxString &aLibPath, int aCtl=0)
Return a plugin type given a footprint library's libPath.
static const wxString ShowType(PCB_FILE_T aFileType)
Return a brief name for a plugin given aFileType enum.
virtual ENV_VAR_MAP & GetLocalEnvVariables() const
static FP_LIB_TABLE * PcbFootprintLibs(PROJECT *aProject)
Return the table of footprint libraries without Kiway.
Container for project specific data.
virtual const wxString GetProjectPath() const
Return the full path of the project.
virtual const wxString FootprintLibTblName() const
Returns the path and filename of this project's footprint library table.
virtual bool IsNullProject() const
Check if this project is a null project (i.e.
Is a LINE_READER that reads from a multiline 8 bit wide std::string.
void OnMoveRowUp(const std::function< void(int row)> &aMover)
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 OnMoveRowDown(const std::function< void(int row)> &aMover)
void OnAddRow(const std::function< std::pair< int, int >()> &aAdder)
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.
void Flush()
Build the HTML messages page.
bool HasMessage() const override
Returns true if the reporter client is non-empty.
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 DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
This file is part of the common library.
FP_LIB_TABLE GFootprintTable
The global footprint library table.
Declaration of the eda_3d_viewer class.
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 KiCadFootprintLibPathExtension
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 InvokePcbLibTableEditor(KIWAY *aKiway, wxWindow *aCaller)
Function InvokePcbLibTableEditor shows the modal DIALOG_FP_LIB_TABLE for purposes of editing the glob...
PGM_BASE & Pgm()
The global program "get" accessor.
#define PROJECT_VAR_NAME
A variable name whose value holds the current project directory.
std::vector< FAB_LAYER_COLOR > dummy
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,...
Definition of file extensions used in Kicad.