Move PROJECT storage to SETTINGS_MANAGER
This commit is contained in:
parent
a7708fa6dc
commit
a5a19076fd
|
@ -31,6 +31,7 @@
|
||||||
#include <pgm_base.h>
|
#include <pgm_base.h>
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include <id.h>
|
#include <id.h>
|
||||||
|
#include <settings/settings_manager.h>
|
||||||
|
|
||||||
#include <wx/stdpaths.h>
|
#include <wx/stdpaths.h>
|
||||||
#include <wx/debug.h>
|
#include <wx/debug.h>
|
||||||
|
@ -170,7 +171,7 @@ const wxString KIWAY::dso_search_path( FACE_T aFaceId )
|
||||||
|
|
||||||
PROJECT& KIWAY::Prj() const
|
PROJECT& KIWAY::Prj() const
|
||||||
{
|
{
|
||||||
return *(PROJECT*) &m_project; // strip const-ness, function really is const.
|
return Pgm().GetSettingsManager().Prj();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -442,6 +442,10 @@ bool PGM_BASE::InitPgm()
|
||||||
wxSystemOptions::SetOption( wxOSX_FILEDIALOG_ALWAYS_SHOW_TYPES, 1 );
|
wxSystemOptions::SetOption( wxOSX_FILEDIALOG_ALWAYS_SHOW_TYPES, 1 );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// TODO(JE): Remove this if apps are refactored to not assume Prj() always works
|
||||||
|
// Need to create a project early for now (it can have an empty path for the moment)
|
||||||
|
GetSettingsManager().LoadProject( "" );
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -252,6 +252,10 @@ bool JSON_SETTINGS::SaveToFile( const std::string& aDirectory, bool aForce )
|
||||||
if( !m_writeFile )
|
if( !m_writeFile )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// Default PROJECT won't have a filename set
|
||||||
|
if( m_filename.empty() )
|
||||||
|
return false;
|
||||||
|
|
||||||
wxFileName path;
|
wxFileName path;
|
||||||
|
|
||||||
if( aDirectory.empty() )
|
if( aDirectory.empty() )
|
||||||
|
@ -292,6 +296,8 @@ bool JSON_SETTINGS::SaveToFile( const std::string& aDirectory, bool aForce )
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxLogTrace( traceSettings, "Saving %s", m_filename );
|
||||||
|
|
||||||
if( !path.DirExists() && !path.Mkdir() )
|
if( !path.DirExists() && !path.Mkdir() )
|
||||||
{
|
{
|
||||||
wxLogTrace( traceSettings, "Warning: could not create path %s, can't save %s",
|
wxLogTrace( traceSettings, "Warning: could not create path %s, can't save %s",
|
||||||
|
|
|
@ -68,6 +68,7 @@ SETTINGS_MANAGER::~SETTINGS_MANAGER()
|
||||||
{
|
{
|
||||||
m_settings.clear();
|
m_settings.clear();
|
||||||
m_color_settings.clear();
|
m_color_settings.clear();
|
||||||
|
m_projects.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -661,14 +662,52 @@ bool SETTINGS_MANAGER::extractVersion( const std::string& aVersionString, int* a
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool SETTINGS_MANAGER::LoadProject( PROJECT& aProject )
|
bool SETTINGS_MANAGER::LoadProject( const wxString& aFullPath )
|
||||||
{
|
{
|
||||||
wxString name = aProject.GetProjectFullName();
|
|
||||||
std::string fn( name.ToUTF8() );
|
|
||||||
|
|
||||||
// Unload if already loaded
|
// Unload if already loaded
|
||||||
if( m_project_files.count( name ) )
|
if( m_projects.count( aFullPath ) && !UnloadProject( *m_projects.at( aFullPath ).get() ) )
|
||||||
UnloadProject( aProject );
|
return false;
|
||||||
|
|
||||||
|
// No MDI yet
|
||||||
|
if( !m_projects.empty() && !UnloadProject( *m_projects.begin()->second ) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
wxLogTrace( traceSettings, "Load project %s", aFullPath );
|
||||||
|
|
||||||
|
m_projects[aFullPath] = std::make_unique<PROJECT>();
|
||||||
|
m_projects[aFullPath]->SetProjectFullName( aFullPath );
|
||||||
|
|
||||||
|
return loadProjectFile( *m_projects[aFullPath] );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool SETTINGS_MANAGER::UnloadProject( PROJECT& aProject )
|
||||||
|
{
|
||||||
|
if( !m_projects.count( aProject.GetProjectFullName() ) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if( !unloadProjectFile( aProject ) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
wxLogTrace( traceSettings, "Unload project %s", aProject.GetProjectFullName() );
|
||||||
|
|
||||||
|
m_projects.erase( aProject.GetProjectFullName() );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PROJECT& SETTINGS_MANAGER::Prj() const
|
||||||
|
{
|
||||||
|
// No MDI yet
|
||||||
|
wxASSERT( m_projects.size() == 1 );
|
||||||
|
return *m_projects.begin()->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool SETTINGS_MANAGER::loadProjectFile( PROJECT& aProject )
|
||||||
|
{
|
||||||
|
std::string fn( aProject.GetProjectFullName().ToUTF8() );
|
||||||
|
|
||||||
PROJECT_FILE* file =
|
PROJECT_FILE* file =
|
||||||
static_cast<PROJECT_FILE*>( RegisterSettings( new PROJECT_FILE( fn ), false ) );
|
static_cast<PROJECT_FILE*>( RegisterSettings( new PROJECT_FILE( fn ), false ) );
|
||||||
|
@ -679,7 +718,7 @@ bool SETTINGS_MANAGER::LoadProject( PROJECT& aProject )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool SETTINGS_MANAGER::UnloadProject( PROJECT& aProject )
|
bool SETTINGS_MANAGER::unloadProjectFile( PROJECT& aProject )
|
||||||
{
|
{
|
||||||
wxString name = aProject.GetProjectFullName();
|
wxString name = aProject.GetProjectFullName();
|
||||||
|
|
||||||
|
@ -696,7 +735,6 @@ bool SETTINGS_MANAGER::UnloadProject( PROJECT& aProject )
|
||||||
|
|
||||||
if( it != m_settings.end() )
|
if( it != m_settings.end() )
|
||||||
{
|
{
|
||||||
wxLogTrace( traceSettings, "Unload project %s", ( *it )->GetFilename() );
|
|
||||||
( *it )->SaveToFile();
|
( *it )->SaveToFile();
|
||||||
m_settings.erase( it );
|
m_settings.erase( it );
|
||||||
}
|
}
|
||||||
|
|
|
@ -441,8 +441,6 @@ private:
|
||||||
// wxWindow::FindWindowByName( m_playerFrameName[aFrameType] )
|
// wxWindow::FindWindowByName( m_playerFrameName[aFrameType] )
|
||||||
// to know if still exists (or GetPlayerFrame( FRAME_T aFrameType )
|
// to know if still exists (or GetPlayerFrame( FRAME_T aFrameType )
|
||||||
wxArrayString m_playerFrameName;
|
wxArrayString m_playerFrameName;
|
||||||
|
|
||||||
PROJECT m_project; // do not assume this is here, use Prj().
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -182,19 +182,25 @@ public:
|
||||||
void ReloadColorSettings();
|
void ReloadColorSettings();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers a project and attempts to load the associated PROJECT_FILE
|
* Loads a project
|
||||||
* @param aProject is the project object to load
|
* @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
|
||||||
*/
|
*/
|
||||||
bool LoadProject( PROJECT& aProject );
|
bool LoadProject( const wxString& aFullPath );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Saves, unloads and unregisters the given project
|
* Saves, unloads and unregisters the given PROJECT
|
||||||
* @param aProject is the project object to unload
|
* @param aProject is the project object to unload
|
||||||
* @return true if the PROJECT file was successfully saved
|
* @return true if the PROJECT file was successfully saved
|
||||||
*/
|
*/
|
||||||
bool UnloadProject( PROJECT& aProject );
|
bool UnloadProject( PROJECT& aProject );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A helper while we are not MDI-capable -- return the one and only project
|
||||||
|
* @return the loaded project
|
||||||
|
*/
|
||||||
|
PROJECT& Prj() 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
|
||||||
|
@ -274,6 +280,22 @@ private:
|
||||||
|
|
||||||
void loadAllColorSettings();
|
void loadAllColorSettings();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a PROJECT_FILE and attempts to load it from disk
|
||||||
|
* @param aProject is the project object to load the file for
|
||||||
|
* @return true if the PROJECT_FILE was successfully loaded
|
||||||
|
*/
|
||||||
|
bool loadProjectFile( PROJECT& aProject );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Saves, unloads and unregisters the given PROJECT_FILE
|
||||||
|
* @param aProject is the project object to unload the file for
|
||||||
|
* @return true if the PROJECT file was successfully saved
|
||||||
|
*/
|
||||||
|
bool unloadProjectFile( PROJECT& aProject );
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
std::vector<std::unique_ptr<JSON_SETTINGS>> m_settings;
|
std::vector<std::unique_ptr<JSON_SETTINGS>> m_settings;
|
||||||
|
|
||||||
std::unordered_map<wxString, COLOR_SETTINGS*> m_color_settings;
|
std::unordered_map<wxString, COLOR_SETTINGS*> m_color_settings;
|
||||||
|
@ -286,7 +308,10 @@ private:
|
||||||
/// True if settings loaded successfully at construction
|
/// True if settings loaded successfully at construction
|
||||||
bool m_ok;
|
bool m_ok;
|
||||||
|
|
||||||
/// Project files, mapped according to project full name
|
/// Loaded projects, mapped according to project full name
|
||||||
|
std::map<wxString, std::unique_ptr<PROJECT>> m_projects;
|
||||||
|
|
||||||
|
/// Loaded project files, mapped according to project full name
|
||||||
std::map<wxString, PROJECT_FILE*> m_project_files;
|
std::map<wxString, PROJECT_FILE*> m_project_files;
|
||||||
|
|
||||||
/// A list of project settings objects for each loaded project
|
/// A list of project settings objects for each loaded project
|
||||||
|
|
Loading…
Reference in New Issue