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.