Strip out and migrate 3d search paths in favor of env vars

This mainly stops reading/writing 3dresolver.cfg
We still keep some sillyness for kicad2step for now

Fixes https://gitlab.com/kicad/code/kicad/-/issues/9164
This commit is contained in:
Marek Roszko 2022-09-25 21:08:51 -04:00
parent 76a7a2b4bc
commit 8e96751af2
12 changed files with 281 additions and 1004 deletions

View File

@ -45,7 +45,7 @@ bool S3D::Select3DModel( wxWindow* aParent, S3D_CACHE* aCache, wxString& prevMod
bool S3D::Configure3DPaths( wxWindow* aParent, FILENAME_RESOLVER* aResolver )
{
DIALOG_CONFIGURE_PATHS dlg( aParent, aResolver );
DIALOG_CONFIGURE_PATHS dlg( aParent );
// Use QuasiModal so that HTML help window will work
return( dlg.ShowQuasiModal() == wxID_OK );

View File

@ -54,12 +54,11 @@ enum SEARCH_PATH_GRID_COLUMNS
};
DIALOG_CONFIGURE_PATHS::DIALOG_CONFIGURE_PATHS( wxWindow* aParent, FILENAME_RESOLVER* aResolver ) :
DIALOG_CONFIGURE_PATHS::DIALOG_CONFIGURE_PATHS( wxWindow* aParent ) :
DIALOG_CONFIGURE_PATHS_BASE( aParent ),
m_errorGrid( nullptr ),
m_errorRow( -1 ),
m_errorCol( -1 ),
m_resolver( aResolver ),
m_gridWidth( 0 ),
m_gridWidthsDirty( true ),
m_helpBox( nullptr ),
@ -67,10 +66,6 @@ DIALOG_CONFIGURE_PATHS::DIALOG_CONFIGURE_PATHS( wxWindow* aParent, FILENAME_RESO
{
m_btnAddEnvVar->SetBitmap( KiBitmap( BITMAPS::small_plus ) );
m_btnDeleteEnvVar->SetBitmap( KiBitmap( BITMAPS::small_trash ) );
m_btnAddSearchPath->SetBitmap( KiBitmap( BITMAPS::small_plus ) );
m_btnDeleteSearchPath->SetBitmap( KiBitmap( BITMAPS::small_trash ) );
m_btnMoveUp->SetBitmap( KiBitmap( BITMAPS::small_up ) );
m_btnMoveDown->SetBitmap( KiBitmap( BITMAPS::small_down ) );
m_EnvVars->ClearRows();
m_EnvVars->AppendCols( 1 ); // for the isExternal flags
@ -81,39 +76,16 @@ DIALOG_CONFIGURE_PATHS::DIALOG_CONFIGURE_PATHS( wxWindow* aParent, FILENAME_RESO
attr->SetEditor( new GRID_CELL_PATH_EDITOR( this, m_EnvVars, &m_curdir, wxEmptyString ) );
m_EnvVars->SetColAttr( TV_VALUE_COL, attr );
attr = new wxGridCellAttr;
attr->SetEditor( new GRID_CELL_PATH_EDITOR( this, m_SearchPaths, &m_curdir, wxEmptyString ) );
m_SearchPaths->SetColAttr( TV_VALUE_COL, attr );
// Give a bit more room for combobox editors
m_EnvVars->SetDefaultRowSize( m_EnvVars->GetDefaultRowSize() + 4 );
m_SearchPaths->SetDefaultRowSize( m_SearchPaths->GetDefaultRowSize() + 4 );
m_EnvVars->PushEventHandler( new GRID_TRICKS( m_EnvVars,
[this]( wxCommandEvent& aEvent )
{
OnAddEnvVar( aEvent );
} ) );
m_SearchPaths->PushEventHandler( new GRID_TRICKS( m_SearchPaths,
[this]( wxCommandEvent& aEvent )
{
OnAddSearchPath( aEvent );
} ) );
m_EnvVars->SetSelectionMode( wxGrid::wxGridSelectionModes::wxGridSelectRows );
m_SearchPaths->SetSelectionMode( wxGrid::wxGridSelectionModes::wxGridSelectRows );
if( m_resolver )
{
m_SearchPaths->ClearRows();
m_SearchPaths->UseNativeColHeader( true );
// prohibit these characters in the alias names: []{}()%~<>"='`;:.,&?/\|$
m_aliasValidator.SetStyle( wxFILTER_EXCLUDE_CHAR_LIST );
m_aliasValidator.SetCharExcludes( wxT( "{}[]()%~<>\"='`;:.,&?/\\|$" ) );
}
else
m_sb3DSearchPaths->Show( false );
SetInitialFocus( m_EnvVars );
SetupStandardButtons();
@ -122,9 +94,6 @@ DIALOG_CONFIGURE_PATHS::DIALOG_CONFIGURE_PATHS( wxWindow* aParent, FILENAME_RESO
m_EnvVars->Connect( wxEVT_GRID_CELL_CHANGING,
wxGridEventHandler( DIALOG_CONFIGURE_PATHS::OnGridCellChanging ),
nullptr, this );
m_SearchPaths->Connect( wxEVT_GRID_CELL_CHANGING,
wxGridEventHandler( DIALOG_CONFIGURE_PATHS::OnGridCellChanging ),
nullptr, this );
GetSizer()->SetSizeHints( this );
Centre();
@ -134,15 +103,11 @@ DIALOG_CONFIGURE_PATHS::DIALOG_CONFIGURE_PATHS( wxWindow* aParent, FILENAME_RESO
DIALOG_CONFIGURE_PATHS::~DIALOG_CONFIGURE_PATHS()
{
// Delete the GRID_TRICKS.
m_SearchPaths->PopEventHandler( true );
m_EnvVars->PopEventHandler( true );
m_EnvVars->Disconnect( wxEVT_GRID_CELL_CHANGING,
wxGridEventHandler( DIALOG_CONFIGURE_PATHS::OnGridCellChanging ),
nullptr, this );
m_SearchPaths->Disconnect( wxEVT_GRID_CELL_CHANGING,
wxGridEventHandler( DIALOG_CONFIGURE_PATHS::OnGridCellChanging ),
nullptr, this );
}
@ -151,26 +116,6 @@ bool DIALOG_CONFIGURE_PATHS::TransferDataToWindow()
if( !wxDialog::TransferDataToWindow() )
return false;
// Do 3D search paths first so they get first crack at setting m_curdir
if( m_resolver )
{
const std::list<SEARCH_PATH>* paths = m_resolver->GetPaths();
for( auto it = paths->begin(); it != paths->end(); ++it )
{
if ( !( *it ).m_Alias.StartsWith( "${" ) && !( *it ).m_Alias.StartsWith( "$(" ) )
{
AppendSearchPath( it->m_Alias, it->m_Pathvar, it->m_Description );
if( m_curdir.IsEmpty() )
m_curdir = it->m_Pathexp;
}
}
}
// Environment variables
const ENV_VAR_MAP& envVars = Pgm().GetLocalEnvVariables();
for( auto it = envVars.begin(); it != envVars.end(); ++it )
@ -213,29 +158,9 @@ void DIALOG_CONFIGURE_PATHS::AppendEnvVar( const wxString& aName, const wxString
}
void DIALOG_CONFIGURE_PATHS::AppendSearchPath( const wxString& aName, const wxString& aPath,
const wxString& aDescription )
{
int i = m_SearchPaths->GetNumberRows();
m_SearchPaths->AppendRows( 1 );
m_SearchPaths->SetCellValue( i, SP_ALIAS_COL, aName );
wxGridCellAttr* nameCellAttr = m_SearchPaths->GetOrCreateCellAttr( i, SP_ALIAS_COL );
wxGridCellTextEditor* nameTextEditor = new GRID_CELL_TEXT_EDITOR();
nameTextEditor->SetValidator( m_aliasValidator );
nameCellAttr->SetEditor( nameTextEditor );
nameCellAttr->DecRef();
m_SearchPaths->SetCellValue( i, SP_PATH_COL, aPath );
m_SearchPaths->SetCellValue( i, SP_DESC_COL, aDescription );
}
bool DIALOG_CONFIGURE_PATHS::TransferDataFromWindow()
{
if( !m_EnvVars->CommitPendingChanges() || !m_SearchPaths->CommitPendingChanges() )
if( !m_EnvVars->CommitPendingChanges() )
return false;
if( !wxDialog::TransferDataFromWindow() )
@ -301,43 +226,6 @@ bool DIALOG_CONFIGURE_PATHS::TransferDataFromWindow()
Pgm().SetLocalEnvVariables();
// 3D search paths
if( m_resolver )
{
std::vector<SEARCH_PATH> alist;
SEARCH_PATH alias;
for( int row = 0; row < m_SearchPaths->GetNumberRows(); ++row )
{
alias.m_Alias = m_SearchPaths->GetCellValue( row, SP_ALIAS_COL );
alias.m_Pathvar = m_SearchPaths->GetCellValue( row, SP_PATH_COL );
alias.m_Description = m_SearchPaths->GetCellValue( row, SP_DESC_COL );
if( alias.m_Alias.IsEmpty() )
{
m_errorGrid = m_SearchPaths;
m_errorRow = row;
m_errorCol = SP_ALIAS_COL;
m_errorMsg = _( "3D search path alias cannot be empty." );
return false;
}
else if( alias.m_Pathvar.IsEmpty() )
{
m_errorGrid = m_SearchPaths;
m_errorRow = row;
m_errorCol = SP_PATH_COL;
m_errorMsg = _( "3D search path cannot be empty." );
return false;
}
alist.push_back( alias );
}
if( !m_resolver->UpdatePathList( alist ) )
return false;
}
return true;
}
@ -426,21 +314,6 @@ void DIALOG_CONFIGURE_PATHS::OnAddEnvVar( wxCommandEvent& event )
}
void DIALOG_CONFIGURE_PATHS::OnAddSearchPath( wxCommandEvent& event )
{
if( !m_SearchPaths->CommitPendingChanges() )
return;
AppendSearchPath( wxEmptyString, wxEmptyString, wxEmptyString);
m_SearchPaths->MakeCellVisible( m_SearchPaths->GetNumberRows() - 1, SP_ALIAS_COL );
m_SearchPaths->SetGridCursor( m_SearchPaths->GetNumberRows() - 1, SP_ALIAS_COL );
m_SearchPaths->EnableCellEditControl( true );
m_SearchPaths->ShowCellEditControl();
}
void DIALOG_CONFIGURE_PATHS::OnRemoveEnvVar( wxCommandEvent& event )
{
int curRow = m_EnvVars->GetGridCursorRow();
@ -463,115 +336,6 @@ void DIALOG_CONFIGURE_PATHS::OnRemoveEnvVar( wxCommandEvent& event )
}
void DIALOG_CONFIGURE_PATHS::OnDeleteSearchPath( wxCommandEvent& event )
{
wxArrayInt selectedRows = m_SearchPaths->GetSelectedRows();
if( selectedRows.empty() && m_SearchPaths->GetGridCursorRow() >= 0 )
selectedRows.push_back( m_SearchPaths->GetGridCursorRow() );
if( selectedRows.empty() )
return;
m_SearchPaths->CommitPendingChanges( true /* silent mode; we don't care if it's valid */ );
// Reverse sort so deleting a row doesn't change the indexes of the other rows.
selectedRows.Sort( []( int* first, int* second ) { return *second - *first; } );
for( int row : selectedRows )
{
m_SearchPaths->DeleteRows( row, 1 );
// if there are still rows in grid, make previous row visible
if( m_SearchPaths->GetNumberRows() )
{
m_SearchPaths->MakeCellVisible( std::max( 0, row-1 ),
m_SearchPaths->GetGridCursorCol() );
m_SearchPaths->SetGridCursor( std::max( 0, row-1 ),
m_SearchPaths->GetGridCursorCol() );
}
}
}
void DIALOG_CONFIGURE_PATHS::OnSearchPathMoveUp( wxCommandEvent& event )
{
if( !m_SearchPaths->CommitPendingChanges() )
return;
int curRow = m_SearchPaths->GetGridCursorRow();
int prevRow = curRow - 1;
if( curRow > 0 )
{
for( int i = 0; i < m_SearchPaths->GetNumberCols(); ++i )
{
wxString tmp = m_SearchPaths->GetCellValue( curRow, i );
m_SearchPaths->SetCellValue( curRow, i, m_SearchPaths->GetCellValue( prevRow, i ) );
m_SearchPaths->SetCellValue( prevRow, i, tmp );
}
m_SearchPaths->SetGridCursor( prevRow, m_SearchPaths->GetGridCursorCol() );
}
else
{
wxBell();
}
}
void DIALOG_CONFIGURE_PATHS::OnSearchPathMoveDown( wxCommandEvent& event )
{
if( !m_SearchPaths->CommitPendingChanges() )
return;
int curRow = m_SearchPaths->GetGridCursorRow();
int nextRow = curRow + 1;
if( curRow < m_SearchPaths->GetNumberRows() - 1 )
{
for( int i = 0; i < m_SearchPaths->GetNumberCols(); ++i )
{
wxString tmp = m_SearchPaths->GetCellValue( curRow, i );
m_SearchPaths->SetCellValue( curRow, i, m_SearchPaths->GetCellValue( nextRow, i ) );
m_SearchPaths->SetCellValue( nextRow, i, tmp );
}
m_SearchPaths->SetGridCursor( nextRow, m_SearchPaths->GetGridCursorCol() );
}
else
{
wxBell();
}
}
void DIALOG_CONFIGURE_PATHS::OnGridCellRightClick( wxGridEvent& aEvent )
{
wxASSERT((int) TV_VALUE_COL == (int) SP_PATH_COL );
if( aEvent.GetCol() == TV_VALUE_COL )
{
wxMenu menu;
AddMenuItem( &menu, 1, _( "File Browser..." ), KiBitmap( BITMAPS::small_folder ) );
if( GetPopupMenuSelectionFromUser( menu ) == 1 )
{
wxDirDialog dlg( nullptr, _( "Select Path" ), m_curdir,
wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST );
if( dlg.ShowModal() == wxID_OK )
{
wxGrid* grid = dynamic_cast<wxGrid*>( aEvent.GetEventObject() );
grid->SetCellValue( aEvent.GetRow(), TV_VALUE_COL, dlg.GetPath() );
m_curdir = dlg.GetPath();
}
}
}
}
void DIALOG_CONFIGURE_PATHS::OnUpdateUI( wxUpdateUIEvent& event )
{
if( m_gridWidthsDirty )
@ -583,19 +347,6 @@ void DIALOG_CONFIGURE_PATHS::OnUpdateUI( wxUpdateUIEvent& event )
m_EnvVars->SetColSize( TV_VALUE_COL, width - m_EnvVars->GetColSize( TV_NAME_COL ) );
width = m_SearchPaths->GetClientRect().GetWidth();
m_SearchPaths->AutoSizeColumn( SP_ALIAS_COL );
m_SearchPaths->SetColSize( SP_ALIAS_COL,
std::max( m_SearchPaths->GetColSize( SP_ALIAS_COL ), 120 ) );
m_SearchPaths->AutoSizeColumn( SP_PATH_COL );
m_SearchPaths->SetColSize( SP_PATH_COL,
std::max( m_SearchPaths->GetColSize( SP_PATH_COL ), 300 ) );
m_SearchPaths->SetColSize( SP_DESC_COL, width -
( m_SearchPaths->GetColSize( SP_ALIAS_COL ) +
m_SearchPaths->GetColSize( SP_PATH_COL ) ) );
m_gridWidth = m_EnvVars->GetSize().GetX();
m_gridWidthsDirty = false;
}

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version 3.9.0 Jul 27 2020)
// C++ code generated with wxFormBuilder (version 3.10.1-0-g8feb16b3)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
@ -35,9 +35,9 @@ DIALOG_CONFIGURE_PATHS_BASE::DIALOG_CONFIGURE_PATHS_BASE( wxWindow* parent, wxWi
m_EnvVars->SetColSize( 1, 454 );
m_EnvVars->EnableDragColMove( false );
m_EnvVars->EnableDragColSize( true );
m_EnvVars->SetColLabelSize( 22 );
m_EnvVars->SetColLabelValue( 0, _("Name") );
m_EnvVars->SetColLabelValue( 1, _("Path") );
m_EnvVars->SetColLabelSize( 22 );
m_EnvVars->SetColLabelAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
// Rows
@ -71,67 +71,6 @@ DIALOG_CONFIGURE_PATHS_BASE::DIALOG_CONFIGURE_PATHS_BASE( wxWindow* parent, wxWi
bSizerMain->Add( sbEnvVars, 1, wxEXPAND|wxALL, 5 );
m_sb3DSearchPaths = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("3D Search Paths") ), wxVERTICAL );
m_SearchPaths = new WX_GRID( m_sb3DSearchPaths->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
// Grid
m_SearchPaths->CreateGrid( 1, 3 );
m_SearchPaths->EnableEditing( true );
m_SearchPaths->EnableGridLines( true );
m_SearchPaths->EnableDragGridSize( false );
m_SearchPaths->SetMargins( 0, 0 );
// Columns
m_SearchPaths->SetColSize( 0, 150 );
m_SearchPaths->SetColSize( 1, 300 );
m_SearchPaths->SetColSize( 2, 154 );
m_SearchPaths->EnableDragColMove( false );
m_SearchPaths->EnableDragColSize( true );
m_SearchPaths->SetColLabelSize( 22 );
m_SearchPaths->SetColLabelValue( 0, _("Alias") );
m_SearchPaths->SetColLabelValue( 1, _("Path") );
m_SearchPaths->SetColLabelValue( 2, _("Description") );
m_SearchPaths->SetColLabelAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
// Rows
m_SearchPaths->AutoSizeRows();
m_SearchPaths->EnableDragRowSize( false );
m_SearchPaths->SetRowLabelSize( 0 );
m_SearchPaths->SetRowLabelAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
// Label Appearance
// Cell Defaults
m_SearchPaths->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP );
m_SearchPaths->SetMinSize( wxSize( 604,150 ) );
m_sb3DSearchPaths->Add( m_SearchPaths, 1, wxALL|wxEXPAND, 5 );
wxBoxSizer* bSizerSearchPathBtns;
bSizerSearchPathBtns = new wxBoxSizer( wxHORIZONTAL );
m_btnAddSearchPath = new wxBitmapButton( m_sb3DSearchPaths->GetStaticBox(), wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 );
bSizerSearchPathBtns->Add( m_btnAddSearchPath, 0, wxBOTTOM|wxLEFT|wxRIGHT, 5 );
m_btnMoveUp = new wxBitmapButton( m_sb3DSearchPaths->GetStaticBox(), wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 );
bSizerSearchPathBtns->Add( m_btnMoveUp, 0, wxBOTTOM|wxRIGHT, 5 );
m_btnMoveDown = new wxBitmapButton( m_sb3DSearchPaths->GetStaticBox(), wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 );
bSizerSearchPathBtns->Add( m_btnMoveDown, 0, wxBOTTOM|wxRIGHT, 5 );
bSizerSearchPathBtns->Add( 0, 0, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
m_btnDeleteSearchPath = new wxBitmapButton( m_sb3DSearchPaths->GetStaticBox(), wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 );
bSizerSearchPathBtns->Add( m_btnDeleteSearchPath, 0, wxBOTTOM|wxRIGHT, 5 );
m_sb3DSearchPaths->Add( bSizerSearchPathBtns, 0, wxEXPAND, 5 );
bSizerMain->Add( m_sb3DSearchPaths, 1, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
m_sdbSizer = new wxStdDialogButtonSizer();
m_sdbSizerOK = new wxButton( this, wxID_OK );
m_sdbSizer->AddButton( m_sdbSizerOK );
@ -155,12 +94,6 @@ DIALOG_CONFIGURE_PATHS_BASE::DIALOG_CONFIGURE_PATHS_BASE( wxWindow* parent, wxWi
m_EnvVars->Connect( wxEVT_SIZE, wxSizeEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnGridSize ), NULL, this );
m_btnAddEnvVar->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnAddEnvVar ), NULL, this );
m_btnDeleteEnvVar->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnRemoveEnvVar ), NULL, this );
m_SearchPaths->Connect( wxEVT_GRID_CELL_CHANGED, wxGridEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnGridCellChange ), NULL, this );
m_SearchPaths->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnGridCellRightClick ), NULL, this );
m_btnAddSearchPath->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnAddSearchPath ), NULL, this );
m_btnMoveUp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnSearchPathMoveUp ), NULL, this );
m_btnMoveDown->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnSearchPathMoveDown ), NULL, this );
m_btnDeleteSearchPath->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnDeleteSearchPath ), NULL, this );
m_sdbSizerHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnHelp ), NULL, this );
}
@ -171,12 +104,6 @@ DIALOG_CONFIGURE_PATHS_BASE::~DIALOG_CONFIGURE_PATHS_BASE()
m_EnvVars->Disconnect( wxEVT_SIZE, wxSizeEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnGridSize ), NULL, this );
m_btnAddEnvVar->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnAddEnvVar ), NULL, this );
m_btnDeleteEnvVar->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnRemoveEnvVar ), NULL, this );
m_SearchPaths->Disconnect( wxEVT_GRID_CELL_CHANGED, wxGridEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnGridCellChange ), NULL, this );
m_SearchPaths->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnGridCellRightClick ), NULL, this );
m_btnAddSearchPath->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnAddSearchPath ), NULL, this );
m_btnMoveUp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnSearchPathMoveUp ), NULL, this );
m_btnMoveDown->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnSearchPathMoveDown ), NULL, this );
m_btnDeleteSearchPath->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnDeleteSearchPath ), NULL, this );
m_sdbSizerHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnHelp ), NULL, this );
}

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<wxFormBuilder_Project>
<FileVersion major="1" minor="15" />
<FileVersion major="1" minor="16" />
<object class="Project" expanded="1">
<property name="class_decoration"></property>
<property name="code_generation">C++</property>
@ -14,6 +14,7 @@
<property name="file">dialog_configure_paths_base</property>
<property name="first_id">1000</property>
<property name="help_provider">none</property>
<property name="image_path_wrapper_function_name"></property>
<property name="indent_with_spaces"></property>
<property name="internationalize">1</property>
<property name="name">DIALOG_CONFIGURE_PATHS_BASE</property>
@ -25,6 +26,7 @@
<property name="skip_php_events">1</property>
<property name="skip_python_events">1</property>
<property name="ui_table">UI</property>
<property name="use_array_enum">0</property>
<property name="use_enum">0</property>
<property name="use_microsoft_bom">0</property>
<object class="Dialog" expanded="1">
@ -50,6 +52,7 @@
<property name="subclass">DIALOG_SHIM; dialog_shim.h</property>
<property name="title">Configure Paths</property>
<property name="tooltip"></property>
<property name="two_step_creation">0</property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
@ -182,6 +185,7 @@
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="auth_needed">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="bitmap"></property>
@ -265,6 +269,7 @@
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="auth_needed">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="bitmap"></property>
@ -329,423 +334,6 @@
</object>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND|wxTOP|wxRIGHT|wxLEFT</property>
<property name="proportion">1</property>
<object class="wxStaticBoxSizer" expanded="1">
<property name="id">wxID_ANY</property>
<property name="label">3D Search Paths</property>
<property name="minimum_size"></property>
<property name="name">m_sb3DSearchPaths</property>
<property name="orient">wxVERTICAL</property>
<property name="parent">1</property>
<property name="permission">protected</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL|wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxGrid" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="autosize_cols">0</property>
<property name="autosize_rows">1</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="cell_bg"></property>
<property name="cell_font"></property>
<property name="cell_horiz_alignment">wxALIGN_LEFT</property>
<property name="cell_text"></property>
<property name="cell_vert_alignment">wxALIGN_TOP</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="col_label_horiz_alignment">wxALIGN_CENTER</property>
<property name="col_label_size">22</property>
<property name="col_label_values">&quot;Alias&quot; &quot;Path&quot; &quot;Description&quot;</property>
<property name="col_label_vert_alignment">wxALIGN_CENTER</property>
<property name="cols">3</property>
<property name="column_sizes">150,300,154</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="drag_col_move">0</property>
<property name="drag_col_size">1</property>
<property name="drag_grid_size">0</property>
<property name="drag_row_size">0</property>
<property name="editing">1</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="grid_line_color"></property>
<property name="grid_lines">1</property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label_bg"></property>
<property name="label_font"></property>
<property name="label_text"></property>
<property name="margin_height">0</property>
<property name="margin_width">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size">604,150</property>
<property name="moveable">1</property>
<property name="name">m_SearchPaths</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="row_label_horiz_alignment">wxALIGN_CENTER</property>
<property name="row_label_size">0</property>
<property name="row_label_values"></property>
<property name="row_label_vert_alignment">wxALIGN_CENTER</property>
<property name="row_sizes"></property>
<property name="rows">1</property>
<property name="show">1</property>
<property name="size"></property>
<property name="subclass">WX_GRID; widgets/wx_grid.h; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnGridCellChange">OnGridCellChange</event>
<event name="OnGridCellRightClick">OnGridCellRightClick</event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizerSearchPathBtns</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxLEFT|wxRIGHT</property>
<property name="proportion">0</property>
<object class="wxBitmapButton" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="bitmap"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="current"></property>
<property name="default">0</property>
<property name="default_pane">0</property>
<property name="disabled"></property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="focus"></property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Add Path</property>
<property name="margins"></property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size">-1,-1</property>
<property name="moveable">1</property>
<property name="name">m_btnAddSearchPath</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="position"></property>
<property name="pressed"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnButtonClick">OnAddSearchPath</event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxRIGHT</property>
<property name="proportion">0</property>
<object class="wxBitmapButton" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="bitmap"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="current"></property>
<property name="default">0</property>
<property name="default_pane">0</property>
<property name="disabled"></property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="focus"></property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Move Up</property>
<property name="margins"></property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size">-1,-1</property>
<property name="moveable">1</property>
<property name="name">m_btnMoveUp</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="position"></property>
<property name="pressed"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnButtonClick">OnSearchPathMoveUp</event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxRIGHT</property>
<property name="proportion">0</property>
<object class="wxBitmapButton" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="bitmap"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="current"></property>
<property name="default">0</property>
<property name="default_pane">0</property>
<property name="disabled"></property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="focus"></property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Move Down</property>
<property name="margins"></property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size">-1,-1</property>
<property name="moveable">1</property>
<property name="name">m_btnMoveDown</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="position"></property>
<property name="pressed"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnButtonClick">OnSearchPathMoveDown</event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property>
<object class="spacer" expanded="1">
<property name="height">0</property>
<property name="permission">protected</property>
<property name="width">0</property>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxRIGHT</property>
<property name="proportion">0</property>
<object class="wxBitmapButton" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="bitmap"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="current"></property>
<property name="default">0</property>
<property name="default_pane">0</property>
<property name="disabled"></property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="focus"></property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Delete Path</property>
<property name="margins"></property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size">-1,-1</property>
<property name="moveable">1</property>
<property name="name">m_btnDeleteSearchPath</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="position"></property>
<property name="pressed"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnButtonClick">OnDeleteSearchPath</event>
</object>
</object>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL|wxEXPAND</property>

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version 3.9.0 Jul 27 2020)
// C++ code generated with wxFormBuilder (version 3.10.1-0-g8feb16b3)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
@ -42,12 +42,6 @@ class DIALOG_CONFIGURE_PATHS_BASE : public DIALOG_SHIM
WX_GRID* m_EnvVars;
wxBitmapButton* m_btnAddEnvVar;
wxBitmapButton* m_btnDeleteEnvVar;
wxStaticBoxSizer* m_sb3DSearchPaths;
WX_GRID* m_SearchPaths;
wxBitmapButton* m_btnAddSearchPath;
wxBitmapButton* m_btnMoveUp;
wxBitmapButton* m_btnMoveDown;
wxBitmapButton* m_btnDeleteSearchPath;
wxStdDialogButtonSizer* m_sdbSizer;
wxButton* m_sdbSizerOK;
wxButton* m_sdbSizerCancel;
@ -58,18 +52,13 @@ class DIALOG_CONFIGURE_PATHS_BASE : public DIALOG_SHIM
virtual void OnGridSize( wxSizeEvent& event ) { event.Skip(); }
virtual void OnAddEnvVar( wxCommandEvent& event ) { event.Skip(); }
virtual void OnRemoveEnvVar( wxCommandEvent& event ) { event.Skip(); }
virtual void OnGridCellChange( wxGridEvent& event ) { event.Skip(); }
virtual void OnGridCellRightClick( wxGridEvent& event ) { event.Skip(); }
virtual void OnAddSearchPath( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSearchPathMoveUp( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSearchPathMoveDown( wxCommandEvent& event ) { event.Skip(); }
virtual void OnDeleteSearchPath( wxCommandEvent& event ) { event.Skip(); }
virtual void OnHelp( wxCommandEvent& event ) { event.Skip(); }
public:
DIALOG_CONFIGURE_PATHS_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Configure Paths"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
~DIALOG_CONFIGURE_PATHS_BASE();
};

View File

@ -37,7 +37,6 @@
// configuration file version
#define CFGFILE_VERSION 1
#define RESOLVER_CONFIG wxT( "3Dresolver.cfg" )
// flag bits used to track different one-off messages to users
#define ERRFLG_ALIAS (1)
@ -48,8 +47,6 @@
static std::mutex mutex_resolver;
static bool getHollerith( const std::string& aString, size_t& aIndex, wxString& aResult );
FILENAME_RESOLVER::FILENAME_RESOLVER() :
m_pgm( nullptr ),
@ -176,9 +173,13 @@ bool FILENAME_RESOLVER::createPathList()
if( GetKicadPaths( epaths ) )
{
for( const wxString& curr_path : epaths )
for( const wxString& currPath : epaths )
{
wxString pathVal = ExpandEnvVarSubstitutions( curr_path, m_project );
wxString currPathVarFormat = currPath;
currPathVarFormat.Prepend( wxS( "${" ) );
currPathVarFormat.Append( wxS( "}" ) );
wxString pathVal = ExpandEnvVarSubstitutions( currPathVarFormat, m_project );
if( pathVal.empty() )
{
@ -191,19 +192,21 @@ bool FILENAME_RESOLVER::createPathList()
lpath.m_Pathexp = fndummy.GetFullPath();
}
lpath.m_Alias = curr_path;
lpath.m_Pathvar = curr_path;
lpath.m_Alias = currPath;
lpath.m_Pathvar = currPath;
if( !lpath.m_Pathexp.empty() && psep == *lpath.m_Pathexp.rbegin() )
lpath.m_Pathexp.erase( --lpath.m_Pathexp.end() );
// we add it first with the alias set to the non-variable format
m_paths.push_back( lpath );
// now add it with the "new variable format ${VAR}"
lpath.m_Alias = currPathVarFormat;
m_paths.push_back( lpath );
}
}
if( !m_configDir.empty() )
readPathList();
if( m_paths.empty() )
return false;
@ -233,7 +236,7 @@ bool FILENAME_RESOLVER::UpdatePathList( const std::vector< SEARCH_PATH >& aPathL
for( const SEARCH_PATH& path : aPathList )
addPath( path );
return WritePathList( m_configDir, RESOLVER_CONFIG, false );
return true;
}
@ -481,118 +484,6 @@ bool FILENAME_RESOLVER::addPath( const SEARCH_PATH& aPath )
}
bool FILENAME_RESOLVER::readPathList()
{
if( m_configDir.empty() )
{
std::ostringstream ostr;
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
wxString errmsg = "3D configuration directory is unknown";
ostr << " * " << errmsg.ToUTF8();
wxLogTrace( MASK_3D_RESOLVER, "%s\n", ostr.str().c_str() );
return false;
}
wxFileName cfgpath( m_configDir, RESOLVER_CONFIG );
// This should be the same as wxWidgets 3.0 wxPATH_NORM_ALL which is deprecated in 3.1.
// There are known issues with environment variable expansion so maybe we should be using
// our own ExpandEnvVarSubstitutions() here instead.
cfgpath.Normalize( FN_NORMALIZE_FLAGS | wxPATH_NORM_ENV_VARS );
wxString cfgname = cfgpath.GetFullPath();
size_t nitems = m_paths.size();
std::ifstream cfgFile;
std::string cfgLine;
if( !wxFileName::Exists( cfgname ) )
{
std::ostringstream ostr;
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
wxString errmsg = "no 3D configuration file";
ostr << " * " << errmsg.ToUTF8() << " '";
ostr << cfgname.ToUTF8() << "'";
wxLogTrace( MASK_3D_RESOLVER, "%s\n", ostr.str().c_str() );
return false;
}
cfgFile.open( cfgname.ToUTF8() );
if( !cfgFile.is_open() )
{
std::ostringstream ostr;
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
wxString errmsg = "Could not open configuration file";
ostr << " * " << errmsg.ToUTF8() << " '" << cfgname.ToUTF8() << "'";
wxLogTrace( MASK_3D_RESOLVER, "%s\n", ostr.str().c_str() );
return false;
}
int lineno = 0;
SEARCH_PATH al;
size_t idx;
int vnum = 0; // version number
while( cfgFile.good() )
{
cfgLine.clear();
std::getline( cfgFile, cfgLine );
++lineno;
if( cfgLine.empty() )
{
if( cfgFile.eof() )
break;
continue;
}
if( 1 == lineno && cfgLine.compare( 0, 2, "#V" ) == 0 )
{
// extract the version number and parse accordingly
if( cfgLine.size() > 2 )
{
std::istringstream istr;
istr.str( cfgLine.substr( 2 ) );
istr >> vnum;
}
continue;
}
idx = 0;
if( !getHollerith( cfgLine, idx, al.m_Alias ) )
continue;
// Don't add KICAD6_3DMODEL_DIR, one of its legacy equivalents, or KIPRJMOD from a
// config file. They're system variables are are defined at runtime.
if( al.m_Alias == "${KICAD6_3DMODEL_DIR}"
|| al.m_Alias == "${KIPRJMOD}" || al.m_Alias == "$(KIPRJMOD)"
|| al.m_Alias == "${KISYS3DMOD}" || al.m_Alias == "$(KISYS3DMOD)" )
{
continue;
}
if( !getHollerith( cfgLine, idx, al.m_Pathvar ) )
continue;
if( !getHollerith( cfgLine, idx, al.m_Description ) )
continue;
addPath( al );
}
cfgFile.close();
if( vnum < CFGFILE_VERSION )
WritePathList( m_configDir, RESOLVER_CONFIG, false );
return( m_paths.size() != nitems );
}
bool FILENAME_RESOLVER::WritePathList( const wxString& aDir, const wxString& aFilename,
bool aResolvePaths )
{
@ -858,101 +749,6 @@ bool FILENAME_RESOLVER::SplitAlias( const wxString& aFileName,
}
static bool getHollerith( const std::string& aString, size_t& aIndex, wxString& aResult )
{
aResult.clear();
if( aIndex >= aString.size() )
{
std::ostringstream ostr;
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
wxString errmsg = "bad Hollerith string on line";
ostr << " * " << errmsg.ToUTF8() << "\n'" << aString << "'";
wxLogTrace( MASK_3D_RESOLVER, "%s\n", ostr.str().c_str() );
return false;
}
size_t i2 = aString.find( '"', aIndex );
if( std::string::npos == i2 )
{
std::ostringstream ostr;
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
wxString errmsg = "missing opening quote mark in config file";
ostr << " * " << errmsg.ToUTF8() << "\n'" << aString << "'";
wxLogTrace( MASK_3D_RESOLVER, "%s\n", ostr.str().c_str() );
return false;
}
++i2;
if( i2 >= aString.size() )
{
std::ostringstream ostr;
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
wxString errmsg = "invalid entry (unexpected end of line)";
ostr << " * " << errmsg.ToUTF8() << "\n'" << aString << "'";
wxLogTrace( MASK_3D_RESOLVER, "%s\n", ostr.str().c_str() );
return false;
}
std::string tnum;
while( aString[i2] >= '0' && aString[i2] <= '9' )
tnum.append( 1, aString[i2++] );
if( tnum.empty() || aString[i2++] != ':' )
{
std::ostringstream ostr;
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
wxString errmsg = "bad Hollerith string on line";
ostr << " * " << errmsg.ToUTF8() << "\n'" << aString << "'";
wxLogTrace( MASK_3D_RESOLVER, "%s\n", ostr.str().c_str() );
return false;
}
std::istringstream istr;
istr.str( tnum );
size_t nchars;
istr >> nchars;
if( (i2 + nchars) >= aString.size() )
{
std::ostringstream ostr;
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
wxString errmsg = "invalid entry (unexpected end of line)";
ostr << " * " << errmsg.ToUTF8() << "\n'" << aString << "'";
wxLogTrace( MASK_3D_RESOLVER, "%s\n", ostr.str().c_str() );
return false;
}
if( nchars > 0 )
{
aResult = wxString::FromUTF8( aString.substr( i2, nchars ).c_str() );
i2 += nchars;
}
if( i2 >= aString.size() || aString[i2] != '"' )
{
std::ostringstream ostr;
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
wxString errmsg = "missing closing quote mark in config file";
ostr << " * " << errmsg.ToUTF8() << "\n'" << aString << "'";
wxLogTrace( MASK_3D_RESOLVER, "%s\n", ostr.str().c_str() );
return false;
}
aIndex = i2 + 1;
return true;
}
bool FILENAME_RESOLVER::ValidateFileName( const wxString& aFileName, bool& hasAlias ) const
{
// Rules:
@ -1066,32 +862,30 @@ bool FILENAME_RESOLVER::GetKicadPaths( std::list< wxString >& paths ) const
while( mS != mE )
{
// filter out URLs, template directories, and known system paths
if( mS->first == wxString( "KICAD_PTEMPLATES" )
|| mS->first == wxString( "KICAD6_FOOTPRINT_DIR" ) )
if( mS->first == wxS( "KICAD_PTEMPLATES" )
|| mS->first == wxS( "KICAD6_FOOTPRINT_DIR" ) )
{
++mS;
continue;
}
if( wxString::npos != mS->second.GetValue().find( wxString( "://" ) ) )
if( wxString::npos != mS->second.GetValue().find( wxS( "://" ) ) )
{
++mS;
continue;
}
wxString tmp( "${" );
tmp.Append( mS->first );
tmp.Append( "}" );
paths.push_back( tmp );
//also add the path without the ${} to act as legacy alias support for older files
paths.push_back( mS->first );
if( tmp == "${KICAD6_3DMODEL_DIR}" )
if( mS->first == wxS("KICAD6_3DMODEL_DIR") )
hasKisys3D = true;
++mS;
}
if( !hasKisys3D )
paths.emplace_back("${KICAD6_3DMODEL_DIR}" );
paths.emplace_back( wxS("KICAD6_3DMODEL_DIR") );
return true;
}

View File

@ -19,9 +19,12 @@
*/
#include <set>
#include <fstream>
#include <sstream>
#include <paths.h>
#include <search_stack.h>
#include <settings/settings_manager.h>
#include <settings/common_settings.h>
#include <settings/json_settings_internals.h>
#include <settings/parameters.h>
@ -42,7 +45,7 @@ const std::set<wxString> envVarBlacklist =
///! Update the schema version whenever a migration is required
const int commonSchemaVersion = 2;
const int commonSchemaVersion = 3;
COMMON_SETTINGS::COMMON_SETTINGS() :
JSON_SETTINGS( "kicad_common", SETTINGS_LOC::USER, commonSchemaVersion ),
@ -341,6 +344,7 @@ COMMON_SETTINGS::COMMON_SETTINGS() :
registerMigration( 0, 1, std::bind( &COMMON_SETTINGS::migrateSchema0to1, this ) );
registerMigration( 1, 2, std::bind( &COMMON_SETTINGS::migrateSchema1to2, this ) );
registerMigration( 2, 3, std::bind( &COMMON_SETTINGS::migrateSchema2to3, this ) );
}
@ -412,6 +416,38 @@ bool COMMON_SETTINGS::migrateSchema1to2()
}
bool COMMON_SETTINGS::migrateSchema2to3()
{
wxFileName cfgpath;
cfgpath.AssignDir( SETTINGS_MANAGER::GetUserSettingsPath() );
cfgpath.AppendDir( wxT( "3d" ) );
cfgpath.SetFullName( "3Dresolver.cfg" );
cfgpath.MakeAbsolute();
std::vector<LEGACY_3D_SEARCH_PATH> legacyPaths;
readLegacy3DResolverCfg( cfgpath.GetFullPath(), legacyPaths );
for( const LEGACY_3D_SEARCH_PATH& path : legacyPaths )
{
const wxString& key = path.m_Alias;
const wxString& val = path.m_Pathvar;
if( !m_Env.vars.count( key ) )
{
wxLogTrace( traceEnvVars, "COMMON_SETTINGS: Loaded new var: %s = %s", key, val );
m_Env.vars[key] = ENV_VAR_ITEM( key, val );
}
}
if( cfgpath.FileExists() )
{
wxRemoveFile( cfgpath.GetFullPath() );
}
return true;
}
bool COMMON_SETTINGS::MigrateFromLegacy( wxConfigBase* aCfg )
{
bool ret = true;
@ -536,3 +572,197 @@ void COMMON_SETTINGS::InitializeEnvironment()
path.AppendDir( wxT( "symbols" ) );
addVar( wxT( "KICAD6_SYMBOL_DIR" ), path.GetFullPath() );
}
bool COMMON_SETTINGS::readLegacy3DResolverCfg( const wxString& path,
std::vector<LEGACY_3D_SEARCH_PATH>& aSearchPaths )
{
wxFileName cfgpath( path );
// This should be the same as wxWidgets 3.0 wxPATH_NORM_ALL which is deprecated in 3.1.
// There are known issues with environment variable expansion so maybe we should be using
// our own ExpandEnvVarSubstitutions() here instead.
cfgpath.Normalize( FN_NORMALIZE_FLAGS | wxPATH_NORM_ENV_VARS );
wxString cfgname = cfgpath.GetFullPath();
std::ifstream cfgFile;
std::string cfgLine;
if( !wxFileName::Exists( cfgname ) )
{
std::ostringstream ostr;
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
wxString errmsg = "no 3D configuration file";
ostr << " * " << errmsg.ToUTF8() << " '";
ostr << cfgname.ToUTF8() << "'";
wxLogTrace( traceSettings, "%s\n", ostr.str().c_str() );
return false;
}
cfgFile.open( cfgname.ToUTF8() );
if( !cfgFile.is_open() )
{
std::ostringstream ostr;
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
wxString errmsg = "Could not open configuration file";
ostr << " * " << errmsg.ToUTF8() << " '" << cfgname.ToUTF8() << "'";
wxLogTrace( traceSettings, "%s\n", ostr.str().c_str() );
return false;
}
int lineno = 0;
LEGACY_3D_SEARCH_PATH al;
size_t idx;
int vnum = 0; // version number
while( cfgFile.good() )
{
cfgLine.clear();
std::getline( cfgFile, cfgLine );
++lineno;
if( cfgLine.empty() )
{
if( cfgFile.eof() )
break;
continue;
}
if( 1 == lineno && cfgLine.compare( 0, 2, "#V" ) == 0 )
{
// extract the version number and parse accordingly
if( cfgLine.size() > 2 )
{
std::istringstream istr;
istr.str( cfgLine.substr( 2 ) );
istr >> vnum;
}
continue;
}
idx = 0;
if( !getLegacy3DHollerith( cfgLine, idx, al.m_Alias ) )
continue;
// Don't add KICAD6_3DMODEL_DIR, one of its legacy equivalents, or KIPRJMOD from a
// config file. They're system variables are are defined at runtime.
if( al.m_Alias == "${KICAD6_3DMODEL_DIR}" || al.m_Alias == "${KIPRJMOD}"
|| al.m_Alias == "$(KIPRJMOD)" || al.m_Alias == "${KISYS3DMOD}"
|| al.m_Alias == "$(KISYS3DMOD)" )
{
continue;
}
if( !getLegacy3DHollerith( cfgLine, idx, al.m_Pathvar ) )
continue;
if( !getLegacy3DHollerith( cfgLine, idx, al.m_Description ) )
continue;
aSearchPaths.push_back( al );
}
cfgFile.close();
return true;
}
bool COMMON_SETTINGS::getLegacy3DHollerith( const std::string& aString, size_t& aIndex,
wxString& aResult )
{
aResult.clear();
if( aIndex >= aString.size() )
{
std::ostringstream ostr;
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
wxString errmsg = "bad Hollerith string on line";
ostr << " * " << errmsg.ToUTF8() << "\n'" << aString << "'";
wxLogTrace( traceSettings, "%s\n", ostr.str().c_str() );
return false;
}
size_t i2 = aString.find( '"', aIndex );
if( std::string::npos == i2 )
{
std::ostringstream ostr;
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
wxString errmsg = "missing opening quote mark in config file";
ostr << " * " << errmsg.ToUTF8() << "\n'" << aString << "'";
wxLogTrace( traceSettings, "%s\n", ostr.str().c_str() );
return false;
}
++i2;
if( i2 >= aString.size() )
{
std::ostringstream ostr;
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
wxString errmsg = "invalid entry (unexpected end of line)";
ostr << " * " << errmsg.ToUTF8() << "\n'" << aString << "'";
wxLogTrace( traceSettings, "%s\n", ostr.str().c_str() );
return false;
}
std::string tnum;
while( aString[i2] >= '0' && aString[i2] <= '9' )
tnum.append( 1, aString[i2++] );
if( tnum.empty() || aString[i2++] != ':' )
{
std::ostringstream ostr;
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
wxString errmsg = "bad Hollerith string on line";
ostr << " * " << errmsg.ToUTF8() << "\n'" << aString << "'";
wxLogTrace( traceSettings, "%s\n", ostr.str().c_str() );
return false;
}
std::istringstream istr;
istr.str( tnum );
size_t nchars;
istr >> nchars;
if( ( i2 + nchars ) >= aString.size() )
{
std::ostringstream ostr;
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
wxString errmsg = "invalid entry (unexpected end of line)";
ostr << " * " << errmsg.ToUTF8() << "\n'" << aString << "'";
wxLogTrace( traceSettings, "%s\n", ostr.str().c_str() );
return false;
}
if( nchars > 0 )
{
aResult = wxString::FromUTF8( aString.substr( i2, nchars ).c_str() );
i2 += nchars;
}
if( i2 >= aString.size() || aString[i2] != '"' )
{
std::ostringstream ostr;
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
wxString errmsg = "missing closing quote mark in config file";
ostr << " * " << errmsg.ToUTF8() << "\n'" << aString << "'";
wxLogTrace( traceSettings, "%s\n", ostr.str().c_str() );
return false;
}
aIndex = i2 + 1;
return true;
}

