Fold 3D Search Paths dialog into Configure Paths.

Use in-place editing for both.

Fixes: lp:1743823
* https://bugs.launchpad.net/kicad/+bug/1743823

(cherry picked from commit 33622cd)
This commit is contained in:
Jeff Young 2018-03-07 13:05:12 +00:00
parent 124c6d9857
commit 8f0aa68ab8
41 changed files with 2130 additions and 4216 deletions

View File

@ -43,7 +43,7 @@
#include "3d_cache.h"
#include "3d_info.h"
#include "sg/scenegraph.h"
#include "3d_filename_resolver.h"
#include "filename_resolver.h"
#include "3d_plugin_manager.h"
#include "plugins/3dapi/ifsg_api.h"
@ -180,7 +180,7 @@ const wxString S3D_CACHE_ENTRY::GetCacheBaseName( void )
S3D_CACHE::S3D_CACHE()
{
m_DirtyCache = false;
m_FNResolver = new S3D_FILENAME_RESOLVER;
m_FNResolver = new FILENAME_RESOLVER;
m_Plugins = new S3D_PLUGIN_MANAGER;
return;
@ -217,7 +217,7 @@ SCENEGRAPH* S3D_CACHE::load( const wxString& aModelFile, S3D_CACHE_ENTRY** aCach
// check cache if file is already loaded
wxCriticalSectionLocker lock( lock3D_cache );
std::map< wxString, S3D_CACHE_ENTRY*, S3D::rsort_wxString >::iterator mi;
std::map< wxString, S3D_CACHE_ENTRY*, rsort_wxString >::iterator mi;
mi = m_CacheMap.find( full3Dpath );
if( mi != m_CacheMap.end() )
@ -736,7 +736,7 @@ wxString S3D_CACHE::GetProjectDir( void )
}
S3D_FILENAME_RESOLVER* S3D_CACHE::GetResolver( void )
FILENAME_RESOLVER* S3D_CACHE::GetResolver( void )
{
return m_FNResolver;
}
@ -818,7 +818,7 @@ wxString S3D_CACHE::GetModelHash( const wxString& aModelFileName )
return wxEmptyString;
// check cache if file is already loaded
std::map< wxString, S3D_CACHE_ENTRY*, S3D::rsort_wxString >::iterator mi;
std::map< wxString, S3D_CACHE_ENTRY*, rsort_wxString >::iterator mi;
mi = m_CacheMap.find( full3Dpath );
if( mi != m_CacheMap.end() )

View File

@ -32,8 +32,8 @@
#include <list>
#include <map>
#include <wx/string.h>
#include "str_rsort.h"
#include "3d_filename_resolver.h"
#include "kicad_string.h"
#include "filename_resolver.h"
#include "3d_info.h"
#include "plugins/3dapi/c3dmodel.h"
@ -42,7 +42,7 @@ class PGM_BASE;
class S3D_CACHE;
class S3D_CACHE_ENTRY;
class SCENEGRAPH;
class S3D_FILENAME_RESOLVER;
class FILENAME_RESOLVER;
class S3D_PLUGIN_MANAGER;
@ -53,10 +53,10 @@ private:
std::list< S3D_CACHE_ENTRY* > m_CacheList;
/// mapping of file names to cache names and data
std::map< wxString, S3D_CACHE_ENTRY*, S3D::rsort_wxString > m_CacheMap;
std::map< wxString, S3D_CACHE_ENTRY*, rsort_wxString > m_CacheMap;
/// object to resolve file names
S3D_FILENAME_RESOLVER* m_FNResolver;
FILENAME_RESOLVER* m_FNResolver;
/// plugin manager
S3D_PLUGIN_MANAGER* m_Plugins;
@ -167,7 +167,7 @@ public:
*/
SCENEGRAPH* Load( const wxString& aModelFile );
S3D_FILENAME_RESOLVER* GetResolver( void );
FILENAME_RESOLVER* GetResolver( void );
/**
* Function GetFileFilters

View File

@ -27,7 +27,7 @@
#include "3d_cache.h"
#include "plugins/3dapi/ifsg_api.h"
#include "3d_cache_dialogs.h"
#include "dlg_3d_pathconfig.h"
#include "dialog_configure_paths.h"
#include "dlg_select_3dmodel.h"
@ -51,16 +51,9 @@ bool S3D::Select3DModel( wxWindow* aParent, S3D_CACHE* aCache,
}
bool S3D::Configure3DPaths( wxWindow* aParent, S3D_FILENAME_RESOLVER* aResolver )
bool S3D::Configure3DPaths( wxWindow* aParent, FILENAME_RESOLVER* aResolver )
{
DLG_3D_PATH_CONFIG* dp = new DLG_3D_PATH_CONFIG( aParent, aResolver );
DIALOG_CONFIGURE_PATHS dlg( aParent, aResolver );
if( wxID_OK == dp->ShowModal() )
{
delete dp;
return true;
}
delete dp;
return false;
return( dlg.ShowModal() == wxID_OK );
}

View File

@ -27,14 +27,14 @@
#include <wx/window.h>
class S3D_CACHE;
class S3D_FILENAME_RESOLVER;
class FILENAME_RESOLVER;
namespace S3D
{
bool Select3DModel( wxWindow* aParent, S3D_CACHE* aCache,
wxString& prevModelSelectDir, int& prevModelWildcard, MODULE_3D_SETTINGS* aModel );
bool Configure3DPaths( wxWindow* aParent, S3D_FILENAME_RESOLVER* aResolver );
bool Configure3DPaths( wxWindow* aParent, FILENAME_RESOLVER* aResolver );
}
#endif // CACHE_DIALOGS_3D_H

View File

@ -1,383 +0,0 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 Cirilo Bernardo <cirilo.bernardo@gmail.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <wx/msgdlg.h>
#include <pgm_base.h>
#include <html_messagebox.h>
#include "3d_cache/dialogs/dlg_3d_pathconfig.h"
#include "3d_cache/3d_filename_resolver.h"
DLG_3D_PATH_CONFIG::DLG_3D_PATH_CONFIG( wxWindow* aParent, S3D_FILENAME_RESOLVER* aResolver ) :
DLG_3D_PATH_CONFIG_BASE( aParent ), m_resolver( aResolver )
{
initDialog();
GetSizer()->SetSizeHints( this );
Centre();
return;
}
void DLG_3D_PATH_CONFIG::initDialog()
{
m_Aliases->EnableEditing( true );
// Gives a min width to each column, when the user drags a column
m_Aliases->SetColMinimalWidth( 0, 80 );
m_Aliases->SetColMinimalWidth( 1, 300 );
m_Aliases->SetColMinimalWidth( 2, 120 );
m_Aliases->SetColMinimalAcceptableWidth( 80 );
// Set column sizes to this min value
m_Aliases->SetColSize( 0, 80 );
m_Aliases->SetColSize( 1, 300 );
m_Aliases->SetColSize( 2, 120 );
m_EnvVars->SetColMinimalWidth( 0, 80 );
m_EnvVars->SetColMinimalWidth( 1, 300 );
m_EnvVars->SetColMinimalAcceptableWidth( 80 );
m_EnvVars->SetColSize( 0, 80 );
m_EnvVars->SetColSize( 1, 300 );
if( m_resolver )
{
updateEnvVars();
// prohibit these characters in the alias names: []{}()%~<>"='`;:.,&?/\|$
m_aliasValidator.SetStyle( wxFILTER_EXCLUDE_CHAR_LIST );
m_aliasValidator.SetCharExcludes( wxT( "{}[]()%~<>\"='`;:.,&?/\\|$" ) );
const std::list< S3D_ALIAS >* rpaths = m_resolver->GetPaths();
std::list< S3D_ALIAS >::const_iterator rI = rpaths->begin();
std::list< S3D_ALIAS >::const_iterator rE = rpaths->end();
size_t listsize = rpaths->size();
size_t listidx = 0;
while( rI != rE && ( (*rI).m_alias.StartsWith( "${" ) || (*rI).m_alias.StartsWith( "$(" ) ) )
{
++listidx;
++rI;
}
if( listidx < listsize )
m_curdir = (*rI).m_pathexp;
else
return;
listsize = listsize - listidx - m_Aliases->GetNumberRows();
// note: if the list allocation fails we have bigger problems
// and there is no point in trying to notify the user here
if( listsize > 0 && !m_Aliases->InsertRows( 0, listsize ) )
return;
int nitems = 0;
wxGridCellTextEditor* pEdAlias;
while( rI != rE )
{
m_Aliases->SetCellValue( nitems, 0, rI->m_alias );
if( 0 == nitems )
{
m_Aliases->SetCellEditor( nitems, 0, new wxGridCellTextEditor );
pEdAlias = (wxGridCellTextEditor*) m_Aliases->GetCellEditor( nitems, 0 );
pEdAlias->SetValidator( m_aliasValidator );
pEdAlias->DecRef();
}
else
{
pEdAlias->IncRef();
m_Aliases->SetCellEditor( nitems, 0, pEdAlias );
}
m_Aliases->SetCellValue( nitems, 1, rI->m_pathvar );
m_Aliases->SetCellValue( nitems++, 2, rI->m_description );
// TODO: implement a wxGridCellEditor which invokes a wxDirDialog
++rI;
}
m_Aliases->AutoSize();
}
}
bool DLG_3D_PATH_CONFIG::TransferDataFromWindow()
{
if( NULL == m_resolver )
{
wxMessageBox( _( "[BUG] No valid resolver; data will not be updated" ),
_( "Update 3D search path list" ) );
return false;
}
std::vector<S3D_ALIAS> alist;
S3D_ALIAS alias;
int ni = m_Aliases->GetNumberRows();
if( ni <= 0 )
{
// note: UI usability: we should ask a user if they're sure they
// want to clear the entire path list
m_resolver->UpdatePathList( alist );
return true;
}
for( int i = 0; i < ni; ++i )
{
alias.m_alias = m_Aliases->GetCellValue( i, 0 );
alias.m_pathvar = m_Aliases->GetCellValue( i, 1 );
alias.m_description = m_Aliases->GetCellValue( i, 2 );
if( !alias.m_alias.empty() && !alias.m_pathvar.empty() )
alist.push_back( alias );
}
return m_resolver->UpdatePathList( alist );
}
void DLG_3D_PATH_CONFIG::OnAddAlias( wxCommandEvent& event )
{
int ni = m_Aliases->GetNumberRows();
if( m_Aliases->InsertRows( ni, 1 ) )
{
wxGridCellTextEditor* pEdAlias;
pEdAlias = (wxGridCellTextEditor*) m_Aliases->GetCellEditor( 0, 0 );
m_Aliases->SetCellEditor( ni, 0, pEdAlias );
m_Aliases->SelectRow( ni, false );
m_Aliases->AutoSize();
Fit();
// TODO: set the editors on any newly created rows
}
event.Skip();
}
void DLG_3D_PATH_CONFIG::OnDelAlias( wxCommandEvent& event )
{
wxArrayInt sel = m_Aliases->GetSelectedRows();
if( sel.empty() )
{
wxMessageBox( _( "No entry selected" ), _( "Delete alias entry" ) );
return;
}
if( sel.size() > 1 )
{
wxMessageBox( _( "Multiple entries selected; please\nselect only one entry" ),
_( "Delete alias entry" ) );
return;
}
if( m_Aliases->GetNumberRows() > 1 )
{
int ni = sel.front();
m_Aliases->DeleteRows( ni, 1 );
if( ni >= m_Aliases->GetNumberRows() )
ni = m_Aliases->GetNumberRows() - 1;
m_Aliases->SelectRow( ni, false );
m_Aliases->AutoSize();
Fit();
}
else
{
m_Aliases->SetCellValue( 0, 0, wxEmptyString );
m_Aliases->SetCellValue( 0, 1, wxEmptyString );
m_Aliases->SetCellValue( 0, 2, wxEmptyString );
}
event.Skip();
}
void DLG_3D_PATH_CONFIG::OnAliasMoveUp( wxCommandEvent& event )
{
wxArrayInt sel = m_Aliases->GetSelectedRows();
if( sel.empty() )
{
wxMessageBox( _( "No entry selected" ), _( "Move alias up" ) );
return;
}
if( sel.size() > 1 )
{
wxMessageBox( _( "Multiple entries selected; please\nselect only one entry" ),
_( "Move alias up" ) );
return;
}
int ci = sel.front();
if( ci > 0 )
{
S3D_ALIAS al0;
al0.m_alias = m_Aliases->GetCellValue( ci, 0 );
al0.m_pathvar = m_Aliases->GetCellValue( ci, 1 );
al0.m_description = m_Aliases->GetCellValue( ci, 2 );
int ni = ci - 1;
m_Aliases->SetCellValue( ci, 0, m_Aliases->GetCellValue( ni, 0 ) );
m_Aliases->SetCellValue( ci, 1, m_Aliases->GetCellValue( ni, 1 ) );
m_Aliases->SetCellValue( ci, 2, m_Aliases->GetCellValue( ni, 2 ) );
m_Aliases->SetCellValue( ni, 0, al0.m_alias );
m_Aliases->SetCellValue( ni, 1, al0.m_pathvar );
m_Aliases->SetCellValue( ni, 2, al0.m_description );
m_Aliases->SelectRow( ni, false );
}
event.Skip();
}
void DLG_3D_PATH_CONFIG::OnAliasMoveDown( wxCommandEvent& event )
{
wxArrayInt sel = m_Aliases->GetSelectedRows();
if( sel.empty() )
{
wxMessageBox( _( "No entry selected" ), _( "Move alias down" ) );
return;
}
if( sel.size() > 1 )
{
wxMessageBox( _( "Multiple entries selected; please\nselect only one entry" ),
_( "Move alias down" ) );
return;
}
int ni = m_Aliases->GetNumberRows() - 1;
int ci = sel.front();
if( ci < ni )
{
S3D_ALIAS al0;
al0.m_alias = m_Aliases->GetCellValue( ci, 0 );
al0.m_pathvar = m_Aliases->GetCellValue( ci, 1 );
al0.m_description = m_Aliases->GetCellValue( ci, 2 );
ni = ci + 1;
m_Aliases->SetCellValue( ci, 0, m_Aliases->GetCellValue( ni, 0 ) );
m_Aliases->SetCellValue( ci, 1, m_Aliases->GetCellValue( ni, 1 ) );
m_Aliases->SetCellValue( ci, 2, m_Aliases->GetCellValue( ni, 2 ) );
m_Aliases->SetCellValue( ni, 0, al0.m_alias );
m_Aliases->SetCellValue( ni, 1, al0.m_pathvar );
m_Aliases->SetCellValue( ni, 2, al0.m_description );
m_Aliases->SelectRow( ni, false );
}
event.Skip();
}
void DLG_3D_PATH_CONFIG::OnConfigEnvVar( wxCommandEvent& event )
{
Pgm().ConfigurePaths( this );
updateEnvVars();
event.Skip();
}
void DLG_3D_PATH_CONFIG::updateEnvVars( void )
{
if( !m_resolver )
return;
std::list< wxString > epaths;
m_resolver->GetKicadPaths( epaths );
size_t nitems = epaths.size();
size_t nrows = m_EnvVars->GetNumberRows();
bool resize = nrows != nitems; // true after adding/removing env vars
if( nrows > nitems )
{
size_t ni = nrows - nitems;
m_EnvVars->DeleteRows( 0, ni );
}
else if( nrows < nitems )
{
size_t ni = nitems - nrows;
m_EnvVars->InsertRows( 0, ni );
}
int j = 0;
for( const auto& i : epaths )
{
wxString val = ExpandEnvVarSubstitutions( i );
m_EnvVars->SetCellValue( j, 0, i );
m_EnvVars->SetCellValue( j, 1, val );
m_EnvVars->SetReadOnly( j, 0, true );
m_EnvVars->SetReadOnly( j, 1, true );
wxGridCellAttr* ap = m_EnvVars->GetOrCreateCellAttr( j, 0 );
ap->SetReadOnly( true );
ap->SetBackgroundColour( *wxLIGHT_GREY );
m_EnvVars->SetRowAttr( j, ap );
++j;
}
m_EnvVars->AutoSize();
// Resizing the full dialog is sometimes needed for a clean display
// i.e. when adding/removing Kicad environment variables
if( resize )
GetSizer()->SetSizeHints( this );
return;
}
void DLG_3D_PATH_CONFIG::OnHelp( wxCommandEvent& event )
{
wxString msg = _( "Enter the name and path for each 3D alias variable.<br>KiCad "
"environment variables and their values are shown for "
"reference only and cannot be edited." );
msg << "<br><br><b>";
msg << _( "Alias names may not contain any of the characters " );
msg << "{}[]()%~<>\"='`;:.,&?/\\|$";
msg << "</b>";
HTML_MESSAGE_BOX dlg( GetParent(), _( "Environment Variable Help" ) );
dlg.AddHTML_Text( msg );
dlg.ShowModal();
event.Skip();
}

View File

@ -1,57 +0,0 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 Cirilo Bernardo <cirilo.bernardo@gmail.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef DLG_3D_PATHCONFIG_H
#define DLG_3D_PATHCONFIG_H
#include <wx/valtext.h>
#include "dlg_3d_pathconfig_base.h"
class S3D_FILENAME_RESOLVER;
class DLG_3D_PATH_CONFIG : public DLG_3D_PATH_CONFIG_BASE
{
private:
S3D_FILENAME_RESOLVER* m_resolver;
wxString m_curdir;
wxTextValidator m_aliasValidator;
void initDialog();
void OnAddAlias( wxCommandEvent& event ) override;
void OnDelAlias( wxCommandEvent& event ) override;
void OnAliasMoveUp( wxCommandEvent& event ) override;
void OnAliasMoveDown( wxCommandEvent& event ) override;
void OnConfigEnvVar( wxCommandEvent& event ) override;
void OnHelp( wxCommandEvent& event ) override;
public:
DLG_3D_PATH_CONFIG( wxWindow* aParent, S3D_FILENAME_RESOLVER* aResolver );
bool TransferDataFromWindow() override;
private:
void updateEnvVars( void );
};
#endif // DLG_3D_PATHCONFIG_H

View File

@ -1,162 +0,0 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Nov 22 2017)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#include "dlg_3d_pathconfig_base.h"
///////////////////////////////////////////////////////////////////////////
DLG_3D_PATH_CONFIG_BASE::DLG_3D_PATH_CONFIG_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style )
{
this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize );
wxBoxSizer* bSizerMain;
bSizerMain = new wxBoxSizer( wxVERTICAL );
wxBoxSizer* bSizer5;
bSizer5 = new wxBoxSizer( wxVERTICAL );
m_EnvVars = new wxGrid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
// Grid
m_EnvVars->CreateGrid( 1, 2 );
m_EnvVars->EnableEditing( true );
m_EnvVars->EnableGridLines( true );
m_EnvVars->EnableDragGridSize( false );
m_EnvVars->SetMargins( 0, 0 );
// Columns
m_EnvVars->SetColSize( 0, 150 );
m_EnvVars->SetColSize( 1, 300 );
m_EnvVars->EnableDragColMove( false );
m_EnvVars->EnableDragColSize( true );
m_EnvVars->SetColLabelSize( 30 );
m_EnvVars->SetColLabelValue( 0, _("Name") );
m_EnvVars->SetColLabelValue( 1, _("Path") );
m_EnvVars->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
// Rows
m_EnvVars->EnableDragRowSize( true );
m_EnvVars->SetRowLabelSize( 80 );
m_EnvVars->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
// Label Appearance
// Cell Defaults
m_EnvVars->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP );
m_EnvVars->SetMinSize( wxSize( 250,100 ) );
bSizer5->Add( m_EnvVars, 1, wxALL|wxEXPAND, 5 );
m_btnEnvCfg = new wxButton( this, wxID_ANY, _("Configure Environment Variables"), wxDefaultPosition, wxDefaultSize, 0 );
bSizer5->Add( m_btnEnvCfg, 0, wxALIGN_CENTER|wxALL, 5 );
bSizerMain->Add( bSizer5, 0, wxEXPAND, 5 );
m_staticline2 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
bSizerMain->Add( m_staticline2, 0, wxEXPAND | wxALL, 5 );
wxBoxSizer* bSizerGrid;
bSizerGrid = new wxBoxSizer( wxHORIZONTAL );
m_Aliases = new wxGrid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
// Grid
m_Aliases->CreateGrid( 1, 3 );
m_Aliases->EnableEditing( true );
m_Aliases->EnableGridLines( true );
m_Aliases->EnableDragGridSize( false );
m_Aliases->SetMargins( 0, 0 );
// Columns
m_Aliases->SetColSize( 0, 80 );
m_Aliases->SetColSize( 1, 300 );
m_Aliases->SetColSize( 2, 120 );
m_Aliases->EnableDragColMove( false );
m_Aliases->EnableDragColSize( true );
m_Aliases->SetColLabelSize( 30 );
m_Aliases->SetColLabelValue( 0, _("Alias") );
m_Aliases->SetColLabelValue( 1, _("Path") );
m_Aliases->SetColLabelValue( 2, _("Description") );
m_Aliases->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
// Rows
m_Aliases->AutoSizeRows();
m_Aliases->EnableDragRowSize( false );
m_Aliases->SetRowLabelSize( 80 );
m_Aliases->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
// Label Appearance
// Cell Defaults
m_Aliases->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP );
m_Aliases->SetMinSize( wxSize( -1,150 ) );
bSizerGrid->Add( m_Aliases, 1, wxALL|wxEXPAND, 5 );
bSizerMain->Add( bSizerGrid, 1, wxEXPAND, 5 );
wxBoxSizer* bSizerButtons;
bSizerButtons = new wxBoxSizer( wxHORIZONTAL );
m_btnAddAlias = new wxButton( this, wxID_ANY, _("Add Alias"), wxDefaultPosition, wxDefaultSize, 0 );
bSizerButtons->Add( m_btnAddAlias, 0, wxALL, 5 );
m_btnDelAlias = new wxButton( this, wxID_ANY, _("Remove Alias"), wxDefaultPosition, wxDefaultSize, 0 );
bSizerButtons->Add( m_btnDelAlias, 0, wxALL, 5 );
m_btnMoveUp = new wxButton( this, wxID_ANY, _("Move Up"), wxDefaultPosition, wxDefaultSize, 0 );
bSizerButtons->Add( m_btnMoveUp, 0, wxALL, 5 );
m_btnMoveDown = new wxButton( this, wxID_ANY, _("Move Down"), wxDefaultPosition, wxDefaultSize, 0 );
bSizerButtons->Add( m_btnMoveDown, 0, wxALL, 5 );
bSizerMain->Add( bSizerButtons, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
bSizerMain->Add( m_staticline1, 0, wxEXPAND | wxALL, 5 );
m_sdbSizer2 = new wxStdDialogButtonSizer();
m_sdbSizer2OK = new wxButton( this, wxID_OK );
m_sdbSizer2->AddButton( m_sdbSizer2OK );
m_sdbSizer2Cancel = new wxButton( this, wxID_CANCEL );
m_sdbSizer2->AddButton( m_sdbSizer2Cancel );
m_sdbSizer2Help = new wxButton( this, wxID_HELP );
m_sdbSizer2->AddButton( m_sdbSizer2Help );
m_sdbSizer2->Realize();
bSizerMain->Add( m_sdbSizer2, 0, wxALL|wxEXPAND, 5 );
this->SetSizer( bSizerMain );
this->Layout();
bSizerMain->Fit( this );
this->Centre( wxBOTH );
// Connect Events
m_btnEnvCfg->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DLG_3D_PATH_CONFIG_BASE::OnConfigEnvVar ), NULL, this );
m_btnAddAlias->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DLG_3D_PATH_CONFIG_BASE::OnAddAlias ), NULL, this );
m_btnDelAlias->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DLG_3D_PATH_CONFIG_BASE::OnDelAlias ), NULL, this );
m_btnMoveUp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DLG_3D_PATH_CONFIG_BASE::OnAliasMoveUp ), NULL, this );
m_btnMoveDown->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DLG_3D_PATH_CONFIG_BASE::OnAliasMoveDown ), NULL, this );
m_sdbSizer2Help->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DLG_3D_PATH_CONFIG_BASE::OnHelp ), NULL, this );
}
DLG_3D_PATH_CONFIG_BASE::~DLG_3D_PATH_CONFIG_BASE()
{
// Disconnect Events
m_btnEnvCfg->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DLG_3D_PATH_CONFIG_BASE::OnConfigEnvVar ), NULL, this );
m_btnAddAlias->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DLG_3D_PATH_CONFIG_BASE::OnAddAlias ), NULL, this );
m_btnDelAlias->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DLG_3D_PATH_CONFIG_BASE::OnDelAlias ), NULL, this );
m_btnMoveUp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DLG_3D_PATH_CONFIG_BASE::OnAliasMoveUp ), NULL, this );
m_btnMoveDown->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DLG_3D_PATH_CONFIG_BASE::OnAliasMoveDown ), NULL, this );
m_sdbSizer2Help->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DLG_3D_PATH_CONFIG_BASE::OnHelp ), NULL, this );
}

File diff suppressed because it is too large Load Diff

View File

@ -1,67 +0,0 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Nov 22 2017)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#ifndef __DLG_3D_PATHCONFIG_BASE_H__
#define __DLG_3D_PATHCONFIG_BASE_H__
#include <wx/artprov.h>
#include <wx/xrc/xmlres.h>
#include <wx/intl.h>
#include "dialog_shim.h"
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/string.h>
#include <wx/font.h>
#include <wx/grid.h>
#include <wx/gdicmn.h>
#include <wx/button.h>
#include <wx/sizer.h>
#include <wx/statline.h>
#include <wx/dialog.h>
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// Class DLG_3D_PATH_CONFIG_BASE
///////////////////////////////////////////////////////////////////////////////
class DLG_3D_PATH_CONFIG_BASE : public DIALOG_SHIM
{
private:
protected:
wxGrid* m_EnvVars;
wxButton* m_btnEnvCfg;
wxStaticLine* m_staticline2;
wxGrid* m_Aliases;
wxButton* m_btnAddAlias;
wxButton* m_btnDelAlias;
wxButton* m_btnMoveUp;
wxButton* m_btnMoveDown;
wxStaticLine* m_staticline1;
wxStdDialogButtonSizer* m_sdbSizer2;
wxButton* m_sdbSizer2OK;
wxButton* m_sdbSizer2Cancel;
wxButton* m_sdbSizer2Help;
// Virtual event handlers, overide them in your derived class
virtual void OnConfigEnvVar( wxCommandEvent& event ) { event.Skip(); }
virtual void OnAddAlias( wxCommandEvent& event ) { event.Skip(); }
virtual void OnDelAlias( wxCommandEvent& event ) { event.Skip(); }
virtual void OnAliasMoveUp( wxCommandEvent& event ) { event.Skip(); }
virtual void OnAliasMoveDown( wxCommandEvent& event ) { event.Skip(); }
virtual void OnHelp( wxCommandEvent& event ) { event.Skip(); }
public:
DLG_3D_PATH_CONFIG_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("3D Search Path Configuration"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
~DLG_3D_PATH_CONFIG_BASE();
};
#endif //__DLG_3D_PATHCONFIG_BASE_H__

View File

@ -240,9 +240,9 @@ void DLG_SELECT_3DMODEL::updateDirChoiceList( void )
if( NULL == m_FileTree || NULL == m_resolver || NULL == dirChoices )
return;
std::list< S3D_ALIAS > const* md = m_resolver->GetPaths();
std::list< S3D_ALIAS >::const_iterator sL = md->begin();
std::list< S3D_ALIAS >::const_iterator eL = md->end();
std::list< SEARCH_PATH > const* md = m_resolver->GetPaths();
std::list< SEARCH_PATH >::const_iterator sL = md->begin();
std::list< SEARCH_PATH >::const_iterator eL = md->end();
std::set< wxString > cl;
wxString prjDir;

View File

@ -43,7 +43,7 @@
class MODULE_3D_SETTINGS;
class S3D_CACHE;
class S3D_FILENAME_RESOLVER;
class FILENAME_RESOLVER;
class C3D_MODEL_VIEWER;
class DLG_SELECT_3DMODEL : public DIALOG_SHIM
@ -51,7 +51,7 @@ class DLG_SELECT_3DMODEL : public DIALOG_SHIM
private:
MODULE_3D_SETTINGS* m_model; // data for the selected model
S3D_CACHE* m_cache; // cache manager
S3D_FILENAME_RESOLVER* m_resolver; // 3D filename resolver
FILENAME_RESOLVER* m_resolver; // 3D filename resolver
wxString& m_previousDir;
int& m_previousFilterIndex;

View File

@ -63,7 +63,7 @@
// Declared classes to create pointers
class S3D_CACHE;
class S3D_FILENAME_RESOLVER;
class FILENAME_RESOLVER;
class BOARD;
class CINFO3D_VISU;
class MODULE;
@ -81,7 +81,7 @@ public:
private:
wxString currentModelFile; ///< Used to check if the model file was changed
S3D_FILENAME_RESOLVER *m_resolver; ///< Used to get the full path name
FILENAME_RESOLVER *m_resolver; ///< Used to get the full path name
/// The 3D canvas
EDA_3D_CANVAS *m_previewPane;

View File

@ -1,87 +0,0 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2015 Cirilo Bernardo <cirilo.bernardo@gmail.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file str_rsort.h
* provides a wxString sorting functino which works from the
* end of the string towards the beginning
*/
#ifndef STR_RSORT_H
#define STR_RSORT_H
#include <wx/string.h>
namespace S3D
{
struct rsort_wxString
{
bool operator() (const wxString& strA, const wxString& strB ) const
{
// sort a wxString using the reverse character order; for 3d model
// filenames this will typically be a much faster operation than
// a normal alphabetic sort
wxString::const_reverse_iterator sA = strA.rbegin();
wxString::const_reverse_iterator eA = strA.rend();
wxString::const_reverse_iterator sB = strB.rbegin();
wxString::const_reverse_iterator eB = strB.rend();
if( strA.empty() )
{
if( strB.empty() )
return false;
// note: this rule implies that a null string is first in the sort order
return true;
}
if( strB.empty() )
return false;
while( sA != eA && sB != eB )
{
if( (*sA) == (*sB) )
{
++sA;
++sB;
continue;
}
if( (*sA) < (*sB) )
return true;
else
return false;
}
if( sB == eB )
return false;
return true;
}
};
} // end NAMESPACE
#endif // STR_RSORT_H

View File

@ -33,10 +33,7 @@ set(3D-VIEWER_SRCS
3d_cache/3d_cache_wrapper.cpp
3d_cache/3d_cache.cpp
3d_cache/3d_plugin_manager.cpp
3d_cache/3d_filename_resolver.cpp
${DIR_DLG}/3d_cache_dialogs.cpp
${DIR_DLG}/dlg_3d_pathconfig_base.cpp
${DIR_DLG}/dlg_3d_pathconfig.cpp
${DIR_DLG}/dlg_select_3dmodel.cpp
${DIR_DLG}/panel_prev_3d_base.cpp
${DIR_DLG}/panel_prev_model.cpp

View File

@ -153,9 +153,9 @@ set( COMMON_ABOUT_DLG_SRCS
)
set( COMMON_DLG_SRCS
dialogs/dialog_configure_paths.cpp
dialogs/dialog_configure_paths_base.cpp
dialogs/dialog_display_info_HTML_base.cpp
dialogs/dialog_env_var_config.cpp
dialogs/dialog_env_var_config_base.cpp
dialogs/dialog_exit_base.cpp
dialogs/dialog_file_dir_picker.cpp
dialogs/dialog_hotkeys_editor.cpp
@ -261,6 +261,7 @@ set( COMMON_SRCS
env_paths.cpp
exceptions.cpp
executable_names.cpp
filename_resolver.cpp
filter_reader.cpp
footprint_filter.cpp
footprint_info.cpp

View File

@ -81,8 +81,8 @@ DIALOG_SHIM::DIALOG_SHIM( wxWindow* aParent, wxWindowID id, const wxString& titl
}
else
{
wxFAIL_MSG( wxString::Format( "No KIWAY_HOLDER in parent chain. Top window is a %s.",
aParent->GetClassInfo()->GetClassName() ) );
// There are a few dialogs, such as Configure Paths, which are called
// from the top-level wxFrame.
m_units = MILLIMETRES;
}

View File

@ -0,0 +1,565 @@
/*
* This program source code file is part of KICAD, a free EDA CAD application.
*
* Copyright (C) 2015 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 2015-2018 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <dialog_configure_paths.h>
#include <confirm.h>
#include <menus_helpers.h>
#include <validators.h>
#include <html_messagebox.h>
#include <filename_resolver.h>
enum ENV_VAR_GRID_COLUMNS
{
EV_NAME_COL = 0,
EV_PATH_COL,
EV_FLAG_COL
};
enum SEARCH_PATH_GRID_COLUMNS
{
SP_ALIAS_COL = 0,
SP_PATH_COL,
SP_DESC_COL
};
DIALOG_CONFIGURE_PATHS::DIALOG_CONFIGURE_PATHS( wxWindow* aParent, FILENAME_RESOLVER* aResolver ) :
DIALOG_CONFIGURE_PATHS_BASE( aParent ),
m_errorGrid( nullptr ),
m_resolver( aResolver )
{
m_btnAddEnvVar->SetBitmap( KiBitmap( small_plus_xpm ) );
m_btnDeleteEnvVar->SetBitmap( KiBitmap( trash_xpm ) );
m_btnAddSearchPath->SetBitmap( KiBitmap( small_plus_xpm ) );
m_btnDeleteSearchPath->SetBitmap( KiBitmap( trash_xpm ) );
m_btnMoveUp->SetBitmap( KiBitmap( small_up_xpm ) );
m_btnMoveDown->SetBitmap( KiBitmap( small_down_xpm ) );
m_EnvVars->DeleteRows( 0, m_EnvVars->GetNumberRows() );
m_EnvVars->AppendCols( 1 ); // for the isExternal flags
m_EnvVars->HideCol( EV_FLAG_COL );
m_EnvVars->UseNativeColHeader( true );
if( m_resolver )
{
m_SearchPaths->DeleteRows( 0, m_SearchPaths->GetNumberRows() );
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 );
m_sdbSizerOK->SetDefault();
// wxFormBuilder doesn't include this event...
m_EnvVars->Connect( wxEVT_GRID_CELL_CHANGING, wxGridEventHandler( DIALOG_CONFIGURE_PATHS::OnGridCellChanging ), NULL, this );
m_SearchPaths->Connect( wxEVT_GRID_CELL_CHANGING, wxGridEventHandler( DIALOG_CONFIGURE_PATHS::OnGridCellChanging ), NULL, this );
GetSizer()->SetSizeHints( this );
Centre();
}
DIALOG_CONFIGURE_PATHS::~DIALOG_CONFIGURE_PATHS()
{
m_EnvVars->Disconnect( wxEVT_GRID_CELL_CHANGING, wxGridEventHandler( DIALOG_CONFIGURE_PATHS::OnGridCellChanging ), NULL, this );
m_SearchPaths->Disconnect( wxEVT_GRID_CELL_CHANGING, wxGridEventHandler( DIALOG_CONFIGURE_PATHS::OnGridCellChanging ), NULL, this );
}
bool DIALOG_CONFIGURE_PATHS::TransferDataToWindow()
{
if( !wxDialog::TransferDataToWindow() )
return false;
// Environment variables
const ENV_VAR_MAP& envVars = Pgm().GetLocalEnvVariables();
for( auto it = envVars.begin(); it != envVars.end(); ++it )
AppendEnvVar( it->first, it->second.GetValue(), it->second.GetDefinedExternally() );
// 3D search paths
if( m_resolver )
{
const std::list<SEARCH_PATH>* paths = m_resolver->GetPaths();
auto it = paths->begin();
while( it != paths->end()
&& ( ( *it ).m_alias.StartsWith( "${" ) || ( *it ).m_alias.StartsWith( "$(" ) ) )
++it;
if( it != paths->end() )
m_curdir = ( *it ).m_pathexp;
for( ; it != paths->end(); ++it )
AppendSearchPath( it->m_alias, it->m_pathvar, it->m_description );
}
return true;
}
void DIALOG_CONFIGURE_PATHS::AppendEnvVar( const wxString& aName, const wxString& aPath,
bool isExternal )
{
int i = m_EnvVars->GetNumberRows();
m_EnvVars->AppendRows( 1 );
m_EnvVars->SetCellValue( i, EV_NAME_COL, aName );
wxGridCellAttr* nameCellAttr = m_EnvVars->GetOrCreateCellAttr( i, EV_NAME_COL );
wxGridCellTextEditor* nameTextEditor = new GRID_CELL_TEXT_EDITOR();
nameTextEditor->SetValidator( ENV_VAR_NAME_VALIDATOR() );
nameCellAttr->SetEditor( nameTextEditor );
nameCellAttr->SetReadOnly( IsEnvVarImmutable( aName ) );
nameCellAttr->DecRef();
m_EnvVars->SetCellValue( i, EV_PATH_COL, aPath );
wxGridCellAttr* pathCellAttr = m_EnvVars->GetOrCreateCellAttr( i, EV_PATH_COL );
wxSystemColour c = isExternal ? wxSYS_COLOUR_MENU : wxSYS_COLOUR_LISTBOX;
pathCellAttr->SetBackgroundColour( wxSystemSettings::GetColour( c ) );
pathCellAttr->DecRef();
m_EnvVars->SetCellValue( i, EV_FLAG_COL, isExternal ? wxT( "external" ) : wxEmptyString );
}
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( !wxDialog::TransferDataFromWindow() )
return false;
// Commit any pending in-place edits and close the editor
m_EnvVars->DisableCellEditControl();
m_SearchPaths->DisableCellEditControl();
// Environment variables
ENV_VAR_MAP envVarMap;
for( int row = 0; row < m_EnvVars->GetNumberRows(); ++row )
{
wxString name = m_EnvVars->GetCellValue( row, EV_NAME_COL );
wxString path = m_EnvVars->GetCellValue( row, EV_PATH_COL );
if( name.IsEmpty() )
{
m_errorGrid = m_EnvVars;
m_errorRow = row;
m_errorCol = EV_NAME_COL;
m_errorMsg = _( "Environment variable name cannot be empty." );
return false;
}
else if( path.IsEmpty() )
{
m_errorGrid = m_EnvVars;
m_errorRow = row;
m_errorCol = EV_PATH_COL;
m_errorMsg = _( "Environment variable path cannot be empty." );
return false;
}
envVarMap[ name ] = ENV_VAR_ITEM( path );
}
Pgm().SetLocalEnvVariables( envVarMap );
// 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;
}
void DIALOG_CONFIGURE_PATHS::OnGridCellChanging( wxGridEvent& event )
{
wxGrid* grid = dynamic_cast<wxGrid*>( event.GetEventObject() );
int row = event.GetRow();
int col = event.GetCol();
wxString text = event.GetString();
if( text.IsEmpty() )
{
if( grid == m_EnvVars )
{
if( col == EV_NAME_COL )
m_errorMsg = _( "Environment variable name cannot be empty." );
else
m_errorMsg = _( "Environment variable path cannot be empty." );
}
else
{
if( col == SP_ALIAS_COL )
m_errorMsg = _( "3D search path alias cannot be empty." );
else
m_errorMsg = _( "3D search path cannot be empty." );
}
m_errorGrid = dynamic_cast<wxGrid*>( event.GetEventObject() );
m_errorRow = row;
m_errorCol = col;
event.Veto();
}
if( grid == m_EnvVars )
{
if( col == EV_PATH_COL && m_EnvVars->GetCellValue( row, EV_FLAG_COL ).Length() )
{
wxString msg1 = _( "This path was defined externally to the running process and\n"
"will only be temporarily overwritten." );
wxString msg2 = _( "The next time KiCad is launched, any paths that have already\n"
"been defined are honored and any settings defined in the path\n"
"configuration dialog are ignored. If you did not intend for\n"
"this behavior, either rename any conflicting entries or remove\n"
"the external environment variable(s) from your system." );
KIDIALOG dlg( this, msg1, KIDIALOG::KD_WARNING );
dlg.ShowDetailedText( msg2 );
dlg.DoNotShowCheckbox();
dlg.ShowModal();
}
else if( col == EV_NAME_COL && m_EnvVars->GetCellValue( row, EV_NAME_COL ) != text )
{
// Changing name; clear external flag
m_EnvVars->SetCellValue( row, EV_FLAG_COL, wxEmptyString );
}
}
}
void DIALOG_CONFIGURE_PATHS::OnAddEnvVar( wxCommandEvent& event )
{
AppendEnvVar( wxEmptyString, wxEmptyString, false );
m_EnvVars->MakeCellVisible( m_EnvVars->GetNumberRows() - 1, EV_NAME_COL );
m_EnvVars->SetGridCursor( m_EnvVars->GetNumberRows() - 1, EV_NAME_COL );
m_EnvVars->EnableCellEditControl( true );
m_EnvVars->ShowCellEditControl();
}
void DIALOG_CONFIGURE_PATHS::OnAddSearchPath( wxCommandEvent& event )
{
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();
if( !m_EnvVars->HasFocus() || curRow < 0 )
{
m_EnvVars->SetFocus();
return;
}
if( IsEnvVarImmutable( m_EnvVars->GetCellValue( curRow, EV_NAME_COL ) ) )
{
wxBell();
return;
}
m_EnvVars->DeleteRows( curRow, 1 );
curRow = std::max( 0, curRow - 1 );
m_EnvVars->MakeCellVisible( curRow, m_EnvVars->GetGridCursorCol() );
m_EnvVars->SetGridCursor( curRow, m_EnvVars->GetGridCursorCol() );
}
void DIALOG_CONFIGURE_PATHS::OnDeleteSearchPath( wxCommandEvent& event )
{
int curRow = m_SearchPaths->GetGridCursorRow();
if( !m_SearchPaths->HasFocus() || curRow < 0 )
{
m_SearchPaths->SetFocus();
return;
}
m_SearchPaths->DeleteRows( curRow, 1 );
curRow = std::max( 0, curRow - 1 );
m_SearchPaths->MakeCellVisible( curRow, m_SearchPaths->GetGridCursorCol() );
m_SearchPaths->SetGridCursor( curRow, m_SearchPaths->GetGridCursorCol() );
}
void DIALOG_CONFIGURE_PATHS::OnSearchPathMoveUp( wxCommandEvent& event )
{
int curRow = m_SearchPaths->GetGridCursorRow();
int prevRow = curRow - 1;
m_SearchPaths->DisableCellEditControl();
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() );
}
}
void DIALOG_CONFIGURE_PATHS::OnSearchPathMoveDown( wxCommandEvent& event )
{
int curRow = m_SearchPaths->GetGridCursorRow();
int nextRow = curRow + 1;
m_SearchPaths->DisableCellEditControl();
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() );
}
}
void DIALOG_CONFIGURE_PATHS::OnGridCellRightClick( wxGridEvent& aEvent )
{
wxASSERT( (int) EV_PATH_COL == (int) SP_PATH_COL );
if( aEvent.GetCol() == EV_PATH_COL )
{
wxMenu menu;
AddMenuItem( &menu, 1, _( "File Browser..." ), KiBitmap( folder_xpm ) );
if( GetPopupMenuSelectionFromUser( menu ) == 1 )
{
wxString title = _( "Select Path" );
wxString path; // Currently the first opened path is not initialized
wxDirDialog dlg( nullptr, title, path, wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST );
if( dlg.ShowModal() == wxID_OK )
{
wxGrid* grid = dynamic_cast<wxGrid*>( aEvent.GetEventObject() );
grid->SetCellValue( aEvent.GetRow(), EV_PATH_COL, dlg.GetPath() );
}
}
}
}
void DIALOG_CONFIGURE_PATHS::AdjustGridColumns( int aWidth )
{
m_EnvVars->AutoSizeColumn( EV_NAME_COL );
m_EnvVars->SetColSize( EV_NAME_COL, std::max( m_EnvVars->GetColSize( EV_NAME_COL ), 120 ) );
m_EnvVars->SetColSize( EV_PATH_COL, aWidth - m_EnvVars->GetColSize( EV_NAME_COL ) );
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, aWidth - ( m_SearchPaths->GetColSize( SP_ALIAS_COL )
+ m_SearchPaths->GetColSize( SP_PATH_COL ) ) );
}
void DIALOG_CONFIGURE_PATHS::OnUpdateUI( wxUpdateUIEvent& event )
{
if( !m_EnvVars->IsCellEditControlShown() && !m_SearchPaths->IsCellEditControlShown() )
AdjustGridColumns( m_EnvVars->GetRect().GetWidth() );
// Handle a grid error. This is delayed to OnUpdateUI so that we can change focus
// even when the original validation was triggered from a killFocus event (and for
// dialog with notebooks, so that the corresponding notebook page can be shown in
// the background when triggered from an OK).
if( m_errorGrid )
{
// We will re-enter this routine when the error dialog is displayed, so make
// sure we don't keep putting up more dialogs.
wxGrid* grid = m_errorGrid;
m_errorGrid = nullptr;
DisplayErrorMessage( this, m_errorMsg );
grid->SetFocus();
grid->MakeCellVisible( m_errorRow, m_errorCol );
grid->SetGridCursor( m_errorRow, m_errorCol );
grid->EnableCellEditControl( true );
grid->ShowCellEditControl();
}
}
void DIALOG_CONFIGURE_PATHS::OnGridSize( wxSizeEvent& event )
{
AdjustGridColumns( event.GetSize().GetX() );
event.Skip();
}
void DIALOG_CONFIGURE_PATHS::OnHelp( wxCommandEvent& event )
{
wxString msg = _( "Enter the name and value for each environment variable. Grey entries "
"are names that have been defined externally at the system or user "
"level. Environment variables defined at the system or user level "
"take precedence over the ones defined in this table. This means the "
"values in this table are ignored." );
msg << wxT( "<br><br><b>" );
msg << _( "To ensure environment variable names are valid on all platforms, the name field "
"will only accept upper case letters, digits, and the underscore characters." );
msg << wxT( "</b><br><br>" );
msg << _( "<b>KICAD_SYMBOL_DIR</b> is the base path of the locally installed symbol libraries." );
msg << wxT( "<br><br>" );
msg << _( "<b>KIGITHUB</b> is used by KiCad to define the URL of the repository "
"of the official KiCad footprint libraries." );
msg << wxT( "<br><br>" );
msg << _( "<b>KISYS3DMOD</b> is the base path of system footprint 3D "
"shapes (.3Dshapes folders)." );
msg << wxT( "<br><br>" );
msg << _( "<b>KISYSMOD</b> is the base path of locally installed system "
"footprint libraries (.pretty folders)." );
msg << wxT( "<br><br>" );
msg << _( "<b>KIPRJMOD</b> is internally defined by KiCad (cannot be edited) and is set "
"to the absolute path of the currently loaded project file. This environment "
"variable can be used to define files and paths relative to the currently loaded "
"project. For instance, ${KIPRJMOD}/libs/footprints.pretty can be defined as a "
"folder containing a project specific footprint library named footprints.pretty." );
msg << wxT( "<br><br>" );
msg << _( "<b>KICAD_PTEMPLATES</b> is optional and can be defined if you want to "
"create your own project templates folder." );
HTML_MESSAGE_BOX dlg( GetParent(), _( "Environment Variable Help" ) );
dlg.SetDialogSizeInDU( 400, 250 );
dlg.AddHTML_Text( msg );
dlg.ShowModal();
}
bool DIALOG_CONFIGURE_PATHS::IsEnvVarImmutable( const wxString aEnvVar )
{
/*
* TODO - Instead of defining these values here,
* extract them from elsewhere in the program
* (where they are originally defined)
*/
static const wxString immutable[] = {
"KIGITHUB",
"KISYS3DMOD",
"KISYSMOD",
"KIPRJMOD",
"KICAD_PTEMPLATES",
"KICAD_SYMBOL_DIR"
};
for( const auto& ii : immutable )
{
if( aEnvVar.Cmp( ii ) == 0 )
return true;
}
return false;
}

View File

@ -0,0 +1,186 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Dec 30 2017)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#include "dialog_configure_paths_base.h"
///////////////////////////////////////////////////////////////////////////
DIALOG_CONFIGURE_PATHS_BASE::DIALOG_CONFIGURE_PATHS_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style )
{
this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize );
wxBoxSizer* bSizerMain;
bSizerMain = new wxBoxSizer( wxVERTICAL );
wxStaticBoxSizer* sbEnvVars;
sbEnvVars = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Environment Variables") ), wxVERTICAL );
m_EnvVars = new wxGrid( sbEnvVars->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
// Grid
m_EnvVars->CreateGrid( 1, 2 );
m_EnvVars->EnableEditing( true );
m_EnvVars->EnableGridLines( true );
m_EnvVars->EnableDragGridSize( false );
m_EnvVars->SetMargins( 0, 0 );
// Columns
m_EnvVars->SetColSize( 0, 150 );
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->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
// Rows
m_EnvVars->EnableDragRowSize( true );
m_EnvVars->SetRowLabelSize( 0 );
m_EnvVars->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
// Label Appearance
// Cell Defaults
m_EnvVars->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP );
m_EnvVars->SetMinSize( wxSize( 600,150 ) );
sbEnvVars->Add( m_EnvVars, 1, wxEXPAND|wxBOTTOM, 5 );
wxBoxSizer* bSizerEnvVarBtns;
bSizerEnvVarBtns = new wxBoxSizer( wxHORIZONTAL );
m_btnAddEnvVar = new wxBitmapButton( sbEnvVars->GetStaticBox(), wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW );
m_btnAddEnvVar->SetMinSize( wxSize( 29,29 ) );
bSizerEnvVarBtns->Add( m_btnAddEnvVar, 0, 0, 5 );
m_btnDeleteEnvVar = new wxBitmapButton( sbEnvVars->GetStaticBox(), wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW );
m_btnDeleteEnvVar->SetMinSize( wxSize( 29,29 ) );
bSizerEnvVarBtns->Add( m_btnDeleteEnvVar, 0, 0, 5 );
sbEnvVars->Add( bSizerEnvVarBtns, 0, wxEXPAND, 5 );
bSizerMain->Add( sbEnvVars, 1, wxEXPAND|wxALL, 5 );
m_sb3DSearchPaths = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("3D Search Paths") ), wxVERTICAL );
m_SearchPaths = new wxGrid( 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_CENTRE, wxALIGN_CENTRE );
// Rows
m_SearchPaths->AutoSizeRows();
m_SearchPaths->EnableDragRowSize( false );
m_SearchPaths->SetRowLabelSize( 0 );
m_SearchPaths->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
// Label Appearance
// Cell Defaults
m_SearchPaths->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP );
m_SearchPaths->SetMinSize( wxSize( 600,150 ) );
m_sb3DSearchPaths->Add( m_SearchPaths, 1, wxEXPAND|wxBOTTOM, 5 );
wxBoxSizer* bSizerSearchPathBtns;
bSizerSearchPathBtns = new wxBoxSizer( wxHORIZONTAL );
m_btnAddSearchPath = new wxBitmapButton( m_sb3DSearchPaths->GetStaticBox(), wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW );
m_btnAddSearchPath->SetMinSize( wxSize( 29,29 ) );
bSizerSearchPathBtns->Add( m_btnAddSearchPath, 0, 0, 5 );
m_btnDeleteSearchPath = new wxBitmapButton( m_sb3DSearchPaths->GetStaticBox(), wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW );
m_btnDeleteSearchPath->SetMinSize( wxSize( 29,29 ) );
bSizerSearchPathBtns->Add( m_btnDeleteSearchPath, 0, wxRIGHT, 10 );
m_btnMoveUp = new wxBitmapButton( m_sb3DSearchPaths->GetStaticBox(), wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW );
m_btnMoveUp->SetMinSize( wxSize( 29,29 ) );
bSizerSearchPathBtns->Add( m_btnMoveUp, 0, wxLEFT, 10 );
m_btnMoveDown = new wxBitmapButton( m_sb3DSearchPaths->GetStaticBox(), wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW );
m_btnMoveDown->SetMinSize( wxSize( 29,29 ) );
bSizerSearchPathBtns->Add( m_btnMoveDown, 0, 0, 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 );
m_sdbSizerCancel = new wxButton( this, wxID_CANCEL );
m_sdbSizer->AddButton( m_sdbSizerCancel );
m_sdbSizerHelp = new wxButton( this, wxID_HELP );
m_sdbSizer->AddButton( m_sdbSizerHelp );
m_sdbSizer->Realize();
bSizerMain->Add( m_sdbSizer, 0, wxALL|wxEXPAND, 5 );
this->SetSizer( bSizerMain );
this->Layout();
bSizerMain->Fit( this );
this->Centre( wxBOTH );
// Connect Events
m_EnvVars->Connect( wxEVT_SIZE, wxSizeEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnGridSize ), NULL, this );
m_EnvVars->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnUpdateUI ), 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_RIGHT_CLICK, wxGridEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnGridCellRightClick ), NULL, this );
m_SearchPaths->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnUpdateUI ), NULL, this );
m_btnAddSearchPath->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnAddSearchPath ), NULL, this );
m_btnDeleteSearchPath->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnDeleteSearchPath ), 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_sdbSizerHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnHelp ), NULL, this );
}
DIALOG_CONFIGURE_PATHS_BASE::~DIALOG_CONFIGURE_PATHS_BASE()
{
// Disconnect Events
m_EnvVars->Disconnect( wxEVT_SIZE, wxSizeEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnGridSize ), NULL, this );
m_EnvVars->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnUpdateUI ), 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_RIGHT_CLICK, wxGridEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnGridCellRightClick ), NULL, this );
m_SearchPaths->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnUpdateUI ), NULL, this );
m_btnAddSearchPath->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnAddSearchPath ), NULL, this );
m_btnDeleteSearchPath->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnDeleteSearchPath ), 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_sdbSizerHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnHelp ), NULL, this );
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,75 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Dec 30 2017)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#ifndef __DIALOG_CONFIGURE_PATHS_BASE_H__
#define __DIALOG_CONFIGURE_PATHS_BASE_H__
#include <wx/artprov.h>
#include <wx/xrc/xmlres.h>
#include <wx/intl.h>
#include "dialog_shim.h"
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/string.h>
#include <wx/font.h>
#include <wx/grid.h>
#include <wx/gdicmn.h>
#include <wx/bitmap.h>
#include <wx/image.h>
#include <wx/icon.h>
#include <wx/bmpbuttn.h>
#include <wx/button.h>
#include <wx/sizer.h>
#include <wx/statbox.h>
#include <wx/dialog.h>
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// Class DIALOG_CONFIGURE_PATHS_BASE
///////////////////////////////////////////////////////////////////////////////
class DIALOG_CONFIGURE_PATHS_BASE : public DIALOG_SHIM
{
private:
protected:
wxGrid* m_EnvVars;
wxBitmapButton* m_btnAddEnvVar;
wxBitmapButton* m_btnDeleteEnvVar;
wxStaticBoxSizer* m_sb3DSearchPaths;
wxGrid* m_SearchPaths;
wxBitmapButton* m_btnAddSearchPath;
wxBitmapButton* m_btnDeleteSearchPath;
wxBitmapButton* m_btnMoveUp;
wxBitmapButton* m_btnMoveDown;
wxStdDialogButtonSizer* m_sdbSizer;
wxButton* m_sdbSizerOK;
wxButton* m_sdbSizerCancel;
wxButton* m_sdbSizerHelp;
// Virtual event handlers, overide them in your derived class
virtual void OnGridSize( wxSizeEvent& event ) { event.Skip(); }
virtual void OnUpdateUI( wxUpdateUIEvent& event ) { event.Skip(); }
virtual void OnAddEnvVar( wxCommandEvent& event ) { event.Skip(); }
virtual void OnRemoveEnvVar( wxCommandEvent& event ) { event.Skip(); }
virtual void OnGridCellRightClick( wxGridEvent& event ) { event.Skip(); }
virtual void OnAddSearchPath( wxCommandEvent& event ) { event.Skip(); }
virtual void OnDeleteSearchPath( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSearchPathMoveUp( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSearchPathMoveDown( 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();
};
#endif //__DIALOG_CONFIGURE_PATHS_BASE_H__

View File

@ -1,511 +0,0 @@
/*
* This program source code file is part of KICAD, a free EDA CAD application.
*
* Copyright (C) 2015 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 2015-2018 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file dialog_env_var_config.cpp
*/
#include <dialog_env_var_config.h>
#include <confirm.h>
#include <validators.h>
#include <html_messagebox.h>
#include <wx/regex.h>
/** A helper dialog to edit a env var name and/or its value (often a path)
*/
class DIALOG_ENV_VAR_SINGLE : public DIALOG_ENV_VAR_SINGLE_BASE
{
public:
DIALOG_ENV_VAR_SINGLE( wxWindow* parent, const wxString& aEnvVarName,
const wxString& aEnvVarPath );
/// @return the new environment variable name
wxString GetEnvVarName() const
{
return m_envVarName->GetValue();
}
/// @return the new environment variable value
wxString GetEnvVarValue() const
{
return m_envVarPath->GetValue();
}
/// disable the environment variable name (must be called
/// for predefined environment variable names, not editable
void SetEnvVarProtected()
{
m_envVarName->Enable( false );
}
protected:
void OnSelectPath( wxCommandEvent& event ) override;
void onHelpClick( wxCommandEvent& event ) override;
// Currently, only upper case variable names are accepted. onVarNameChange
// changes on the fly any lower case char by the corresponding upper case
void onVarNameChange( wxCommandEvent& event ) override;
bool TransferDataFromWindow() override;
};
DIALOG_ENV_VAR_CONFIG::DIALOG_ENV_VAR_CONFIG( wxWindow* aParent, const ENV_VAR_MAP& aEnvVarMap ) :
DIALOG_ENV_VAR_CONFIG_BASE( aParent )
{
// Copy environment variables across
m_envVarMap = aEnvVarMap;
}
bool DIALOG_ENV_VAR_CONFIG::TransferDataToWindow()
{
wxLogDebug( wxT( "In DIALOG_ENV_VAR_CONFIG::TransferDataToWindow()." ) );
if( !wxDialog::TransferDataToWindow() )
return false;
//TODO
/*
// Grab the project path var (not editable)
wxString prjPath;
wxGetEnv( PROJECT_VAR_NAME, &prjPath );
m_kiprjmod->SetLabel( prjPath );
*/
//TODO - Call SetAlternateRowColour first to prevent assertion error
//m_pathList->EnableAlternateRowColours( true );
PopulatePathList();
// Select the first item in the list
SelectListIndex( 0 );
GetSizer()->Layout();
GetSizer()->Fit( this );
GetSizer()->SetSizeHints( this );
return true;
}
bool DIALOG_ENV_VAR_CONFIG::TransferDataFromWindow()
{
if( !wxDialog::TransferDataFromWindow() )
{
return false;
}
Pgm().SetLocalEnvVariables( m_envVarMap );
return true;
}
void DIALOG_ENV_VAR_CONFIG::PopulatePathList()
{
m_pathList->Freeze();
m_pathList->ClearAll();
m_pathList->AppendColumn( _( "Name:" ) );
m_pathList->AppendColumn( _( "Path:" ) );
int row = 0;
for( auto it = m_envVarMap.begin(); it != m_envVarMap.end(); ++it )
{
long index = m_pathList->InsertItem( row, it->first );
m_pathList->SetItem( index, 1, it->second.GetValue() );
if( it->second.GetDefinedExternally() )
{
wxColour color = wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT );
m_pathList->SetItemBackgroundColour( index, color );
}
row++;
}
m_pathList->SetColumnWidth( 0, wxLIST_AUTOSIZE );
m_pathList->SetColumnWidth( 1, wxLIST_AUTOSIZE );
m_pathList->Update();
m_pathList->Thaw();
}
bool DIALOG_ENV_VAR_CONFIG::GetPathAtIndex( unsigned int aIndex, wxString& aEnvVar,
wxString& aEnvPath )
{
if( aIndex > m_envVarMap.size() )
{
return false;
}
unsigned int idx = 0;
for( auto it = m_envVarMap.begin(); it != m_envVarMap.end(); ++it )
{
if( idx == aIndex )
{
aEnvVar = it->first;
aEnvPath = it->second.GetValue();
return true;
}
idx++;
}
return false;
}
void DIALOG_ENV_VAR_CONFIG::OnAddButton( wxCommandEvent& event )
{
DIALOG_ENV_VAR_SINGLE dlg( nullptr, wxEmptyString, wxEmptyString );
if( dlg.ShowModal() == wxID_OK )
{
wxString newName = dlg.GetEnvVarName();
wxString newPath = dlg.GetEnvVarValue();
// Check that the name does not already exist
if( m_envVarMap.count( newName ) > 0 )
{
//TODO - Improve this message, use DisplayErrorMessage instead
DisplayError( this, _( "Path already exists." ) );
}
else
{
m_envVarMap[newName] = ENV_VAR_ITEM( newPath );
// Update path list
PopulatePathList();
}
}
}
void DIALOG_ENV_VAR_CONFIG::OnEditButton( wxCommandEvent& event )
{
EditSelectedEntry();
}
void DIALOG_ENV_VAR_CONFIG::EditSelectedEntry()
{
wxString envName;
wxString envPath;
if( GetPathAtIndex( m_pathIndex, envName, envPath ) )
{
auto dlg = new DIALOG_ENV_VAR_SINGLE( nullptr, envName, envPath );
if( IsEnvVarImmutable( envName ) )
{
dlg->SetEnvVarProtected();
}
if( dlg->ShowModal() == wxID_OK )
{
wxString newName = dlg->GetEnvVarName();
wxString newPath = dlg->GetEnvVarValue();
// If the path name has not been changed
if( envName.Cmp( newName ) == 0 )
{
m_envVarMap[envName].SetValue( newPath );
if( m_envVarMap[envName].GetDefinedExternally() )
{
m_extDefsChanged = true;
}
}
// Path-name needs to be updated
else
{
if( IsEnvVarImmutable( envName ) )
{
DisplayErrorMessage( this,
wxString::Format( _( "Environment variable \"%s\" cannot "
"be renamed." ),
envName.ToStdString() ),
_( "The selected environment variable name "
"is required for KiCad functionality and "
"can not be renamed." ) );
return;
}
auto envVar = m_envVarMap[envName];
m_envVarMap.erase( envName );
envVar.SetValue( newPath );
envVar.SetDefinedExternally( false );
m_envVarMap[newName] = envVar;
}
// Update the path list
PopulatePathList();
}
dlg->Destroy();
}
}
void DIALOG_ENV_VAR_CONFIG::OnHelpButton( wxCommandEvent& event )
{
wxString msg = _( "Enter the name and value for each environment variable. Grey entries "
"are names that have been defined externally at the system or user "
"level. Environment variables defined at the system or user level "
"take precedence over the ones defined in this table. This means the "
"values in this table are ignored." );
msg << wxT( "<br><br><b>" );
msg << _( "To ensure environment variable names are valid on all platforms, the name field "
"will only accept upper case letters, digits, and the underscore characters." );
msg << wxT( "</b><br><br>" );
msg << _( "<b>KICAD_SYMBOL_DIR</b> is the base path of the locally installed symbol "
"libraries." );
msg << wxT( "<br><br>" );
msg << _( "<b>KIGITHUB</b> is used by KiCad to define the URL of the repository "
"of the official KiCad footprint libraries. This is only required if the "
"Github plugin is used to access footprint libraries" );
msg << wxT( "<br><br>" );
msg << _( "<b>KISYS3DMOD</b> is the base path of system footprint 3D "
"shapes (.3Dshapes folders)." );
msg << wxT( "<br><br>" );
msg << _( "<b>KISYSMOD</b> is the base path of locally installed system "
"footprint libraries (.pretty folders)." );
msg << wxT( "<br><br>" );
msg << _( "<b>KIPRJMOD</b> is internally defined by KiCad (cannot be edited) and is set "
"to the absolute path of the currently loaded project file. This environment "
"variable can be used to define files and paths relative to the currently loaded "
"project. For instance, ${KIPRJMOD}/libs/footprints.pretty can be defined as a "
"folder containing a project specific footprint library named footprints.pretty." );
msg << wxT( "<br><br>" );
msg << _( "<b>KICAD_TEMPLATE_DIR</b> is required and is the path containing the project "
"templates installed with KiCad." );
msg << wxT( "<br><br>" );
msg << _( "<b>KICAD_USER_TEMPLATE_DIR</b> is required and is the path containing any user "
"specific project templates." );
HTML_MESSAGE_BOX dlg( GetParent(), _( "Environment Variable Help" ) );
dlg.SetDialogSizeInDU( 400, 350 );
dlg.AddHTML_Text( msg );
dlg.ShowModal();
}
bool DIALOG_ENV_VAR_CONFIG::IsEnvVarImmutable( const wxString aEnvVar )
{
/*
* TODO - Instead of defining these values here,
* extract them from elsewhere in the program
* (where they are originally defined)
*/
static const wxString immutable[] = {
"KIGITHUB",
"KISYS3DMOD",
"KISYSMOD",
"KIPRJMOD",
"KICAD_SYMBOL_DIR",
"KICAD_TEMPLATE_DIR",
"KICAD_USER_TEMPLATE_DIR"
};
for( unsigned int ii=0; ii<6; ii++ )
{
if( aEnvVar.Cmp( immutable[ii] ) == 0 )
{
return true;
}
}
return false;
}
void DIALOG_ENV_VAR_CONFIG::OnRemoveButton( wxCommandEvent& event )
{
wxString envName;
wxString envPath;
if( GetPathAtIndex( m_pathIndex, envName, envPath ) )
{
if( IsEnvVarImmutable( envName ) )
{
return;
}
m_envVarMap.erase( envName );
PopulatePathList();
}
}
void DIALOG_ENV_VAR_CONFIG::SelectListIndex( unsigned int aIndex )
{
if( aIndex >= m_envVarMap.size() )
{
aIndex = 0;
}
m_pathIndex = aIndex;
wxString envName;
wxString envPath;
if( GetPathAtIndex( m_pathIndex, envName, envPath ) )
{
// Disable the 'delete' button if the path cannot be deleted
m_deletePathButton->Enable( !IsEnvVarImmutable( envName ) );
}
}
void DIALOG_ENV_VAR_CONFIG::OnPathSelected( wxListEvent& event )
{
SelectListIndex( event.GetIndex() );
}
void DIALOG_ENV_VAR_CONFIG::OnPathActivated( wxListEvent& event )
{
SelectListIndex( event.GetIndex() );
EditSelectedEntry();
}
///////////////////////////
// DIALOG_ENV_VAR_SINGLE //
///////////////////////////
DIALOG_ENV_VAR_SINGLE::DIALOG_ENV_VAR_SINGLE( wxWindow* parent,
const wxString& aEnvVarName,
const wxString& aEnvVarPath ) :
DIALOG_ENV_VAR_SINGLE_BASE( parent )
{
m_envVarName->SetValue( aEnvVarName );
m_envVarPath->SetValue( aEnvVarPath );
m_envVarName->SetValidator( ENV_VAR_NAME_VALIDATOR() );
}
void DIALOG_ENV_VAR_SINGLE::OnSelectPath( wxCommandEvent& event )
{
wxString title = _( "Select Path for Environment Variable" );
wxString path; // Currently the first opened path is not initialized
wxDirDialog dlg( nullptr, title, path, wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST );
if( dlg.ShowModal() == wxID_OK )
m_envVarPath->SetValue( dlg.GetPath() );
}
void DIALOG_ENV_VAR_SINGLE::onVarNameChange( wxCommandEvent& event )
{
wxString upper_var = m_envVarName->GetValue().Upper();
if( upper_var != m_envVarName->GetValue() )
{
int pos = m_envVarName->GetInsertionPoint();
m_envVarName->ChangeValue( upper_var );
m_envVarName->SetInsertionPoint( pos );
}
}
bool DIALOG_ENV_VAR_SINGLE::TransferDataFromWindow()
{
// The user pressed the OK button, test data validity
wxString name = m_envVarName->GetValue();
wxString path = m_envVarPath->GetValue();
// Neither name nor path can be empty
if( name.IsEmpty() )
{
DisplayError( this, _( "Environment variable name cannot be empty." ) );
// Veto:
return false;
}
if( path.IsEmpty() )
{
DisplayError( this, _( "Environment variable value cannot be empty." ) );
// Veto:
return false;
}
// Name cannot start with a number
if( name.Left( 1 ).IsNumber() )
{
DisplayError( this, _( "Environment variable names cannot start with a digit (0-9)." ) );
// Veto:
return false;
}
// No errors detected
return true;
}
void DIALOG_ENV_VAR_SINGLE::onHelpClick( wxCommandEvent& event )
{
wxString msg = _( "An environment variable is used for string substitutions.<br>"
"Environment variables are primarily used for paths to make KiCad portable "
"between platforms.<br><br>"
"If an environment variable is defined as <b>MYLIBPATH</b> with a "
"value <b>e:/kicad_libs</b>, then a library name "
"<b>${MYLIBPATH}/mylib.lib</b> gets expanded to "
"<b>e:/kicad_libs/mylib.lib</b>"
"<br><br>"
"<b>Note:</b><br>"
"Only characters <b>ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_</b> are "
"allowed in environment variable names and the environment variable name "
"cannot start with a digit (0-9)."
);
HTML_MESSAGE_BOX dlg( GetParent(), _( "Environment Variable Help" ) );
dlg.SetDialogSizeInDU( 400, 350 );
dlg.AddHTML_Text( msg );
dlg.ShowModal();
}

View File

@ -1,167 +0,0 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Aug 4 2017)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#include "dialog_env_var_config_base.h"
///////////////////////////////////////////////////////////////////////////
DIALOG_ENV_VAR_CONFIG_BASE::DIALOG_ENV_VAR_CONFIG_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style )
{
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
wxBoxSizer* mainSizer;
mainSizer = new wxBoxSizer( wxVERTICAL );
wxBoxSizer* bSizer7;
bSizer7 = new wxBoxSizer( wxHORIZONTAL );
m_pathList = new wxListCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_HRULES|wxLC_REPORT|wxLC_VRULES );
bSizer7->Add( m_pathList, 1, wxALL|wxEXPAND, 5 );
wxBoxSizer* bSizer6;
bSizer6 = new wxBoxSizer( wxVERTICAL );
m_addPathButton = new wxButton( this, ID_BUTTON_ADD_PATH, _("Add"), wxDefaultPosition, wxDefaultSize, 0 );
m_addPathButton->SetToolTip( _("Add path prefix") );
bSizer6->Add( m_addPathButton, 0, wxALL, 5 );
m_editPathButton = new wxButton( this, ID_BUTTON_EDIT_PATH, _("Edit"), wxDefaultPosition, wxDefaultSize, 0 );
m_editPathButton->SetToolTip( _("Edit selected path prefix") );
bSizer6->Add( m_editPathButton, 0, wxBOTTOM|wxLEFT|wxRIGHT, 5 );
m_deletePathButton = new wxButton( this, ID_BUTTON_DELETE_PATH, _("Remove"), wxDefaultPosition, wxDefaultSize, 0 );
m_deletePathButton->SetToolTip( _("Remove selected path prefix") );
bSizer6->Add( m_deletePathButton, 0, wxBOTTOM|wxLEFT|wxRIGHT, 5 );
bSizer6->Add( 0, 0, 1, wxEXPAND, 5 );
bSizer7->Add( bSizer6, 0, wxEXPAND, 5 );
mainSizer->Add( bSizer7, 1, wxEXPAND, 5 );
m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
mainSizer->Add( m_staticline1, 0, wxEXPAND | wxALL, 5 );
m_sdbSizer = new wxStdDialogButtonSizer();
m_sdbSizerOK = new wxButton( this, wxID_OK );
m_sdbSizer->AddButton( m_sdbSizerOK );
m_sdbSizerCancel = new wxButton( this, wxID_CANCEL );
m_sdbSizer->AddButton( m_sdbSizerCancel );
m_sdbSizerHelp = new wxButton( this, wxID_HELP );
m_sdbSizer->AddButton( m_sdbSizerHelp );
m_sdbSizer->Realize();
mainSizer->Add( m_sdbSizer, 0, wxBOTTOM|wxALIGN_RIGHT, 5 );
this->SetSizer( mainSizer );
this->Layout();
mainSizer->Fit( this );
this->Centre( wxBOTH );
// Connect Events
m_pathList->Connect( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler( DIALOG_ENV_VAR_CONFIG_BASE::OnPathActivated ), NULL, this );
m_pathList->Connect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( DIALOG_ENV_VAR_CONFIG_BASE::OnPathSelected ), NULL, this );
m_addPathButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_ENV_VAR_CONFIG_BASE::OnAddButton ), NULL, this );
m_editPathButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_ENV_VAR_CONFIG_BASE::OnEditButton ), NULL, this );
m_deletePathButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_ENV_VAR_CONFIG_BASE::OnRemoveButton ), NULL, this );
m_sdbSizerHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_ENV_VAR_CONFIG_BASE::OnHelpButton ), NULL, this );
}
DIALOG_ENV_VAR_CONFIG_BASE::~DIALOG_ENV_VAR_CONFIG_BASE()
{
// Disconnect Events
m_pathList->Disconnect( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler( DIALOG_ENV_VAR_CONFIG_BASE::OnPathActivated ), NULL, this );
m_pathList->Disconnect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( DIALOG_ENV_VAR_CONFIG_BASE::OnPathSelected ), NULL, this );
m_addPathButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_ENV_VAR_CONFIG_BASE::OnAddButton ), NULL, this );
m_editPathButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_ENV_VAR_CONFIG_BASE::OnEditButton ), NULL, this );
m_deletePathButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_ENV_VAR_CONFIG_BASE::OnRemoveButton ), NULL, this );
m_sdbSizerHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_ENV_VAR_CONFIG_BASE::OnHelpButton ), NULL, this );
}
DIALOG_ENV_VAR_SINGLE_BASE::DIALOG_ENV_VAR_SINGLE_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style )
{
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
wxBoxSizer* bSizerMain;
bSizerMain = new wxBoxSizer( wxVERTICAL );
wxFlexGridSizer* fgSizer1;
fgSizer1 = new wxFlexGridSizer( 0, 3, 0, 0 );
fgSizer1->AddGrowableCol( 1 );
fgSizer1->SetFlexibleDirection( wxBOTH );
fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_envVarNameLabel = new wxStaticText( this, wxID_ANY, _("Name:"), wxDefaultPosition, wxDefaultSize, 0 );
m_envVarNameLabel->Wrap( -1 );
fgSizer1->Add( m_envVarNameLabel, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_envVarName = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer1->Add( m_envVarName, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
m_buttonHelp = new wxButton( this, wxID_ANY, _("Help"), wxDefaultPosition, wxDefaultSize, 0 );
fgSizer1->Add( m_buttonHelp, 0, wxALL, 5 );
m_envVarPathLabel = new wxStaticText( this, wxID_ANY, _("Value:"), wxDefaultPosition, wxDefaultSize, 0 );
m_envVarPathLabel->Wrap( -1 );
fgSizer1->Add( m_envVarPathLabel, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT|wxRIGHT, 5 );
m_envVarPath = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_envVarPath->SetMinSize( wxSize( 250,-1 ) );
fgSizer1->Add( m_envVarPath, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
m_selectPathButton = new wxButton( this, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
fgSizer1->Add( m_selectPathButton, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT|wxRIGHT, 5 );
bSizerMain->Add( fgSizer1, 0, wxALL|wxEXPAND, 5 );
bSizerMain->Add( 0, 0, 1, wxEXPAND, 5 );
m_staticline2 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
bSizerMain->Add( m_staticline2, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
m_sdbSizer2 = new wxStdDialogButtonSizer();
m_sdbSizer2OK = new wxButton( this, wxID_OK );
m_sdbSizer2->AddButton( m_sdbSizer2OK );
m_sdbSizer2Cancel = new wxButton( this, wxID_CANCEL );
m_sdbSizer2->AddButton( m_sdbSizer2Cancel );
m_sdbSizer2->Realize();
bSizerMain->Add( m_sdbSizer2, 0, wxBOTTOM|wxLEFT|wxRIGHT|wxALIGN_RIGHT, 5 );
this->SetSizer( bSizerMain );
this->Layout();
bSizerMain->Fit( this );
this->Centre( wxBOTH );
// Connect Events
m_envVarName->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_ENV_VAR_SINGLE_BASE::onVarNameChange ), NULL, this );
m_buttonHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_ENV_VAR_SINGLE_BASE::onHelpClick ), NULL, this );
m_selectPathButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_ENV_VAR_SINGLE_BASE::OnSelectPath ), NULL, this );
}
DIALOG_ENV_VAR_SINGLE_BASE::~DIALOG_ENV_VAR_SINGLE_BASE()
{
// Disconnect Events
m_envVarName->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_ENV_VAR_SINGLE_BASE::onVarNameChange ), NULL, this );
m_buttonHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_ENV_VAR_SINGLE_BASE::onHelpClick ), NULL, this );
m_selectPathButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_ENV_VAR_SINGLE_BASE::OnSelectPath ), NULL, this );
}

