25#include <wx/filename.h>
26#include <wx/snglinst.h>
27#include <wx/stdpaths.h>
65 if( !
path.DirExists() )
67 wxLogTrace(
traceSettings, wxT(
"Path didn't exist; creating it" ) );
68 path.Mkdir( wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL );
76 wxLogTrace(
traceSettings, wxT(
"Note: no valid settings directory on disk" ) );
97 for( std::unique_ptr<JSON_SETTINGS>& settings :
m_settings )
108 for( std::unique_ptr<JSON_SETTINGS>& settings :
m_settings )
112 std::map<std::string, nlohmann::json> fileHistories = settings->GetFileHistories();
114 settings->Internals()->clear();
117 for(
const auto& [
path, history] : fileHistories )
118 settings->Set(
path, history );
128 for( std::unique_ptr<JSON_SETTINGS>& settings :
m_settings )
132 for(
const auto& [
path, history] : settings->GetFileHistories() )
133 settings->Set(
path, nlohmann::json::array() );
143 std::unique_ptr<JSON_SETTINGS> ptr( aSettings );
145 ptr->SetManager(
this );
147 wxLogTrace(
traceSettings, wxT(
"Registered new settings object <%s>" ),
148 ptr->GetFullFilename() );
162 std::vector<JSON_SETTINGS*> toLoad;
166 []( std::unique_ptr<JSON_SETTINGS>& aSettings )
168 return aSettings.get();
179 [&aSettings](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
181 return aPtr.get() == aSettings;
213 [&aSettings](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
215 return aPtr.get() == aSettings;
220 wxLogTrace(
traceSettings, wxT(
"Saving %s" ), ( *it )->GetFullFilename() );
229 [&aSettings](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
231 return aPtr.get() == aSettings;
236 wxLogTrace(
traceSettings, wxT(
"Flush and release %s" ), ( *it )->GetFullFilename() );
242 size_t typeHash =
typeid( *tmp ).hash_code();
260 [&aName](
const std::pair<wxString, COLOR_SETTINGS*>& p )
262 return p.second->GetName().Lower() == aName.Lower();
293 std::vector<COLOR_SETTINGS*> ret;
295 for(
const std::pair<const wxString, COLOR_SETTINGS*>& entry :
m_color_settings )
296 ret.push_back( entry.second );
299 { return a->GetName() < b->GetName(); } );
307 wxLogTrace(
traceSettings, wxT(
"Attempting to load color theme %s" ), aName );
311 if( !fn.IsOk() || !fn.Exists() )
313 wxLogTrace(
traceSettings, wxT(
"Theme file %s.json not found, falling back to user" ),
320 if( settings->
GetFilename() != aName.ToStdString() )
322 wxLogTrace(
traceSettings, wxT(
"Warning: stored filename is actually %s, " ),
343 wxDirTraverseResult
OnFile(
const wxString& aFilePath )
override
345 wxFileName file( aFilePath );
347 if( file.GetExt() == wxS(
"json" ) )
350 return wxDIR_CONTINUE;
353 wxDirTraverseResult
OnDir(
const wxString& dirPath )
override
355 return wxDIR_CONTINUE;
375 if( aName.EndsWith( wxT(
".json" ) ) )
387 settings->
SetName( wxT(
"User" ) );
407 wxFileName third_party_path;
411 if( it != env.end() && !it->second.GetValue().IsEmpty() )
412 third_party_path.SetPath( it->second.GetValue() );
416 third_party_path.AppendDir( wxS(
"colors" ) );
419 wxDir third_party_colors_dir( third_party_path.GetFullPath() );
434 [&](
const wxFileName& aFilename )
440 if( system_colors_dir.IsOpened() )
441 system_colors_dir.Traverse( readOnlyLoader );
443 if( third_party_colors_dir.IsOpened() )
444 third_party_colors_dir.Traverse( readOnlyLoader );
446 if( colors_dir.IsOpened() )
447 colors_dir.Traverse( loader );
462 [aSettings] (
const std::pair<wxString, COLOR_SETTINGS*>& el )
464 return el.second->GetFilename() == aSettings->GetFilename();
471 if( !aSettings->
Store() )
473 wxLogTrace(
traceSettings, wxT(
"Color scheme %s not modified; skipping save" ),
478 wxASSERT( aSettings->
Contains( aNamespace ) );
480 wxLogTrace(
traceSettings, wxT(
"Saving color scheme %s, preserving %s" ),
484 std::optional<nlohmann::json> backup = aSettings->
GetJson( aNamespace );
490 ( *aSettings->
Internals() )[aNamespace].update( *backup );
500 wxASSERT( aSettings );
521 wxASSERT_MSG(
false, wxT(
"Unknown settings location!" ) );
546 wxDirTraverseResult
OnFile(
const wxString& aSrcFilePath )
override
548 wxFileName file( aSrcFilePath );
553 return wxDIR_CONTINUE;
557 if( file.GetFullName() == wxT(
"installed_packages.json" ) )
558 return wxDIR_CONTINUE;
562 if( file.GetExt() == wxT(
"hotkeys" ) )
563 return wxDIR_CONTINUE;
565 wxString
path = file.GetPath();
568 file.SetPath(
path );
570 wxLogTrace(
traceSettings, wxT(
"Copying %s to %s" ), aSrcFilePath, file.GetFullPath() );
575 return wxDIR_CONTINUE;
578 wxDirTraverseResult
OnDir(
const wxString& dirPath )
override
580 wxFileName dir( dirPath );
583 if( dir.GetName() == wxS(
"colors" ) ||
584 dir.GetName() == wxS(
"3d" ) )
587 wxString
path = dir.GetPath();
592 if( !wxDirExists( dir.GetPath() ) )
593 wxMkdir( dir.GetPath() );
595 return wxDIR_CONTINUE;
609 if(
path.DirExists() )
611 wxFileName common =
path;
612 common.SetName( wxS(
"kicad_common" ) );
613 common.SetExt( wxS(
"json" ) );
615 if( common.Exists() )
617 wxLogTrace(
traceSettings, wxT(
"Path exists and has a kicad_common, continuing!" ) );
630 if( aSourcePath.IsEmpty() )
633 wxLogTrace(
traceSettings, wxT(
"Migrating from path %s" ), aSourcePath );
637 wxDir source_dir( aSourcePath );
639 source_dir.Traverse( traverser );
651 const std::vector<wxString> libKeys = {
652 wxT(
"KICAD6_SYMBOL_DIR" ),
653 wxT(
"KICAD6_3DMODEL_DIR" ),
654 wxT(
"KICAD6_FOOTPRINT_DIR" ),
655 wxT(
"KICAD6_TEMPLATE_DIR" ),
656 wxT(
"KICAD7_SYMBOL_DIR" ),
657 wxT(
"KICAD7_3DMODEL_DIR" ),
658 wxT(
"KICAD7_FOOTPRINT_DIR" ),
659 wxT(
"KICAD7_TEMPLATE_DIR" ),
660 wxT(
"KICAD8_SYMBOL_DIR" ),
661 wxT(
"KICAD8_3DMODEL_DIR" ),
662 wxT(
"KICAD8_FOOTPRINT_DIR" ),
663 wxT(
"KICAD8_TEMPLATE_DIR" ),
666 wxT(
"KICAD_PTEMPLATES" ),
669 wxT(
"KICAD_SYMBOL_DIR" ),
672 for(
const wxString& key : libKeys )
689 std::vector<wxFileName> base_paths;
694 if( wxGetEnv( wxT(
"KICAD_CONFIG_HOME" ),
nullptr ) )
705 wxFileName wxGtkPath;
706 wxGtkPath.AssignDir( wxS(
"~/.config/kicad" ) );
707 wxGtkPath.MakeAbsolute();
708 base_paths.emplace_back( wxGtkPath );
711 wxGtkPath.AssignDir( wxS(
"~/.var/app/org.kicad.KiCad/config/kicad" ) );
712 wxGtkPath.MakeAbsolute();
713 base_paths.emplace_back( wxGtkPath );
721 [&] (
const wxString& aSubDir )
726 wxString sub_path = dir.GetNameWithSep() + aSubDir;
730 aPaths->push_back( sub_path );
731 wxLogTrace(
traceSettings, wxT(
"GetPreviousVersionName: %s is valid" ), sub_path );
736 std::set<wxString> checkedPaths;
738 for(
const wxFileName& base_path : base_paths )
740 if( checkedPaths.count( base_path.GetFullPath() ) )
743 checkedPaths.insert( base_path.GetFullPath() );
745 if( !dir.Open( base_path.GetFullPath() ) )
747 wxLogTrace(
traceSettings, wxT(
"GetPreviousVersionName: could not open base path %s" ),
748 base_path.GetFullPath() );
752 wxLogTrace(
traceSettings, wxT(
"GetPreviousVersionName: checking base path %s" ),
753 base_path.GetFullPath() );
755 if( dir.GetFirst( &subdir, wxEmptyString, wxDIR_DIRS ) )
760 while( dir.GetNext( &subdir ) )
771 wxT(
"GetPreviousVersionName: root path %s is valid" ), dir.GetName() );
772 aPaths->push_back( dir.GetName() );
776 std::erase_if( *aPaths,
777 [](
const wxString& aPath ) ->
bool
779 wxFileName fulldir = wxFileName::DirName( aPath );
780 const wxArrayString& dirs = fulldir.GetDirs();
782 if( dirs.empty() || !fulldir.IsDirReadable() )
785 std::string ver = dirs.back().ToStdString();
793 std::sort( aPaths->begin(), aPaths->end(),
794 [&](
const wxString& a,
const wxString& b ) ->
bool
796 wxFileName aPath = wxFileName::DirName( a );
797 wxFileName bPath = wxFileName::DirName( b );
799 const wxArrayString& aDirs = aPath.GetDirs();
800 const wxArrayString& bDirs = bPath.GetDirs();
808 std::string verA = aDirs.back().ToStdString();
809 std::string verB = bDirs.back().ToStdString();
811 if( !extractVersion( verA ) )
814 if( !extractVersion( verB ) )
817 return compareVersions( verA, verB ) > 0;
820 return aPaths->size() > 0;
826 wxFileName
test( aPath, wxS(
"kicad_common" ) );
831 test.SetExt(
"json" );
833 return test.Exists();
842 path.AppendDir( wxS(
"colors" ) );
844 if( !
path.DirExists() )
846 if( !wxMkdir(
path.GetPath() ) )
849 wxT(
"GetColorSettingsPath(): Path %s missing and could not be created!" ),
854 return path.GetPath();
863 path.AppendDir( wxS(
"toolbars" ) );
865 if( !
path.DirExists() )
867 if( !wxMkdir(
path.GetPath() ) )
870 wxT(
"GetToolbarSettingsPath(): Path %s missing and could not be created!" ),
875 return path.GetPath();
895 wxLogTrace(
traceSettings, wxT(
"compareSettingsVersions: bad input (%s, %s)" ),
904 else if( a_maj > b_maj )
914 else if( a_min > b_min )
928 std::regex re_version(
"(\\d+)\\.(\\d+)" );
931 if( std::regex_match( aVersionString, match, re_version ) )
935 int major = std::stoi( match[1].str() );
936 int minor = std::stoi( match[2].str() );
960 wxFileName
path( aFullPath );
965 wxString fullPath =
path.GetFullPath();
975 if( !lockFile.
Valid() )
977 wxLogTrace(
traceSettings, wxT(
"Project %s is locked; opening read-only" ), fullPath );
989 pcbFace->CancelPreload(
true );
1002 [&](
const std::unique_ptr<PROJECT>& ptr )
1004 return ptr.get() == oldProject;
1011 wxLogTrace(
traceSettings, wxT(
"Load project %s" ), fullPath );
1013 std::unique_ptr<PROJECT>
project = std::make_unique<PROJECT>();
1014 project->setProjectFullName( fullPath );
1020 wxFileName projectPath( fullPath );
1024 if( !projectPath.GetPath().IsEmpty() && wxTheApp && wxTheApp->IsGUI() )
1025 wxSetWorkingDirectory( projectPath.GetPath() );
1034 if( projectPath.GetPath().IsEmpty() )
1040 wxFileName vcsContext( projectPath );
1041 vcsContext.MakeAbsolute();
1052 if( lockFile && aSetActive )
1059 wxString fn(
path.GetName() );
1068 m_projects[fullPath]->setLocalSettings( settings );
1088 wxLogTrace(
traceSettings, wxT(
"Unload project %s" ), projectPath );
1096 if( wasActiveProject &&
m_kiway )
1099 pcbFace->CancelPreload(
true );
1111 [&](
const std::unique_ptr<PROJECT>& ptr )
1113 return ptr.get() == toRemove;
1121 if( wasActiveProject )
1138 if( wxTheApp && wxTheApp->IsGUI() )
1155 wxLogTrace(
traceSettings, wxT(
"Prj() called with no project loaded" ) );
1157 static PROJECT s_emptyProject;
1158 return s_emptyProject;
1174 && !
m_projects.begin()->second->GetProjectFullName().IsEmpty() );
1189 std::vector<wxString> ret;
1191 for(
const std::pair<const wxString, PROJECT*>& pair :
m_projects )
1194 if( !pair.first.IsEmpty() )
1195 ret.emplace_back( pair.first );
1207 wxString
path = aFullPath;
1222 project->SaveToFile( projectPath );
1236 if( aFullPath.IsSameAs( oldName ) )
1245 wxFileName fn( aFullPath );
1254 project->SetFilename( fn.GetName() );
1255 project->SaveToFile( fn.GetPath() );
1274 wxString oldName =
project->GetFilename();
1275 wxFileName fn( aFullPath );
1277 bool readOnly =
project->IsReadOnly();
1278 project->SetReadOnly(
false );
1280 project->SetFilename( fn.GetName() );
1281 project->SaveToFile( fn.GetPath() );
1282 project->SetFilename( oldName );
1290 project->SetReadOnly( readOnly );
1297 wxString fn( fullFn.GetName() );
1306 wxString
path( fullFn.GetPath() );
1328 [&file](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
1330 return aPtr.get() == file;
1342 ( *it )->SaveToFile( projectPath );
1356 return wxEmptyString;
1360 if( fullName.IsEmpty() )
1361 return wxEmptyString;
1363 std::string hashHex;
1364 picosha2::hash256_hex_string( fullName.ToStdString( wxConvUTF8 ), hashHex );
1366 return wxString::Format( wxS(
"%s-%s" ), aProject->
GetProjectName(),
1367 wxString::FromUTF8( hashHex.substr( 0, 12 ).c_str() ) );
1373 return aProject ? *aProject :
Prj();
1384 if( activePath.IsSameAs( aProjectPath ) || activePath.IsSameAs( aProjectPath + wxFILE_SEP_PATH ) )
1406 root.AppendDir( wxS(
"backups" ) );
1410 if( !key.IsEmpty() )
1411 root.AppendDir( key );
1413 return root.GetPathWithSep();
1424 wxFileName p(
project.GetProjectPath(), wxEmptyString );
1425 p.AppendDir( wxS(
".history" ) );
1430 root.AppendDir( wxS(
"local_history" ) );
1434 if( !key.IsEmpty() )
1435 root.AppendDir( key );
1437 return root.GetPath();
1445 wxFileName p( aProjectPath, wxEmptyString );
1446 p.AppendDir( wxS(
".history" ) );
1460 return project.GetProjectPath();
1463 root.AppendDir( wxS(
"autosave" ) );
1467 if( !key.IsEmpty() )
1468 root.AppendDir( key );
1470 return root.GetPathWithSep();
1479 wxDateTime timestamp = wxDateTime::Now();
1481 wxString fileName = wxString::Format( wxT(
"%s-%s" ),
Prj().GetProjectName(),
1484 if( !aTarget.IsOk() )
1487 aTarget.SetName( fileName );
1493 wxLogTrace(
traceSettings, wxT(
"Could not create project backup path %s" ),
1494 aTarget.GetPath() );
1498 if( !aTarget.IsDirWritable() )
1500 wxLogTrace(
traceSettings, wxT(
"Backup directory %s is not writable" ),
1501 aTarget.GetPath() );
1505 wxLogTrace(
traceSettings, wxT(
"Backing up project to %s" ), aTarget.GetPath() );
1515 std::function<
bool(
const wxString& )> aCond ) :
1521 wxDirTraverseResult
OnFile(
const wxString& aFile )
override
1524 m_files.emplace_back( aFile );
1526 return wxDIR_CONTINUE;
1529 wxDirTraverseResult
OnDir(
const wxString& aDirName )
override
1531 return wxDIR_CONTINUE;
1557 [&prefix](
const wxString& aFile )
1560 wxString fn( wxFileName( aFile ).GetName() );
1561 fn.Replace( prefix, wxS(
"" ) );
1566 if(
Prj().GetProjectFullName().IsEmpty() )
1575 wxLogTrace(
traceSettings, wxT(
"Could not create backups path %s! Skipping backup" ),
1580 wxFileName backupRoot( backupPath, wxEmptyString, wxEmptyString );
1584 if( !backupRoot.IsDirWritable() )
1586 wxLogTrace(
traceSettings, wxT(
"Backup directory %s is not writable! Skipping backup" ),
1591 wxDir dir( backupPath );
1593 if( !dir.IsOpened() )
1595 wxLogTrace(
traceSettings, wxT(
"Could not open project backups path %s" ), dir.GetName() );
1599 std::vector<wxString> files;
1602 [&modTime](
const wxString& aFile )
1604 return modTime( aFile ).IsValid();
1607 dir.Traverse( traverser, wxT(
"*.zip" ) );
1610 std::sort( files.begin(), files.end(),
1611 [&](
const wxString& aFirst,
const wxString& aSecond ) ->
bool
1613 wxDateTime first = modTime( aFirst );
1614 wxDateTime second = modTime( aSecond );
1616 return first.GetTicks() > second.GetTicks();
1620 if( !files.empty() )
1622 wxDateTime lastTime = modTime( files[0] );
1624 if( lastTime.IsValid() )
1626 wxTimeSpan
delta = wxDateTime::Now() - modTime( files[0] );
1637 if( !backupSuccessful )
1641 files.insert( files.begin(), target.GetFullPath() );
1644 if( files.size() >= 2
1647 wxRemoveFile( files[0] );
1658 wxRemoveFile( files.back() );
1666 wxULongLong totalSize = 0;
1668 for(
const wxString& file : files )
1669 totalSize += wxFileName::GetSize( file );
1671 while( !files.empty() && totalSize >
static_cast<wxULongLong
>( settings.
limit_total_size ) )
1673 totalSize -= wxFileName::GetSize( files.back() );
1674 wxRemoveFile( files.back() );
1682 wxDateTime day = modTime( files[0] );
1685 wxASSERT( day.IsValid() );
1687 std::vector<wxString> filesToDelete;
1689 for(
size_t i = 1; i < files.size(); i++ )
1691 wxDateTime dt = modTime( files[i] );
1693 if( dt.IsSameDate( day ) )
1698 filesToDelete.emplace_back( files[i] );
1707 for(
const wxString& file : filesToDelete )
1708 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_DEFAULT
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 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 SaveProjectCopy(const wxString &aFullPath, PROJECT *aProject=nullptr)
Save a copy of the current project under the given path.
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.
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 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.