26#include <wx/filename.h>
27#include <wx/snglinst.h>
28#include <wx/stdpaths.h>
66 if( !
path.DirExists() )
68 wxLogTrace(
traceSettings, wxT(
"Path didn't exist; creating it" ) );
69 path.Mkdir( wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL );
77 wxLogTrace(
traceSettings, wxT(
"Note: no valid settings directory on disk" ) );
98 for( std::unique_ptr<JSON_SETTINGS>& settings :
m_settings )
109 for( std::unique_ptr<JSON_SETTINGS>& settings :
m_settings )
113 std::map<std::string, nlohmann::json> fileHistories = settings->GetFileHistories();
115 settings->Internals()->clear();
118 for(
const auto& [
path, history] : fileHistories )
119 settings->Set(
path, history );
129 for( std::unique_ptr<JSON_SETTINGS>& settings :
m_settings )
133 for(
const auto& [
path, history] : settings->GetFileHistories() )
134 settings->Set(
path, nlohmann::json::array() );
144 std::unique_ptr<JSON_SETTINGS> ptr( aSettings );
146 ptr->SetManager(
this );
148 wxLogTrace(
traceSettings, wxT(
"Registered new settings object <%s>" ),
149 ptr->GetFullFilename() );
163 std::vector<JSON_SETTINGS*> toLoad;
167 []( std::unique_ptr<JSON_SETTINGS>& aSettings )
169 return aSettings.get();
180 [&aSettings](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
182 return aPtr.get() == aSettings;
214 [&aSettings](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
216 return aPtr.get() == aSettings;
221 wxLogTrace(
traceSettings, wxT(
"Saving %s" ), ( *it )->GetFullFilename() );
230 [&aSettings](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
232 return aPtr.get() == aSettings;
237 wxLogTrace(
traceSettings, wxT(
"Flush and release %s" ), ( *it )->GetFullFilename() );
243 size_t typeHash =
typeid( *tmp ).hash_code();
261 [&aName](
const std::pair<wxString, COLOR_SETTINGS*>& p )
263 return p.second->GetName().Lower() == aName.Lower();
294 std::vector<COLOR_SETTINGS*> ret;
296 for(
const std::pair<const wxString, COLOR_SETTINGS*>& entry :
m_color_settings )
297 ret.push_back( entry.second );
300 { return a->GetName() < b->GetName(); } );
308 wxLogTrace(
traceSettings, wxT(
"Attempting to load color theme %s" ), aName );
312 if( !fn.IsOk() || !fn.Exists() )
314 wxLogTrace(
traceSettings, wxT(
"Theme file %s.json not found, falling back to user" ),
321 if( settings->
GetFilename() != aName.ToStdString() )
323 wxLogTrace(
traceSettings, wxT(
"Warning: stored filename is actually %s, " ),
344 wxDirTraverseResult
OnFile(
const wxString& aFilePath )
override
346 wxFileName file( aFilePath );
348 if( file.GetExt() == wxS(
"json" ) )
351 return wxDIR_CONTINUE;
354 wxDirTraverseResult
OnDir(
const wxString& dirPath )
override
356 return wxDIR_CONTINUE;
376 if( aName.EndsWith( wxT(
".json" ) ) )
388 settings->
SetName( wxT(
"User" ) );
408 wxFileName third_party_path;
412 if( it != env.end() && !it->second.GetValue().IsEmpty() )
413 third_party_path.SetPath( it->second.GetValue() );
417 third_party_path.AppendDir( wxS(
"colors" ) );
420 wxDir third_party_colors_dir( third_party_path.GetFullPath() );
435 [&](
const wxFileName& aFilename )
441 if( system_colors_dir.IsOpened() )
442 system_colors_dir.Traverse( readOnlyLoader );
444 if( third_party_colors_dir.IsOpened() )
445 third_party_colors_dir.Traverse( readOnlyLoader );
447 if( colors_dir.IsOpened() )
448 colors_dir.Traverse( loader );
454 std::set<wxString> builtinNames;
463 for(
const std::pair<const wxString, COLOR_SETTINGS*>& entry :
m_color_settings )
469 && builtinNames.count( settings->
GetName() ) )
472 settings->
SetName( wxString::Format( wxS(
"%s (%s)" ), settings->
GetName(),
473 wxFileName( settings->
GetFilename() ).GetName() ) );
490 [aSettings] (
const std::pair<wxString, COLOR_SETTINGS*>& el )
492 return el.second->GetFilename() == aSettings->GetFilename();
499 if( !aSettings->
Store() )
501 wxLogTrace(
traceSettings, wxT(
"Color scheme %s not modified; skipping save" ),
506 wxASSERT( aSettings->
Contains( aNamespace ) );
508 wxLogTrace(
traceSettings, wxT(
"Saving color scheme %s, preserving %s" ),
512 std::optional<nlohmann::json> backup = aSettings->
GetJson( aNamespace );
518 ( *aSettings->
Internals() )[aNamespace].update( *backup );
528 wxASSERT( aSettings );
538 return owner->GetProjectPath();
553 wxASSERT_MSG(
false, wxT(
"Unknown settings location!" ) );
578 wxDirTraverseResult
OnFile(
const wxString& aSrcFilePath )
override
580 wxFileName file( aSrcFilePath );
585 return wxDIR_CONTINUE;
589 if( file.GetFullName() == wxT(
"installed_packages.json" ) )
590 return wxDIR_CONTINUE;
594 if( file.GetExt() == wxT(
"hotkeys" ) )
595 return wxDIR_CONTINUE;
597 wxString
path = file.GetPath();
600 file.SetPath(
path );
602 wxLogTrace(
traceSettings, wxT(
"Copying %s to %s" ), aSrcFilePath, file.GetFullPath() );
607 return wxDIR_CONTINUE;
610 wxDirTraverseResult
OnDir(
const wxString& dirPath )
override
612 wxFileName dir( dirPath );
615 if( dir.GetName() == wxS(
"colors" ) ||
616 dir.GetName() == wxS(
"3d" ) )
619 wxString
path = dir.GetPath();
624 if( !wxDirExists( dir.GetPath() ) )
625 wxMkdir( dir.GetPath() );
627 return wxDIR_CONTINUE;
641 if(
path.DirExists() )
643 wxFileName common =
path;
644 common.SetName( wxS(
"kicad_common" ) );
645 common.SetExt( wxS(
"json" ) );
647 if( common.Exists() )
649 wxLogTrace(
traceSettings, wxT(
"Path exists and has a kicad_common, continuing!" ) );
662 if( aSourcePath.IsEmpty() )
665 wxLogTrace(
traceSettings, wxT(
"Migrating from path %s" ), aSourcePath );
669 wxDir source_dir( aSourcePath );
671 source_dir.Traverse( traverser );
683 const std::vector<wxString> libKeys = {
684 wxT(
"KICAD6_SYMBOL_DIR" ),
685 wxT(
"KICAD6_3DMODEL_DIR" ),
686 wxT(
"KICAD6_FOOTPRINT_DIR" ),
687 wxT(
"KICAD6_TEMPLATE_DIR" ),
688 wxT(
"KICAD7_SYMBOL_DIR" ),
689 wxT(
"KICAD7_3DMODEL_DIR" ),
690 wxT(
"KICAD7_FOOTPRINT_DIR" ),
691 wxT(
"KICAD7_TEMPLATE_DIR" ),
692 wxT(
"KICAD8_SYMBOL_DIR" ),
693 wxT(
"KICAD8_3DMODEL_DIR" ),
694 wxT(
"KICAD8_FOOTPRINT_DIR" ),
695 wxT(
"KICAD8_TEMPLATE_DIR" ),
698 wxT(
"KICAD_PTEMPLATES" ),
701 wxT(
"KICAD_SYMBOL_DIR" ),
704 for(
const wxString& key : libKeys )
721 std::vector<wxFileName> base_paths;
726 if( wxGetEnv( wxT(
"KICAD_CONFIG_HOME" ),
nullptr ) )
737 wxFileName wxGtkPath;
738 wxGtkPath.AssignDir( wxS(
"~/.config/kicad" ) );
739 wxGtkPath.MakeAbsolute();
740 base_paths.emplace_back( wxGtkPath );
743 wxGtkPath.AssignDir( wxS(
"~/.var/app/org.kicad.KiCad/config/kicad" ) );
744 wxGtkPath.MakeAbsolute();
745 base_paths.emplace_back( wxGtkPath );
753 [&] (
const wxString& aSubDir )
758 wxString sub_path = dir.GetNameWithSep() + aSubDir;
762 aPaths->push_back( sub_path );
763 wxLogTrace(
traceSettings, wxT(
"GetPreviousVersionName: %s is valid" ), sub_path );
768 std::set<wxString> checkedPaths;
770 for(
const wxFileName& base_path : base_paths )
772 if( checkedPaths.count( base_path.GetFullPath() ) )
775 checkedPaths.insert( base_path.GetFullPath() );
777 if( !dir.Open( base_path.GetFullPath() ) )
779 wxLogTrace(
traceSettings, wxT(
"GetPreviousVersionName: could not open base path %s" ),
780 base_path.GetFullPath() );
784 wxLogTrace(
traceSettings, wxT(
"GetPreviousVersionName: checking base path %s" ),
785 base_path.GetFullPath() );
787 if( dir.GetFirst( &subdir, wxEmptyString, wxDIR_DIRS ) )
792 while( dir.GetNext( &subdir ) )
803 wxT(
"GetPreviousVersionName: root path %s is valid" ), dir.GetName() );
804 aPaths->push_back( dir.GetName() );
808 std::erase_if( *aPaths,
809 [](
const wxString& aPath ) ->
bool
811 wxFileName fulldir = wxFileName::DirName( aPath );
812 const wxArrayString& dirs = fulldir.GetDirs();
814 if( dirs.empty() || !fulldir.IsDirReadable() )
817 std::string ver = dirs.back().ToStdString();
825 std::sort( aPaths->begin(), aPaths->end(),
826 [&](
const wxString& a,
const wxString& b ) ->
bool
828 wxFileName aPath = wxFileName::DirName( a );
829 wxFileName bPath = wxFileName::DirName( b );
831 const wxArrayString& aDirs = aPath.GetDirs();
832 const wxArrayString& bDirs = bPath.GetDirs();
840 std::string verA = aDirs.back().ToStdString();
841 std::string verB = bDirs.back().ToStdString();
843 if( !extractVersion( verA ) )
846 if( !extractVersion( verB ) )
849 return compareVersions( verA, verB ) > 0;
852 return aPaths->size() > 0;
858 wxFileName
test( aPath, wxS(
"kicad_common" ) );
863 test.SetExt(
"json" );
865 return test.Exists();
874 path.AppendDir( wxS(
"colors" ) );
876 if( !
path.DirExists() )
878 if( !wxMkdir(
path.GetPath() ) )
881 wxT(
"GetColorSettingsPath(): Path %s missing and could not be created!" ),
886 return path.GetPath();
895 path.AppendDir( wxS(
"toolbars" ) );
897 if( !
path.DirExists() )
899 if( !wxMkdir(
path.GetPath() ) )
902 wxT(
"GetToolbarSettingsPath(): Path %s missing and could not be created!" ),
907 return path.GetPath();
927 wxLogTrace(
traceSettings, wxT(
"compareSettingsVersions: bad input (%s, %s)" ),
936 else if( a_maj > b_maj )
946 else if( a_min > b_min )
960 std::regex re_version(
"(\\d+)\\.(\\d+)" );
963 if( std::regex_match( aVersionString, match, re_version ) )
967 int major = std::stoi( match[1].str() );
968 int minor = std::stoi( match[2].str() );
992 wxFileName
path( aFullPath );
997 wxString fullPath =
path.GetFullPath();
1007 if( !lockFile.
Valid() )
1009 wxLogTrace(
traceSettings, wxT(
"Project %s is locked; opening read-only" ), fullPath );
1021 pcbFace->CancelPreload(
true );
1034 [&](
const std::unique_ptr<PROJECT>& ptr )
1036 return ptr.get() == oldProject;
1043 wxLogTrace(
traceSettings, wxT(
"Load project %s" ), fullPath );
1045 std::unique_ptr<PROJECT>
project = std::make_unique<PROJECT>();
1046 project->setProjectFullName( fullPath );
1052 wxFileName projectPath( fullPath );
1056 if( !projectPath.GetPath().IsEmpty() && wxTheApp && wxTheApp->IsGUI() )
1057 wxSetWorkingDirectory( projectPath.GetPath() );
1066 if( projectPath.GetPath().IsEmpty() )
1072 wxFileName vcsContext( projectPath );
1073 vcsContext.MakeAbsolute();
1084 if( lockFile && aSetActive )
1091 wxString fn(
path.GetName() );
1100 m_projects[fullPath]->setLocalSettings( settings );
1120 [&](
const std::unique_ptr<PROJECT>& aPtr )
1122 return aPtr.get() == aProject;
1133 wxLogTrace(
traceSettings, wxT(
"Unload project %s" ), projectPath );
1141 if( wasActiveProject &&
m_kiway )
1144 pcbFace->CancelPreload(
true );
1156 [&](
const std::unique_ptr<PROJECT>& ptr )
1158 return ptr.get() == toRemove;
1166 if( wasActiveProject )
1183 if( wxTheApp && wxTheApp->IsGUI() )
1200 wxLogTrace(
traceSettings, wxT(
"Prj() called with no project loaded" ) );
1202 static PROJECT s_emptyProject;
1203 return s_emptyProject;
1219 && !
m_projects.begin()->second->GetProjectFullName().IsEmpty() );
1234 std::vector<wxString> ret;
1236 for(
const std::pair<const wxString, PROJECT*>& pair :
m_projects )
1239 if( !pair.first.IsEmpty() )
1240 ret.emplace_back( pair.first );
1252 wxString
path = aFullPath;
1267 project->SaveToFile( projectPath );
1281 if( aFullPath.IsSameAs( oldName ) )
1290 wxFileName fn( aFullPath );
1299 project->SetFilename( fn.GetName() );
1300 project->SaveToFile( fn.GetPath() );
1319 wxString oldName =
project->GetFilename();
1320 wxFileName fn( aFullPath );
1322 bool readOnly =
project->IsReadOnly();
1323 project->SetReadOnly(
false );
1325 project->SetFilename( fn.GetName() );
1326 const bool projectOk =
project->SaveToFile( fn.GetPath() );
1327 project->SetFilename( oldName );
1338 project->SetReadOnly( readOnly );
1347 wxString fn( fullFn.GetName() );
1356 wxString
path( fullFn.GetPath() );
1378 [&file](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
1380 return aPtr.get() == file;
1393 ( *it )->SaveToFile( projectPath );
1407 return wxEmptyString;
1411 if( fullName.IsEmpty() )
1412 return wxEmptyString;
1414 std::string hashHex;
1415 picosha2::hash256_hex_string( fullName.ToStdString( wxConvUTF8 ), hashHex );
1417 return wxString::Format( wxS(
"%s-%s" ), aProject->
GetProjectName(),
1418 wxString::FromUTF8( hashHex.substr( 0, 12 ).c_str() ) );
1424 return aProject ? *aProject :
Prj();
1435 if( activePath.IsSameAs( aProjectPath ) || activePath.IsSameAs( aProjectPath + wxFILE_SEP_PATH ) )
1457 root.AppendDir( wxS(
"backups" ) );
1461 if( !key.IsEmpty() )
1462 root.AppendDir( key );
1464 return root.GetPathWithSep();
1475 wxFileName p(
project.GetProjectPath(), wxEmptyString );
1476 p.AppendDir( wxS(
".history" ) );
1481 root.AppendDir( wxS(
"local_history" ) );
1485 if( !key.IsEmpty() )
1486 root.AppendDir( key );
1488 return root.GetPath();
1496 wxFileName p( aProjectPath, wxEmptyString );
1497 p.AppendDir( wxS(
".history" ) );
1511 return project.GetProjectPath();
1514 root.AppendDir( wxS(
"autosave" ) );
1518 if( !key.IsEmpty() )
1519 root.AppendDir( key );
1521 return root.GetPathWithSep();
1530 wxDateTime timestamp = wxDateTime::Now();
1532 wxString fileName = wxString::Format( wxT(
"%s-%s" ),
Prj().GetProjectName(),
1535 if( !aTarget.IsOk() )
1538 aTarget.SetName( fileName );
1544 wxLogTrace(
traceSettings, wxT(
"Could not create project backup path %s" ),
1545 aTarget.GetPath() );
1549 if( !aTarget.IsDirWritable() )
1551 wxLogTrace(
traceSettings, wxT(
"Backup directory %s is not writable" ),
1552 aTarget.GetPath() );
1556 wxLogTrace(
traceSettings, wxT(
"Backing up project to %s" ), aTarget.GetPath() );
1566 std::function<
bool(
const wxString& )> aCond ) :
1572 wxDirTraverseResult
OnFile(
const wxString& aFile )
override
1575 m_files.emplace_back( aFile );
1577 return wxDIR_CONTINUE;
1580 wxDirTraverseResult
OnDir(
const wxString& aDirName )
override
1582 return wxDIR_CONTINUE;
1608 [&prefix](
const wxString& aFile )
1611 wxString fn( wxFileName( aFile ).GetName() );
1612 fn.Replace( prefix, wxS(
"" ) );
1617 if(
Prj().GetProjectFullName().IsEmpty() )
1626 wxLogTrace(
traceSettings, wxT(
"Could not create backups path %s! Skipping backup" ),
1631 wxFileName backupRoot( backupPath, wxEmptyString, wxEmptyString );
1635 if( !backupRoot.IsDirWritable() )
1637 wxLogTrace(
traceSettings, wxT(
"Backup directory %s is not writable! Skipping backup" ),
1642 wxDir dir( backupPath );
1644 if( !dir.IsOpened() )
1646 wxLogTrace(
traceSettings, wxT(
"Could not open project backups path %s" ), dir.GetName() );
1650 std::vector<wxString> files;
1653 [&modTime](
const wxString& aFile )
1655 return modTime( aFile ).IsValid();
1658 dir.Traverse( traverser, wxT(
"*.zip" ) );
1661 std::sort( files.begin(), files.end(),
1662 [&](
const wxString& aFirst,
const wxString& aSecond ) ->
bool
1664 wxDateTime first = modTime( aFirst );
1665 wxDateTime second = modTime( aSecond );
1667 return first.GetTicks() > second.GetTicks();
1671 if( !files.empty() )
1673 wxDateTime lastTime = modTime( files[0] );
1675 if( lastTime.IsValid() )
1677 wxTimeSpan
delta = wxDateTime::Now() - modTime( files[0] );
1688 if( !backupSuccessful )
1692 files.insert( files.begin(), target.GetFullPath() );
1695 if( files.size() >= 2
1698 wxRemoveFile( files[0] );
1709 wxRemoveFile( files.back() );
1717 wxULongLong totalSize = 0;
1719 for(
const wxString& file : files )
1720 totalSize += wxFileName::GetSize( file );
1722 while( !files.empty() && totalSize >
static_cast<wxULongLong
>( settings.
limit_total_size ) )
1724 totalSize -= wxFileName::GetSize( files.back() );
1725 wxRemoveFile( files.back() );
1733 wxDateTime day = modTime( files[0] );
1736 wxASSERT( day.IsValid() );
1738 std::vector<wxString> filesToDelete;
1740 for(
size_t i = 1; i < files.size(); i++ )
1742 wxDateTime dt = modTime( files[i] );
1744 if( dt.IsSameDate( day ) )
1749 filesToDelete.emplace_back( files[i] );
1758 for(
const wxString& file : filesToDelete )
1759 wxRemoveFile( file );
wxString GetMajorMinorVersion()
Get only the major and minor version in a string major.minor.
Color settings are a bit different than most of the settings objects in that there can be more than o...
void SetName(const wxString &aName)
static std::vector< COLOR_SETTINGS * > CreateBuiltinColorSettings()
Constructs and returns a list of color settings objects based on the built-in color themes.
static const wxString COLOR_BUILTIN_CLASSIC
static const wxString COLOR_BUILTIN_DEFAULT
const wxString & GetName() const
std::function< void(const wxFileName &)> m_action
JSON_DIR_TRAVERSER(std::function< void(const wxFileName &)> aAction)
wxDirTraverseResult OnDir(const wxString &dirPath) override
wxDirTraverseResult OnFile(const wxString &aFilePath) override
std::optional< nlohmann::json > GetJson(const std::string &aPath) const
Fetches a JSON object that is a subset of this JSON_SETTINGS object, using a path of the form "key1....
bool Contains(const std::string &aPath) const
SETTINGS_LOC GetLocation() const
virtual bool LoadFromFile(const wxString &aDirectory="")
Loads the backing file from disk and then calls Load()
virtual const PROJECT * GetOwningProject() const
Project-located settings override this to report the project they belong to so their save path is res...
virtual void Load()
Updates the parameters of this object based on the current JSON document contents.
void SetReadOnly(bool aReadOnly)
JSON_SETTINGS_INTERNALS * Internals()
void SetFilename(const wxString &aFilename)
virtual bool SaveToFile(const wxString &aDirectory="", bool aForce=false)
Calls Store() and then writes the contents of the JSON document to a file.
virtual bool Store()
Stores the current parameters into the JSON document represented by this object Note: this doesn't do...
wxString GetFilename() const
void AbortAsyncLoads()
Abort any async library loading operations in progress.
void ProjectChanged()
Notify all adapters that the project has changed.
wxDirTraverseResult OnDir(const wxString &dirPath) override
MIGRATION_TRAVERSER(const wxString &aSrcDir, const wxString &aDestDir, bool aMigrateTables)
wxDirTraverseResult OnFile(const wxString &aSrcFilePath) override
static wxString CalculateUserSettingsPath(bool aIncludeVer=true, bool aUseEnv=true)
Determines the base path for user settings files.
static wxString GetDefault3rdPartyPath()
Gets the default path for PCM packages.
static bool EnsurePathExists(const wxString &aPath, bool aPathToFile=false)
Attempts to create a given path if it does not exist.
static wxString GetStockDataPath(bool aRespectRunFromBuildDir=true)
Gets the stock (install) data path, which is the base path for things like scripting,...
static wxString GetUserSettingsPath()
Return the user configuration path used to store KiCad's configuration files.
virtual ENV_VAR_MAP & GetLocalEnvVariables() const
virtual LIBRARY_MANAGER & GetLibraryManager() const
static bool Archive(const wxString &aSrcDir, const wxString &aDestFile, REPORTER &aReporter, bool aVerbose=true, bool aIncludeExtraFiles=false)
Create an archive of the project.
static bool AreZipArchivesIdentical(const wxString &aZipFileA, const wxString &aZipFileB, REPORTER &aReporter)
Compare the CRCs of all the files in zip archive to determine whether the archives are identical.
The backing store for a PROJECT, in JSON format.
bool ShouldAutoSave() const
void SetProject(PROJECT *aProject)
bool LoadFromFile(const wxString &aDirectory="") override
Loads the backing file from disk and then calls Load()
The project local settings are things that are attached to a particular project, but also might be pa...
bool SaveToFile(const wxString &aDirectory="", bool aForce=false) override
Calls Store() and then writes the contents of the JSON document to a file.
bool ShouldAutoSave() const
Container for project specific data.
virtual void setProjectFile(PROJECT_FILE *aFile)
Set the backing store file for this project.
virtual bool IsReadOnly() const
virtual const wxString GetProjectFullName() const
Return the full path and name of the project.
virtual const wxString GetProjectPath() const
Return the full path of the project.
virtual const wxString GetProjectName() const
Return the short name of the project.
virtual PROJECT_LOCAL_SETTINGS & GetLocalSettings() const
virtual void setProjectFullName(const wxString &aFullPathAndName)
Set the full directory, basename, and extension of the project.
A pure virtual class used to derive REPORTER objects from.
static int compareVersions(const std::string &aFirst, const std::string &aSecond)
Compare two settings versions, like "5.99" and "6.0".
wxString GetBackupRootForProject(const PROJECT *aProject=nullptr) const
Resolve the backup root directory for a project, honoring the active BACKUP_LOCATION preference.
wxString GetPathForSettingsFile(JSON_SETTINGS *aSettings)
Return the path a given settings file should be loaded from / stored to.
static std::string GetSettingsVersion()
Parse the current KiCad build version and extracts the major and minor revision to use as the name of...
void SaveProjectAs(const wxString &aFullPath, PROJECT *aProject=nullptr)
Set the currently loaded project path and saves it (pointers remain valid).
JSON_SETTINGS * registerSettings(JSON_SETTINGS *aSettings, bool aLoadNow=true)
static wxString GetUserSettingsPath()
A proxy for PATHS::GetUserSettingsPath() rather than fighting swig.
T * RegisterSettings(T *aSettings, bool aLoadNow=true)
Take ownership of the pointer passed in.
void SaveColorSettings(COLOR_SETTINGS *aSettings, const std::string &aNamespace="")
Safely save a COLOR_SETTINGS to disk, preserving any changes outside the given namespace.
bool MigrateFromPreviousVersion(const wxString &aSourcePath)
Handle migration of the settings from previous KiCad versions.
std::map< wxString, PROJECT * > m_projects
Loaded projects, mapped according to project full name.
static bool extractVersion(const std::string &aVersionString, int *aMajor=nullptr, int *aMinor=nullptr)
Extract the numeric version from a given settings string.
COLOR_SETTINGS * registerColorSettings(const wxString &aFilename, bool aAbsolutePath=false)
COLOR_SETTINGS * GetColorSettings(const wxString &aName)
Retrieve a color settings object that applications can read colors from.
static wxString GetColorSettingsPath()
Return the path where color scheme files are stored; creating it if missing (normally .
COMMON_SETTINGS * GetCommonSettings() const
Retrieve the common settings shared by all applications.
bool SaveProject(const wxString &aFullPath=wxEmptyString, PROJECT *aProject=nullptr)
Save a loaded project.
bool SaveProjectCopy(const wxString &aFullPath, PROJECT *aProject=nullptr)
Save a copy of the current project under the given path.
wxString GetLocalHistoryDirForProject(const PROJECT *aProject=nullptr) const
Resolve the local-history (.history) storage directory for a project.
void ClearFileHistory()
Clear saved file history from all settings files.
wxString GetProjectBackupsPath() const
bool LoadProject(const wxString &aFullPath, bool aSetActive=true)
Load a project or sets up a new project with a specified path.
void ResetToDefaults()
Reset all program settings to defaults.
const PROJECT & resolveProject(const PROJECT *aProject) const
Pick the project to resolve a backup path against, falling back to Prj().
bool SettingsDirectoryValid() const
wxString GetAutosaveRootForProject(const PROJECT *aProject=nullptr) const
Resolve the autosave-files root for a project.
std::map< wxString, PROJECT_FILE * > m_project_files
Loaded project files, mapped according to project full name.
std::unordered_map< wxString, COLOR_SETTINGS * > m_color_settings
PROJECT * GetProjectForPath(const wxString &aProjectPath) const
Return the active project iff its path matches aProjectPath, else nullptr.
COLOR_SETTINGS * loadColorSettingsByName(const wxString &aName)
Attempt to load a color theme by name (the color theme directory and .json ext are assumed).
std::vector< COLOR_SETTINGS * > GetColorSettingsList()
bool IsProjectOpen() const
Helper for checking if we have a project open.
wxString GetLocalHistoryDirForPath(const wxString &aProjectPath) const
Resolve the local-history directory for a project given by its on-disk path.
static wxString GetToolbarSettingsPath()
Return the path where toolbar configuration files are stored; creating it if missing (normally .
bool GetPreviousVersionPaths(std::vector< wxString > *aName=nullptr)
Retrieve the name of the most recent previous KiCad version that can be found in the user settings di...
static bool IsSettingsPathValid(const wxString &aPath)
Check if a given path is probably a valid KiCad configuration directory.
bool IsProjectLoaded(PROJECT *aProject) const
True if aProject is still owned by the manager.
bool BackupProject(REPORTER &aReporter, wxFileName &aTarget) const
Create a backup archive of the current project.
std::vector< std::unique_ptr< PROJECT > > m_projects_list
Loaded projects (ownership here).
void loadAllColorSettings()
PROJECT * GetProject(const wxString &aFullPath) const
Retrieve a loaded project by name.
bool UnloadProject(PROJECT *aProject, bool aSave=true)
Save, unload and unregister the given PROJECT.
std::vector< wxString > GetOpenProjects() const
std::vector< std::unique_ptr< JSON_SETTINGS > > m_settings
bool TriggerBackupIfNeeded(REPORTER &aReporter) const
Call BackupProject() if a new backup is needed according to the current backup policy.
bool m_migrateLibraryTables
If true, the symbol and footprint library tables will be migrated from the previous version.
bool unloadProjectFile(PROJECT *aProject, bool aSave)
Optionally save, unload and unregister the given PROJECT_FILE.
COLOR_SETTINGS * GetMigratedColorSettings()
Return a color theme for storing colors migrated from legacy (5.x and earlier) settings,...
std::unordered_map< size_t, JSON_SETTINGS * > m_app_settings_cache
Cache for app settings.
COLOR_SETTINGS * AddNewColorSettings(const wxString &aFilename)
Register a new color settings object with the given filename.
bool m_ok
True if settings loaded successfully at construction.
void registerBuiltinColorSettings()
PROJECT & Prj() const
A helper while we are not MDI-capable – return the one and only project.
bool loadProjectFile(PROJECT &aProject)
Register a PROJECT_FILE and attempt to load it from disk.
bool IsProjectOpenNotDummy() const
Helper for checking if we have a project open that is not a dummy project.
static wxString backupDateTimeFormat
void ReloadColorSettings()
Re-scan the color themes directory, reloading any changes it finds.
COMMON_SETTINGS * m_common_settings
KIWAY * m_kiway
The kiway this settings manager interacts with.
void FlushAndRelease(JSON_SETTINGS *aSettings, bool aSave=true)
If the given settings object is registered, save it to disk and unregister it.
static wxString projectKeySuffix(const PROJECT *aProject)
Build "<projectname>-<sha256prefix>" suffix used to disambiguate per-project subdirectories under the...
wxDirTraverseResult OnFile(const wxString &aFile) override
wxDirTraverseResult OnDir(const wxString &aDirName) override
std::vector< wxString > & m_files
VECTOR_INSERT_TRAVERSER(std::vector< wxString > &aVec, std::function< bool(const wxString &)> aCond)
std::function< bool(const wxString &)> m_condition
@ ZIP
Zip archive snapshots; autosave uses recovery files.
@ PROJECT_DIR
Inside the project directory (default)
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
This file is part of the common library.
Functions related to environment variables, including help functions.
void KiCopyFile(const wxString &aSrcPath, const wxString &aDestPath, wxString &aErrors)
static const std::string SymbolLibraryTableFileName
static const std::string ProjectFileExtension
static const std::string FootprintLibraryTableFileName
static const std::string ArchiveFileExtension
std::map< wxString, ENV_VAR_ITEM > ENV_VAR_MAP
@ TOOLBARS
The toolbar directory (e.g. ~/.config/kicad/toolbars/)
@ PROJECT
The settings directory inside a project folder.
@ USER
The main config directory (e.g. ~/.config/kicad/)
@ COLORS
The color scheme directory (e.g. ~/.config/kicad/colors/)
@ NONE
No directory prepended, full path in filename (used for PROJECT_FILE)
This file contains miscellaneous commonly used macros and functions.
KICOMMON_API wxString GetVersionedEnvVarName(const wxString &aBaseName)
Construct a versioned environment variable based on this KiCad major version.
void SetContextPath(const wxString &aPath)
Set the filesystem path used as the repository-discovery starting point for repo-scoped VCS queries (...
PGM_BASE & Pgm()
The global program "get" accessor.
PGM_BASE * PgmOrNull()
Return a reference that can be nullptr when running a shared lib from a script, not from a kicad app.
#define PROJECT_VAR_NAME
A variable name whose value holds the current project directory.
#define PROJECT_BACKUPS_DIR_SUFFIX
Project settings path will be <projectname> + this.
int min_interval
Minimum time, in seconds, between subsequent backups.
unsigned long long limit_total_size
Maximum total size of backups (bytes), 0 for unlimited.
int limit_total_files
Maximum number of backup archives to retain.
BACKUP_LOCATION location
Where backups, history, and autosave files live.
int limit_daily_files
Maximum files to keep per day, 0 for unlimited.
BACKUP_FORMAT format
Backup format (incremental git history vs zip archives)
bool enabled
Automatically back up the project when files are saved.
Implement a participant in the KIWAY alchemy.
Definition of file extensions used in Kicad.