File diff suppressed because it is too large Load Diff

View File

@ -1,102 +0,0 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Aug 4 2017)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#ifndef __DIALOG_ENV_VAR_CONFIG_BASE_H__
#define __DIALOG_ENV_VAR_CONFIG_BASE_H__
#include <wx/artprov.h>
#include <wx/xrc/xmlres.h>
#include <wx/intl.h>
class DIALOG_SHIM;
#include "dialog_shim.h"
#include <wx/listctrl.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/string.h>
#include <wx/button.h>
#include <wx/sizer.h>
#include <wx/statline.h>
#include <wx/dialog.h>
#include <wx/stattext.h>
#include <wx/textctrl.h>
///////////////////////////////////////////////////////////////////////////
#define ID_BUTTON_ADD_PATH 1000
#define ID_BUTTON_EDIT_PATH 1001
#define ID_BUTTON_DELETE_PATH 1002
///////////////////////////////////////////////////////////////////////////////
/// Class DIALOG_ENV_VAR_CONFIG_BASE
///////////////////////////////////////////////////////////////////////////////
class DIALOG_ENV_VAR_CONFIG_BASE : public DIALOG_SHIM
{
private:
protected:
wxListCtrl* m_pathList;
wxButton* m_addPathButton;
wxButton* m_editPathButton;
wxButton* m_deletePathButton;
wxStaticLine* m_staticline1;
wxStdDialogButtonSizer* m_sdbSizer;
wxButton* m_sdbSizerOK;
wxButton* m_sdbSizerCancel;
wxButton* m_sdbSizerHelp;
// Virtual event handlers, overide them in your derived class
virtual void OnPathActivated( wxListEvent& event ) { event.Skip(); }
virtual void OnPathSelected( wxListEvent& event ) { event.Skip(); }
virtual void OnAddButton( wxCommandEvent& event ) { event.Skip(); }
virtual void OnEditButton( wxCommandEvent& event ) { event.Skip(); }
virtual void OnRemoveButton( wxCommandEvent& event ) { event.Skip(); }
virtual void OnHelpButton( wxCommandEvent& event ) { event.Skip(); }
public:
DIALOG_ENV_VAR_CONFIG_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Environment Variable Configuration"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
~DIALOG_ENV_VAR_CONFIG_BASE();
};
///////////////////////////////////////////////////////////////////////////////
/// Class DIALOG_ENV_VAR_SINGLE_BASE
///////////////////////////////////////////////////////////////////////////////
class DIALOG_ENV_VAR_SINGLE_BASE : public DIALOG_SHIM
{
private:
protected:
wxStaticText* m_envVarNameLabel;
wxTextCtrl* m_envVarName;
wxButton* m_buttonHelp;
wxStaticText* m_envVarPathLabel;
wxTextCtrl* m_envVarPath;
wxButton* m_selectPathButton;
wxStaticLine* m_staticline2;
wxStdDialogButtonSizer* m_sdbSizer2;
wxButton* m_sdbSizer2OK;
wxButton* m_sdbSizer2Cancel;
// Virtual event handlers, overide them in your derived class
virtual void onVarNameChange( wxCommandEvent& event ) { event.Skip(); }
virtual void onHelpClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSelectPath( wxCommandEvent& event ) { event.Skip(); }
public:
DIALOG_ENV_VAR_SINGLE_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Edit Environment Variable"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
~DIALOG_ENV_VAR_SINGLE_BASE();
};
#endif //__DIALOG_ENV_VAR_CONFIG_BASE_H__

