25#include <wx/filename.h>
26#include <wx/snglinst.h>
27#include <wx/stdpaths.h>
52 m_headless( aHeadless ),
54 m_common_settings( nullptr ),
56 m_migrateLibraryTables( true )
77 if( !wxFileExists( commonSettings.GetFullPath() ) )
91 for( std::unique_ptr<JSON_SETTINGS>& settings :
m_settings )
102 std::unique_ptr<JSON_SETTINGS> ptr( aSettings );
104 ptr->SetManager(
this );
106 wxLogTrace(
traceSettings, wxT(
"Registered new settings object <%s>" ),
107 ptr->GetFullFilename() );
122 std::vector<JSON_SETTINGS*> toLoad;
126 []( std::unique_ptr<JSON_SETTINGS>& aSettings )
128 return aSettings.get();
139 [&aSettings](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
141 return aPtr.get() == aSettings;
165 [&aSettings](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
167 return aPtr.get() == aSettings;
172 wxLogTrace(
traceSettings, wxT(
"Saving %s" ), ( *it )->GetFullFilename() );
181 [&aSettings](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
183 return aPtr.get() == aSettings;
188 wxLogTrace(
traceSettings, wxT(
"Flush and release %s" ), ( *it )->GetFullFilename() );
194 size_t typeHash =
typeid( *tmp ).hash_code();
212 [&aName](
const std::pair<wxString, COLOR_SETTINGS*>& p )
214 return p.second->GetName().Lower() == aName.Lower();
245 wxLogTrace(
traceSettings, wxT(
"Attempting to load color theme %s" ), aName );
249 if( !fn.IsOk() || !fn.Exists() )
251 wxLogTrace(
traceSettings, wxT(
"Theme file %s.json not found, falling back to user" ),
258 if( settings->
GetFilename() != aName.ToStdString() )
260 wxLogTrace(
traceSettings, wxT(
"Warning: stored filename is actually %s, " ),
281 wxDirTraverseResult
OnFile(
const wxString& aFilePath )
override
283 wxFileName file( aFilePath );
285 if( file.GetExt() == wxS(
"json" ) )
288 return wxDIR_CONTINUE;
291 wxDirTraverseResult
OnDir(
const wxString& dirPath )
override
293 return wxDIR_CONTINUE;
313 if( aName.EndsWith( wxT(
".json" ) ) )
325 settings->
SetName( wxT(
"User" ) );
345 wxFileName third_party_path;
347 auto it = env.find( wxS(
"KICAD7_3RD_PARTY" ) );
349 if( it != env.end() && !it->second.GetValue().IsEmpty() )
350 third_party_path.SetPath( it->second.GetValue() );
354 third_party_path.AppendDir( wxS(
"colors" ) );
357 wxDir third_party_colors_dir( third_party_path.GetFullPath() );
372 [&](
const wxFileName& aFilename )
378 if( system_colors_dir.IsOpened() )
379 system_colors_dir.Traverse( readOnlyLoader );
381 if( third_party_colors_dir.IsOpened() )
382 third_party_colors_dir.Traverse( readOnlyLoader );
384 if( colors_dir.IsOpened() )
385 colors_dir.Traverse( loader );
400 [aSettings] (
const std::pair<wxString, COLOR_SETTINGS*>& el )
402 return el.second->GetFilename() == aSettings->GetFilename();
409 if( !aSettings->
Store() )
411 wxLogTrace(
traceSettings, wxT(
"Color scheme %s not modified; skipping save" ),
416 wxASSERT( aSettings->
Contains( aNamespace ) );
418 wxLogTrace(
traceSettings, wxT(
"Saving color scheme %s, preserving %s" ),
422 std::optional<nlohmann::json> backup = aSettings->
GetJson( aNamespace );
428 ( *aSettings->
Internals() )[aNamespace].update( *backup );
438 wxASSERT( aSettings );
442 case SETTINGS_LOC::USER:
445 case SETTINGS_LOC::PROJECT:
449 case SETTINGS_LOC::COLORS:
452 case SETTINGS_LOC::NONE:
456 wxASSERT_MSG(
false, wxT(
"Unknown settings location!" ) );
481 wxDirTraverseResult
OnFile(
const wxString& aSrcFilePath )
override
483 wxFileName file( aSrcFilePath );
486 file.GetName() == wxT(
"fp-lib-table" ) ) )
488 return wxDIR_CONTINUE;
492 if( file.GetFullName() == wxT(
"installed_packages.json" ) )
493 return wxDIR_CONTINUE;
497 if( file.GetExt() == wxT(
"hotkeys" ) )
498 return wxDIR_CONTINUE;
500 wxString
path = file.GetPath();
503 file.SetPath(
path );
505 wxLogTrace(
traceSettings, wxT(
"Copying %s to %s" ), aSrcFilePath, file.GetFullPath() );
510 return wxDIR_CONTINUE;
513 wxDirTraverseResult
OnDir(
const wxString& dirPath )
override
515 wxFileName dir( dirPath );
518 if( dir.GetName() == wxS(
"colors" ) ||
519 dir.GetName() == wxS(
"3d" ) )
522 wxString
path = dir.GetPath();
527 wxMkdir( dir.GetFullPath() );
529 return wxDIR_CONTINUE;
542 wxLogTrace(
traceSettings, wxT(
"Using settings path %s" ),
path.GetFullPath() );
550 if( !
path.DirExists() )
552 wxLogTrace(
traceSettings, wxT(
"Path didn't exist; creating it" ) );
553 path.Mkdir( wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL );
556 wxLogTrace(
traceSettings, wxT(
"Settings migration not checked; running headless" ) );
560 if(
path.DirExists() )
562 wxFileName common =
path;
563 common.SetName( wxS(
"kicad_common" ) );
564 common.SetExt( wxS(
"json" ) );
566 if( common.Exists() )
568 wxLogTrace(
traceSettings, wxT(
"Path exists and has a kicad_common, continuing!" ) );
578 wxLogTrace(
traceSettings, wxT(
"Migration dialog canceled; exiting" ) );
582 if( !
path.DirExists() )
584 wxLogTrace(
traceSettings, wxT(
"Path didn't exist; creating it" ) );
585 path.Mkdir( wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL );
590 wxLogTrace(
traceSettings, wxT(
"No migration source given; starting with defaults" ) );
599 source_dir.Traverse( traverser );
611 const std::vector<wxString> libKeys = {
612 wxT(
"KICAD6_SYMBOL_DIR" ),
613 wxT(
"KICAD6_3DMODEL_DIR" ),
614 wxT(
"KICAD6_FOOTPRINT_DIR" ),
615 wxT(
"KICAD6_TEMPLATE_DIR" ),
616 wxT(
"KICAD7_SYMBOL_DIR" ),
617 wxT(
"KICAD7_3DMODEL_DIR" ),
618 wxT(
"KICAD7_FOOTPRINT_DIR" ),
619 wxT(
"KICAD7_TEMPLATE_DIR" ),
620 wxT(
"KICAD8_SYMBOL_DIR" ),
621 wxT(
"KICAD8_3DMODEL_DIR" ),
622 wxT(
"KICAD8_FOOTPRINT_DIR" ),
623 wxT(
"KICAD8_TEMPLATE_DIR" ),
626 wxT(
"KICAD_PTEMPLATES" ),
629 wxT(
"KICAD_SYMBOL_DIR" ),
632 for(
const wxString& key : libKeys )
649 std::vector<wxFileName> base_paths;
654 if( wxGetEnv( wxT(
"KICAD_CONFIG_HOME" ),
nullptr ) )
665 wxFileName wxGtkPath;
666 wxGtkPath.AssignDir( wxS(
"~/.config/kicad" ) );
667 wxGtkPath.MakeAbsolute();
668 base_paths.emplace_back( wxGtkPath );
671 wxGtkPath.AssignDir( wxS(
"~/.var/app/org.kicad.KiCad/config/kicad" ) );
672 wxGtkPath.MakeAbsolute();
673 base_paths.emplace_back( wxGtkPath );
680 auto check_dir = [&] (
const wxString& aSubDir )
685 wxString sub_path = dir.GetNameWithSep() + aSubDir;
689 aPaths->push_back( sub_path );
690 wxLogTrace(
traceSettings, wxT(
"GetPreviousVersionName: %s is valid" ), sub_path );
695 std::set<wxString> checkedPaths;
697 for(
const wxFileName& base_path : base_paths )
699 if( checkedPaths.count( base_path.GetFullPath() ) )
702 checkedPaths.insert( base_path.GetFullPath() );
704 if( !dir.Open( base_path.GetFullPath() ) )
706 wxLogTrace(
traceSettings, wxT(
"GetPreviousVersionName: could not open base path %s" ),
707 base_path.GetFullPath() );
711 wxLogTrace(
traceSettings, wxT(
"GetPreviousVersionName: checking base path %s" ),
712 base_path.GetFullPath() );
714 if( dir.GetFirst( &subdir, wxEmptyString, wxDIR_DIRS ) )
719 while( dir.GetNext( &subdir ) )
730 wxT(
"GetPreviousVersionName: root path %s is valid" ), dir.GetName() );
731 aPaths->push_back( dir.GetName() );
737 wxFileName fulldir = wxFileName::DirName( aPath );
738 const wxArrayString& dirs = fulldir.GetDirs();
740 if( dirs.empty() || !fulldir.IsDirReadable() )
743 std::string ver = dirs.back().ToStdString();
751 std::sort( aPaths->begin(), aPaths->end(),
752 [&](
const wxString& a,
const wxString& b ) ->
bool
754 wxFileName aPath = wxFileName::DirName( a );
755 wxFileName bPath = wxFileName::DirName( b );
757 const wxArrayString& aDirs = aPath.GetDirs();
758 const wxArrayString& bDirs = bPath.GetDirs();
766 std::string verA = aDirs.back().ToStdString();
767 std::string verB = bDirs.back().ToStdString();
769 if( !extractVersion( verA ) )
772 if( !extractVersion( verB ) )
775 return compareVersions( verA, verB ) >= 0;
778 return aPaths->size() > 0;
784 wxFileName
test( aPath, wxS(
"kicad_common" ) );
789 test.SetExt(
"json" );
791 return test.Exists();
800 path.AppendDir( wxS(
"colors" ) );
802 if( !
path.DirExists() )
804 if( !wxMkdir(
path.GetPath() ) )
807 wxT(
"GetColorSettingsPath(): Path %s missing and could not be created!" ),
812 return path.GetPath();
832 wxLogTrace(
traceSettings, wxT(
"compareSettingsVersions: bad input (%s, %s)" ),
841 else if( a_maj > b_maj )
851 else if( a_min > b_min )
865 std::regex re_version(
"(\\d+)\\.(\\d+)" );
868 if( std::regex_match( aVersionString, match, re_version ) )
872 int major = std::stoi( match[1].str() );
873 int minor = std::stoi( match[2].str() );
896 wxFileName
path( aFullPath );
901 wxString fullPath =
path.GetFullPath();
909 bool readOnly =
false;
912 if( !lockFile.
Valid() )
914 wxLogTrace(
traceSettings, wxT(
"Project %s is locked; opening read-only" ), fullPath );
926 [&](
const std::unique_ptr<PROJECT>& ptr )
928 return ptr.get() == oldProject;
935 wxLogTrace(
traceSettings, wxT(
"Load project %s" ), fullPath );
937 std::unique_ptr<PROJECT>
project = std::make_unique<PROJECT>();
938 project->setProjectFullName( fullPath );
944 wxFileName projectPath( fullPath );
952 project->SetReadOnly( readOnly ||
project->GetProjectFile().IsReadOnly() );
954 if( lockFile && aSetActive )
961 wxString fn(
path.GetName() );
970 m_projects[fullPath]->setLocalSettings( settings );
988 wxLogTrace(
traceSettings, wxT(
"Unload project %s" ), projectPath );
994 [&](
const std::unique_ptr<PROJECT>& ptr )
996 return ptr.get() == toRemove;
1004 if( wasActiveProject )
1056 std::vector<wxString> ret;
1058 for(
const std::pair<const wxString, PROJECT*>& pair :
m_projects )
1061 if( !pair.first.IsEmpty() )
1062 ret.emplace_back( pair.first );
1074 wxString
path = aFullPath;
1089 project->SaveToFile( projectPath );
1103 if( aFullPath.IsSameAs( oldName ) )
1112 wxFileName fn( aFullPath );
1121 project->SetFilename( fn.GetName() );
1122 project->SaveToFile( fn.GetPath() );
1141 wxString oldName =
project->GetFilename();
1142 wxFileName fn( aFullPath );
1144 bool readOnly =
project->IsReadOnly();
1145 project->SetReadOnly(
false );
1147 project->SetFilename( fn.GetName() );
1148 project->SaveToFile( fn.GetPath() );
1149 project->SetFilename( oldName );
1157 project->SetReadOnly( readOnly );
1164 wxString fn( fullFn.GetName() );
1173 wxString
path( fullFn.GetPath() );
1192 [&file](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
1194 return aPtr.get() == file;
1204 ( *it )->SaveToFile( projectPath );
1226 wxDateTime timestamp = wxDateTime::Now();
1228 wxString fileName = wxString::Format( wxT(
"%s-%s" ),
Prj().GetProjectName(),
1231 if( !aTarget.IsOk() )
1234 aTarget.SetName( fileName );
1238 if( !aTarget.DirExists() && !wxMkdir( aTarget.GetPath() ) )
1240 wxLogTrace(
traceSettings, wxT(
"Could not create project backup path %s" ),
1241 aTarget.GetPath() );
1245 if( !aTarget.IsDirWritable() )
1247 wxLogTrace(
traceSettings, wxT(
"Backup directory %s is not writable" ), aTarget.GetPath() );
1251 wxLogTrace(
traceSettings, wxT(
"Backing up project to %s" ), aTarget.GetPath() );
1261 std::function<
bool(
const wxString& )> aCond ) :
1267 wxDirTraverseResult
OnFile(
const wxString& aFile )
override
1270 m_files.emplace_back( aFile );
1272 return wxDIR_CONTINUE;
1275 wxDirTraverseResult
OnDir(
const wxString& aDirName )
override
1277 return wxDIR_CONTINUE;
1297 [&prefix](
const wxString& aFile )
1300 wxString fn( wxFileName( aFile ).GetName() );
1301 fn.Replace( prefix, wxS(
"" ) );
1306 wxFileName projectPath(
Prj().GetProjectPath() );
1309 if( !projectPath.IsOk() || !projectPath.Exists() || !projectPath.IsDirWritable() )
1314 if( !wxDirExists( backupPath ) )
1316 wxLogTrace(
traceSettings, wxT(
"Backup path %s doesn't exist, creating it" ), backupPath );
1318 if( !wxMkdir( backupPath ) )
1320 wxLogTrace(
traceSettings, wxT(
"Could not create backups path! Skipping backup" ) );
1325 wxDir dir( backupPath );
1327 if( !dir.IsOpened() )
1329 wxLogTrace(
traceSettings, wxT(
"Could not open project backups path %s" ), dir.GetName() );
1333 std::vector<wxString> files;
1336 [&modTime](
const wxString& aFile )
1338 return modTime( aFile ).IsValid();
1341 dir.Traverse( traverser, wxT(
"*.zip" ) );
1344 std::sort( files.begin(), files.end(),
1345 [&](
const wxString& aFirst,
const wxString& aSecond ) ->
bool
1347 wxDateTime first = modTime( aFirst );
1348 wxDateTime second = modTime( aSecond );
1350 return first.GetTicks() > second.GetTicks();
1354 if( !files.empty() )
1356 wxDateTime lastTime = modTime( files[0] );
1358 if( lastTime.IsValid() )
1360 wxTimeSpan
delta = wxDateTime::Now() - modTime( files[0] );
1371 if( !backupSuccessful )
1375 files.insert( files.begin(), target.GetFullPath() );
1378 if( files.size() >= 2
1381 wxRemoveFile( files[0] );
1392 wxRemoveFile( files.back() );
1400 wxULongLong totalSize = 0;
1402 for(
const wxString& file : files )
1403 totalSize += wxFileName::GetSize( file );
1405 while( !files.empty() && totalSize >
static_cast<wxULongLong
>( settings.
limit_total_size ) )
1407 totalSize -= wxFileName::GetSize( files.back() );
1408 wxRemoveFile( files.back() );
1416 wxDateTime day = modTime( files[0] );
1419 wxASSERT( day.IsValid() );
1421 std::vector<wxString> filesToDelete;
1423 for(
size_t i = 1; i < files.size(); i++ )
1425 wxDateTime dt = modTime( files[i] );
1427 if( dt.IsSameDate( day ) )
1432 filesToDelete.emplace_back( files[i] );
1441 for(
const wxString& file : filesToDelete )
1442 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)
Creates an archive of the project.
static bool AreZipArchivesIdentical(const wxString &aZipFileA, const wxString &aZipFileB, REPORTER &aReporter)
Compares 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.
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.
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)
Compares 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)
Returns the path a given settings file should be loaded from / stored to.
static std::string GetSettingsVersion()
Parses the current KiCad build version and extracts the major and minor revision to use as the name o...
void SaveProjectAs(const wxString &aFullPath, PROJECT *aProject=nullptr)
Sets the currently loaded project path and saves it (pointers remain valid) Note that this will not m...
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")
Retrieves a color settings object that applications can read colors from.
T * RegisterSettings(T *aSettings, bool aLoadNow=true)
Takes ownership of the pointer passed in.
void SaveProjectCopy(const wxString &aFullPath, PROJECT *aProject=nullptr)
Saves a copy of the current project under the given path.
bool MigrateIfNeeded()
Handles the initialization of the user settings directory and migration from previous KiCad versions ...
wxString m_migration_source
void SaveColorSettings(COLOR_SETTINGS *aSettings, const std::string &aNamespace="")
Safely saves 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)
Extracts 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()
Returns the path where color scheme files are stored; creating it if missing (normally .
COMMON_SETTINGS * GetCommonSettings() const
Retrieves the common settings shared by all applications.
bool SaveProject(const wxString &aFullPath=wxEmptyString, PROJECT *aProject=nullptr)
Saves a loaded project.
wxString GetProjectBackupsPath() const
bool LoadProject(const wxString &aFullPath, bool aSetActive=true)
Loads 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)
Attempts 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 TODO: This should be deprecated along with Prj() once w...
bool GetPreviousVersionPaths(std::vector< wxString > *aName=nullptr)
Retrieves the name of the most recent previous KiCad version that can be found in the user settings d...
static bool IsSettingsPathValid(const wxString &aPath)
Checks if a given path is probably a valid KiCad configuration directory.
bool BackupProject(REPORTER &aReporter, wxFileName &aTarget) const
Creates 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
Retrieves a loaded project by name.
bool UnloadProject(PROJECT *aProject, bool aSave=true)
Saves, unloads and unregisters the given PROJECT.
std::vector< wxString > GetOpenProjects() const
std::vector< std::unique_ptr< JSON_SETTINGS > > m_settings
bool TriggerBackupIfNeeded(REPORTER &aReporter) const
Calls 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 saves, and then unloads and unregisters the given PROJECT_FILE.
COLOR_SETTINGS * GetMigratedColorSettings()
Returns 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)
Registers 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)
Registers a PROJECT_FILE and attempts 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-scans 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.
void KiCopyFile(const wxString &aSrcPath, const wxString &aDestPath, wxString &aErrors)
static const std::string ProjectFileExtension
static const std::string LegacyProjectFileExtension
static const std::string ArchiveFileExtension
std::map< wxString, ENV_VAR_ITEM > ENV_VAR_MAP
This file contains miscellaneous commonly used macros and functions.
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.