View File

@ -111,7 +111,7 @@ int COMMON_CONTROL::ConfigurePaths( const TOOL_EVENT& aEvent )
}
else
{
DIALOG_CONFIGURE_PATHS dlg( m_frame, nullptr );
DIALOG_CONFIGURE_PATHS dlg( m_frame );
if( dlg.ShowModal() == wxID_OK )
m_frame->Kiway().CommonSettingsChanged( true, false );

View File

@ -30,15 +30,13 @@
#include <wx/string.h>
#include <wx/valtext.h>
class FILENAME_RESOLVER;
class HTML_WINDOW;
class DIALOG_CONFIGURE_PATHS: public DIALOG_CONFIGURE_PATHS_BASE
{
public:
DIALOG_CONFIGURE_PATHS( wxWindow* aParent, FILENAME_RESOLVER* aResolver );
DIALOG_CONFIGURE_PATHS( wxWindow* aParent );
~DIALOG_CONFIGURE_PATHS() override;
bool TransferDataToWindow() override;
@ -46,16 +44,11 @@ public:
protected:
// Various button callbacks
void OnGridCellRightClick( wxGridEvent& event ) override;
void OnGridSize( wxSizeEvent& event ) override;
void OnUpdateUI( wxUpdateUIEvent& event ) override;
void OnGridCellChanging( wxGridEvent& event );
void OnAddEnvVar( wxCommandEvent& event ) override;
void OnRemoveEnvVar( wxCommandEvent& event ) override;
void OnAddSearchPath( wxCommandEvent& event ) override;
void OnDeleteSearchPath( wxCommandEvent& event ) override;
void OnSearchPathMoveUp( wxCommandEvent& event ) override;
void OnSearchPathMoveDown( wxCommandEvent& event ) override;
void OnHelp( wxCommandEvent& event ) override;
void AppendEnvVar( const wxString& aName, const wxString& aPath, bool isExternal );
@ -67,7 +60,6 @@ private:
int m_errorRow;
int m_errorCol;
FILENAME_RESOLVER* m_resolver;
wxString m_curdir;
wxTextValidator m_aliasValidator;

View File

@ -161,13 +161,6 @@ private:
*/
bool addPath( const SEARCH_PATH& aPath );
/**
* Read a list of path names from a configuration file.
*
* @return true if a file was found and contained at least one valid path.
*/
bool readPathList( void );
/**
* Check the ${ENV_VAR} component of a path and adds it to the resolver's path list if
* it is not yet in the list.

View File

@ -155,6 +155,19 @@ public:
private:
bool migrateSchema0to1();
bool migrateSchema1to2();
bool migrateSchema2to3();
struct LEGACY_3D_SEARCH_PATH
{
wxString m_Alias; // alias to the base path
wxString m_Pathvar; // base path as stored in the config file
wxString m_Pathexp; // expanded base path
wxString m_Description; // description of the aliased path
};
static bool getLegacy3DHollerith( const std::string& aString, size_t& aIndex,
wxString& aResult );
bool readLegacy3DResolverCfg( const wxString& aPath, std::vector<LEGACY_3D_SEARCH_PATH>& aSearchPaths );
public:
APPEARANCE m_Appearance;

View File

@ -116,7 +116,7 @@ static struct IFACE : public KIFACE_BASE
case DIALOG_CONFIGUREPATHS:
{
DIALOG_CONFIGURE_PATHS dlg( aParent, aKiway->Prj().Get3DFilenameResolver() );
DIALOG_CONFIGURE_PATHS dlg( aParent );
// The dialog's constructor probably failed to set its Kiway because the
// dynamic_cast fails when aParent was allocated by a separate compilation