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 wxLogTrace(
traceSettings, wxT(
"Attempting to load color theme %s" ), aName );
295 if( !fn.IsOk() || !fn.Exists() )
297 wxLogTrace(
traceSettings, wxT(
"Theme file %s.json not found, falling back to user" ),
304 if( settings->
GetFilename() != aName.ToStdString() )
306 wxLogTrace(
traceSettings, wxT(
"Warning: stored filename is actually %s, " ),
327 wxDirTraverseResult
OnFile(
const wxString& aFilePath )
override
329 wxFileName file( aFilePath );
331 if( file.GetExt() == wxS(
"json" ) )
334 return wxDIR_CONTINUE;
337 wxDirTraverseResult
OnDir(
const wxString& dirPath )
override
339 return wxDIR_CONTINUE;
359 if( aName.EndsWith( wxT(
".json" ) ) )
371 settings->
SetName( wxT(
"User" ) );
391 wxFileName third_party_path;
395 if( it != env.end() && !it->second.GetValue().IsEmpty() )
396 third_party_path.SetPath( it->second.GetValue() );
400 third_party_path.AppendDir( wxS(
"colors" ) );
403 wxDir third_party_colors_dir( third_party_path.GetFullPath() );
418 [&](
const wxFileName& aFilename )
424 if( system_colors_dir.IsOpened() )
425 system_colors_dir.Traverse( readOnlyLoader );
427 if( third_party_colors_dir.IsOpened() )
428 third_party_colors_dir.Traverse( readOnlyLoader );
430 if( colors_dir.IsOpened() )
431 colors_dir.Traverse( loader );
446 [aSettings] (
const std::pair<wxString, COLOR_SETTINGS*>& el )
448 return el.second->GetFilename() == aSettings->GetFilename();
455 if( !aSettings->
Store() )
457 wxLogTrace(
traceSettings, wxT(
"Color scheme %s not modified; skipping save" ),
462 wxASSERT( aSettings->
Contains( aNamespace ) );
464 wxLogTrace(
traceSettings, wxT(
"Saving color scheme %s, preserving %s" ),
468 std::optional<nlohmann::json> backup = aSettings->
GetJson( aNamespace );
474 ( *aSettings->
Internals() )[aNamespace].update( *backup );
484 wxASSERT( aSettings );
505 wxASSERT_MSG(
false, wxT(
"Unknown settings location!" ) );
530 wxDirTraverseResult
OnFile(
const wxString& aSrcFilePath )
override
532 wxFileName file( aSrcFilePath );
537 return wxDIR_CONTINUE;
541 if( file.GetFullName() == wxT(
"installed_packages.json" ) )
542 return wxDIR_CONTINUE;
546 if( file.GetExt() == wxT(
"hotkeys" ) )
547 return wxDIR_CONTINUE;
549 wxString
path = file.GetPath();
552 file.SetPath(
path );
554 wxLogTrace(
traceSettings, wxT(
"Copying %s to %s" ), aSrcFilePath, file.GetFullPath() );
559 return wxDIR_CONTINUE;
562 wxDirTraverseResult
OnDir(
const wxString& dirPath )
override
564 wxFileName dir( dirPath );
567 if( dir.GetName() == wxS(
"colors" ) ||
568 dir.GetName() == wxS(
"3d" ) )
571 wxString
path = dir.GetPath();
576 wxMkdir( dir.GetFullPath() );
578 return wxDIR_CONTINUE;
592 if(
path.DirExists() )
594 wxFileName common =
path;
595 common.SetName( wxS(
"kicad_common" ) );
596 common.SetExt( wxS(
"json" ) );
598 if( common.Exists() )
600 wxLogTrace(
traceSettings, wxT(
"Path exists and has a kicad_common, continuing!" ) );
613 if( aSourcePath.IsEmpty() )
616 wxLogTrace(
traceSettings, wxT(
"Migrating from path %s" ), aSourcePath );
620 wxDir source_dir( aSourcePath );
622 source_dir.Traverse( traverser );
634 const std::vector<wxString> libKeys = {
635 wxT(
"KICAD6_SYMBOL_DIR" ),
636 wxT(
"KICAD6_3DMODEL_DIR" ),
637 wxT(
"KICAD6_FOOTPRINT_DIR" ),
638 wxT(
"KICAD6_TEMPLATE_DIR" ),
639 wxT(
"KICAD7_SYMBOL_DIR" ),
640 wxT(
"KICAD7_3DMODEL_DIR" ),
641 wxT(
"KICAD7_FOOTPRINT_DIR" ),
642 wxT(
"KICAD7_TEMPLATE_DIR" ),
643 wxT(
"KICAD8_SYMBOL_DIR" ),
644 wxT(
"KICAD8_3DMODEL_DIR" ),
645 wxT(
"KICAD8_FOOTPRINT_DIR" ),
646 wxT(
"KICAD8_TEMPLATE_DIR" ),
649 wxT(
"KICAD_PTEMPLATES" ),
652 wxT(
"KICAD_SYMBOL_DIR" ),
655 for(
const wxString& key : libKeys )
672 std::vector<wxFileName> base_paths;
677 if( wxGetEnv( wxT(
"KICAD_CONFIG_HOME" ),
nullptr ) )
688 wxFileName wxGtkPath;
689 wxGtkPath.AssignDir( wxS(
"~/.config/kicad" ) );
690 wxGtkPath.MakeAbsolute();
691 base_paths.emplace_back( wxGtkPath );
694 wxGtkPath.AssignDir( wxS(
"~/.var/app/org.kicad.KiCad/config/kicad" ) );
695 wxGtkPath.MakeAbsolute();
696 base_paths.emplace_back( wxGtkPath );
704 [&] (
const wxString& aSubDir )
709 wxString sub_path = dir.GetNameWithSep() + aSubDir;
713 aPaths->push_back( sub_path );
714 wxLogTrace(
traceSettings, wxT(
"GetPreviousVersionName: %s is valid" ), sub_path );
719 std::set<wxString> checkedPaths;
721 for(
const wxFileName& base_path : base_paths )
723 if( checkedPaths.count( base_path.GetFullPath() ) )
726 checkedPaths.insert( base_path.GetFullPath() );
728 if( !dir.Open( base_path.GetFullPath() ) )
730 wxLogTrace(
traceSettings, wxT(
"GetPreviousVersionName: could not open base path %s" ),
731 base_path.GetFullPath() );
735 wxLogTrace(
traceSettings, wxT(
"GetPreviousVersionName: checking base path %s" ),
736 base_path.GetFullPath() );
738 if( dir.GetFirst( &subdir, wxEmptyString, wxDIR_DIRS ) )
743 while( dir.GetNext( &subdir ) )
754 wxT(
"GetPreviousVersionName: root path %s is valid" ), dir.GetName() );
755 aPaths->push_back( dir.GetName() );
759 std::erase_if( *aPaths,
760 [](
const wxString& aPath ) ->
bool
762 wxFileName fulldir = wxFileName::DirName( aPath );
763 const wxArrayString& dirs = fulldir.GetDirs();
765 if( dirs.empty() || !fulldir.IsDirReadable() )
768 std::string ver = dirs.back().ToStdString();
776 std::sort( aPaths->begin(), aPaths->end(),
777 [&](
const wxString& a,
const wxString& b ) ->
bool
779 wxFileName aPath = wxFileName::DirName( a );
780 wxFileName bPath = wxFileName::DirName( b );
782 const wxArrayString& aDirs = aPath.GetDirs();
783 const wxArrayString& bDirs = bPath.GetDirs();
791 std::string verA = aDirs.back().ToStdString();
792 std::string verB = bDirs.back().ToStdString();
794 if( !extractVersion( verA ) )
797 if( !extractVersion( verB ) )
800 return compareVersions( verA, verB ) >= 0;
803 return aPaths->size() > 0;
809 wxFileName
test( aPath, wxS(
"kicad_common" ) );
814 test.SetExt(
"json" );
816 return test.Exists();
825 path.AppendDir( wxS(
"colors" ) );
827 if( !
path.DirExists() )
829 if( !wxMkdir(
path.GetPath() ) )
832 wxT(
"GetColorSettingsPath(): Path %s missing and could not be created!" ),
837 return path.GetPath();
846 path.AppendDir( wxS(
"toolbars" ) );
848 if( !
path.DirExists() )
850 if( !wxMkdir(
path.GetPath() ) )
853 wxT(
"GetToolbarSettingsPath(): Path %s missing and could not be created!" ),
858 return path.GetPath();
878 wxLogTrace(
traceSettings, wxT(
"compareSettingsVersions: bad input (%s, %s)" ),
887 else if( a_maj > b_maj )
897 else if( a_min > b_min )
911 std::regex re_version(
"(\\d+)\\.(\\d+)" );
914 if( std::regex_match( aVersionString, match, re_version ) )
918 int major = std::stoi( match[1].str() );
919 int minor = std::stoi( match[2].str() );
942 wxFileName
path( aFullPath );
947 wxString fullPath =
path.GetFullPath();
957 if( !lockFile.
Valid() )
959 wxLogTrace(
traceSettings, wxT(
"Project %s is locked; opening read-only" ), fullPath );
970 [&](
const std::unique_ptr<PROJECT>& ptr )
972 return ptr.get() == oldProject;
979 wxLogTrace(
traceSettings, wxT(
"Load project %s" ), fullPath );
981 std::unique_ptr<PROJECT>
project = std::make_unique<PROJECT>();
982 project->setProjectFullName( fullPath );
988 wxFileName projectPath( fullPath );
992 if( !projectPath.GetPath().IsEmpty() && wxTheApp && wxTheApp->IsGUI() )
993 wxSetWorkingDirectory( projectPath.GetPath() );
1002 if( lockFile && aSetActive )
1009 wxString fn(
path.GetName() );
1018 m_projects[fullPath]->setLocalSettings( settings );
1041 wxLogTrace(
traceSettings, wxT(
"Unload project %s" ), projectPath );
1047 [&](
const std::unique_ptr<PROJECT>& ptr )
1049 return ptr.get() == toRemove;
1057 if( wasActiveProject )
1092 && !
m_projects.begin()->second->GetProjectFullName().IsEmpty() );
1107 std::vector<wxString> ret;
1109 for(
const std::pair<const wxString, PROJECT*>& pair :
m_projects )
1112 if( !pair.first.IsEmpty() )
1113 ret.emplace_back( pair.first );
1125 wxString
path = aFullPath;
1140 project->SaveToFile( projectPath );
1154 if( aFullPath.IsSameAs( oldName ) )
1163 wxFileName fn( aFullPath );
1172 project->SetFilename( fn.GetName() );
1173 project->SaveToFile( fn.GetPath() );
1192 wxString oldName =
project->GetFilename();
1193 wxFileName fn( aFullPath );
1195 bool readOnly =
project->IsReadOnly();
1196 project->SetReadOnly(
false );
1198 project->SetFilename( fn.GetName() );
1199 project->SaveToFile( fn.GetPath() );
1200 project->SetFilename( oldName );
1208 project->SetReadOnly( readOnly );
1215 wxString fn( fullFn.GetName() );
1224 wxString
path( fullFn.GetPath() );
1246 [&file](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
1248 return aPtr.get() == file;
1260 ( *it )->SaveToFile( projectPath );
1282 wxDateTime timestamp = wxDateTime::Now();
1284 wxString fileName = wxString::Format( wxT(
"%s-%s" ),
Prj().GetProjectName(),
1287 if( !aTarget.IsOk() )
1290 aTarget.SetName( fileName );
1294 if( !aTarget.DirExists() && !wxMkdir( aTarget.GetPath() ) )
1296 wxLogTrace(
traceSettings, wxT(
"Could not create project backup path %s" ),
1297 aTarget.GetPath() );
1301 if( !aTarget.IsDirWritable() )
1303 wxLogTrace(
traceSettings, wxT(
"Backup directory %s is not writable" ),
1304 aTarget.GetPath() );
1308 wxLogTrace(
traceSettings, wxT(
"Backing up project to %s" ), aTarget.GetPath() );
1318 std::function<
bool(
const wxString& )> aCond ) :
1324 wxDirTraverseResult
OnFile(
const wxString& aFile )
override
1327 m_files.emplace_back( aFile );
1329 return wxDIR_CONTINUE;
1332 wxDirTraverseResult
OnDir(
const wxString& aDirName )
override
1334 return wxDIR_CONTINUE;
1354 [&prefix](
const wxString& aFile )
1357 wxString fn( wxFileName( aFile ).GetName() );
1358 fn.Replace( prefix, wxS(
"" ) );
1363 wxFileName projectPath(
Prj().GetProjectPath(), wxEmptyString, wxEmptyString );
1366 if( !projectPath.IsOk() || !projectPath.Exists() || !projectPath.IsDirWritable() )
1371 if( !wxDirExists( backupPath ) )
1373 wxLogTrace(
traceSettings, wxT(
"Backup path %s doesn't exist, creating it" ), backupPath );
1375 if( !wxMkdir( backupPath ) )
1377 wxLogTrace(
traceSettings, wxT(
"Could not create backups path! Skipping backup" ) );
1382 wxDir dir( backupPath );
1384 if( !dir.IsOpened() )
1386 wxLogTrace(
traceSettings, wxT(
"Could not open project backups path %s" ), dir.GetName() );
1390 std::vector<wxString> files;
1393 [&modTime](
const wxString& aFile )
1395 return modTime( aFile ).IsValid();
1398 dir.Traverse( traverser, wxT(
"*.zip" ) );
1401 std::sort( files.begin(), files.end(),
1402 [&](
const wxString& aFirst,
const wxString& aSecond ) ->
bool
1404 wxDateTime first = modTime( aFirst );
1405 wxDateTime second = modTime( aSecond );
1407 return first.GetTicks() > second.GetTicks();
1411 if( !files.empty() )
1413 wxDateTime lastTime = modTime( files[0] );
1415 if( lastTime.IsValid() )
1417 wxTimeSpan
delta = wxDateTime::Now() - modTime( files[0] );
1428 if( !backupSuccessful )
1432 files.insert( files.begin(), target.GetFullPath() );
1435 if( files.size() >= 2
1438 wxRemoveFile( files[0] );
1449 wxRemoveFile( files.back() );
1457 wxULongLong totalSize = 0;
1459 for(
const wxString& file : files )
1460 totalSize += wxFileName::GetSize( file );
1462 while( !files.empty() && totalSize >
static_cast<wxULongLong
>( settings.
limit_total_size ) )
1464 totalSize -= wxFileName::GetSize( files.back() );
1465 wxRemoveFile( files.back() );
1473 wxDateTime day = modTime( files[0] );
1476 wxASSERT( day.IsValid() );
1478 std::vector<wxString> filesToDelete;
1480 for(
size_t i = 1; i < files.size(); i++ )
1482 wxDateTime dt = modTime( files[i] );
1484 if( dt.IsSameDate( day ) )
1489 filesToDelete.emplace_back( files[i] );
1498 for(
const wxString& file : filesToDelete )
1499 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 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).
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 LegacyProjectFileExtension
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.
Definition of file extensions used in Kicad.