25#include <wx/filename.h>
26#include <wx/snglinst.h>
27#include <wx/stdpaths.h>
63 if( !
path.DirExists() )
65 wxLogTrace(
traceSettings, wxT(
"Path didn't exist; creating it" ) );
66 path.Mkdir( wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL );
74 wxLogTrace(
traceSettings, wxT(
"Note: no valid settings directory on disk" ) );
95 for( std::unique_ptr<JSON_SETTINGS>& settings :
m_settings )
106 for( std::unique_ptr<JSON_SETTINGS>& settings :
m_settings )
110 std::map<std::string, nlohmann::json> fileHistories = settings->GetFileHistories();
112 settings->Internals()->clear();
115 for(
const auto& [
path, history] : fileHistories )
116 settings->Set(
path, history );
126 for( std::unique_ptr<JSON_SETTINGS>& settings :
m_settings )
130 for(
const auto& [
path, history] : settings->GetFileHistories() )
131 settings->Set(
path, nlohmann::json::array() );
141 std::unique_ptr<JSON_SETTINGS> ptr( aSettings );
143 ptr->SetManager(
this );
145 wxLogTrace(
traceSettings, wxT(
"Registered new settings object <%s>" ),
146 ptr->GetFullFilename() );
160 std::vector<JSON_SETTINGS*> toLoad;
164 []( std::unique_ptr<JSON_SETTINGS>& aSettings )
166 return aSettings.get();
177 [&aSettings](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
179 return aPtr.get() == aSettings;
211 [&aSettings](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
213 return aPtr.get() == aSettings;
218 wxLogTrace(
traceSettings, wxT(
"Saving %s" ), ( *it )->GetFullFilename() );
227 [&aSettings](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
229 return aPtr.get() == aSettings;
234 wxLogTrace(
traceSettings, wxT(
"Flush and release %s" ), ( *it )->GetFullFilename() );
240 size_t typeHash =
typeid( *tmp ).hash_code();
258 [&aName](
const std::pair<wxString, COLOR_SETTINGS*>& p )
260 return p.second->GetName().Lower() == aName.Lower();
291 std::vector<COLOR_SETTINGS*> ret;
293 for(
const std::pair<const wxString, COLOR_SETTINGS*>& entry :
m_color_settings )
294 ret.push_back( entry.second );
297 { return a->GetName() < b->GetName(); } );
305 wxLogTrace(
traceSettings, wxT(
"Attempting to load color theme %s" ), aName );
309 if( !fn.IsOk() || !fn.Exists() )
311 wxLogTrace(
traceSettings, wxT(
"Theme file %s.json not found, falling back to user" ),
318 if( settings->
GetFilename() != aName.ToStdString() )
320 wxLogTrace(
traceSettings, wxT(
"Warning: stored filename is actually %s, " ),
341 wxDirTraverseResult
OnFile(
const wxString& aFilePath )
override
343 wxFileName file( aFilePath );
345 if( file.GetExt() == wxS(
"json" ) )
348 return wxDIR_CONTINUE;
351 wxDirTraverseResult
OnDir(
const wxString& dirPath )
override
353 return wxDIR_CONTINUE;
373 if( aName.EndsWith( wxT(
".json" ) ) )
385 settings->
SetName( wxT(
"User" ) );
405 wxFileName third_party_path;
409 if( it != env.end() && !it->second.GetValue().IsEmpty() )
410 third_party_path.SetPath( it->second.GetValue() );
414 third_party_path.AppendDir( wxS(
"colors" ) );
417 wxDir third_party_colors_dir( third_party_path.GetFullPath() );
432 [&](
const wxFileName& aFilename )
438 if( system_colors_dir.IsOpened() )
439 system_colors_dir.Traverse( readOnlyLoader );
441 if( third_party_colors_dir.IsOpened() )
442 third_party_colors_dir.Traverse( readOnlyLoader );
444 if( colors_dir.IsOpened() )
445 colors_dir.Traverse( loader );
460 [aSettings] (
const std::pair<wxString, COLOR_SETTINGS*>& el )
462 return el.second->GetFilename() == aSettings->GetFilename();
469 if( !aSettings->
Store() )
471 wxLogTrace(
traceSettings, wxT(
"Color scheme %s not modified; skipping save" ),
476 wxASSERT( aSettings->
Contains( aNamespace ) );
478 wxLogTrace(
traceSettings, wxT(
"Saving color scheme %s, preserving %s" ),
482 std::optional<nlohmann::json> backup = aSettings->
GetJson( aNamespace );
488 ( *aSettings->
Internals() )[aNamespace].update( *backup );
498 wxASSERT( aSettings );
519 wxASSERT_MSG(
false, wxT(
"Unknown settings location!" ) );
544 wxDirTraverseResult
OnFile(
const wxString& aSrcFilePath )
override
546 wxFileName file( aSrcFilePath );
551 return wxDIR_CONTINUE;
555 if( file.GetFullName() == wxT(
"installed_packages.json" ) )
556 return wxDIR_CONTINUE;
560 if( file.GetExt() == wxT(
"hotkeys" ) )
561 return wxDIR_CONTINUE;
563 wxString
path = file.GetPath();
566 file.SetPath(
path );
568 wxLogTrace(
traceSettings, wxT(
"Copying %s to %s" ), aSrcFilePath, file.GetFullPath() );
573 return wxDIR_CONTINUE;
576 wxDirTraverseResult
OnDir(
const wxString& dirPath )
override
578 wxFileName dir( dirPath );
581 if( dir.GetName() == wxS(
"colors" ) ||
582 dir.GetName() == wxS(
"3d" ) )
585 wxString
path = dir.GetPath();
590 if( !wxDirExists( dir.GetPath() ) )
591 wxMkdir( dir.GetPath() );
593 return wxDIR_CONTINUE;
607 if(
path.DirExists() )
609 wxFileName common =
path;
610 common.SetName( wxS(
"kicad_common" ) );
611 common.SetExt( wxS(
"json" ) );
613 if( common.Exists() )
615 wxLogTrace(
traceSettings, wxT(
"Path exists and has a kicad_common, continuing!" ) );
628 if( aSourcePath.IsEmpty() )
631 wxLogTrace(
traceSettings, wxT(
"Migrating from path %s" ), aSourcePath );
635 wxDir source_dir( aSourcePath );
637 source_dir.Traverse( traverser );
649 const std::vector<wxString> libKeys = {
650 wxT(
"KICAD6_SYMBOL_DIR" ),
651 wxT(
"KICAD6_3DMODEL_DIR" ),
652 wxT(
"KICAD6_FOOTPRINT_DIR" ),
653 wxT(
"KICAD6_TEMPLATE_DIR" ),
654 wxT(
"KICAD7_SYMBOL_DIR" ),
655 wxT(
"KICAD7_3DMODEL_DIR" ),
656 wxT(
"KICAD7_FOOTPRINT_DIR" ),
657 wxT(
"KICAD7_TEMPLATE_DIR" ),
658 wxT(
"KICAD8_SYMBOL_DIR" ),
659 wxT(
"KICAD8_3DMODEL_DIR" ),
660 wxT(
"KICAD8_FOOTPRINT_DIR" ),
661 wxT(
"KICAD8_TEMPLATE_DIR" ),
664 wxT(
"KICAD_PTEMPLATES" ),
667 wxT(
"KICAD_SYMBOL_DIR" ),
670 for(
const wxString& key : libKeys )
687 std::vector<wxFileName> base_paths;
692 if( wxGetEnv( wxT(
"KICAD_CONFIG_HOME" ),
nullptr ) )
703 wxFileName wxGtkPath;
704 wxGtkPath.AssignDir( wxS(
"~/.config/kicad" ) );
705 wxGtkPath.MakeAbsolute();
706 base_paths.emplace_back( wxGtkPath );
709 wxGtkPath.AssignDir( wxS(
"~/.var/app/org.kicad.KiCad/config/kicad" ) );
710 wxGtkPath.MakeAbsolute();
711 base_paths.emplace_back( wxGtkPath );
719 [&] (
const wxString& aSubDir )
724 wxString sub_path = dir.GetNameWithSep() + aSubDir;
728 aPaths->push_back( sub_path );
729 wxLogTrace(
traceSettings, wxT(
"GetPreviousVersionName: %s is valid" ), sub_path );
734 std::set<wxString> checkedPaths;
736 for(
const wxFileName& base_path : base_paths )
738 if( checkedPaths.count( base_path.GetFullPath() ) )
741 checkedPaths.insert( base_path.GetFullPath() );
743 if( !dir.Open( base_path.GetFullPath() ) )
745 wxLogTrace(
traceSettings, wxT(
"GetPreviousVersionName: could not open base path %s" ),
746 base_path.GetFullPath() );
750 wxLogTrace(
traceSettings, wxT(
"GetPreviousVersionName: checking base path %s" ),
751 base_path.GetFullPath() );
753 if( dir.GetFirst( &subdir, wxEmptyString, wxDIR_DIRS ) )
758 while( dir.GetNext( &subdir ) )
769 wxT(
"GetPreviousVersionName: root path %s is valid" ), dir.GetName() );
770 aPaths->push_back( dir.GetName() );
774 std::erase_if( *aPaths,
775 [](
const wxString& aPath ) ->
bool
777 wxFileName fulldir = wxFileName::DirName( aPath );
778 const wxArrayString& dirs = fulldir.GetDirs();
780 if( dirs.empty() || !fulldir.IsDirReadable() )
783 std::string ver = dirs.back().ToStdString();
791 std::sort( aPaths->begin(), aPaths->end(),
792 [&](
const wxString& a,
const wxString& b ) ->
bool
794 wxFileName aPath = wxFileName::DirName( a );
795 wxFileName bPath = wxFileName::DirName( b );
797 const wxArrayString& aDirs = aPath.GetDirs();
798 const wxArrayString& bDirs = bPath.GetDirs();
806 std::string verA = aDirs.back().ToStdString();
807 std::string verB = bDirs.back().ToStdString();
809 if( !extractVersion( verA ) )
812 if( !extractVersion( verB ) )
815 return compareVersions( verA, verB ) > 0;
818 return aPaths->size() > 0;
824 wxFileName
test( aPath, wxS(
"kicad_common" ) );
829 test.SetExt(
"json" );
831 return test.Exists();
840 path.AppendDir( wxS(
"colors" ) );
842 if( !
path.DirExists() )
844 if( !wxMkdir(
path.GetPath() ) )
847 wxT(
"GetColorSettingsPath(): Path %s missing and could not be created!" ),
852 return path.GetPath();
861 path.AppendDir( wxS(
"toolbars" ) );
863 if( !
path.DirExists() )
865 if( !wxMkdir(
path.GetPath() ) )
868 wxT(
"GetToolbarSettingsPath(): Path %s missing and could not be created!" ),
873 return path.GetPath();
893 wxLogTrace(
traceSettings, wxT(
"compareSettingsVersions: bad input (%s, %s)" ),
902 else if( a_maj > b_maj )
912 else if( a_min > b_min )
926 std::regex re_version(
"(\\d+)\\.(\\d+)" );
929 if( std::regex_match( aVersionString, match, re_version ) )
933 int major = std::stoi( match[1].str() );
934 int minor = std::stoi( match[2].str() );
958 wxFileName
path( aFullPath );
963 wxString fullPath =
path.GetFullPath();
973 if( !lockFile.
Valid() )
975 wxLogTrace(
traceSettings, wxT(
"Project %s is locked; opening read-only" ), fullPath );
987 pcbFace->CancelPreload(
true );
1000 [&](
const std::unique_ptr<PROJECT>& ptr )
1002 return ptr.get() == oldProject;
1009 wxLogTrace(
traceSettings, wxT(
"Load project %s" ), fullPath );
1011 std::unique_ptr<PROJECT>
project = std::make_unique<PROJECT>();
1012 project->setProjectFullName( fullPath );
1018 wxFileName projectPath( fullPath );
1022 if( !projectPath.GetPath().IsEmpty() && wxTheApp && wxTheApp->IsGUI() )
1023 wxSetWorkingDirectory( projectPath.GetPath() );
1032 if( lockFile && aSetActive )
1039 wxString fn(
path.GetName() );
1048 m_projects[fullPath]->setLocalSettings( settings );
1068 wxLogTrace(
traceSettings, wxT(
"Unload project %s" ), projectPath );
1076 if( wasActiveProject &&
m_kiway )
1079 pcbFace->CancelPreload(
true );
1091 [&](
const std::unique_ptr<PROJECT>& ptr )
1093 return ptr.get() == toRemove;
1101 if( wasActiveProject )
1115 if( wxTheApp && wxTheApp->IsGUI() )
1132 wxLogTrace(
traceSettings, wxT(
"Prj() called with no project loaded" ) );
1134 static PROJECT s_emptyProject;
1135 return s_emptyProject;
1151 && !
m_projects.begin()->second->GetProjectFullName().IsEmpty() );
1166 std::vector<wxString> ret;
1168 for(
const std::pair<const wxString, PROJECT*>& pair :
m_projects )
1171 if( !pair.first.IsEmpty() )
1172 ret.emplace_back( pair.first );
1184 wxString
path = aFullPath;
1199 project->SaveToFile( projectPath );
1213 if( aFullPath.IsSameAs( oldName ) )
1222 wxFileName fn( aFullPath );
1231 project->SetFilename( fn.GetName() );
1232 project->SaveToFile( fn.GetPath() );
1251 wxString oldName =
project->GetFilename();
1252 wxFileName fn( aFullPath );
1254 bool readOnly =
project->IsReadOnly();
1255 project->SetReadOnly(
false );
1257 project->SetFilename( fn.GetName() );
1258 project->SaveToFile( fn.GetPath() );
1259 project->SetFilename( oldName );
1267 project->SetReadOnly( readOnly );
1274 wxString fn( fullFn.GetName() );
1283 wxString
path( fullFn.GetPath() );
1305 [&file](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
1307 return aPtr.get() == file;
1319 ( *it )->SaveToFile( projectPath );
1341 wxDateTime timestamp = wxDateTime::Now();
1343 wxString fileName = wxString::Format( wxT(
"%s-%s" ),
Prj().GetProjectName(),
1346 if( !aTarget.IsOk() )
1349 aTarget.SetName( fileName );
1353 if( !aTarget.DirExists() && !wxMkdir( aTarget.GetPath() ) )
1355 wxLogTrace(
traceSettings, wxT(
"Could not create project backup path %s" ),
1356 aTarget.GetPath() );
1360 if( !aTarget.IsDirWritable() )
1362 wxLogTrace(
traceSettings, wxT(
"Backup directory %s is not writable" ),
1363 aTarget.GetPath() );
1367 wxLogTrace(
traceSettings, wxT(
"Backing up project to %s" ), aTarget.GetPath() );
1377 std::function<
bool(
const wxString& )> aCond ) :
1383 wxDirTraverseResult
OnFile(
const wxString& aFile )
override
1386 m_files.emplace_back( aFile );
1388 return wxDIR_CONTINUE;
1391 wxDirTraverseResult
OnDir(
const wxString& aDirName )
override
1393 return wxDIR_CONTINUE;
1413 [&prefix](
const wxString& aFile )
1416 wxString fn( wxFileName( aFile ).GetName() );
1417 fn.Replace( prefix, wxS(
"" ) );
1422 wxFileName projectPath(
Prj().GetProjectPath(), wxEmptyString, wxEmptyString );
1425 if( !projectPath.IsOk() || !projectPath.Exists() || !projectPath.IsDirWritable() )
1430 if( !wxDirExists( backupPath ) )
1432 wxLogTrace(
traceSettings, wxT(
"Backup path %s doesn't exist, creating it" ), backupPath );
1434 if( !wxMkdir( backupPath ) )
1436 wxLogTrace(
traceSettings, wxT(
"Could not create backups path! Skipping backup" ) );
1441 wxDir dir( backupPath );
1443 if( !dir.IsOpened() )
1445 wxLogTrace(
traceSettings, wxT(
"Could not open project backups path %s" ), dir.GetName() );
1449 std::vector<wxString> files;
1452 [&modTime](
const wxString& aFile )
1454 return modTime( aFile ).IsValid();
1457 dir.Traverse( traverser, wxT(
"*.zip" ) );
1460 std::sort( files.begin(), files.end(),
1461 [&](
const wxString& aFirst,
const wxString& aSecond ) ->
bool
1463 wxDateTime first = modTime( aFirst );
1464 wxDateTime second = modTime( aSecond );
1466 return first.GetTicks() > second.GetTicks();
1470 if( !files.empty() )
1472 wxDateTime lastTime = modTime( files[0] );
1474 if( lastTime.IsValid() )
1476 wxTimeSpan
delta = wxDateTime::Now() - modTime( files[0] );
1487 if( !backupSuccessful )
1491 files.insert( files.begin(), target.GetFullPath() );
1494 if( files.size() >= 2
1497 wxRemoveFile( files[0] );
1508 wxRemoveFile( files.back() );
1516 wxULongLong totalSize = 0;
1518 for(
const wxString& file : files )
1519 totalSize += wxFileName::GetSize( file );
1521 while( !files.empty() && totalSize >
static_cast<wxULongLong
>( settings.
limit_total_size ) )
1523 totalSize -= wxFileName::GetSize( files.back() );
1524 wxRemoveFile( files.back() );
1532 wxDateTime day = modTime( files[0] );
1535 wxASSERT( day.IsValid() );
1537 std::vector<wxString> filesToDelete;
1539 for(
size_t i = 1; i < files.size(); i++ )
1541 wxDateTime dt = modTime( files[i] );
1543 if( dt.IsSameDate( day ) )
1548 filesToDelete.emplace_back( files[i] );
1557 for(
const wxString& file : filesToDelete )
1558 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 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 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.
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.
bool SettingsDirectoryValid() const
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
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.
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.
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
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.
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.
int limit_daily_files
Maximum files to keep per day, 0 for unlimited.
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.