View File

@ -22,7 +22,6 @@
*/
#include <sstream>
#include <cstring>
#include <fstream>
#include <sstream>
#include <wx/filename.h>
@ -32,11 +31,11 @@
#include <trace_helpers.h>
#include "common.h"
#include "3d_filename_resolver.h"
#include "filename_resolver.h"
// configuration file version
#define CFGFILE_VERSION 1
#define S3D_RESOLVER_CONFIG wxT( "3Dresolver.cfg" )
#define RESOLVER_CONFIG wxT( "3Dresolver.cfg" )
// flag bits used to track different one-off messages to users
#define ERRFLG_ALIAS (1)
@ -45,19 +44,19 @@
#define MASK_3D_RESOLVER "3D_RESOLVER"
static wxCriticalSection lock3D_resolver;
static wxCriticalSection lock_resolver;
static bool getHollerith( const std::string& aString, size_t& aIndex, wxString& aResult );
S3D_FILENAME_RESOLVER::S3D_FILENAME_RESOLVER()
FILENAME_RESOLVER::FILENAME_RESOLVER()
{
m_errflags = 0;
m_pgm = NULL;
}
bool S3D_FILENAME_RESOLVER::Set3DConfigDir( const wxString& aConfigDir )
bool FILENAME_RESOLVER::Set3DConfigDir( const wxString& aConfigDir )
{
if( aConfigDir.empty() )
return false;
@ -71,7 +70,7 @@ bool S3D_FILENAME_RESOLVER::Set3DConfigDir( const wxString& aConfigDir )
cfgdir.Normalize();
if( false == cfgdir.DirExists() )
if( !cfgdir.DirExists() )
return false;
m_ConfigDir = cfgdir.GetPath();
@ -81,7 +80,7 @@ bool S3D_FILENAME_RESOLVER::Set3DConfigDir( const wxString& aConfigDir )
}
bool S3D_FILENAME_RESOLVER::SetProjectDir( const wxString& aProjDir, bool* flgChanged )
bool FILENAME_RESOLVER::SetProjectDir( const wxString& aProjDir, bool* flgChanged )
{
if( aProjDir.empty() )
return false;
@ -95,7 +94,7 @@ bool S3D_FILENAME_RESOLVER::SetProjectDir( const wxString& aProjDir, bool* flgCh
projdir.Normalize();
if( false == projdir.DirExists() )
if( !projdir.DirExists() )
return false;
m_curProjDir = projdir.GetPath();
@ -105,7 +104,7 @@ bool S3D_FILENAME_RESOLVER::SetProjectDir( const wxString& aProjDir, bool* flgCh
if( m_Paths.empty() )
{
S3D_ALIAS al;
SEARCH_PATH al;
al.m_alias = "${KIPRJMOD}";
al.m_pathvar = "${KIPRJMOD}";
al.m_pathexp = m_curProjDir;
@ -145,28 +144,26 @@ bool S3D_FILENAME_RESOLVER::SetProjectDir( const wxString& aProjDir, bool* flgCh
}
wxString S3D_FILENAME_RESOLVER::GetProjectDir( void )
wxString FILENAME_RESOLVER::GetProjectDir()
{
return m_curProjDir;
}
void S3D_FILENAME_RESOLVER::SetProgramBase( PGM_BASE* aBase )
void FILENAME_RESOLVER::SetProgramBase( PGM_BASE* aBase )
{
m_pgm = aBase;
if( NULL == m_pgm || m_Paths.empty() )
if( !m_pgm || m_Paths.empty() )
return;
// recreate the path list
m_Paths.clear();
createPathList();
return;
}
bool S3D_FILENAME_RESOLVER::createPathList( void )
bool FILENAME_RESOLVER::createPathList()
{
if( !m_Paths.empty() )
return true;
@ -177,7 +174,7 @@ bool S3D_FILENAME_RESOLVER::createPathList( void )
// we cannot set a sensible default so we use an empty string.
// the user may change this later with a call to SetProjectDir()
S3D_ALIAS lpath;
SEARCH_PATH lpath;
lpath.m_alias = "${KIPRJMOD}";
lpath.m_pathvar = "${KIPRJMOD}";
lpath.m_pathexp = m_curProjDir;
@ -221,8 +218,8 @@ bool S3D_FILENAME_RESOLVER::createPathList( void )
#ifdef DEBUG
wxLogTrace( MASK_3D_RESOLVER, " * [3D model] search paths:\n" );
std::list< S3D_ALIAS >::const_iterator sPL = m_Paths.begin();
std::list< S3D_ALIAS >::const_iterator ePL = m_Paths.end();
std::list< SEARCH_PATH >::const_iterator sPL = m_Paths.begin();
std::list< SEARCH_PATH >::const_iterator ePL = m_Paths.end();
while( sPL != ePL )
{
@ -236,7 +233,7 @@ bool S3D_FILENAME_RESOLVER::createPathList( void )
}
bool S3D_FILENAME_RESOLVER::UpdatePathList( std::vector< S3D_ALIAS >& aPathList )
bool FILENAME_RESOLVER::UpdatePathList( std::vector< SEARCH_PATH >& aPathList )
{
wxUniChar envMarker( '$' );
@ -252,9 +249,9 @@ bool S3D_FILENAME_RESOLVER::UpdatePathList( std::vector< S3D_ALIAS >& aPathList
}
wxString S3D_FILENAME_RESOLVER::ResolvePath( const wxString& aFileName )
wxString FILENAME_RESOLVER::ResolvePath( const wxString& aFileName )
{
wxCriticalSectionLocker lock( lock3D_resolver );
wxCriticalSectionLocker lock( lock_resolver );
if( aFileName.empty() )
return wxEmptyString;
@ -329,8 +326,8 @@ wxString S3D_FILENAME_RESOLVER::ResolvePath( const wxString& aFileName )
// a. an aliased shortened name or
// b. cannot be determined
std::list< S3D_ALIAS >::const_iterator sPL = m_Paths.begin();
std::list< S3D_ALIAS >::const_iterator ePL = m_Paths.end();
std::list< SEARCH_PATH >::const_iterator sPL = m_Paths.begin();
std::list< SEARCH_PATH >::const_iterator ePL = m_Paths.end();
// check the path relative to the current project directory;
// note: this is not necessarily the same as the current working
@ -438,14 +435,14 @@ wxString S3D_FILENAME_RESOLVER::ResolvePath( const wxString& aFileName )
}
bool S3D_FILENAME_RESOLVER::addPath( const S3D_ALIAS& aPath )
bool FILENAME_RESOLVER::addPath( const SEARCH_PATH& aPath )
{
if( aPath.m_alias.empty() || aPath.m_pathvar.empty() )
return false;
wxCriticalSectionLocker lock( lock3D_resolver );
wxCriticalSectionLocker lock( lock_resolver );
S3D_ALIAS tpath = aPath;
SEARCH_PATH tpath = aPath;
#ifdef _WIN32
while( tpath.m_pathvar.EndsWith( wxT( "\\" ) ) )
@ -492,8 +489,8 @@ bool S3D_FILENAME_RESOLVER::addPath( const S3D_ALIAS& aPath )
}
wxString pname = path.GetPath();
std::list< S3D_ALIAS >::iterator sPL = m_Paths.begin();
std::list< S3D_ALIAS >::iterator ePL = m_Paths.end();
std::list< SEARCH_PATH >::iterator sPL = m_Paths.begin();
std::list< SEARCH_PATH >::iterator ePL = m_Paths.end();
while( sPL != ePL )
{
@ -520,7 +517,7 @@ bool S3D_FILENAME_RESOLVER::addPath( const S3D_ALIAS& aPath )
}
bool S3D_FILENAME_RESOLVER::readPathList( void )
bool FILENAME_RESOLVER::readPathList()
{
if( m_ConfigDir.empty() )
{
@ -532,7 +529,7 @@ bool S3D_FILENAME_RESOLVER::readPathList( void )
return false;
}
wxFileName cfgpath( m_ConfigDir, S3D_RESOLVER_CONFIG );
wxFileName cfgpath( m_ConfigDir, RESOLVER_CONFIG );
cfgpath.Normalize();
wxString cfgname = cfgpath.GetFullPath();
@ -565,7 +562,7 @@ bool S3D_FILENAME_RESOLVER::readPathList( void )
}
int lineno = 0;
S3D_ALIAS al;
SEARCH_PATH al;
size_t idx;
int vnum = 0; // version number
@ -619,14 +616,11 @@ bool S3D_FILENAME_RESOLVER::readPathList( void )
if( vnum < CFGFILE_VERSION )
writePathList();
if( m_Paths.size() != nitems )
return true;
return false;
return( m_Paths.size() != nitems );
}
bool S3D_FILENAME_RESOLVER::writePathList( void )
bool FILENAME_RESOLVER::writePathList()
{
if( m_ConfigDir.empty() )
{
@ -641,13 +635,13 @@ bool S3D_FILENAME_RESOLVER::writePathList( void )
}
// skip all ${ENV_VAR} alias names
std::list< S3D_ALIAS >::const_iterator sPL = m_Paths.begin();
std::list< S3D_ALIAS >::const_iterator ePL = m_Paths.end();
std::list< SEARCH_PATH >::const_iterator sPL = m_Paths.begin();
std::list< SEARCH_PATH >::const_iterator ePL = m_Paths.end();
while( sPL != ePL && ( sPL->m_alias.StartsWith( "${" ) || sPL->m_alias.StartsWith( "$(" ) ) )
++sPL;
wxFileName cfgpath( m_ConfigDir, S3D_RESOLVER_CONFIG );
wxFileName cfgpath( m_ConfigDir, RESOLVER_CONFIG );
wxString cfgname = cfgpath.GetFullPath();
std::ofstream cfgFile;
@ -694,7 +688,7 @@ bool S3D_FILENAME_RESOLVER::writePathList( void )
}
void S3D_FILENAME_RESOLVER::checkEnvVarPath( const wxString& aPath )
void FILENAME_RESOLVER::checkEnvVarPath( const wxString& aPath )
{
bool useParen = false;
@ -731,7 +725,7 @@ void S3D_FILENAME_RESOLVER::checkEnvVarPath( const wxString& aPath )
++sPL;
}
S3D_ALIAS lpath;
SEARCH_PATH lpath;
lpath.m_alias = envar;
lpath.m_pathvar = lpath.m_alias;
wxFileName tmpFN;
@ -756,20 +750,19 @@ void S3D_FILENAME_RESOLVER::checkEnvVarPath( const wxString& aPath )
return;
m_Paths.insert( sPL, lpath );
return;
}
wxString S3D_FILENAME_RESOLVER::ShortenPath( const wxString& aFullPathName )
wxString FILENAME_RESOLVER::ShortenPath( const wxString& aFullPathName )
{
wxString fname = aFullPathName;
if( m_Paths.empty() )
createPathList();
wxCriticalSectionLocker lock( lock3D_resolver );
std::list< S3D_ALIAS >::const_iterator sL = m_Paths.begin();
std::list< S3D_ALIAS >::const_iterator eL = m_Paths.end();
wxCriticalSectionLocker lock( lock_resolver );
std::list< SEARCH_PATH >::const_iterator sL = m_Paths.begin();
std::list< SEARCH_PATH >::const_iterator eL = m_Paths.end();
size_t idx;
while( sL != eL )
@ -807,7 +800,7 @@ wxString S3D_FILENAME_RESOLVER::ShortenPath( const wxString& aFullPathName )
idx = fname.find( fps );
if( std::string::npos != idx && 0 == idx )
if( idx == 0 )
{
fname = fname.substr( fps.size() );
@ -851,13 +844,13 @@ wxString S3D_FILENAME_RESOLVER::ShortenPath( const wxString& aFullPathName )
const std::list< S3D_ALIAS >* S3D_FILENAME_RESOLVER::GetPaths( void )
const std::list< SEARCH_PATH >* FILENAME_RESOLVER::GetPaths()
{
return &m_Paths;
}
bool S3D_FILENAME_RESOLVER::SplitAlias( const wxString& aFileName,
bool FILENAME_RESOLVER::SplitAlias( const wxString& aFileName,
wxString& anAlias, wxString& aRelPath )
{
anAlias.clear();
@ -976,7 +969,7 @@ static bool getHollerith( const std::string& aString, size_t& aIndex, wxString&
}
bool S3D_FILENAME_RESOLVER::ValidateFileName( const wxString& aFileName, bool& hasAlias )
bool FILENAME_RESOLVER::ValidateFileName( const wxString& aFileName, bool& hasAlias )
{
// Rules:
// 1. The generic form of an aliased 3D relative path is:
@ -1034,7 +1027,7 @@ bool S3D_FILENAME_RESOLVER::ValidateFileName( const wxString& aFileName, bool& h
}
bool S3D_FILENAME_RESOLVER::GetKicadPaths( std::list< wxString >& paths )
bool FILENAME_RESOLVER::GetKicadPaths( std::list< wxString >& paths )
{
paths.clear();

View File

@ -50,7 +50,7 @@
#include <gestfich.h>
#include <menus_helpers.h>
#include <confirm.h>
#include <dialog_env_var_config.h>
#include <dialog_configure_paths.h>
#include <lockfile.h>
#include <systemdirsappend.h>
@ -517,7 +517,7 @@ bool PGM_BASE::InitPgm()
else
{
tmpFileName.AppendDir( wxT( "packages3d" ) );
envVarItem.SetDefinedExternally( false );
envVarItem.SetDefinedExternally( true );
}
envVarItem.SetValue( tmpFileName.GetFullPath() );
@ -975,40 +975,8 @@ void PGM_BASE::SetLocalEnvVariables( const ENV_VAR_MAP& aEnvVarMap )
}
void PGM_BASE::ConfigurePaths( wxWindow* aParent )
void PGM_BASE::ConfigurePaths( wxWindow* aParent, FILENAME_RESOLVER* aResolver )
{
DIALOG_ENV_VAR_CONFIG dlg_envvars( aParent, GetLocalEnvVariables() );
if( dlg_envvars.ShowModal() == wxID_CANCEL )
return;
ENV_VAR_MAP envVarMap = dlg_envvars.GetEnvVarMap();
for( ENV_VAR_MAP_ITER it = envVarMap.begin(); it != envVarMap.end(); ++it )
{
wxLogTrace( traceEnvVars, wxT( "Environment variable %s=%s defined externally = %d" ),
GetChars( it->first ), GetChars( it->second.GetValue() ),
it->second.GetDefinedExternally() );
}
// If any of the environment variables are defined externally, warn the user that the
// next time kicad is run that the externally defined variables will be used instead of
// the user's settings. This is by design.
if( dlg_envvars.ExternalDefsChanged() && m_show_env_var_dialog )
{
wxString msg1 = _( "Warning! Some of paths you have configured have been defined \n"
"externally to the running process and will be temporarily overwritten." );
wxString msg2 = _( "The next time KiCad is launched, any paths that have already\n"
"been defined are honored and any settings defined in the path\n"
"configuration dialog are ignored. If you did not intend for this\n"
"behavior, either rename any conflicting entries or remove the\n"
"external environment variable definition(s) from your system." );
wxRichMessageDialog dlg( aParent, msg1, _( "Warning" ), wxOK | wxCENTRE );
dlg.ShowDetailedText( msg2 );
dlg.ShowCheckBox( _( "Do not show this message again." ) );
DIALOG_CONFIGURE_PATHS dlg( aParent, aResolver );
dlg.ShowModal();
m_show_env_var_dialog = !dlg.IsCheckBoxChecked();
}
SetLocalEnvVariables( dlg_envvars.GetEnvVarMap() );
}

View File

@ -41,6 +41,7 @@
#include <netlist_reader.h>
#include <bitmaps.h>
#include <widgets/progress_reporter.h>
#include <3d_cache/3d_cache.h>
#include <cvpcb_mainframe.h>
#include <cvpcb.h>
@ -974,7 +975,7 @@ void CVPCB_MAINFRAME::SetStatusText( const wxString& aText, int aNumber )
void CVPCB_MAINFRAME::OnConfigurePaths( wxCommandEvent& aEvent )
{
Pgm().ConfigurePaths( this );
Pgm().ConfigurePaths( this, Prj().Get3DCacheManager()->GetResolver() );
}

View File

@ -263,7 +263,7 @@ void SCH_BASE_FRAME::UpdateStatusBar()
void SCH_BASE_FRAME::OnConfigurePaths( wxCommandEvent& aEvent )
{
Pgm().ConfigurePaths( this );
Pgm().ConfigurePaths( this, nullptr );
}

View File

@ -0,0 +1,87 @@
/*
* This program source code file is part of KICAD, a free EDA CAD application.
*
* Copyright (C) 2015 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 2015-2018 Kicad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef _DIALOG_CONFIGURE_PATHS_H_
#define _DIALOG_CONFIGURE_PATHS_H_
#include <../common/dialogs/dialog_configure_paths_base.h>
#include <wx/valtext.h>
#include <pgm_base.h>
class EDA_DRAW_FRAME;
class FILENAME_RESOLVER;
/**
* DIALOG_CONFIGURE_PATHS class declaration
*/
class DIALOG_CONFIGURE_PATHS: public DIALOG_CONFIGURE_PATHS_BASE
{
public:
DIALOG_CONFIGURE_PATHS( wxWindow* aParent, FILENAME_RESOLVER* aResolver );
virtual ~DIALOG_CONFIGURE_PATHS();
bool TransferDataToWindow() override;
bool TransferDataFromWindow() override;
protected:
// Various button callbacks
virtual void OnGridCellRightClick( wxGridEvent& event ) override;
virtual void OnGridSize( wxSizeEvent& event ) override;
virtual void OnUpdateUI( wxUpdateUIEvent& event ) override;
virtual void OnGridCellChanging( wxGridEvent& event );
virtual void OnAddEnvVar( wxCommandEvent& event ) override;
virtual void OnRemoveEnvVar( wxCommandEvent& event ) override;
virtual void OnAddSearchPath( wxCommandEvent& event ) override;
virtual void OnDeleteSearchPath( wxCommandEvent& event ) override;
virtual void OnSearchPathMoveUp( wxCommandEvent& event ) override;
virtual void OnSearchPathMoveDown( wxCommandEvent& event ) override;
virtual void OnHelp( wxCommandEvent& event ) override;
void AppendEnvVar( const wxString& aName, const wxString& aPath,
bool isExternal );
void AppendSearchPath( const wxString& aName, const wxString& aPath,
const wxString& aDescription );
void AdjustGridColumns( int aWidth );
/**
* Determine if a particular ENV_VAR is protected
*/
bool IsEnvVarImmutable( const wxString aEnvVar );
private:
wxString m_errorMsg;
wxGrid* m_errorGrid;
int m_errorRow;
int m_errorCol;
FILENAME_RESOLVER* m_resolver;
wxString m_curdir;
wxTextValidator m_aliasValidator;
};
#endif // _DIALOG_CONFIGURE_PATHS_H_

View File

@ -1,102 +0,0 @@
/*
* This program source code file is part of KICAD, a free EDA CAD application.
*
* Copyright (C) 2015 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 2015 Kicad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef _DIALOG_ENV_VAR_CONFIG_H_
#define _DIALOG_ENV_VAR_CONFIG_H_
class EDA_DRAW_FRAME;
#include <../common/dialogs/dialog_env_var_config_base.h>
#include <pgm_base.h>
/**
* DIALOG_ENV_VAR_CONFIG class declaration
*/
class DIALOG_ENV_VAR_CONFIG: public DIALOG_ENV_VAR_CONFIG_BASE
{
private:
ENV_VAR_MAP m_envVarMap;
bool m_extDefsChanged = false;
protected:
/**
* Update the displayed list of ENV_VAR paths
*/
void PopulatePathList();
/**
* Edit the currently selected ENV_VAR entry
*/
void EditSelectedEntry();
// Various button callbacks
virtual void OnAddButton( wxCommandEvent& event ) override;
virtual void OnEditButton( wxCommandEvent& event ) override;
virtual void OnRemoveButton( wxCommandEvent& event ) override;
virtual void OnHelpButton( wxCommandEvent& event ) override;
virtual void OnPathSelected( wxListEvent& event ) override;
virtual void OnPathActivated( wxListEvent& event ) override;
// Variable for keeping track of currently selected list index
unsigned int m_pathIndex = 0;
/**
* Extract the NAME and PATH data from the ENV_VAR at the provided index
* @param aIndex is the index to extract data from
* @return true if data was extracted else false
*/
bool GetPathAtIndex( unsigned int aIndex, wxString& aEnvVar, wxString& aEnvPath );
/**
* Determine if a particular ENV_VAR is protected
* @param aEnvVar is the name of the ENV_VAR
*/
bool IsEnvVarImmutable( const wxString aEnvVar );
/**
* Select the ENV_VAR at the provided index
*/
void SelectListIndex( unsigned int aIndex );
public:
DIALOG_ENV_VAR_CONFIG( wxWindow* parent, const ENV_VAR_MAP& aEnvVarMap );
virtual ~DIALOG_ENV_VAR_CONFIG() {}
bool TransferDataToWindow() override;
bool TransferDataFromWindow() override;
bool ExternalDefsChanged() const { return m_extDefsChanged; }
const ENV_VAR_MAP& GetEnvVarMap() const
{
return m_envVarMap;
}
};
#endif // _DIALOG_ENV_VAR_CONFIG_H_

View File

@ -22,7 +22,7 @@
*/
/**
* @file 3d_filename_resolver.h
* @file filename_resolver.h
* provides an extensible class to resolve 3D model paths. Initially
* the legacy behavior will be implemented and an incomplete path
* would be checked against the project directory or the KISYS3DMOD
@ -30,18 +30,17 @@
* paths may be specified.
*/
#ifndef FILENAME_RESOLVER_3D_H
#define FILENAME_RESOLVER_3D_H
#ifndef FILENAME_RESOLVER_H
#define FILENAME_RESOLVER_H
#include <list>
#include <map>
#include <vector>
#include <wx/string.h>
#include "str_rsort.h"
class PGM_BASE;
struct S3D_ALIAS
struct SEARCH_PATH
{
wxString m_alias; // alias to the base path
wxString m_pathvar; // base path as stored in the config file
@ -49,11 +48,11 @@ struct S3D_ALIAS
wxString m_description; // description of the aliased path
};
class S3D_FILENAME_RESOLVER
class FILENAME_RESOLVER
{
private:
wxString m_ConfigDir; // 3D configuration directory
std::list< S3D_ALIAS > m_Paths; // list of base paths to search from
std::list< SEARCH_PATH > m_Paths; // list of base paths to search from
int m_errflags;
PGM_BASE* m_pgm;
wxString m_curProjDir;
@ -76,7 +75,7 @@ private:
* @param aPath is the alias set to be checked and added
* @return true if aPath is valid
*/
bool addPath( const S3D_ALIAS& aPath );
bool addPath( const SEARCH_PATH& aPath );
/**
* Function readPathList
@ -105,7 +104,7 @@ private:
void checkEnvVarPath( const wxString& aPath );
public:
S3D_FILENAME_RESOLVER();
FILENAME_RESOLVER();
/**
* Function Set3DConfigDir
@ -143,7 +142,7 @@ public:
* clears the current path list and substitutes the given path
* list, updating the path configuration file on success.
*/
bool UpdatePathList( std::vector< S3D_ALIAS >& aPathList );
bool UpdatePathList( std::vector< SEARCH_PATH >& aPathList );
/**
* Function ResolvePath
@ -175,7 +174,7 @@ public:
*
* @return pointer to the internal path list
*/
const std::list< S3D_ALIAS >* GetPaths( void );
const std::list< SEARCH_PATH >* GetPaths( void );
/**
* Function SplitAlias
@ -201,4 +200,4 @@ public:
bool GetKicadPaths( std::list< wxString >& paths );
};
#endif // FILENAME_RESOLVER_3D_H
#endif // FILENAME_RESOLVER_H

View File

@ -189,4 +189,52 @@ bool ReplaceIllegalFileNameChars( wxString& aName, int aReplaceChar = 0 );
extern "C" char* strtok_r( char* str, const char* delim, char** nextp );
#endif
/**
* A helper for sorting strings from the rear. Useful for things like 3d model names
* where they tend to be largely repititous at the front.
*/
struct rsort_wxString
{
bool operator() (const wxString& strA, const wxString& strB ) const
{
wxString::const_reverse_iterator sA = strA.rbegin();
wxString::const_reverse_iterator eA = strA.rend();
wxString::const_reverse_iterator sB = strB.rbegin();
wxString::const_reverse_iterator eB = strB.rend();
if( strA.empty() )
{
if( strB.empty() )
return false;
// note: this rule implies that a null string is first in the sort order
return true;
}
if( strB.empty() )
return false;
while( sA != eA && sB != eB )
{
if( (*sA) == (*sB) )
{
++sA;
++sB;
continue;
}
if( (*sA) < (*sB) )
return true;
else
return false;
}
if( sB == eB )
return false;
return true;
}
};
#endif // KICAD_STRING_H_

View File

@ -43,6 +43,8 @@ class wxApp;
class wxMenu;
class wxWindow;
class FILENAME_RESOLVER;
// inter program module calling
#define VTBL_ENTRY virtual
@ -279,11 +281,8 @@ public:
* the footprint library table and the 3D model importer. It was added to PGM_BASE because
* it will eventually find use for in schematic I/O design so it needs to accessible by
* almost every KiCad application.
*
* @param aParent - a pointer the wxWindow parent of the dialog or NULL to use the top level
* window.
*/
VTBL_ENTRY void ConfigurePaths( wxWindow* aParent = NULL );
VTBL_ENTRY void ConfigurePaths( wxWindow* aParent, FILENAME_RESOLVER* aResolver );
/**
* Function App

View File

@ -588,5 +588,5 @@ void KICAD_MANAGER_FRAME::Process_Config( wxCommandEvent& event )
void KICAD_MANAGER_FRAME::OnConfigurePaths( wxCommandEvent& aEvent )
{
Pgm().ConfigurePaths( this );
Pgm().ConfigurePaths( this, nullptr );
}

View File

@ -49,13 +49,13 @@
#include <class_text_mod.h>
#include <validators.h>
#include <widgets/text_ctrl_eval.h>
#include <filename_resolver.h>
#include <dialog_edit_footprint_for_BoardEditor.h>
#include <wildcards_and_files_ext.h>
#include "3d_cache/dialogs/panel_prev_model.h"
#include "3d_cache/dialogs/3d_cache_dialogs.h"
#include "3d_cache/3d_cache.h"
#include "3d_cache/3d_filename_resolver.h"
#include <dialog_edit_footprint_text.h>
@ -312,7 +312,7 @@ void DIALOG_FOOTPRINT_BOARD_EDITOR::InitModeditProperties()
wxString origPath;
wxString alias;
wxString shortPath;
S3D_FILENAME_RESOLVER* res = Prj().Get3DCacheManager()->GetResolver();
FILENAME_RESOLVER* res = Prj().Get3DCacheManager()->GetResolver();
while( sM != eM )
{
@ -498,7 +498,7 @@ void DIALOG_FOOTPRINT_BOARD_EDITOR::Edit3DShapeFileName()
WX_TEXT_ENTRY_DIALOG dlg( this, wxEmptyString, wxEmptyString, filename );
bool hasAlias;
S3D_FILENAME_RESOLVER* res = Prj().Get3DCacheManager()->GetResolver();
FILENAME_RESOLVER* res = Prj().Get3DCacheManager()->GetResolver();
if( dlg.ShowModal() != wxID_OK )
return;
@ -573,7 +573,7 @@ void DIALOG_FOOTPRINT_BOARD_EDITOR::BrowseAndAdd3DShapeFile()
prj.SetRString( PROJECT::VIEWER_3D_PATH, initialpath );
sidx = wxString::Format( wxT( "%i" ), filter );
prj.SetRString( PROJECT::VIEWER_3D_FILTER_INDEX, sidx );
S3D_FILENAME_RESOLVER* res = Prj().Get3DCacheManager()->GetResolver();
FILENAME_RESOLVER* res = Prj().Get3DCacheManager()->GetResolver();
wxString alias;
wxString shortPath;
wxString filename = model.m_Filename;

View File

@ -53,11 +53,11 @@
#include <footprint_edit_frame.h>
#include <dialog_edit_footprint_for_fp_editor.h>
#include <wildcards_and_files_ext.h>
#include "filename_resolver.h"
#include <pgm_base.h>
#include "3d_cache/dialogs/panel_prev_model.h"
#include "3d_cache/dialogs/3d_cache_dialogs.h"
#include "3d_cache/3d_cache.h"
#include "3d_cache/3d_filename_resolver.h"
#include <dialog_edit_footprint_text.h>
@ -157,7 +157,7 @@ void DIALOG_FOOTPRINT_FP_EDITOR::initModeditProperties()
wxString origPath;
wxString alias;
wxString shortPath;
S3D_FILENAME_RESOLVER* res = Prj().Get3DCacheManager()->GetResolver();
FILENAME_RESOLVER* res = Prj().Get3DCacheManager()->GetResolver();
while( sM != eM )
{
@ -371,7 +371,7 @@ void DIALOG_FOOTPRINT_FP_EDITOR::Edit3DShapeFileName()
WX_TEXT_ENTRY_DIALOG dlg( this, _( "Filepath:" ), _( "Edit 3D Shape Name" ), filename );
bool hasAlias;
S3D_FILENAME_RESOLVER* res = Prj().Get3DCacheManager()->GetResolver();
FILENAME_RESOLVER* res = Prj().Get3DCacheManager()->GetResolver();
if( dlg.ShowModal() != wxID_OK )
return;
@ -449,7 +449,7 @@ void DIALOG_FOOTPRINT_FP_EDITOR::BrowseAndAdd3DShapeFile()
wxString origPath = model.m_Filename;
wxString alias;
wxString shortPath;
S3D_FILENAME_RESOLVER* res = Prj().Get3DCacheManager()->GetResolver();
FILENAME_RESOLVER* res = Prj().Get3DCacheManager()->GetResolver();
if( res && res->SplitAlias( origPath, alias, shortPath ) )
{

View File

@ -39,7 +39,7 @@
#include "project.h"
#include "kiway.h"
#include "3d_cache/3d_cache.h"
#include "3d_cache/3d_filename_resolver.h"
#include "filename_resolver.h"
#ifndef PCBNEW
#define PCBNEW // needed to define the right value of Millimeter2iu(x)
@ -49,7 +49,7 @@
// assumed default graphical line thickness: == 0.1mm
#define LINE_WIDTH (Millimeter2iu( 0.1 ))
static S3D_FILENAME_RESOLVER* resolver;
static FILENAME_RESOLVER* resolver;
/**
* Function idf_export_outline

View File

@ -907,7 +907,7 @@ void FOOTPRINT_EDIT_FRAME::ProcessPreferences( wxCommandEvent& event )
void FOOTPRINT_EDIT_FRAME::OnConfigurePaths( wxCommandEvent& aEvent )
{
Pgm().ConfigurePaths( this );
Pgm().ConfigurePaths( this, Prj().Get3DCacheManager()->GetResolver() );
}

View File

@ -1216,7 +1216,7 @@ bool PCB_EDIT_FRAME::SetCurrentNetClass( const wxString& aNetClassName )
void PCB_EDIT_FRAME::OnConfigurePaths( wxCommandEvent& aEvent )
{
Pgm().ConfigurePaths( this );
Pgm().ConfigurePaths( this, Prj().Get3DCacheManager()->GetResolver() );
}

View File

@ -136,7 +136,7 @@ bool S3D_RESOLVER::SetProjectDir( const wxString& aProjDir, bool* flgChanged )
if( m_Paths.empty() )
{
S3D_ALIAS al;
SEARCH_PATH al;
al.m_alias = "${KIPRJMOD}";
al.m_pathvar = "${KIPRJMOD}";
al.m_pathexp = m_curProjDir;
@ -195,7 +195,7 @@ bool S3D_RESOLVER::createPathList( void )
// we cannot set a sensible default so we use an empty string.
// the user may change this later with a call to SetProjectDir()
S3D_ALIAS lpath;
SEARCH_PATH lpath;
lpath.m_alias = "${KIPRJMOD}";
lpath.m_pathvar = "${KIPRJMOD}";
lpath.m_pathexp = m_curProjDir;
@ -294,8 +294,8 @@ bool S3D_RESOLVER::createPathList( void )
#ifdef DEBUG
wxLogTrace( MASK_3D_RESOLVER, " * [3D model] search paths:\n" );
std::list< S3D_ALIAS >::const_iterator sPL = m_Paths.begin();
std::list< S3D_ALIAS >::const_iterator ePL = m_Paths.end();
std::list< SEARCH_PATH >::const_iterator sPL = m_Paths.begin();
std::list< SEARCH_PATH >::const_iterator ePL = m_Paths.end();
while( sPL != ePL )
{
@ -308,7 +308,7 @@ bool S3D_RESOLVER::createPathList( void )
}
bool S3D_RESOLVER::UpdatePathList( std::vector< S3D_ALIAS >& aPathList )
bool S3D_RESOLVER::UpdatePathList( std::vector< SEARCH_PATH >& aPathList )
{
wxUniChar envMarker( '$' );
@ -408,8 +408,8 @@ wxString S3D_RESOLVER::ResolvePath( const wxString& aFileName )
// a. an aliased shortened name or
// b. cannot be determined
std::list< S3D_ALIAS >::const_iterator sPL = m_Paths.begin();
std::list< S3D_ALIAS >::const_iterator ePL = m_Paths.end();
std::list< SEARCH_PATH >::const_iterator sPL = m_Paths.begin();
std::list< SEARCH_PATH >::const_iterator ePL = m_Paths.end();
// check the path relative to the current project directory;
// note: this is not necessarily the same as the current working
@ -519,14 +519,14 @@ wxString S3D_RESOLVER::ResolvePath( const wxString& aFileName )
}
bool S3D_RESOLVER::addPath( const S3D_ALIAS& aPath )
bool S3D_RESOLVER::addPath( const SEARCH_PATH& aPath )
{
if( aPath.m_alias.empty() || aPath.m_pathvar.empty() )
return false;
wxCriticalSectionLocker lock( lock3D_resolver );
S3D_ALIAS tpath = aPath;
SEARCH_PATH tpath = aPath;
#ifdef _WIN32
while( tpath.m_pathvar.EndsWith( "\\" ) )
@ -566,8 +566,8 @@ bool S3D_RESOLVER::addPath( const S3D_ALIAS& aPath )
}
wxString pname = path.GetPath();
std::list< S3D_ALIAS >::iterator sPL = m_Paths.begin();
std::list< S3D_ALIAS >::iterator ePL = m_Paths.end();
std::list< SEARCH_PATH >::iterator sPL = m_Paths.begin();
std::list< SEARCH_PATH >::iterator ePL = m_Paths.end();
while( sPL != ePL )
{
@ -639,7 +639,7 @@ bool S3D_RESOLVER::readPathList( void )
}
int lineno = 0;
S3D_ALIAS al;
SEARCH_PATH al;
size_t idx;
int vnum = 0; // version number
@ -715,8 +715,8 @@ bool S3D_RESOLVER::writePathList( void )
}
// skip all ${ENV_VAR} alias names
std::list< S3D_ALIAS >::const_iterator sPL = m_Paths.begin();
std::list< S3D_ALIAS >::const_iterator ePL = m_Paths.end();
std::list< SEARCH_PATH >::const_iterator sPL = m_Paths.begin();
std::list< SEARCH_PATH >::const_iterator ePL = m_Paths.end();
while( sPL != ePL && ( sPL->m_alias.StartsWith( "${" )
|| sPL->m_alias.StartsWith( "$(" ) ) )
@ -818,8 +818,8 @@ void S3D_RESOLVER::checkEnvVarPath( const wxString& aPath )
// check if the alias exists; if not then add it to the end of the
// env var section of the path list
std::list< S3D_ALIAS >::iterator sPL = m_Paths.begin();
std::list< S3D_ALIAS >::iterator ePL = m_Paths.end();
std::list< SEARCH_PATH >::iterator sPL = m_Paths.begin();
std::list< SEARCH_PATH >::iterator ePL = m_Paths.end();
while( sPL != ePL )
{
@ -832,7 +832,7 @@ void S3D_RESOLVER::checkEnvVarPath( const wxString& aPath )
++sPL;
}
S3D_ALIAS lpath;
SEARCH_PATH lpath;
lpath.m_alias = envar;
lpath.m_pathvar = lpath.m_alias;
wxFileName tmpFN( lpath.m_alias, "" );
@ -896,8 +896,8 @@ wxString S3D_RESOLVER::ShortenPath( const wxString& aFullPathName )
createPathList();
wxCriticalSectionLocker lock( lock3D_resolver );
std::list< S3D_ALIAS >::const_iterator sL = m_Paths.begin();
std::list< S3D_ALIAS >::const_iterator eL = m_Paths.end();
std::list< SEARCH_PATH >::const_iterator sL = m_Paths.begin();
std::list< SEARCH_PATH >::const_iterator eL = m_Paths.end();
size_t idx;
while( sL != eL )
@ -960,7 +960,7 @@ wxString S3D_RESOLVER::ShortenPath( const wxString& aFullPathName )
const std::list< S3D_ALIAS >* S3D_RESOLVER::GetPaths( void )
const std::list< SEARCH_PATH >* S3D_RESOLVER::GetPaths( void )
{
return &m_Paths;
}

View File

@ -91,7 +91,7 @@ namespace S3D
class KICADPCB;
struct S3D_ALIAS
struct SEARCH_PATH
{
wxString m_alias; // alias to the base path
wxString m_pathvar; // base path as stored in the config file
@ -103,7 +103,7 @@ class S3D_RESOLVER
{
private:
wxString m_ConfigDir; // 3D configuration directory
std::list< S3D_ALIAS > m_Paths; // list of base paths to search from
std::list< SEARCH_PATH > m_Paths; // list of base paths to search from
// mapping of (short) file names to resolved names
std::map< wxString, wxString, S3D::rsort_wxString > m_NameMap;
int m_errflags;
@ -129,7 +129,7 @@ private:
* @param aPath is the alias set to be checked and added
* @return true if aPath is valid
*/
bool addPath( const S3D_ALIAS& aPath );
bool addPath( const SEARCH_PATH& aPath );
/**
* Function readPathList
@ -189,7 +189,7 @@ public:
* clears the current path list and substitutes the given path
* list, updating the path configuration file on success.
*/
bool UpdatePathList( std::vector< S3D_ALIAS >& aPathList );
bool UpdatePathList( std::vector< SEARCH_PATH >& aPathList );
/**
* Function ResolvePath
@ -221,7 +221,7 @@ public:
*
* @return pointer to the internal path list
*/
const std::list< S3D_ALIAS >* GetPaths( void );
const std::list< SEARCH_PATH >* GetPaths( void );
/**
* Function SplitAlias