26#include <wx/filename.h>
27#include <wx/stdpaths.h>
66 if( !
path.DirExists() )
68 wxLogTrace(
traceSettings, wxT(
"Path didn't exist; creating it" ) );
69 path.Mkdir( wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL );
77 wxLogTrace(
traceSettings, wxT(
"Note: no valid settings directory on disk" ) );
101 for( std::unique_ptr<JSON_SETTINGS>& settings :
m_settings )
112 for( std::unique_ptr<JSON_SETTINGS>& settings :
m_settings )
116 std::map<std::string, nlohmann::json> fileHistories = settings->GetFileHistories();
118 settings->Internals()->clear();
121 for(
const auto& [
path, history] : fileHistories )
122 settings->Set(
path, history );
132 for( std::unique_ptr<JSON_SETTINGS>& settings :
m_settings )
136 for(
const auto& [
path, history] : settings->GetFileHistories() )
137 settings->Set(
path, nlohmann::json::array() );
147 std::unique_ptr<JSON_SETTINGS> ptr( aSettings );
149 ptr->SetManager(
this );
151 wxLogTrace(
traceSettings, wxT(
"Registered new settings object <%s>" ),
152 ptr->GetFullFilename() );
186 std::vector<JSON_SETTINGS*> toLoad;
190 []( std::unique_ptr<JSON_SETTINGS>& aSettings )
192 return aSettings.get();
203 [&aSettings](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
205 return aPtr.get() == aSettings;
228 [&aSettings](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
230 return aPtr.get() == aSettings;
235 wxLogTrace(
traceSettings, wxT(
"Saving %s" ), ( *it )->GetFullFilename() );
244 [&aSettings](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
246 return aPtr.get() == aSettings;
251 wxLogTrace(
traceSettings, wxT(
"Flush and release %s" ), ( *it )->GetFullFilename() );
257 size_t typeHash =
typeid( *tmp ).hash_code();
279 [&aName](
const std::pair<wxString, COLOR_SETTINGS*>& p )
281 return p.second->GetName().Lower() == aName.Lower();
312 std::vector<COLOR_SETTINGS*> ret;
314 for(
const std::pair<const wxString, COLOR_SETTINGS*>& entry :
m_color_settings )
315 ret.push_back( entry.second );
318 { return a->GetName() < b->GetName(); } );
326 wxLogTrace(
traceSettings, wxT(
"Attempting to load color theme %s" ), aName );
330 if( !fn.IsOk() || !fn.Exists() )
332 wxLogTrace(
traceSettings, wxT(
"Theme file %s.json not found, falling back to user" ),
339 if( settings->
GetFilename() != aName.ToStdString() )
341 wxLogTrace(
traceSettings, wxT(
"Warning: stored filename is actually %s, " ),
362 wxDirTraverseResult
OnFile(
const wxString& aFilePath )
override
364 wxFileName file( aFilePath );
366 if( file.GetExt() == wxS(
"json" ) )
369 return wxDIR_CONTINUE;
372 wxDirTraverseResult
OnDir(
const wxString& dirPath )
override
374 return wxDIR_CONTINUE;
394 if( aName.EndsWith( wxT(
".json" ) ) )
406 settings->
SetName( wxT(
"User" ) );
426 wxFileName third_party_path;
430 if( it != env.end() && !it->second.GetValue().IsEmpty() )
431 third_party_path.SetPath( it->second.GetValue() );
435 third_party_path.AppendDir( wxS(
"colors" ) );
438 wxDir third_party_colors_dir( third_party_path.GetFullPath() );
453 [&](
const wxFileName& aFilename )
459 if( system_colors_dir.IsOpened() )
460 system_colors_dir.Traverse( readOnlyLoader );
462 if( third_party_colors_dir.IsOpened() )
463 third_party_colors_dir.Traverse( readOnlyLoader );
465 if( colors_dir.IsOpened() )
466 colors_dir.Traverse( loader );
472 std::set<wxString> builtinNames;
481 for(
const std::pair<const wxString, COLOR_SETTINGS*>& entry :
m_color_settings )
487 && builtinNames.count( settings->
GetName() ) )
490 settings->
SetName( wxString::Format( wxS(
"%s (%s)" ), settings->
GetName(),
491 wxFileName( settings->
GetFilename() ).GetName() ) );
508 [aSettings] (
const std::pair<wxString, COLOR_SETTINGS*>& el )
510 return el.second->GetFilename() == aSettings->GetFilename();
517 if( !aSettings->
Store() )
519 wxLogTrace(
traceSettings, wxT(
"Color scheme %s not modified; skipping save" ),
524 wxASSERT( aSettings->
Contains( aNamespace ) );
526 wxLogTrace(
traceSettings, wxT(
"Saving color scheme %s, preserving %s" ),
530 std::optional<nlohmann::json> backup = aSettings->
GetJson( aNamespace );
536 ( *aSettings->
Internals() )[aNamespace].update( *backup );
546 wxASSERT( aSettings );
556 return owner->GetProjectPath();
571 wxASSERT_MSG(
false, wxT(
"Unknown settings location!" ) );
596 wxDirTraverseResult
OnFile(
const wxString& aSrcFilePath )
override
598 wxFileName file( aSrcFilePath );
603 return wxDIR_CONTINUE;
607 if( file.GetFullName() == wxT(
"installed_packages.json" ) )
608 return wxDIR_CONTINUE;
612 if( file.GetExt() == wxT(
"hotkeys" ) )
613 return wxDIR_CONTINUE;
615 wxString
path = file.GetPath();
618 file.SetPath(
path );
620 wxLogTrace(
traceSettings, wxT(
"Copying %s to %s" ), aSrcFilePath, file.GetFullPath() );
625 return wxDIR_CONTINUE;
628 wxDirTraverseResult
OnDir(
const wxString& dirPath )
override
630 wxFileName dir( dirPath );
633 if( dir.GetName() == wxS(
"colors" ) ||
634 dir.GetName() == wxS(
"3d" ) )
637 wxString
path = dir.GetPath();
642 if( !wxDirExists( dir.GetPath() ) )
643 wxMkdir( dir.GetPath() );
645 return wxDIR_CONTINUE;
659 if(
path.DirExists() )
661 wxFileName common =
path;
662 common.SetName( wxS(
"kicad_common" ) );
663 common.SetExt( wxS(
"json" ) );
665 if( common.Exists() )
667 wxLogTrace(
traceSettings, wxT(
"Path exists and has a kicad_common, continuing!" ) );
680 if( aSourcePath.IsEmpty() )
683 wxLogTrace(
traceSettings, wxT(
"Migrating from path %s" ), aSourcePath );
687 wxDir source_dir( aSourcePath );
689 source_dir.Traverse( traverser );
701 const std::vector<wxString> libKeys = {
702 wxT(
"KICAD6_SYMBOL_DIR" ),
703 wxT(
"KICAD6_3DMODEL_DIR" ),
704 wxT(
"KICAD6_FOOTPRINT_DIR" ),
705 wxT(
"KICAD6_TEMPLATE_DIR" ),
706 wxT(
"KICAD7_SYMBOL_DIR" ),
707 wxT(
"KICAD7_3DMODEL_DIR" ),
708 wxT(
"KICAD7_FOOTPRINT_DIR" ),
709 wxT(
"KICAD7_TEMPLATE_DIR" ),
710 wxT(
"KICAD8_SYMBOL_DIR" ),
711 wxT(
"KICAD8_3DMODEL_DIR" ),
712 wxT(
"KICAD8_FOOTPRINT_DIR" ),
713 wxT(
"KICAD8_TEMPLATE_DIR" ),
716 wxT(
"KICAD_PTEMPLATES" ),
719 wxT(
"KICAD_SYMBOL_DIR" ),
722 for(
const wxString& key : libKeys )
739 std::vector<wxFileName> base_paths;
744 if( wxGetEnv( wxT(
"KICAD_CONFIG_HOME" ),
nullptr ) )
755 wxFileName wxGtkPath;
756 wxGtkPath.AssignDir( wxS(
"~/.config/kicad" ) );
757 wxGtkPath.MakeAbsolute();
758 base_paths.emplace_back( wxGtkPath );
761 wxGtkPath.AssignDir( wxS(
"~/.var/app/org.kicad.KiCad/config/kicad" ) );
762 wxGtkPath.MakeAbsolute();
763 base_paths.emplace_back( wxGtkPath );
771 [&] (
const wxString& aSubDir )
776 wxString sub_path = dir.GetNameWithSep() + aSubDir;
780 aPaths->push_back( sub_path );
781 wxLogTrace(
traceSettings, wxT(
"GetPreviousVersionName: %s is valid" ), sub_path );
786 std::set<wxString> checkedPaths;
788 for(
const wxFileName& base_path : base_paths )
790 if( checkedPaths.count( base_path.GetFullPath() ) )
793 checkedPaths.insert( base_path.GetFullPath() );
795 if( !dir.Open( base_path.GetFullPath() ) )
797 wxLogTrace(
traceSettings, wxT(
"GetPreviousVersionName: could not open base path %s" ),
798 base_path.GetFullPath() );
802 wxLogTrace(
traceSettings, wxT(
"GetPreviousVersionName: checking base path %s" ),
803 base_path.GetFullPath() );
805 if( dir.GetFirst( &subdir, wxEmptyString, wxDIR_DIRS ) )
810 while( dir.GetNext( &subdir ) )
821 wxT(
"GetPreviousVersionName: root path %s is valid" ), dir.GetName() );
822 aPaths->push_back( dir.GetName() );
826 std::erase_if( *aPaths,
827 [](
const wxString& aPath ) ->
bool
829 wxFileName fulldir = wxFileName::DirName( aPath );
830 const wxArrayString& dirs = fulldir.GetDirs();
832 if( dirs.empty() || !fulldir.IsDirReadable() )
835 std::string ver = dirs.back().ToStdString();
843 std::sort( aPaths->begin(), aPaths->end(),
844 [&](
const wxString& a,
const wxString& b ) ->
bool
846 wxFileName aPath = wxFileName::DirName( a );
847 wxFileName bPath = wxFileName::DirName( b );
849 const wxArrayString& aDirs = aPath.GetDirs();
850 const wxArrayString& bDirs = bPath.GetDirs();
858 std::string verA = aDirs.back().ToStdString();
859 std::string verB = bDirs.back().ToStdString();
861 if( !extractVersion( verA ) )
864 if( !extractVersion( verB ) )
867 return compareVersions( verA, verB ) > 0;
870 return aPaths->size() > 0;
876 wxFileName
test( aPath, wxS(
"kicad_common" ) );
881 test.SetExt(
"json" );
883 return test.Exists();
892 path.AppendDir( wxS(
"colors" ) );
894 if( !
path.DirExists() )
896 if( !wxMkdir(
path.GetPath() ) )
899 wxT(
"GetColorSettingsPath(): Path %s missing and could not be created!" ),
904 return path.GetPath();
913 path.AppendDir( wxS(
"toolbars" ) );
915 if( !
path.DirExists() )
917 if( !wxMkdir(
path.GetPath() ) )
920 wxT(
"GetToolbarSettingsPath(): Path %s missing and could not be created!" ),
925 return path.GetPath();
945 wxLogTrace(
traceSettings, wxT(
"compareSettingsVersions: bad input (%s, %s)" ),
954 else if( a_maj > b_maj )
964 else if( a_min > b_min )
978 std::regex re_version(
"(\\d+)\\.(\\d+)" );
981 if( std::regex_match( aVersionString, match, re_version ) )
985 int major = std::stoi( match[1].str() );
986 int minor = std::stoi( match[2].str() );
1011 wxFileName
path( aFullPath );
1016 return path.GetFullPath();
1023 wxFileName
path( fullPath );
1034 if( !lockFile.
Valid() )
1035 wxLogTrace(
traceSettings, wxT(
"Project %s is locked; opening read-only" ), fullPath );
1046 pcbFace->CancelPreload(
true );
1059 [&](
const std::pair<const wxString, PROJECT*>& aEntry )
1061 return aEntry.second == oldProject;
1067 wxLogTrace(
traceSettings, wxT(
"Load project %s" ), fullPath );
1069 std::unique_ptr<PROJECT>
project = std::make_unique<PROJECT>();
1070 project->setProjectFullName( fullPath );
1076 wxFileName projectPath( fullPath );
1080 if( !projectPath.GetPath().IsEmpty() && wxTheApp && wxTheApp->IsGUI() )
1081 wxSetWorkingDirectory( projectPath.GetPath() );
1090 if( projectPath.GetPath().IsEmpty() )
1096 wxFileName vcsContext( projectPath );
1097 vcsContext.MakeAbsolute();
1106 if( lockFile.
Valid() && aSetActive )
1117 wxString fn(
path.GetName() );
1126 m_projects[fullPath]->setLocalSettings( settings );
1146 [&](
const std::unique_ptr<PROJECT>& aPtr )
1148 return aPtr.get() == aProject;
1159 wxLogTrace(
traceSettings, wxT(
"Unload project %s" ), projectPath );
1167 if( wasActiveProject &&
m_kiway )
1170 pcbFace->CancelPreload(
true );
1182 [&](
const std::unique_ptr<PROJECT>& ptr )
1184 return ptr.get() == toRemove;
1192 if( wasActiveProject )
1209 if( wxTheApp && wxTheApp->IsGUI() )
1226 wxLogTrace(
traceSettings, wxT(
"Prj() called with no project loaded" ) );
1228 static PROJECT s_emptyProject;
1229 return s_emptyProject;
1239 project->SetProjectLock(
nullptr );
1252 && !
m_projects.begin()->second->GetProjectFullName().IsEmpty() );
1267 TEMPLATES::SCOPE::GLOBAL ) )
1270 fieldName, TEMPLATES::SCOPE::GLOBAL );
1280 return it !=
m_projects.end() ? it->second :
nullptr;
1286 std::vector<wxString> ret;
1288 for(
const std::pair<const wxString, PROJECT*>& pair :
m_projects )
1291 if( !pair.first.IsEmpty() )
1292 ret.emplace_back( pair.first );
1304 wxString
path = aFullPath;
1323 project->SaveToFile( projectPath );
1325 return !
project->LastSaveFailed();
1337 if( newName.IsSameAs( oldName ) )
1346 wxFileName fn( newName );
1355 project->SetFilename( fn.GetName() );
1356 project->SaveToFile( fn.GetPath() );
1375 wxString oldName =
project->GetFilename();
1376 wxFileName fn( aFullPath );
1378 bool readOnly =
project->IsReadOnly();
1379 project->SetReadOnly(
false );
1381 project->SetFilename( fn.GetName() );
1382 const bool projectOk =
project->SaveToFile( fn.GetPath() );
1383 project->SetFilename( oldName );
1394 project->SetReadOnly( readOnly );
1403 wxString fn( fullFn.GetName() );
1412 wxString
path( fullFn.GetPath() );
1438 [&file](
const std::unique_ptr<JSON_SETTINGS>& aPtr )
1440 return aPtr.get() == file;
1452 ( *it )->SaveToFile( projectPath );
1455 if( ( *it )->LastSaveFailed() )
1476 return wxEmptyString;
1480 if( fullName.IsEmpty() )
1481 return wxEmptyString;
1483 std::string hashHex;
1484 picosha2::hash256_hex_string( fullName.ToStdString( wxConvUTF8 ), hashHex );
1486 return wxString::Format( wxS(
"%s-%s" ), aProject->
GetProjectName(),
1487 wxString::FromUTF8( hashHex.substr( 0, 12 ).c_str() ) );
1493 return aProject ? *aProject :
Prj();
1504 if( activePath.IsSameAs( aProjectPath ) || activePath.IsSameAs( aProjectPath + wxFILE_SEP_PATH ) )
1526 root.AppendDir( wxS(
"backups" ) );
1530 if( !key.IsEmpty() )
1531 root.AppendDir( key );
1533 return root.GetPathWithSep();
1544 wxFileName p(
project.GetProjectPath(), wxEmptyString );
1545 p.AppendDir( wxS(
".history" ) );
1550 root.AppendDir( wxS(
"local_history" ) );
1554 if( !key.IsEmpty() )
1555 root.AppendDir( key );
1557 return root.GetPath();
1565 wxFileName p( aProjectPath, wxEmptyString );
1566 p.AppendDir( wxS(
".history" ) );
1580 return project.GetProjectPath();
1583 root.AppendDir( wxS(
"autosave" ) );
1587 if( !key.IsEmpty() )
1588 root.AppendDir( key );
1590 return root.GetPathWithSep();
1599 wxDateTime timestamp = wxDateTime::Now();
1601 wxString fileName = wxString::Format( wxT(
"%s-%s" ),
Prj().GetProjectName(),
1604 if( !aTarget.IsOk() )
1607 aTarget.SetName( fileName );
1613 wxLogTrace(
traceSettings, wxT(
"Could not create project backup path %s" ),
1614 aTarget.GetPath() );
1618 if( !aTarget.IsDirWritable() )
1620 wxLogTrace(
traceSettings, wxT(
"Backup directory %s is not writable" ),
1621 aTarget.GetPath() );
1625 wxLogTrace(
traceSettings, wxT(
"Backing up project to %s" ), aTarget.GetPath() );
1635 std::function<
bool(
const wxString& )> aCond ) :
1641 wxDirTraverseResult
OnFile(
const wxString& aFile )
override
1644 m_files.emplace_back( aFile );
1646 return wxDIR_CONTINUE;
1649 wxDirTraverseResult
OnDir(
const wxString& aDirName )
override
1651 return wxDIR_CONTINUE;
1677 [&prefix](
const wxString& aFile )
1680 wxString fn( wxFileName( aFile ).GetName() );
1681 fn.Replace( prefix, wxS(
"" ) );
1686 if(
Prj().GetProjectFullName().IsEmpty() )
1695 wxLogTrace(
traceSettings, wxT(
"Could not create backups path %s! Skipping backup" ),
1700 wxFileName backupRoot( backupPath, wxEmptyString, wxEmptyString );
1704 if( !backupRoot.IsDirWritable() )
1706 wxLogTrace(
traceSettings, wxT(
"Backup directory %s is not writable! Skipping backup" ),
1711 wxDir dir( backupPath );
1713 if( !dir.IsOpened() )
1715 wxLogTrace(
traceSettings, wxT(
"Could not open project backups path %s" ), dir.GetName() );
1719 std::vector<wxString> files;
1722 [&modTime](
const wxString& aFile )
1724 return modTime( aFile ).IsValid();
1727 dir.Traverse( traverser, wxT(
"*.zip" ) );
1730 std::sort( files.begin(), files.end(),
1731 [&](
const wxString& aFirst,
const wxString& aSecond ) ->
bool
1733 wxDateTime first = modTime( aFirst );
1734 wxDateTime second = modTime( aSecond );
1736 return first.GetTicks() > second.GetTicks();
1740 if( !files.empty() )
1742 wxDateTime lastTime = modTime( files[0] );
1744 if( lastTime.IsValid() )
1746 wxTimeSpan
delta = wxDateTime::Now() - modTime( files[0] );
1757 if( !backupSuccessful )
1761 files.insert( files.begin(), target.GetFullPath() );
1764 if( files.size() >= 2
1767 wxRemoveFile( files[0] );
1778 wxRemoveFile( files.back() );
1788 wxULongLong totalSize = 0;
1790 for(
const wxString& file : files )
1791 totalSize += wxFileName::GetSize( file );
1793 while( files.size() > 1 && totalSize > limit )
1795 totalSize -= wxFileName::GetSize( files.back() );
1796 wxRemoveFile( files.back() );
1800 if( totalSize > limit )
1802 aReporter.
Report(
_(
"One backup of this project is larger than the total backup size "
1803 "limit. KiCad kept the new backup; increase the limit in "
1812 wxDateTime day = modTime( files[0] );
1815 wxASSERT( day.IsValid() );
1817 std::vector<wxString> filesToDelete;
1819 for(
size_t i = 1; i < files.size(); i++ )
1821 wxDateTime dt = modTime( files[i] );
1823 if( dt.IsSameDate( day ) )
1828 filesToDelete.emplace_back( files[i] );
1837 for(
const wxString& file : filesToDelete )
1838 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_CLASSIC
static const wxString COLOR_BUILTIN_DEFAULT
const wxString & GetName() const
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
bool IsFileSynced() const
SETTINGS_LOC GetLocation() const
virtual bool LoadFromFile(const wxString &aDirectory="")
Loads the backing file from disk and then calls Load()
virtual const PROJECT * GetOwningProject() const
Project-located settings override this to report the project they belong to so their save path is res...
virtual void Load()
Updates the parameters of this object based on the current JSON document contents.
void SetReadOnly(bool aReadOnly)
JSON_SETTINGS_INTERNALS * Internals()
void SetFilename(const wxString &aFilename)
virtual bool SaveToFile(const wxString &aDirectory="", bool aForce=false)
Calls Store() and then writes the contents of the JSON document to a file.
virtual bool Store()
Stores the current parameters into the JSON document represented by this object Note: this doesn't do...
wxString GetFilename() const
void AbortAsyncLoads()
Abort any async library loading operations in progress.
void ProjectChanged()
Notify all adapters that the project has changed.
Advisory lock over a file, taken by writing a sibling lock file and holding an exclusive lock on it f...
static LOCKFILE Inspect(const wxString &aFilename)
Look at a lock without taking it: nothing is created, nothing is claimed and nothing is removed on re...
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 bool EnsurePathExists(const wxString &aPath, bool aPathToFile=false)
Attempts to create a given path if it does not exist.
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.
TEMPLATES m_TemplateFieldNames
Project and global field name templates shared by project editors.
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.
virtual REPORTER & Report(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED)
Report a string with a given severity.
static int compareVersions(const std::string &aFirst, const std::string &aSecond)
Compare two settings versions, like "5.99" and "6.0".
wxString GetBackupRootForProject(const PROJECT *aProject=nullptr) const
Resolve the backup root directory for a project, honoring the active BACKUP_LOCATION preference.
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 ReleaseProjectLocks()
Give up the lock of every loaded project without unloading it.
void SaveColorSettings(COLOR_SETTINGS *aSettings, const std::string &aNamespace="")
Safely save a COLOR_SETTINGS to disk, preserving any changes outside the given namespace.
void SyncGlobalFieldNameTemplatesToProjects()
Synchronize the global field name templates into every loaded project.
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.
bool SaveProjectCopy(const wxString &aFullPath, PROJECT *aProject=nullptr)
Save a copy of the current project under the given path.
wxString GetLocalHistoryDirForProject(const PROJECT *aProject=nullptr) const
Resolve the local-history (.history) storage directory for a 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.
const PROJECT & resolveProject(const PROJECT *aProject) const
Pick the project to resolve a backup path against, falling back to Prj().
bool SettingsDirectoryValid() const
wxString GetAutosaveRootForProject(const PROJECT *aProject=nullptr) const
Resolve the autosave-files root for a project.
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
PROJECT * GetProjectForPath(const wxString &aProjectPath) const
Return the active project iff its path matches aProjectPath, else nullptr.
COLOR_SETTINGS * loadColorSettingsByName(const wxString &aName)
Attempt to load a color theme by name (the color theme directory and .json ext are assumed).
std::vector< COLOR_SETTINGS * > GetColorSettingsList()
bool IsProjectOpen() const
Helper for checking if we have a project open.
wxString GetLocalHistoryDirForPath(const wxString &aProjectPath) const
Resolve the local-history directory for a project given by its on-disk path.
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 IsProjectLoaded(PROJECT *aProject) const
True if aProject is still owned by the manager.
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()
Helper to create built-in colors and register them.
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.
static wxString projectKeySuffix(const PROJECT *aProject)
Build "<projectname>-<sha256prefix>" suffix used to disambiguate per-project subdirectories under the...
void AddTemplateFieldName(const TEMPLATE_FIELDNAME &aFieldName, SCOPE aScope)
Insert or append a wanted symbol field name into the field names template.
void DeleteFieldNameTemplates(SCOPE aScope)
Delete the contents of a scope.
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
@ ZIP
Zip archive snapshots; autosave uses recovery files.
@ PROJECT_DIR
Inside the project directory (default)
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
This file is part of the common library.
Functions related to environment variables, including help functions.
void KiCopyFile(const wxString &aSrcPath, const wxString &aDestPath, wxString &aErrors)
static const std::string SymbolLibraryTableFileName
static const std::string ProjectFileExtension
static const std::string FootprintLibraryTableFileName
static const std::string ArchiveFileExtension
std::map< wxString, ENV_VAR_ITEM > ENV_VAR_MAP
@ TOOLBARS
The toolbar directory (e.g. ~/.config/kicad/toolbars/)
@ PROJECT
The settings directory inside a project folder.
@ USER
The main config directory (e.g. ~/.config/kicad/)
@ COLORS
The color scheme directory (e.g. ~/.config/kicad/colors/)
@ NONE
No directory prepended, full path in filename (used for PROJECT_FILE)
This file contains miscellaneous commonly used macros and functions.
KICOMMON_API wxString GetVersionedEnvVarName(const wxString &aBaseName)
Construct a versioned environment variable based on this KiCad major version.
void SetContextPath(const wxString &aPath)
Set the filesystem path used for repository discovery and relative file queries.
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.
static void reloadFromFile(JSON_SETTINGS *aSettings, const wxString &aPath)
static wxString projectKey(const wxString &aFullPath)
static bool managerMayAutoSave(JSON_SETTINGS *aSettings)
#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.
BACKUP_LOCATION location
Where backups, history, and autosave files live.
int limit_daily_files
Maximum files to keep per day, 0 for unlimited.
BACKUP_FORMAT format
Backup format (incremental git history vs zip archives)
bool enabled
Automatically back up the project when files are saved.
Implement a participant in the KIWAY alchemy.
Hold a name of a symbol's field, field value, and default visibility.
Definition of file extensions used in Kicad.