Begin moving project file load to new system
This commit is contained in:
parent
a5a19076fd
commit
a4fadfcdf2
|
@ -87,6 +87,8 @@ EDA_BASE_FRAME::EDA_BASE_FRAME( wxWindow* aParent, FRAME_T aFrameType,
|
||||||
m_mruPath = wxStandardPaths::Get().GetDocumentsDir();
|
m_mruPath = wxStandardPaths::Get().GetDocumentsDir();
|
||||||
m_FrameSize = wxSize( s_minsize_x, s_minsize_y );
|
m_FrameSize = wxSize( s_minsize_x, s_minsize_y );
|
||||||
|
|
||||||
|
m_settingsManager = &Pgm().GetSettingsManager();
|
||||||
|
|
||||||
// Set a reasonable minimal size for the frame
|
// Set a reasonable minimal size for the frame
|
||||||
SetSizeHints( s_minsize_x, s_minsize_y, -1, -1, -1, -1 );
|
SetSizeHints( s_minsize_x, s_minsize_y, -1, -1, -1, -1 );
|
||||||
|
|
||||||
|
|
|
@ -36,9 +36,11 @@
|
||||||
#include <kiway.h>
|
#include <kiway.h>
|
||||||
#include <kiface_ids.h>
|
#include <kiface_ids.h>
|
||||||
#include <trace_helpers.h>
|
#include <trace_helpers.h>
|
||||||
|
#include <settings/project_file.h>
|
||||||
|
|
||||||
|
|
||||||
PROJECT::PROJECT()
|
PROJECT::PROJECT() :
|
||||||
|
m_projectFile( nullptr )
|
||||||
{
|
{
|
||||||
memset( m_elems, 0, sizeof(m_elems) );
|
memset( m_elems, 0, sizeof(m_elems) );
|
||||||
}
|
}
|
||||||
|
@ -73,7 +75,7 @@ bool PROJECT::TextVarResolver( wxString* aToken ) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PROJECT::SetProjectFullName( const wxString& aFullPathAndName )
|
void PROJECT::setProjectFullName( const wxString& aFullPathAndName )
|
||||||
{
|
{
|
||||||
// Compare paths, rather than inodes, to be less surprising to the user.
|
// Compare paths, rather than inodes, to be less surprising to the user.
|
||||||
// Create a temporary wxFileName to normalize the path
|
// Create a temporary wxFileName to normalize the path
|
||||||
|
@ -92,7 +94,7 @@ void PROJECT::SetProjectFullName( const wxString& aFullPathAndName )
|
||||||
|
|
||||||
wxASSERT( m_project_name.IsAbsolute() );
|
wxASSERT( m_project_name.IsAbsolute() );
|
||||||
|
|
||||||
wxASSERT( m_project_name.GetExt() == LegacyProjectFileExtension );
|
wxASSERT( m_project_name.GetExt() == ProjectFileExtension );
|
||||||
|
|
||||||
// until multiple projects are in play, set an environment variable for the
|
// until multiple projects are in play, set an environment variable for the
|
||||||
// the project pointer.
|
// the project pointer.
|
||||||
|
@ -333,6 +335,14 @@ wxConfigBase* PROJECT::configCreate( const SEARCH_STACK& aSList,
|
||||||
wxConfigBase* cfg = 0;
|
wxConfigBase* cfg = 0;
|
||||||
wxString cur_pro_fn = !aProjectFileName ? GetProjectFullName() : aProjectFileName;
|
wxString cur_pro_fn = !aProjectFileName ? GetProjectFullName() : aProjectFileName;
|
||||||
|
|
||||||
|
wxFileName filename( cur_pro_fn );
|
||||||
|
|
||||||
|
if( filename.GetExt() == ProjectFileExtension )
|
||||||
|
{
|
||||||
|
filename.SetExt( LegacyProjectFileExtension );
|
||||||
|
cur_pro_fn = filename.GetFullPath();
|
||||||
|
}
|
||||||
|
|
||||||
// If we do not have a project name or specified name, choose an empty file to store the
|
// If we do not have a project name or specified name, choose an empty file to store the
|
||||||
// temporary configuration data in.
|
// temporary configuration data in.
|
||||||
if( cur_pro_fn.IsEmpty() )
|
if( cur_pro_fn.IsEmpty() )
|
||||||
|
|
|
@ -45,6 +45,7 @@ JSON_SETTINGS::JSON_SETTINGS( const std::string& aFilename, SETTINGS_LOC aLocati
|
||||||
m_createIfMissing( aCreateIfMissing ),
|
m_createIfMissing( aCreateIfMissing ),
|
||||||
m_createIfDefault( aCreateIfDefault ),
|
m_createIfDefault( aCreateIfDefault ),
|
||||||
m_writeFile( aWriteFile ),
|
m_writeFile( aWriteFile ),
|
||||||
|
m_deleteLegacyAfterMigration( true ),
|
||||||
m_schemaVersion( aSchemaVersion ),
|
m_schemaVersion( aSchemaVersion ),
|
||||||
m_manager( nullptr )
|
m_manager( nullptr )
|
||||||
{
|
{
|
||||||
|
@ -121,11 +122,11 @@ bool JSON_SETTINGS::LoadFromFile( const std::string& aDirectory )
|
||||||
if( aDirectory.empty() )
|
if( aDirectory.empty() )
|
||||||
{
|
{
|
||||||
path.Assign( m_filename );
|
path.Assign( m_filename );
|
||||||
path.SetExt( wxT( "json" ) );
|
path.SetExt( getFileExt() );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
path.Assign( aDirectory, m_filename, wxT( "json" ) );
|
path.Assign( aDirectory, m_filename, getFileExt() );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !path.Exists() )
|
if( !path.Exists() )
|
||||||
|
@ -212,7 +213,7 @@ bool JSON_SETTINGS::LoadFromFile( const std::string& aDirectory )
|
||||||
// If we migrated, clean up the legacy file (with no extension)
|
// If we migrated, clean up the legacy file (with no extension)
|
||||||
if( legacy_migrated || migrated )
|
if( legacy_migrated || migrated )
|
||||||
{
|
{
|
||||||
if( legacy_migrated && !wxRemoveFile( path.GetFullPath() ) )
|
if( legacy_migrated && m_deleteLegacyAfterMigration && !wxRemoveFile( path.GetFullPath() ) )
|
||||||
{
|
{
|
||||||
wxLogTrace(
|
wxLogTrace(
|
||||||
traceSettings, "Warning: could not remove legacy file %s", path.GetFullPath() );
|
traceSettings, "Warning: could not remove legacy file %s", path.GetFullPath() );
|
||||||
|
@ -261,11 +262,11 @@ bool JSON_SETTINGS::SaveToFile( const std::string& aDirectory, bool aForce )
|
||||||
if( aDirectory.empty() )
|
if( aDirectory.empty() )
|
||||||
{
|
{
|
||||||
path.Assign( m_filename );
|
path.Assign( m_filename );
|
||||||
path.SetExt( wxT( "json" ) );
|
path.SetExt( getFileExt() );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
path.Assign( aDirectory, m_filename, wxT( "json" ) );
|
path.Assign( aDirectory, m_filename, getFileExt() );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !m_createIfMissing && !path.FileExists() )
|
if( !m_createIfMissing && !path.FileExists() )
|
||||||
|
|
|
@ -34,13 +34,14 @@ const int projectFileSchemaVersion = 1;
|
||||||
|
|
||||||
PROJECT_FILE::PROJECT_FILE( const std::string& aFullPath ) :
|
PROJECT_FILE::PROJECT_FILE( const std::string& aFullPath ) :
|
||||||
JSON_SETTINGS( aFullPath, SETTINGS_LOC::NONE, projectFileSchemaVersion ),
|
JSON_SETTINGS( aFullPath, SETTINGS_LOC::NONE, projectFileSchemaVersion ),
|
||||||
m_sheets(), m_boards(), m_legacyVars()
|
m_sheets(), m_boards()
|
||||||
{
|
{
|
||||||
|
// Keep old files around
|
||||||
|
m_deleteLegacyAfterMigration = false;
|
||||||
|
|
||||||
m_params.emplace_back( new PARAM_LIST<FILE_INFO_PAIR>( "sheets", &m_sheets, {} ) );
|
m_params.emplace_back( new PARAM_LIST<FILE_INFO_PAIR>( "sheets", &m_sheets, {} ) );
|
||||||
|
|
||||||
m_params.emplace_back( new PARAM_LIST<FILE_INFO_PAIR>( "boards", &m_boards, {} ) );
|
m_params.emplace_back( new PARAM_LIST<FILE_INFO_PAIR>( "boards", &m_boards, {} ) );
|
||||||
|
|
||||||
m_params.emplace_back( new PARAM_MAP<wxString>( "legacy", &m_legacyVars, {} ) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -48,7 +49,7 @@ bool PROJECT_FILE::MigrateFromLegacy( wxConfigBase* aLegacyFile )
|
||||||
{
|
{
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
wxString str;
|
wxString str;
|
||||||
long dummy;
|
long index = 0;
|
||||||
|
|
||||||
// Legacy files don't store board info; they assume board matches project name
|
// Legacy files don't store board info; they assume board matches project name
|
||||||
// We will leave m_boards empty here so it can be populated with other code
|
// We will leave m_boards empty here so it can be populated with other code
|
||||||
|
@ -56,18 +57,28 @@ bool PROJECT_FILE::MigrateFromLegacy( wxConfigBase* aLegacyFile )
|
||||||
auto loadSheetNames =
|
auto loadSheetNames =
|
||||||
[&]() -> bool
|
[&]() -> bool
|
||||||
{
|
{
|
||||||
int index = 1;
|
int sheet = 1;
|
||||||
wxString entry;
|
wxString entry;
|
||||||
|
nlohmann::json arr = nlohmann::json::array();
|
||||||
|
|
||||||
|
wxLogTrace( traceSettings, "Migrating sheet names" );
|
||||||
|
|
||||||
aLegacyFile->SetPath( GROUP_SHEET_NAMES );
|
aLegacyFile->SetPath( GROUP_SHEET_NAMES );
|
||||||
|
|
||||||
while( aLegacyFile->Read( wxString::Format( "%d", index++ ), &entry ) )
|
while( aLegacyFile->Read( wxString::Format( "%d", sheet++ ), &entry ) )
|
||||||
{
|
{
|
||||||
wxArrayString tokens = wxSplit( entry, ':' );
|
wxArrayString tokens = wxSplit( entry, ':' );
|
||||||
|
|
||||||
if( tokens.size() == 2 )
|
if( tokens.size() == 2 )
|
||||||
m_sheets.emplace_back( std::make_pair( KIID( tokens[0] ), tokens[1] ) );
|
{
|
||||||
|
wxLogTrace( traceSettings, "%d: %s = %s", sheet, tokens[0], tokens[1] );
|
||||||
|
arr.push_back( nlohmann::json::array( { tokens[0], tokens[1] } ) );
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
( *this )[PointerFromString( "sheets" )] = arr;
|
||||||
|
|
||||||
|
aLegacyFile->SetPath( "/" );
|
||||||
|
|
||||||
// TODO: any reason we want to fail on this?
|
// TODO: any reason we want to fail on this?
|
||||||
return true;
|
return true;
|
||||||
|
@ -75,46 +86,73 @@ bool PROJECT_FILE::MigrateFromLegacy( wxConfigBase* aLegacyFile )
|
||||||
|
|
||||||
std::vector<wxString> groups;
|
std::vector<wxString> groups;
|
||||||
|
|
||||||
bool more = aLegacyFile->GetFirstGroup( str, dummy );
|
while( aLegacyFile->GetNextGroup( str, index ) )
|
||||||
|
|
||||||
while( more )
|
|
||||||
{
|
{
|
||||||
if( str == GROUP_SHEET_NAMES )
|
if( str == wxString( GROUP_SHEET_NAMES ).Mid( 1 ) )
|
||||||
ret |= loadSheetNames();
|
ret |= loadSheetNames();
|
||||||
else
|
else
|
||||||
groups.emplace_back( str );
|
groups.emplace_back( "/" + str );
|
||||||
|
|
||||||
more = aLegacyFile->GetNextGroup( str, dummy );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto loadLegacyPairs =
|
auto loadLegacyPairs =
|
||||||
[&]( const wxString& aGroup = wxEmptyString ) -> bool
|
[&]( const std::string& aGroup ) -> bool
|
||||||
{
|
{
|
||||||
aLegacyFile->SetPath( aGroup );
|
wxLogTrace( traceSettings, "Migrating group %s", aGroup );
|
||||||
|
bool success = true;
|
||||||
|
wxString keyStr;
|
||||||
|
wxString val;
|
||||||
|
|
||||||
bool morePairs = aLegacyFile->GetFirstEntry( str, dummy );
|
index = 0;
|
||||||
|
|
||||||
while( morePairs )
|
while( aLegacyFile->GetNextEntry( keyStr, index ) )
|
||||||
{
|
{
|
||||||
wxString val = aLegacyFile->Read( str );
|
if( !aLegacyFile->Read( keyStr, &val ) )
|
||||||
std::string key( str.ToUTF8() );
|
continue;
|
||||||
m_legacyVars[key] = val;
|
|
||||||
morePairs = aLegacyFile->GetNextEntry( str, dummy );
|
std::string key( keyStr.ToUTF8() );
|
||||||
|
|
||||||
|
wxLogTrace( traceSettings, " %s = %s", key, val );
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
nlohmann::json::json_pointer ptr( "/legacy" + aGroup + "/" + key );
|
||||||
|
( *this )[ptr] = val;
|
||||||
|
}
|
||||||
|
catch( ... )
|
||||||
|
{
|
||||||
|
success = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: any reason we want to fail on this?
|
return success;
|
||||||
return true;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
ret &= loadLegacyPairs();
|
ret &= loadLegacyPairs( "" );
|
||||||
|
|
||||||
for( const auto& groupName : groups )
|
for( size_t i = 0; i < groups.size(); i++ )
|
||||||
ret &= loadLegacyPairs( groupName );
|
{
|
||||||
|
aLegacyFile->SetPath( groups[i] );
|
||||||
|
|
||||||
|
ret &= loadLegacyPairs( groups[i].ToStdString() );
|
||||||
|
|
||||||
|
index = 0;
|
||||||
|
|
||||||
|
while( aLegacyFile->GetNextGroup( str, index ) )
|
||||||
|
groups.emplace_back( groups[i] + "/" + str );
|
||||||
|
|
||||||
|
aLegacyFile->SetPath( "/" );
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
wxString PROJECT_FILE::getFileExt() const
|
||||||
|
{
|
||||||
|
return ProjectFileExtension;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
wxString PROJECT_FILE::getLegacyFileExt() const
|
wxString PROJECT_FILE::getLegacyFileExt() const
|
||||||
{
|
{
|
||||||
return LegacyProjectFileExtension;
|
return LegacyProjectFileExtension;
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include <settings/common_settings.h>
|
#include <settings/common_settings.h>
|
||||||
#include <settings/project_file.h>
|
#include <settings/project_file.h>
|
||||||
#include <settings/settings_manager.h>
|
#include <settings/settings_manager.h>
|
||||||
|
#include <wildcards_and_files_ext.h>
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -44,6 +45,10 @@
|
||||||
const char* traceSettings = "SETTINGS";
|
const char* traceSettings = "SETTINGS";
|
||||||
|
|
||||||
|
|
||||||
|
/// Project settings path will be <projectname> + this
|
||||||
|
#define PROJECT_SETTINGS_DIR_SUFFIX wxT( "-settings" )
|
||||||
|
|
||||||
|
|
||||||
SETTINGS_MANAGER::SETTINGS_MANAGER() :
|
SETTINGS_MANAGER::SETTINGS_MANAGER() :
|
||||||
m_common_settings( nullptr ),
|
m_common_settings( nullptr ),
|
||||||
m_migration_source()
|
m_migration_source()
|
||||||
|
@ -664,20 +669,28 @@ bool SETTINGS_MANAGER::extractVersion( const std::string& aVersionString, int* a
|
||||||
|
|
||||||
bool SETTINGS_MANAGER::LoadProject( const wxString& aFullPath )
|
bool SETTINGS_MANAGER::LoadProject( const wxString& aFullPath )
|
||||||
{
|
{
|
||||||
|
// Normalize path to new format even if migrating from a legacy file
|
||||||
|
wxFileName path( aFullPath );
|
||||||
|
|
||||||
|
if( path.GetExt() == LegacyProjectFileExtension )
|
||||||
|
path.SetExt( ProjectFileExtension );
|
||||||
|
|
||||||
|
wxString fullPath = path.GetFullPath();
|
||||||
|
|
||||||
// Unload if already loaded
|
// Unload if already loaded
|
||||||
if( m_projects.count( aFullPath ) && !UnloadProject( *m_projects.at( aFullPath ).get() ) )
|
if( m_projects.count( fullPath ) && !UnloadProject( *m_projects.at( fullPath ).get() ) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// No MDI yet
|
// No MDI yet
|
||||||
if( !m_projects.empty() && !UnloadProject( *m_projects.begin()->second ) )
|
if( !m_projects.empty() && !UnloadProject( *m_projects.begin()->second ) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
wxLogTrace( traceSettings, "Load project %s", aFullPath );
|
wxLogTrace( traceSettings, "Load project %s", fullPath );
|
||||||
|
|
||||||
m_projects[aFullPath] = std::make_unique<PROJECT>();
|
m_projects[fullPath] = std::make_unique<PROJECT>();
|
||||||
m_projects[aFullPath]->SetProjectFullName( aFullPath );
|
m_projects[fullPath]->setProjectFullName( fullPath );
|
||||||
|
|
||||||
return loadProjectFile( *m_projects[aFullPath] );
|
return loadProjectFile( *m_projects[fullPath] );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -705,6 +718,25 @@ PROJECT& SETTINGS_MANAGER::Prj() const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool SETTINGS_MANAGER::SaveProject()
|
||||||
|
{
|
||||||
|
wxString name = Prj().GetProjectFullName();
|
||||||
|
|
||||||
|
if( !m_project_files.count( name ) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
m_project_files[name]->SaveToFile();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
wxString SETTINGS_MANAGER::GetProjectSettingsPath() const
|
||||||
|
{
|
||||||
|
return Prj().GetProjectPath() + Prj().GetProjectName() + PROJECT_SETTINGS_DIR_SUFFIX;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool SETTINGS_MANAGER::loadProjectFile( PROJECT& aProject )
|
bool SETTINGS_MANAGER::loadProjectFile( PROJECT& aProject )
|
||||||
{
|
{
|
||||||
std::string fn( aProject.GetProjectFullName().ToUTF8() );
|
std::string fn( aProject.GetProjectFullName().ToUTF8() );
|
||||||
|
@ -714,6 +746,8 @@ bool SETTINGS_MANAGER::loadProjectFile( PROJECT& aProject )
|
||||||
|
|
||||||
m_project_files[aProject.GetProjectFullName()] = file;
|
m_project_files[aProject.GetProjectFullName()] = file;
|
||||||
|
|
||||||
|
aProject.setProjectFile( file );
|
||||||
|
|
||||||
return file->LoadFromFile();
|
return file->LoadFromFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -189,7 +189,19 @@ wxString LegacySymbolLibFileWildcard()
|
||||||
|
|
||||||
wxString ProjectFileWildcard()
|
wxString ProjectFileWildcard()
|
||||||
{
|
{
|
||||||
return _( "KiCad project files" ) + AddFileExtListToFilter( { "pro" } );
|
return _( "KiCad project files" ) + AddFileExtListToFilter( { "kicad_pro" } );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
wxString LegacyProjectFileWildcard()
|
||||||
|
{
|
||||||
|
return _( "KiCad legacy project files" ) + AddFileExtListToFilter( { "pro" } );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
wxString AllProjectFilesWildcard()
|
||||||
|
{
|
||||||
|
return _( "All KiCad project files" ) + AddFileExtListToFilter( { "kicad_pro", "pro" } );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -54,6 +54,7 @@
|
||||||
#include <connection_graph.h>
|
#include <connection_graph.h>
|
||||||
#include <tool/actions.h>
|
#include <tool/actions.h>
|
||||||
#include <tools/sch_editor_control.h>
|
#include <tools/sch_editor_control.h>
|
||||||
|
#include <settings/settings_manager.h>
|
||||||
#include <netlist.h>
|
#include <netlist.h>
|
||||||
#include <widgets/infobar.h>
|
#include <widgets/infobar.h>
|
||||||
|
|
||||||
|
@ -303,7 +304,7 @@ bool SCH_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
|
||||||
if( pro.GetFullPath() != Prj().GetProjectFullName()
|
if( pro.GetFullPath() != Prj().GetProjectFullName()
|
||||||
|| !Prj().GetElem( PROJECT::ELEM_SCH_PART_LIBS ) )
|
|| !Prj().GetElem( PROJECT::ELEM_SCH_PART_LIBS ) )
|
||||||
{
|
{
|
||||||
Prj().SetProjectFullName( pro.GetFullPath() );
|
GetSettingsManager()->LoadProject( pro.GetFullPath() );
|
||||||
|
|
||||||
// load the libraries here, not in SCH_SCREEN::Draw() which is a context
|
// load the libraries here, not in SCH_SCREEN::Draw() which is a context
|
||||||
// that will not tolerate DisplayError() dialog since we're already in an
|
// that will not tolerate DisplayError() dialog since we're already in an
|
||||||
|
@ -322,7 +323,7 @@ bool SCH_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
|
||||||
|
|
||||||
// Make sure the project file name is set (it won't be in standalone mode)
|
// Make sure the project file name is set (it won't be in standalone mode)
|
||||||
if( pro.GetFullPath() != Prj().GetProjectFullName() )
|
if( pro.GetFullPath() != Prj().GetProjectFullName() )
|
||||||
Prj().SetProjectFullName( pro.GetFullPath() );
|
GetSettingsManager()->LoadProject( pro.GetFullPath() );
|
||||||
|
|
||||||
LoadProjectFile();
|
LoadProjectFile();
|
||||||
|
|
||||||
|
@ -605,8 +606,8 @@ void SCH_EDIT_FRAME::OnImportProject( wxCommandEvent& aEvent )
|
||||||
if( setProject )
|
if( setProject )
|
||||||
{
|
{
|
||||||
wxFileName projectFn( dlg.GetPath() );
|
wxFileName projectFn( dlg.GetPath() );
|
||||||
projectFn.SetExt( LegacyProjectFileExtension );
|
projectFn.SetExt( ProjectFileExtension );
|
||||||
Prj().SetProjectFullName( projectFn.GetFullPath() );
|
GetSettingsManager()->LoadProject( projectFn.GetFullPath() );
|
||||||
}
|
}
|
||||||
|
|
||||||
// For now there is only one import plugin
|
// For now there is only one import plugin
|
||||||
|
|
|
@ -47,6 +47,7 @@ class S3D_CACHE;
|
||||||
class KIWAY;
|
class KIWAY;
|
||||||
class SYMBOL_LIB_TABLE;
|
class SYMBOL_LIB_TABLE;
|
||||||
class FILENAME_RESOLVER;
|
class FILENAME_RESOLVER;
|
||||||
|
class PROJECT_FILE;
|
||||||
|
|
||||||
#define VTBL_ENTRY virtual
|
#define VTBL_ENTRY virtual
|
||||||
|
|
||||||
|
@ -58,6 +59,9 @@ class FILENAME_RESOLVER;
|
||||||
*/
|
*/
|
||||||
class PROJECT
|
class PROJECT
|
||||||
{
|
{
|
||||||
|
friend class SETTINGS_MANAGER; // so that SM can set project path
|
||||||
|
friend class TEST_NETLISTS_FIXTURE; // TODO(JE) make this not required
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/// A PROJECT can hold stuff it knows nothing about, in the form of
|
/// A PROJECT can hold stuff it knows nothing about, in the form of
|
||||||
|
@ -84,16 +88,6 @@ public:
|
||||||
|
|
||||||
// VTBL_ENTRY bool MaybeLoadProjectSettings( const std::vector<wxString>& aFileSet );
|
// VTBL_ENTRY bool MaybeLoadProjectSettings( const std::vector<wxString>& aFileSet );
|
||||||
|
|
||||||
/**
|
|
||||||
* Function SetProjectFullName
|
|
||||||
* sets the:
|
|
||||||
* 1) full directory, 2) basename, and 3) extension of the project. This is
|
|
||||||
* the name of the *.pro file with full absolute path and it also defines
|
|
||||||
* the name of the project. The project name and the *.pro file names are
|
|
||||||
* exactly the same, providing the *.pro filename is absolute.
|
|
||||||
*/
|
|
||||||
VTBL_ENTRY void SetProjectFullName( const wxString& aFullPathAndName );
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function GetProjectFullName
|
* Function GetProjectFullName
|
||||||
* returns the full path and name of the project. This is the same as the
|
* returns the full path and name of the project. This is the same as the
|
||||||
|
@ -321,6 +315,25 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the:
|
||||||
|
* 1) full directory, 2) basename, and 3) extension of the project. This is
|
||||||
|
* the name of the *.pro file with full absolute path and it also defines
|
||||||
|
* the name of the project. The project name and the *.pro file names are
|
||||||
|
* exactly the same, providing the *.pro filename is absolute.
|
||||||
|
*/
|
||||||
|
VTBL_ENTRY void setProjectFullName( const wxString& aFullPathAndName );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the backing store file for this project
|
||||||
|
* Should only be called by SETTINGS_MANGER on load.
|
||||||
|
* @param aFile is a loaded PROJECT_FILE
|
||||||
|
*/
|
||||||
|
VTBL_ENTRY void setProjectFile( PROJECT_FILE* aFile )
|
||||||
|
{
|
||||||
|
m_projectFile = aFile;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function configCreate
|
* Function configCreate
|
||||||
* loads a *.pro file and returns a wxConfigBase.
|
* loads a *.pro file and returns a wxConfigBase.
|
||||||
|
@ -340,6 +353,9 @@ private:
|
||||||
wxFileName m_project_name; ///< \<fullpath\>/\<basename\>.pro
|
wxFileName m_project_name; ///< \<fullpath\>/\<basename\>.pro
|
||||||
wxString m_pro_date_and_time;
|
wxString m_pro_date_and_time;
|
||||||
|
|
||||||
|
/// Backing store for project data -- owned by SETTINGS_MANAGER
|
||||||
|
PROJECT_FILE* m_projectFile;
|
||||||
|
|
||||||
std::map<KIID, wxString> m_sheetNames;
|
std::map<KIID, wxString> m_sheetNames;
|
||||||
std::map<wxString, wxString> m_textVars;
|
std::map<wxString, wxString> m_textVars;
|
||||||
|
|
||||||
|
|
|
@ -213,6 +213,11 @@ protected:
|
||||||
bool fromLegacyColor( wxConfigBase* aConfig, const std::string& aKey,
|
bool fromLegacyColor( wxConfigBase* aConfig, const std::string& aKey,
|
||||||
const std::string& aDest );
|
const std::string& aDest );
|
||||||
|
|
||||||
|
virtual wxString getFileExt() const
|
||||||
|
{
|
||||||
|
return wxT( "json" );
|
||||||
|
}
|
||||||
|
|
||||||
virtual wxString getLegacyFileExt() const
|
virtual wxString getLegacyFileExt() const
|
||||||
{
|
{
|
||||||
return wxEmptyString;
|
return wxEmptyString;
|
||||||
|
@ -245,6 +250,9 @@ protected:
|
||||||
/// Whether or not the backing store file should be written
|
/// Whether or not the backing store file should be written
|
||||||
bool m_writeFile;
|
bool m_writeFile;
|
||||||
|
|
||||||
|
/// Whether or not to delete legacy file after migration
|
||||||
|
bool m_deleteLegacyAfterMigration;
|
||||||
|
|
||||||
/// Version of this settings schema.
|
/// Version of this settings schema.
|
||||||
int m_schemaVersion;
|
int m_schemaVersion;
|
||||||
|
|
||||||
|
|
|
@ -52,6 +52,8 @@ public:
|
||||||
virtual bool MigrateFromLegacy( wxConfigBase* aLegacyFile ) override;
|
virtual bool MigrateFromLegacy( wxConfigBase* aLegacyFile ) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
wxString getFileExt() const override;
|
||||||
|
|
||||||
wxString getLegacyFileExt() const override;
|
wxString getLegacyFileExt() const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -61,13 +63,6 @@ private:
|
||||||
|
|
||||||
/// A list of board files in this project
|
/// A list of board files in this project
|
||||||
std::vector<FILE_INFO_PAIR> m_boards;
|
std::vector<FILE_INFO_PAIR> m_boards;
|
||||||
|
|
||||||
/**
|
|
||||||
* Stores all K/V pairs migrated from a legacy (.pro) file so that the legacy file can be
|
|
||||||
* removed before these settings are migrated in by PROJECT_SETTINGS objects later.
|
|
||||||
*/
|
|
||||||
std::map<std::string, wxString> m_legacyVars;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Specializations to allow directly reading/writing FILE_INFO_PAIRs from JSON
|
// Specializations to allow directly reading/writing FILE_INFO_PAIRs from JSON
|
||||||
|
|
|
@ -182,9 +182,9 @@ public:
|
||||||
void ReloadColorSettings();
|
void ReloadColorSettings();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads a project
|
* Loads a project or sets up a new project with a specified path
|
||||||
* @param aFullPath is the full path to the project
|
* @param aFullPath is the full path to the project
|
||||||
* @return true if the PROJECT_FILE was successfully loaded
|
* @return true if the PROJECT_FILE was successfully loaded from disk
|
||||||
*/
|
*/
|
||||||
bool LoadProject( const wxString& aFullPath );
|
bool LoadProject( const wxString& aFullPath );
|
||||||
|
|
||||||
|
@ -201,6 +201,18 @@ public:
|
||||||
*/
|
*/
|
||||||
PROJECT& Prj() const;
|
PROJECT& Prj() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Saves the one and only project
|
||||||
|
* TODO: Update for MDI
|
||||||
|
* @return true if save was successful
|
||||||
|
*/
|
||||||
|
bool SaveProject();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the path to the settings folder for the loaded project
|
||||||
|
*/
|
||||||
|
wxString GetProjectSettingsPath() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if a given path is probably a valid KiCad configuration directory.
|
* Checks if a given path is probably a valid KiCad configuration directory.
|
||||||
* Actually it just checks if a file called "kicad_common" exists, because that's probably
|
* Actually it just checks if a file called "kicad_common" exists, because that's probably
|
||||||
|
|
|
@ -176,6 +176,8 @@ extern wxString SchematicSymbolFileWildcard();
|
||||||
extern wxString KiCadSymbolLibFileWildcard();
|
extern wxString KiCadSymbolLibFileWildcard();
|
||||||
extern wxString LegacySymbolLibFileWildcard();
|
extern wxString LegacySymbolLibFileWildcard();
|
||||||
extern wxString ProjectFileWildcard();
|
extern wxString ProjectFileWildcard();
|
||||||
|
extern wxString LegacyProjectFileWildcard();
|
||||||
|
extern wxString AllProjectFilesWildcard();
|
||||||
extern wxString KiCadSchematicFileWildcard();
|
extern wxString KiCadSchematicFileWildcard();
|
||||||
extern wxString LegacySchematicFileWildcard();
|
extern wxString LegacySchematicFileWildcard();
|
||||||
extern wxString BoardFileWildcard();
|
extern wxString BoardFileWildcard();
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#include <launch_ext.h>
|
#include <launch_ext.h>
|
||||||
#include <panel_hotkeys_editor.h>
|
#include <panel_hotkeys_editor.h>
|
||||||
#include <settings/common_settings.h>
|
#include <settings/common_settings.h>
|
||||||
|
#include <settings/settings_manager.h>
|
||||||
#include <tool/action_toolbar.h>
|
#include <tool/action_toolbar.h>
|
||||||
#include <tool/common_control.h>
|
#include <tool/common_control.h>
|
||||||
#include <tool/tool_manager.h>
|
#include <tool/tool_manager.h>
|
||||||
|
@ -203,8 +204,6 @@ void KICAD_MANAGER_FRAME::SetProjectFileName( const wxString& aFullProjectProFil
|
||||||
if( !fn.IsAbsolute() )
|
if( !fn.IsAbsolute() )
|
||||||
fn.MakeAbsolute();
|
fn.MakeAbsolute();
|
||||||
|
|
||||||
Prj().SetProjectFullName( fn.GetFullPath() );
|
|
||||||
|
|
||||||
SetTitle( wxString( "KiCad " ) + GetBuildVersion() );
|
SetTitle( wxString( "KiCad " ) + GetBuildVersion() );
|
||||||
wxString title = GetTitle() + " " + fn.GetFullPath();
|
wxString title = GetTitle() + " " + fn.GetFullPath();
|
||||||
|
|
||||||
|
@ -343,12 +342,13 @@ void KICAD_MANAGER_FRAME::LoadProject( const wxFileName& aProjectFileName )
|
||||||
|
|
||||||
// Save the project file for the currently loaded project.
|
// Save the project file for the currently loaded project.
|
||||||
if( m_active_project )
|
if( m_active_project )
|
||||||
Prj().ConfigLoad( PgmTop().SysSearch(), GeneralGroupName, s_KicadManagerParams );
|
Pgm().GetSettingsManager().SaveProject();
|
||||||
|
|
||||||
m_active_project = true;
|
m_active_project = true;
|
||||||
ClearMsg();
|
ClearMsg();
|
||||||
SetProjectFileName( aProjectFileName.GetFullPath() );
|
|
||||||
Prj().ConfigLoad( PgmTop().SysSearch(), GeneralGroupName, s_KicadManagerParams );
|
Pgm().GetSettingsManager().LoadProject( aProjectFileName.GetFullPath() );
|
||||||
|
SetProjectFileName( Prj().GetProjectFullName() );
|
||||||
|
|
||||||
if( aProjectFileName.IsDirWritable() )
|
if( aProjectFileName.IsDirWritable() )
|
||||||
SetMruPath( Prj().GetProjectPath() ); // Only set MRU path if we have write access. Why?
|
SetMruPath( Prj().GetProjectPath() ); // Only set MRU path if we have write access. Why?
|
||||||
|
@ -381,13 +381,17 @@ void KICAD_MANAGER_FRAME::CreateNewProject( const wxFileName& aProjectFileName )
|
||||||
// Copy kicad.pro file from template folder.
|
// Copy kicad.pro file from template folder.
|
||||||
if( !aProjectFileName.FileExists() )
|
if( !aProjectFileName.FileExists() )
|
||||||
{
|
{
|
||||||
|
// TODO(JE) provide in new format
|
||||||
wxString srcFileName = sys_search().FindValidPath( "kicad.pro" );
|
wxString srcFileName = sys_search().FindValidPath( "kicad.pro" );
|
||||||
|
|
||||||
|
wxFileName destFileName( aProjectFileName );
|
||||||
|
destFileName.SetExt( LegacyProjectFileExtension );
|
||||||
|
|
||||||
// Create a minimal project (.pro) file if the template project file could not be copied.
|
// Create a minimal project (.pro) file if the template project file could not be copied.
|
||||||
if( !wxFileName::FileExists( srcFileName )
|
if( !wxFileName::FileExists( srcFileName )
|
||||||
|| !wxCopyFile( srcFileName, aProjectFileName.GetFullPath() ) )
|
|| !wxCopyFile( srcFileName, destFileName.GetFullPath() ) )
|
||||||
{
|
{
|
||||||
Prj().ConfigSave( PgmTop().SysSearch(), GeneralGroupName, s_KicadManagerParams );
|
Pgm().GetSettingsManager().SaveProject();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -292,15 +292,17 @@ int KICAD_MANAGER_CONTROL::NewFromTemplate( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
int KICAD_MANAGER_CONTROL::OpenProject( const TOOL_EVENT& aEvent )
|
int KICAD_MANAGER_CONTROL::OpenProject( const TOOL_EVENT& aEvent )
|
||||||
{
|
{
|
||||||
|
wxString wildcard = ProjectFileWildcard() + "|" + LegacyProjectFileWildcard() + "|"
|
||||||
|
+ AllProjectFilesWildcard();
|
||||||
|
|
||||||
wxString default_dir = m_frame->GetMruPath();
|
wxString default_dir = m_frame->GetMruPath();
|
||||||
wxFileDialog dlg( m_frame, _( "Open Existing Project" ), default_dir, wxEmptyString,
|
wxFileDialog dlg( m_frame, _( "Open Existing Project" ), default_dir, wxEmptyString,
|
||||||
ProjectFileWildcard(), wxFD_OPEN | wxFD_FILE_MUST_EXIST );
|
wildcard, wxFD_OPEN | wxFD_FILE_MUST_EXIST );
|
||||||
|
|
||||||
if( dlg.ShowModal() == wxID_CANCEL )
|
if( dlg.ShowModal() == wxID_CANCEL )
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
wxFileName pro( dlg.GetPath() );
|
wxFileName pro( dlg.GetPath() );
|
||||||
pro.SetExt( LegacyProjectFileExtension ); // enforce extension
|
|
||||||
|
|
||||||
if( !pro.IsAbsolute() )
|
if( !pro.IsAbsolute() )
|
||||||
pro.MakeAbsolute();
|
pro.MakeAbsolute();
|
||||||
|
|
|
@ -51,6 +51,7 @@
|
||||||
#include <ratsnest/ratsnest_data.h>
|
#include <ratsnest/ratsnest_data.h>
|
||||||
|
|
||||||
#include <wx/wupdlock.h>
|
#include <wx/wupdlock.h>
|
||||||
|
#include <settings/settings_manager.h>
|
||||||
|
|
||||||
|
|
||||||
//#define USE_INSTRUMENTATION 1
|
//#define USE_INSTRUMENTATION 1
|
||||||
|
@ -310,7 +311,7 @@ bool PCB_EDIT_FRAME::Files_io_from_id( int id )
|
||||||
wxFileName fn( wxStandardPaths::Get().GetDocumentsDir(), wxT( "noname" ),
|
wxFileName fn( wxStandardPaths::Get().GetDocumentsDir(), wxT( "noname" ),
|
||||||
LegacyProjectFileExtension );
|
LegacyProjectFileExtension );
|
||||||
|
|
||||||
Prj().SetProjectFullName( fn.GetFullPath() );
|
GetSettingsManager()->LoadProject( fn.GetFullPath() );
|
||||||
|
|
||||||
onBoardLoaded();
|
onBoardLoaded();
|
||||||
|
|
||||||
|
@ -507,7 +508,7 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
|
||||||
// The calling code should know not to ask me here to change projects unless
|
// The calling code should know not to ask me here to change projects unless
|
||||||
// it knows what consequences that will have on other KIFACEs running and using
|
// it knows what consequences that will have on other KIFACEs running and using
|
||||||
// this same PROJECT. It can be very harmful if that calling code is stupid.
|
// this same PROJECT. It can be very harmful if that calling code is stupid.
|
||||||
Prj().SetProjectFullName( pro.GetFullPath() );
|
GetSettingsManager()->LoadProject( pro.GetFullPath() );
|
||||||
|
|
||||||
// load project settings before BOARD
|
// load project settings before BOARD
|
||||||
LoadProjectSettings();
|
LoadProjectSettings();
|
||||||
|
|
|
@ -81,9 +81,10 @@ void TEST_NETLISTS_FIXTURE::loadSchematic( const wxString& aBaseName )
|
||||||
BOOST_TEST_MESSAGE( fn );
|
BOOST_TEST_MESSAGE( fn );
|
||||||
|
|
||||||
wxFileName pro( fn );
|
wxFileName pro( fn );
|
||||||
pro.SetExt( LegacyProjectFileExtension );
|
pro.SetExt( ProjectFileExtension );
|
||||||
|
|
||||||
m_project.SetProjectFullName( pro.GetFullPath() );
|
// TODO(JE) Make this not required
|
||||||
|
m_project.setProjectFullName( pro.GetFullPath() );
|
||||||
m_project.SetElem( PROJECT::ELEM_SCH_PART_LIBS, nullptr );
|
m_project.SetElem( PROJECT::ELEM_SCH_PART_LIBS, nullptr );
|
||||||
|
|
||||||
m_schematic.Reset();
|
m_schematic.Reset();
|
||||||
|
|
Loading…
Reference in New Issue