25#include <wx/filename.h>
26#include <wx/snglinst.h>
27#include <wx/stdpaths.h>
54 m_headless( aHeadless ),
56 m_common_settings( nullptr ),
58 m_migrateLibraryTables( true )
79 if( !wxFileExists( commonSettings.GetFullPath() ) )
94 for( std::unique_ptr<JSON_SETTINGS>& settings :
m_settings )
105 std::unique_ptr<JSON_SETTINGS> ptr( aSettings );
107 ptr->SetManager(
this );
109 wxLogTrace(
traceSettings, wxT(
"Registered new settings object <%s>" ),
110 ptr->GetFullFilename() );
124 std::vector<JSON_SETTINGS*> toLoad;
128 []( std::unique_ptr<JSON_SETTINGS>& aSettings )
130 return aSettings.get();
141 [&aSettings](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
143 return aPtr.get() == aSettings;
174 [&aSettings](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
176 return aPtr.get() == aSettings;
181 wxLogTrace(
traceSettings, wxT(
"Saving %s" ), ( *it )->GetFullFilename() );
190 [&aSettings](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
192 return aPtr.get() == aSettings;
197 wxLogTrace(
traceSettings, wxT(
"Flush and release %s" ), ( *it )->GetFullFilename() );
203 size_t typeHash =
typeid( *tmp ).hash_code();
221 [&aName](
const std::pair<wxString, COLOR_SETTINGS*>& p )
223 return p.second->GetName().Lower() == aName.Lower();
254 wxLogTrace(
traceSettings, wxT(
"Attempting to load color theme %s" ), aName );
258 if( !fn.IsOk() || !fn.Exists() )
260 wxLogTrace(
traceSettings, wxT(
"Theme file %s.json not found, falling back to user" ),
267 if( settings->
GetFilename() != aName.ToStdString() )
269 wxLogTrace(
traceSettings, wxT(
"Warning: stored filename is actually %s, " ),
290 wxDirTraverseResult
OnFile(
const wxString& aFilePath )
override
292 wxFileName file( aFilePath );
294 if( file.GetExt() == wxS(
"json" ) )
297 return wxDIR_CONTINUE;
300 wxDirTraverseResult
OnDir(
const wxString& dirPath )
override
302 return wxDIR_CONTINUE;
322 if( aName.EndsWith( wxT(
".json" ) ) )
334 settings->
SetName( wxT(
"User" ) );
354 wxFileName third_party_path;
358 if( it != env.end() && !it->second.GetValue().IsEmpty() )
359 third_party_path.SetPath( it->second.GetValue() );
363 third_party_path.AppendDir( wxS(
"colors" ) );
366 wxDir third_party_colors_dir( third_party_path.GetFullPath() );
381 [&](
const wxFileName& aFilename )
387 if( system_colors_dir.IsOpened() )
388 system_colors_dir.Traverse( readOnlyLoader );
390 if( third_party_colors_dir.IsOpened() )
391 third_party_colors_dir.Traverse( readOnlyLoader );
393 if( colors_dir.IsOpened() )
394 colors_dir.Traverse( loader );
409 [aSettings] (
const std::pair<wxString, COLOR_SETTINGS*>& el )
411 return el.second->GetFilename() == aSettings->GetFilename();
418 if( !aSettings->
Store() )
420 wxLogTrace(
traceSettings, wxT(
"Color scheme %s not modified; skipping save" ),
425 wxASSERT( aSettings->
Contains( aNamespace ) );
427 wxLogTrace(
traceSettings, wxT(
"Saving color scheme %s, preserving %s" ),
431 std::optional<nlohmann::json> backup = aSettings->
GetJson( aNamespace );
437 ( *aSettings->
Internals() )[aNamespace].update( *backup );
447 wxASSERT( aSettings );
451 case SETTINGS_LOC::USER:
454 case SETTINGS_LOC::PROJECT:
458 case SETTINGS_LOC::COLORS:
461 case SETTINGS_LOC::NONE:
465 wxASSERT_MSG(
false, wxT(
"Unknown settings location!" ) );
490 wxDirTraverseResult
OnFile(
const wxString& aSrcFilePath )
override
492 wxFileName file( aSrcFilePath );
497 return wxDIR_CONTINUE;
501 if( file.GetFullName() == wxT(
"installed_packages.json" ) )
502 return wxDIR_CONTINUE;
506 if( file.GetExt() == wxT(
"hotkeys" ) )
507 return wxDIR_CONTINUE;
509 wxString
path = file.GetPath();
512 file.SetPath(
path );
514 wxLogTrace(
traceSettings, wxT(
"Copying %s to %s" ), aSrcFilePath, file.GetFullPath() );
519 return wxDIR_CONTINUE;
522 wxDirTraverseResult
OnDir(
const wxString& dirPath )
override
524 wxFileName dir( dirPath );
527 if( dir.GetName() == wxS(
"colors" ) ||
528 dir.GetName() == wxS(
"3d" ) )
531 wxString
path = dir.GetPath();
536 wxMkdir( dir.GetFullPath() );
538 return wxDIR_CONTINUE;
551 wxLogTrace(
traceSettings, wxT(
"Using settings path %s" ),
path.GetFullPath() );
559 if( !
path.DirExists() )
561 wxLogTrace(
traceSettings, wxT(
"Path didn't exist; creating it" ) );
562 path.Mkdir( wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL );
565 wxLogTrace(
traceSettings, wxT(
"Settings migration not checked; running headless" ) );
569 if(
path.DirExists() )
571 wxFileName common =
path;
572 common.SetName( wxS(
"kicad_common" ) );
573 common.SetExt( wxS(
"json" ) );
575 if( common.Exists() )
577 wxLogTrace(
traceSettings, wxT(
"Path exists and has a kicad_common, continuing!" ) );
587 wxLogTrace(
traceSettings, wxT(
"Migration dialog canceled; exiting" ) );
591 if( !
path.DirExists() )
593 wxLogTrace(
traceSettings, wxT(
"Path didn't exist; creating it" ) );
594 path.Mkdir( wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL );
599 wxLogTrace(
traceSettings, wxT(
"No migration source given; starting with defaults" ) );
608 source_dir.Traverse( traverser );
620 const std::vector<wxString> libKeys = {
621 wxT(
"KICAD6_SYMBOL_DIR" ),
622 wxT(
"KICAD6_3DMODEL_DIR" ),
623 wxT(
"KICAD6_FOOTPRINT_DIR" ),
624 wxT(
"KICAD6_TEMPLATE_DIR" ),
625 wxT(
"KICAD7_SYMBOL_DIR" ),
626 wxT(
"KICAD7_3DMODEL_DIR" ),
627 wxT(
"KICAD7_FOOTPRINT_DIR" ),
628 wxT(
"KICAD7_TEMPLATE_DIR" ),
629 wxT(
"KICAD8_SYMBOL_DIR" ),
630 wxT(
"KICAD8_3DMODEL_DIR" ),
631 wxT(
"KICAD8_FOOTPRINT_DIR" ),
632 wxT(
"KICAD8_TEMPLATE_DIR" ),
635 wxT(
"KICAD_PTEMPLATES" ),
638 wxT(
"KICAD_SYMBOL_DIR" ),
641 for(
const wxString& key : libKeys )
658 std::vector<wxFileName> base_paths;
663 if( wxGetEnv( wxT(
"KICAD_CONFIG_HOME" ),
nullptr ) )
674 wxFileName wxGtkPath;
675 wxGtkPath.AssignDir( wxS(
"~/.config/kicad" ) );
676 wxGtkPath.MakeAbsolute();
677 base_paths.emplace_back( wxGtkPath );
680 wxGtkPath.AssignDir( wxS(
"~/.var/app/org.kicad.KiCad/config/kicad" ) );
681 wxGtkPath.MakeAbsolute();
682 base_paths.emplace_back( wxGtkPath );
689 auto check_dir = [&] (
const wxString& aSubDir )
694 wxString sub_path = dir.GetNameWithSep() + aSubDir;
698 aPaths->push_back( sub_path );
699 wxLogTrace(
traceSettings, wxT(
"GetPreviousVersionName: %s is valid" ), sub_path );
704 std::set<wxString> checkedPaths;
706 for(
const wxFileName& base_path : base_paths )
708 if( checkedPaths.count( base_path.GetFullPath() ) )
711 checkedPaths.insert( base_path.GetFullPath() );
713 if( !dir.Open( base_path.GetFullPath() ) )
715 wxLogTrace(
traceSettings, wxT(
"GetPreviousVersionName: could not open base path %s" ),
716 base_path.GetFullPath() );
720 wxLogTrace(
traceSettings, wxT(
"GetPreviousVersionName: checking base path %s" ),
721 base_path.GetFullPath() );
723 if( dir.GetFirst( &subdir, wxEmptyString, wxDIR_DIRS ) )
728 while( dir.GetNext( &subdir ) )
739 wxT(
"GetPreviousVersionName: root path %s is valid" ), dir.GetName() );
740 aPaths->push_back( dir.GetName() );
746 wxFileName fulldir = wxFileName::DirName( aPath );
747 const wxArrayString& dirs = fulldir.GetDirs();
749 if( dirs.empty() || !fulldir.IsDirReadable() )
752 std::string ver = dirs.back().ToStdString();
760 std::sort( aPaths->begin(), aPaths->end(),
761 [&](
const wxString& a,
const wxString& b ) ->
bool
763 wxFileName aPath = wxFileName::DirName( a );
764 wxFileName bPath = wxFileName::DirName( b );
766 const wxArrayString& aDirs = aPath.GetDirs();
767 const wxArrayString& bDirs = bPath.GetDirs();
775 std::string verA = aDirs.back().ToStdString();
776 std::string verB = bDirs.back().ToStdString();
778 if( !extractVersion( verA ) )
781 if( !extractVersion( verB ) )
784 return compareVersions( verA, verB ) >= 0;
787 return aPaths->size() > 0;
793 wxFileName
test( aPath, wxS(
"kicad_common" ) );
798 test.SetExt(
"json" );
800 return test.Exists();
809 path.AppendDir( wxS(
"colors" ) );
811 if( !
path.DirExists() )
813 if( !wxMkdir(
path.GetPath() ) )
816 wxT(
"GetColorSettingsPath(): Path %s missing and could not be created!" ),
821 return path.GetPath();
841 wxLogTrace(
traceSettings, wxT(
"compareSettingsVersions: bad input (%s, %s)" ),
850 else if( a_maj > b_maj )
860 else if( a_min > b_min )
874 std::regex re_version(
"(\\d+)\\.(\\d+)" );
877 if( std::regex_match( aVersionString, match, re_version ) )
881 int major = std::stoi( match[1].str() );
882 int minor = std::stoi( match[2].str() );
905 wxFileName
path( aFullPath );
910 wxString fullPath =
path.GetFullPath();
918 bool readOnly =
false;
921 if( !lockFile.
Valid() )
923 wxLogTrace(
traceSettings, wxT(
"Project %s is locked; opening read-only" ), fullPath );
935 [&](
const std::unique_ptr<PROJECT>& ptr )
937 return ptr.get() == oldProject;
944 wxLogTrace(
traceSettings, wxT(
"Load project %s" ), fullPath );
946 std::unique_ptr<PROJECT>
project = std::make_unique<PROJECT>();
947 project->setProjectFullName( fullPath );
953 wxFileName projectPath( fullPath );
957 if( !projectPath.GetPath().IsEmpty() && wxTheApp && wxTheApp->IsGUI() )
958 wxSetWorkingDirectory( projectPath.GetPath() );
965 project->SetReadOnly( readOnly ||
project->GetProjectFile().IsReadOnly() );
967 if( lockFile && aSetActive )
974 wxString fn(
path.GetName() );
983 m_projects[fullPath]->setLocalSettings( settings );
1001 wxLogTrace(
traceSettings, wxT(
"Unload project %s" ), projectPath );
1007 [&](
const std::unique_ptr<PROJECT>& ptr )
1009 return ptr.get() == toRemove;
1017 if( wasActiveProject )
1055 && !
m_projects.begin()->second->GetProjectFullName().IsEmpty() );
1070 std::vector<wxString> ret;
1072 for(
const std::pair<const wxString, PROJECT*>& pair :
m_projects )
1075 if( !pair.first.IsEmpty() )
1076 ret.emplace_back( pair.first );
1088 wxString
path = aFullPath;
1103 project->SaveToFile( projectPath );
1117 if( aFullPath.IsSameAs( oldName ) )
1126 wxFileName fn( aFullPath );
1135 project->SetFilename( fn.GetName() );
1136 project->SaveToFile( fn.GetPath() );
1155 wxString oldName =
project->GetFilename();
1156 wxFileName fn( aFullPath );
1158 bool readOnly =
project->IsReadOnly();
1159 project->SetReadOnly(
false );
1161 project->SetFilename( fn.GetName() );
1162 project->SaveToFile( fn.GetPath() );
1163 project->SetFilename( oldName );
1171 project->SetReadOnly( readOnly );
1178 wxString fn( fullFn.GetName() );
1187 wxString
path( fullFn.GetPath() );
1209 [&file](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
1211 return aPtr.get() == file;
1223 ( *it )->SaveToFile( projectPath );
1245 wxDateTime timestamp = wxDateTime::Now();
1247 wxString fileName = wxString::Format( wxT(
"%s-%s" ),
Prj().GetProjectName(),
1250 if( !aTarget.IsOk() )
1253 aTarget.SetName( fileName );
1257 wxString
test = aTarget.GetPath();
1259 if( !aTarget.DirExists() && !wxMkdir( aTarget.GetPath() ) )
1261 wxLogTrace(
traceSettings, wxT(
"Could not create project backup path %s" ),
1262 aTarget.GetPath() );
1266 if( !aTarget.IsDirWritable() )
1268 wxLogTrace(
traceSettings, wxT(
"Backup directory %s is not writable" ),
1269 aTarget.GetPath() );
1273 wxLogTrace(
traceSettings, wxT(
"Backing up project to %s" ), aTarget.GetPath() );
1283 std::function<
bool(
const wxString& )> aCond ) :
1289 wxDirTraverseResult
OnFile(
const wxString& aFile )
override
1292 m_files.emplace_back( aFile );
1294 return wxDIR_CONTINUE;
1297 wxDirTraverseResult
OnDir(
const wxString& aDirName )
override
1299 return wxDIR_CONTINUE;
1319 [&prefix](
const wxString& aFile )
1322 wxString fn( wxFileName( aFile ).GetName() );
1323 fn.Replace( prefix, wxS(
"" ) );
1328 wxFileName projectPath(
Prj().GetProjectPath() );
1331 if( !projectPath.IsOk() || !projectPath.Exists() || !projectPath.IsDirWritable() )
1336 if( !wxDirExists( backupPath ) )
1338 wxLogTrace(
traceSettings, wxT(
"Backup path %s doesn't exist, creating it" ), backupPath );
1340 if( !wxMkdir( backupPath ) )
1342 wxLogTrace(
traceSettings, wxT(
"Could not create backups path! Skipping backup" ) );
1347 wxDir dir( backupPath );
1349 if( !dir.IsOpened() )
1351 wxLogTrace(
traceSettings, wxT(
"Could not open project backups path %s" ), dir.GetName() );
1355 std::vector<wxString> files;
1358 [&modTime](
const wxString& aFile )
1360 return modTime( aFile ).IsValid();
1363 dir.Traverse( traverser, wxT(
"*.zip" ) );
1366 std::sort( files.begin(), files.end(),
1367 [&](
const wxString& aFirst,
const wxString& aSecond ) ->
bool
1369 wxDateTime first = modTime( aFirst );
1370 wxDateTime second = modTime( aSecond );
1372 return first.GetTicks() > second.GetTicks();
1376 if( !files.empty() )
1378 wxDateTime lastTime = modTime( files[0] );
1380 if( lastTime.IsValid() )
1382 wxTimeSpan
delta = wxDateTime::Now() - modTime( files[0] );
1393 if( !backupSuccessful )
1397 files.insert( files.begin(), target.GetFullPath() );
1400 if( files.size() >= 2
1403 wxRemoveFile( files[0] );
1414 wxRemoveFile( files.back() );
1422 wxULongLong totalSize = 0;
1424 for(
const wxString& file : files )
1425 totalSize += wxFileName::GetSize( file );
1427 while( !files.empty() && totalSize >
static_cast<wxULongLong
>( settings.
limit_total_size ) )
1429 totalSize -= wxFileName::GetSize( files.back() );
1430 wxRemoveFile( files.back() );
1438 wxDateTime day = modTime( files[0] );
1441 wxASSERT( day.IsValid() );
1443 std::vector<wxString> filesToDelete;
1445 for(
size_t i = 1; i < files.size(); i++ )
1447 wxDateTime dt = modTime( files[i] );
1449 if( dt.IsSameDate( day ) )
1454 filesToDelete.emplace_back( files[i] );
1463 for(
const wxString& file : filesToDelete )
1464 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)
wxString GetFullFilename() const
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
virtual void ProjectChanged()
Calls ProjectChanged() on all KIWAY_PLAYERs.
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
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)
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".
std::unique_ptr< LOCKFILE > m_project_lock
Lock for loaded project (expand to multiple once we support MDI).
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.
COLOR_SETTINGS * GetColorSettings(const wxString &aName="user")
Retrieve a color settings object that applications can read colors from.
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.
bool MigrateIfNeeded()
Handle the initialization of the user settings directory and migration from previous KiCad versions a...
wxString m_migration_source
void SaveColorSettings(COLOR_SETTINGS *aSettings, const std::string &aNamespace="")
Safely save a COLOR_SETTINGS to disk, preserving any changes outside the given namespace.
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)
bool m_headless
True if running outside a UI context.
SETTINGS_MANAGER(bool aHeadless=false)
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 GetProjectBackupsPath() const
bool LoadProject(const wxString &aFullPath, bool aSetActive=true)
Load a project or sets up a new project with a specified path.
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).
bool IsProjectOpen() const
Helper for checking if we have a project open.
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 LegacyProjectFileExtension
static const std::string FootprintLibraryTableFileName
static const std::string ArchiveFileExtension
std::map< wxString, ENV_VAR_ITEM > ENV_VAR_MAP
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 delete_if(_Container &__c, _Function &&__f)
Deletes all values from __c for which __f returns true.
PGM_BASE & Pgm()
The global program "get" accessor.
#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.
Definition of file extensions used in Kicad.