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;
167 [&aSettings](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
169 return aPtr.get() == aSettings;
174 wxLogTrace(
traceSettings, wxT(
"Saving %s" ), ( *it )->GetFullFilename() );
183 [&aSettings](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
185 return aPtr.get() == aSettings;
190 wxLogTrace(
traceSettings, wxT(
"Flush and release %s" ), ( *it )->GetFullFilename() );
196 size_t typeHash =
typeid( *tmp ).hash_code();
214 [&aName](
const std::pair<wxString, COLOR_SETTINGS*>& p )
216 return p.second->GetName().Lower() == aName.Lower();
247 wxLogTrace(
traceSettings, wxT(
"Attempting to load color theme %s" ), aName );
251 if( !fn.IsOk() || !fn.Exists() )
253 wxLogTrace(
traceSettings, wxT(
"Theme file %s.json not found, falling back to user" ),
260 if( settings->
GetFilename() != aName.ToStdString() )
262 wxLogTrace(
traceSettings, wxT(
"Warning: stored filename is actually %s, " ),
283 wxDirTraverseResult
OnFile(
const wxString& aFilePath )
override
285 wxFileName file( aFilePath );
287 if( file.GetExt() == wxS(
"json" ) )
290 return wxDIR_CONTINUE;
293 wxDirTraverseResult
OnDir(
const wxString& dirPath )
override
295 return wxDIR_CONTINUE;
315 if( aName.EndsWith( wxT(
".json" ) ) )
327 settings->
SetName( wxT(
"User" ) );
347 wxFileName third_party_path;
351 if( it != env.end() && !it->second.GetValue().IsEmpty() )
352 third_party_path.SetPath( it->second.GetValue() );
356 third_party_path.AppendDir( wxS(
"colors" ) );
359 wxDir third_party_colors_dir( third_party_path.GetFullPath() );
374 [&](
const wxFileName& aFilename )
380 if( system_colors_dir.IsOpened() )
381 system_colors_dir.Traverse( readOnlyLoader );
383 if( third_party_colors_dir.IsOpened() )
384 third_party_colors_dir.Traverse( readOnlyLoader );
386 if( colors_dir.IsOpened() )
387 colors_dir.Traverse( loader );
402 [aSettings] (
const std::pair<wxString, COLOR_SETTINGS*>& el )
404 return el.second->GetFilename() == aSettings->GetFilename();
411 if( !aSettings->
Store() )
413 wxLogTrace(
traceSettings, wxT(
"Color scheme %s not modified; skipping save" ),
418 wxASSERT( aSettings->
Contains( aNamespace ) );
420 wxLogTrace(
traceSettings, wxT(
"Saving color scheme %s, preserving %s" ),
424 std::optional<nlohmann::json> backup = aSettings->
GetJson( aNamespace );
430 ( *aSettings->
Internals() )[aNamespace].update( *backup );
440 wxASSERT( aSettings );
444 case SETTINGS_LOC::USER:
447 case SETTINGS_LOC::PROJECT:
451 case SETTINGS_LOC::COLORS:
454 case SETTINGS_LOC::NONE:
458 wxASSERT_MSG(
false, wxT(
"Unknown settings location!" ) );
483 wxDirTraverseResult
OnFile(
const wxString& aSrcFilePath )
override
485 wxFileName file( aSrcFilePath );
490 return wxDIR_CONTINUE;
494 if( file.GetFullName() == wxT(
"installed_packages.json" ) )
495 return wxDIR_CONTINUE;
499 if( file.GetExt() == wxT(
"hotkeys" ) )
500 return wxDIR_CONTINUE;
502 wxString
path = file.GetPath();
505 file.SetPath(
path );
507 wxLogTrace(
traceSettings, wxT(
"Copying %s to %s" ), aSrcFilePath, file.GetFullPath() );
512 return wxDIR_CONTINUE;
515 wxDirTraverseResult
OnDir(
const wxString& dirPath )
override
517 wxFileName dir( dirPath );
520 if( dir.GetName() == wxS(
"colors" ) ||
521 dir.GetName() == wxS(
"3d" ) )
524 wxString
path = dir.GetPath();
529 wxMkdir( dir.GetFullPath() );
531 return wxDIR_CONTINUE;
544 wxLogTrace(
traceSettings, wxT(
"Using settings path %s" ),
path.GetFullPath() );
552 if( !
path.DirExists() )
554 wxLogTrace(
traceSettings, wxT(
"Path didn't exist; creating it" ) );
555 path.Mkdir( wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL );
558 wxLogTrace(
traceSettings, wxT(
"Settings migration not checked; running headless" ) );
562 if(
path.DirExists() )
564 wxFileName common =
path;
565 common.SetName( wxS(
"kicad_common" ) );
566 common.SetExt( wxS(
"json" ) );
568 if( common.Exists() )
570 wxLogTrace(
traceSettings, wxT(
"Path exists and has a kicad_common, continuing!" ) );
580 wxLogTrace(
traceSettings, wxT(
"Migration dialog canceled; exiting" ) );
584 if( !
path.DirExists() )
586 wxLogTrace(
traceSettings, wxT(
"Path didn't exist; creating it" ) );
587 path.Mkdir( wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL );
592 wxLogTrace(
traceSettings, wxT(
"No migration source given; starting with defaults" ) );
601 source_dir.Traverse( traverser );
613 const std::vector<wxString> libKeys = {
614 wxT(
"KICAD6_SYMBOL_DIR" ),
615 wxT(
"KICAD6_3DMODEL_DIR" ),
616 wxT(
"KICAD6_FOOTPRINT_DIR" ),
617 wxT(
"KICAD6_TEMPLATE_DIR" ),
618 wxT(
"KICAD7_SYMBOL_DIR" ),
619 wxT(
"KICAD7_3DMODEL_DIR" ),
620 wxT(
"KICAD7_FOOTPRINT_DIR" ),
621 wxT(
"KICAD7_TEMPLATE_DIR" ),
622 wxT(
"KICAD8_SYMBOL_DIR" ),
623 wxT(
"KICAD8_3DMODEL_DIR" ),
624 wxT(
"KICAD8_FOOTPRINT_DIR" ),
625 wxT(
"KICAD8_TEMPLATE_DIR" ),
628 wxT(
"KICAD_PTEMPLATES" ),
631 wxT(
"KICAD_SYMBOL_DIR" ),
634 for(
const wxString& key : libKeys )
651 std::vector<wxFileName> base_paths;
656 if( wxGetEnv( wxT(
"KICAD_CONFIG_HOME" ),
nullptr ) )
667 wxFileName wxGtkPath;
668 wxGtkPath.AssignDir( wxS(
"~/.config/kicad" ) );
669 wxGtkPath.MakeAbsolute();
670 base_paths.emplace_back( wxGtkPath );
673 wxGtkPath.AssignDir( wxS(
"~/.var/app/org.kicad.KiCad/config/kicad" ) );
674 wxGtkPath.MakeAbsolute();
675 base_paths.emplace_back( wxGtkPath );
682 auto check_dir = [&] (
const wxString& aSubDir )
687 wxString sub_path = dir.GetNameWithSep() + aSubDir;
691 aPaths->push_back( sub_path );
692 wxLogTrace(
traceSettings, wxT(
"GetPreviousVersionName: %s is valid" ), sub_path );
697 std::set<wxString> checkedPaths;
699 for(
const wxFileName& base_path : base_paths )
701 if( checkedPaths.count( base_path.GetFullPath() ) )
704 checkedPaths.insert( base_path.GetFullPath() );
706 if( !dir.Open( base_path.GetFullPath() ) )
708 wxLogTrace(
traceSettings, wxT(
"GetPreviousVersionName: could not open base path %s" ),
709 base_path.GetFullPath() );
713 wxLogTrace(
traceSettings, wxT(
"GetPreviousVersionName: checking base path %s" ),
714 base_path.GetFullPath() );
716 if( dir.GetFirst( &subdir, wxEmptyString, wxDIR_DIRS ) )
721 while( dir.GetNext( &subdir ) )
732 wxT(
"GetPreviousVersionName: root path %s is valid" ), dir.GetName() );
733 aPaths->push_back( dir.GetName() );
739 wxFileName fulldir = wxFileName::DirName( aPath );
740 const wxArrayString& dirs = fulldir.GetDirs();
742 if( dirs.empty() || !fulldir.IsDirReadable() )
745 std::string ver = dirs.back().ToStdString();
753 std::sort( aPaths->begin(), aPaths->end(),
754 [&](
const wxString& a,
const wxString& b ) ->
bool
756 wxFileName aPath = wxFileName::DirName( a );
757 wxFileName bPath = wxFileName::DirName( b );
759 const wxArrayString& aDirs = aPath.GetDirs();
760 const wxArrayString& bDirs = bPath.GetDirs();
768 std::string verA = aDirs.back().ToStdString();
769 std::string verB = bDirs.back().ToStdString();
771 if( !extractVersion( verA ) )
774 if( !extractVersion( verB ) )
777 return compareVersions( verA, verB ) >= 0;
780 return aPaths->size() > 0;
786 wxFileName
test( aPath, wxS(
"kicad_common" ) );
791 test.SetExt(
"json" );
793 return test.Exists();
802 path.AppendDir( wxS(
"colors" ) );
804 if( !
path.DirExists() )
806 if( !wxMkdir(
path.GetPath() ) )
809 wxT(
"GetColorSettingsPath(): Path %s missing and could not be created!" ),
814 return path.GetPath();
834 wxLogTrace(
traceSettings, wxT(
"compareSettingsVersions: bad input (%s, %s)" ),
843 else if( a_maj > b_maj )
853 else if( a_min > b_min )
867 std::regex re_version(
"(\\d+)\\.(\\d+)" );
870 if( std::regex_match( aVersionString, match, re_version ) )
874 int major = std::stoi( match[1].str() );
875 int minor = std::stoi( match[2].str() );
898 wxFileName
path( aFullPath );
903 wxString fullPath =
path.GetFullPath();
911 bool readOnly =
false;
914 if( !lockFile.
Valid() )
916 wxLogTrace(
traceSettings, wxT(
"Project %s is locked; opening read-only" ), fullPath );
928 [&](
const std::unique_ptr<PROJECT>& ptr )
930 return ptr.get() == oldProject;
937 wxLogTrace(
traceSettings, wxT(
"Load project %s" ), fullPath );
939 std::unique_ptr<PROJECT>
project = std::make_unique<PROJECT>();
940 project->setProjectFullName( fullPath );
946 wxFileName projectPath( fullPath );
950 if( !projectPath.GetPath().IsEmpty() && wxTheApp && wxTheApp->IsGUI() )
951 wxSetWorkingDirectory( projectPath.GetPath() );
958 project->SetReadOnly( readOnly ||
project->GetProjectFile().IsReadOnly() );
960 if( lockFile && aSetActive )
967 wxString fn(
path.GetName() );
976 m_projects[fullPath]->setLocalSettings( settings );
994 wxLogTrace(
traceSettings, wxT(
"Unload project %s" ), projectPath );
1000 [&](
const std::unique_ptr<PROJECT>& ptr )
1002 return ptr.get() == toRemove;
1010 if( wasActiveProject )
1048 && !
m_projects.begin()->second->GetProjectFullName().IsEmpty() );
1063 std::vector<wxString> ret;
1065 for(
const std::pair<const wxString, PROJECT*>& pair :
m_projects )
1068 if( !pair.first.IsEmpty() )
1069 ret.emplace_back( pair.first );
1081 wxString
path = aFullPath;
1096 project->SaveToFile( projectPath );
1110 if( aFullPath.IsSameAs( oldName ) )
1119 wxFileName fn( aFullPath );
1128 project->SetFilename( fn.GetName() );
1129 project->SaveToFile( fn.GetPath() );
1148 wxString oldName =
project->GetFilename();
1149 wxFileName fn( aFullPath );
1151 bool readOnly =
project->IsReadOnly();
1152 project->SetReadOnly(
false );
1154 project->SetFilename( fn.GetName() );
1155 project->SaveToFile( fn.GetPath() );
1156 project->SetFilename( oldName );
1164 project->SetReadOnly( readOnly );
1171 wxString fn( fullFn.GetName() );
1180 wxString
path( fullFn.GetPath() );
1199 [&file](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
1201 return aPtr.get() == file;
1211 ( *it )->SaveToFile( projectPath );
1233 wxDateTime timestamp = wxDateTime::Now();
1235 wxString fileName = wxString::Format( wxT(
"%s-%s" ),
Prj().GetProjectName(),
1238 if( !aTarget.IsOk() )
1241 aTarget.SetName( fileName );
1247 wxString
test = aTarget.GetPath();
1249 if( !aTarget.DirExists() && !wxMkdir( aTarget.GetPath() ) )
1251 wxLogTrace(
traceSettings, wxT(
"Could not create project backup path %s" ),
1252 aTarget.GetPath() );
1256 if( !aTarget.IsDirWritable() )
1258 wxLogTrace(
traceSettings, wxT(
"Backup directory %s is not writable" ),
1259 aTarget.GetPath() );
1263 wxLogTrace(
traceSettings, wxT(
"Backing up project to %s" ), aTarget.GetPath() );
1273 std::function<
bool(
const wxString& )> aCond ) :
1279 wxDirTraverseResult
OnFile(
const wxString& aFile )
override
1282 m_files.emplace_back( aFile );
1284 return wxDIR_CONTINUE;
1287 wxDirTraverseResult
OnDir(
const wxString& aDirName )
override
1289 return wxDIR_CONTINUE;
1309 [&prefix](
const wxString& aFile )
1312 wxString fn( wxFileName( aFile ).GetName() );
1313 fn.Replace( prefix, wxS(
"" ) );
1318 wxFileName projectPath(
Prj().GetProjectPath() );
1321 if( !projectPath.IsOk() || !projectPath.Exists() || !projectPath.IsDirWritable() )
1326 if( !wxDirExists( backupPath ) )
1328 wxLogTrace(
traceSettings, wxT(
"Backup path %s doesn't exist, creating it" ), backupPath );
1330 if( !wxMkdir( backupPath ) )
1332 wxLogTrace(
traceSettings, wxT(
"Could not create backups path! Skipping backup" ) );
1337 wxDir dir( backupPath );
1339 if( !dir.IsOpened() )
1341 wxLogTrace(
traceSettings, wxT(
"Could not open project backups path %s" ), dir.GetName() );
1345 std::vector<wxString> files;
1348 [&modTime](
const wxString& aFile )
1350 return modTime( aFile ).IsValid();
1353 dir.Traverse( traverser, wxT(
"*.zip" ) );
1356 std::sort( files.begin(), files.end(),
1357 [&](
const wxString& aFirst,
const wxString& aSecond ) ->
bool
1359 wxDateTime first = modTime( aFirst );
1360 wxDateTime second = modTime( aSecond );
1362 return first.GetTicks() > second.GetTicks();
1366 if( !files.empty() )
1368 wxDateTime lastTime = modTime( files[0] );
1370 if( lastTime.IsValid() )
1372 wxTimeSpan
delta = wxDateTime::Now() - modTime( files[0] );
1383 if( !backupSuccessful )
1387 files.insert( files.begin(), target.GetFullPath() );
1390 if( files.size() >= 2
1393 wxRemoveFile( files[0] );
1404 wxRemoveFile( files.back() );
1412 wxULongLong totalSize = 0;
1414 for(
const wxString& file : files )
1415 totalSize += wxFileName::GetSize( file );
1417 while( !files.empty() && totalSize >
static_cast<wxULongLong
>( settings.
limit_total_size ) )
1419 totalSize -= wxFileName::GetSize( files.back() );
1420 wxRemoveFile( files.back() );
1428 wxDateTime day = modTime( files[0] );
1431 wxASSERT( day.IsValid() );
1433 std::vector<wxString> filesToDelete;
1435 for(
size_t i = 1; i < files.size(); i++ )
1437 wxDateTime dt = modTime( files[i] );
1439 if( dt.IsSameDate( day ) )
1444 filesToDelete.emplace_back( files[i] );
1453 for(
const wxString& file : filesToDelete )
1454 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.
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)
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.