KiCad PCB EDA Suite
COMMON_SETTINGS Class Reference

#include <common_settings.h>

Inheritance diagram for COMMON_SETTINGS:
JSON_SETTINGS

Classes

struct  APPEARANCE
 
struct  AUTO_BACKUP
 
struct  DO_NOT_SHOW_AGAIN
 
struct  ENVIRONMENT
 
struct  GRAPHICS
 
struct  INPUT
 
struct  LEGACY_3D_SEARCH_PATH
 
struct  NETCLASS_PANEL
 
struct  PACKAGE_MANAGER
 
struct  SESSION
 
struct  SYSTEM
 

Public Member Functions

 COMMON_SETTINGS ()
 
virtual ~COMMON_SETTINGS ()
 
virtual bool MigrateFromLegacy (wxConfigBase *aLegacyConfig) override
 Migrates from wxConfig to JSON-based configuration. More...
 
void InitializeEnvironment ()
 Creates the built-in environment variables and sets their default values. More...
 
wxString GetFilename () const
 
wxString GetFullFilename () const
 
void SetFilename (const wxString &aFilename)
 
void SetLocation (SETTINGS_LOC aLocation)
 
SETTINGS_LOC GetLocation () const
 
void SetLegacyFilename (const wxString &aFilename)
 
bool IsReadOnly () const
 
void SetReadOnly (bool aReadOnly)
 
nlohmann::jsonAt (const std::string &aPath)
 Wrappers for the underlying JSON API so that most consumers don't need json.hpp All of these functions take a string that is passed to PointerFromString internally. More...
 
bool Contains (const std::string &aPath) const
 
size_t Count (const std::string &aPath) const
 
JSON_SETTINGS_INTERNALSInternals ()
 
virtual void Load ()
 Updates the parameters of this object based on the current JSON document contents. More...
 
virtual bool Store ()
 Stores the current parameters into the JSON document represented by this object Note: this doesn't do any writing to disk; that's handled by SETTINGS_MANAGER. More...
 
virtual bool LoadFromFile (const wxString &aDirectory="")
 Loads the backing file from disk and then calls Load() More...
 
virtual bool SaveToFile (const wxString &aDirectory="", bool aForce=false)
 
void ResetToDefaults ()
 Resets all parameters to default values. More...
 
std::optional< nlohmann::jsonGetJson (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.key2.key3" to refer to nested objects. More...
 
template<typename ValueType >
std::optional< ValueType > Get (const std::string &aPath) const
 Fetches a value from within the JSON document. More...
 
template<>
std::optional< wxString > Get (const std::string &aPath) const
 
template<typename ValueType >
void Set (const std::string &aPath, ValueType aVal)
 Stores a value into the JSON document Will throw an exception if ValueType isn't something that the library can handle. More...
 
template<>
void Set (const std::string &aPath, wxString aVal)
 
template<>
void Set (const std::string &aPath, wxString aVal)
 
bool Migrate ()
 Migrates the schema of this settings from the version in the file to the latest version. More...
 
void AddNestedSettings (NESTED_SETTINGS *aSettings)
 Transfers ownership of a given NESTED_SETTINGS to this object. More...
 
void ReleaseNestedSettings (NESTED_SETTINGS *aSettings)
 Saves and frees a nested settings object, if it exists within this one. More...
 
void SetManager (SETTINGS_MANAGER *aManager)
 

Static Public Member Functions

static bool SetIfPresent (const nlohmann::json &aObj, const std::string &aPath, wxString &aTarget)
 Sets the given string if the given key/path is present. More...
 
static bool SetIfPresent (const nlohmann::json &aObj, const std::string &aPath, bool &aTarget)
 Sets the given bool if the given key/path is present. More...
 
static bool SetIfPresent (const nlohmann::json &aObj, const std::string &aPath, int &aTarget)
 Sets the given int if the given key/path is present. More...
 
static bool SetIfPresent (const nlohmann::json &aObj, const std::string &aPath, unsigned int &aTarget)
 Sets the given unsigned int if the given key/path is present. More...
 

Public Attributes

APPEARANCE m_Appearance
 
AUTO_BACKUP m_Backup
 
ENVIRONMENT m_Env
 
INPUT m_Input
 
GRAPHICS m_Graphics
 
SESSION m_Session
 
SYSTEM m_System
 
DO_NOT_SHOW_AGAIN m_DoNotShowAgain
 
NETCLASS_PANEL m_NetclassPanel
 
PACKAGE_MANAGER m_PackageManager
 

Protected Member Functions

void registerMigration (int aOldSchemaVersion, int aNewSchemaVersion, std::function< bool(void)> aMigrator)
 Registers a migration from one schema version to another. More...
 
template<typename ValueType >
bool fromLegacy (wxConfigBase *aConfig, const std::string &aKey, const std::string &aDest)
 Translates a legacy wxConfig value to a given JSON pointer value. More...
 
bool fromLegacyString (wxConfigBase *aConfig, const std::string &aKey, const std::string &aDest)
 Translates a legacy wxConfig string value to a given JSON pointer value. More...
 
bool fromLegacyColor (wxConfigBase *aConfig, const std::string &aKey, const std::string &aDest)
 Translates a legacy COLOR4D stored in a wxConfig string to a given JSON pointer value. More...
 
virtual wxString getFileExt () const
 
virtual wxString getLegacyFileExt () const
 

Protected Attributes

wxString m_filename
 The filename (not including path) of this settings file (inicode) More...
 
wxString m_legacy_filename
 The filename of the wxConfig legacy file (if different from m_filename) More...
 
SETTINGS_LOC m_location
 The location of this settings file (. More...
 
std::vector< PARAM_BASE * > m_params
 The list of parameters (owned by this object) More...
 
std::vector< NESTED_SETTINGS * > m_nested_settings
 Nested settings files that live inside this one, if any. More...
 
bool m_createIfMissing
 Whether or not the backing store file should be created it if doesn't exist. More...
 
bool m_createIfDefault
 Whether or not the backing store file should be created if all parameters are still at their default values. More...
 
bool m_writeFile
 Whether or not the backing store file should be written. More...
 
bool m_deleteLegacyAfterMigration
 Whether or not to delete legacy file after migration. More...
 
bool m_resetParamsIfMissing
 Whether or not to set parameters to their default value if missing from JSON on Load() More...
 
int m_schemaVersion
 Version of this settings schema. More...
 
SETTINGS_MANAGERm_manager
 A pointer to the settings manager managing this file (may be null) More...
 
std::map< int, std::pair< int, std::function< bool()> > > m_migrators
 A map of starting schema version to a pair of <ending version, migrator function> More...
 
std::unique_ptr< JSON_SETTINGS_INTERNALSm_internals
 

Private Member Functions

bool migrateSchema0to1 ()
 
bool migrateSchema1to2 ()
 
bool migrateSchema2to3 ()
 
bool readLegacy3DResolverCfg (const wxString &aPath, std::vector< LEGACY_3D_SEARCH_PATH > &aSearchPaths)
 

Static Private Member Functions

static bool getLegacy3DHollerith (const std::string &aString, size_t &aIndex, wxString &aResult)
 

Detailed Description

Definition at line 47 of file common_settings.h.

Constructor & Destructor Documentation

◆ COMMON_SETTINGS()

COMMON_SETTINGS::COMMON_SETTINGS ( )

Definition at line 50 of file common_settings.cpp.

50 :
53 m_Backup(),
54 m_Env(),
55 m_Input(),
56 m_Graphics(),
57 m_Session(),
58 m_System(),
62{
63 /*
64 * Automatic dark mode detection works fine on Mac.
65 */
66#if defined( __WXGTK__ ) || defined( __WXMSW__ )
67 m_params.emplace_back( new PARAM_ENUM<ICON_THEME>( "appearance.icon_theme",
69#else
71#endif
72
73 /*
74 * Automatic icon scaling works fine on Mac. It works mostly fine on MSW, but perhaps not
75 * uniformly enough to exclude the explicit controls there.
76 */
77#if defined( __WXGTK__ ) || defined( __WXMSW__ )
78 m_params.emplace_back( new PARAM<int>( "appearance.icon_scale",
80#else
82#endif
83
84 /*
85 * Automatic canvas scaling works fine on all supported platforms, so it's no longer exposed as
86 * a configuration option.
87 */
89
90 /*
91 * Menu icons are off by default on OSX and on for all other platforms.
92 */
93#ifdef __WXMAC__
94 m_params.emplace_back( new PARAM<bool>( "appearance.use_icons_in_menus",
96#else
97 m_params.emplace_back( new PARAM<bool>( "appearance.use_icons_in_menus",
99#endif
100
101 /*
102 * Font scaling hacks are only needed on GTK under wxWidgets 3.0.
103 */
104#if defined( __WXGTK__ ) && !wxCHECK_VERSION( 3, 1, 0 )
105 m_params.emplace_back( new PARAM<bool>( "appearance.apply_icon_scale_to_fonts",
107#else
109#endif
110
111 m_params.emplace_back( new PARAM<bool>( "appearance.show_scrollbars",
112 &m_Appearance.show_scrollbars, true ) );
113
114 m_params.emplace_back( new PARAM<double>( "appearance.hicontrast_dimming_factor",
116
117 m_params.emplace_back( new PARAM<int>( "appearance.text_editor_zoom",
119
120 m_params.emplace_back( new PARAM<bool>( "auto_backup.enabled", &m_Backup.enabled, true ) );
121
122 m_params.emplace_back( new PARAM<bool>( "auto_backup.backup_on_autosave",
123 &m_Backup.backup_on_autosave, false ) );
124
125 m_params.emplace_back( new PARAM<int>( "auto_backup.limit_total_files",
127
128 m_params.emplace_back( new PARAM<unsigned long long>( "auto_backup.limit_total_size",
129 &m_Backup.limit_total_size, 104857600 ) );
130
131 m_params.emplace_back( new PARAM<int>( "auto_backup.limit_daily_files",
133
134 m_params.emplace_back( new PARAM<int>( "auto_backup.min_interval",
135 &m_Backup.min_interval, 300 ) );
136
137 m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>( "environment.vars",
138 [&]() -> nlohmann::json
139 {
140 nlohmann::json ret = {};
141
142 for( const std::pair<wxString, ENV_VAR_ITEM> entry : m_Env.vars )
143 {
144 const ENV_VAR_ITEM& var = entry.second;
145
146 wxASSERT( entry.first == var.GetKey() );
147
148 // Default values are never persisted
149 if( var.IsDefault() )
150 {
151 wxLogTrace( traceEnvVars,
152 "COMMON_SETTINGS: Env var %s skipping save (default)",
153 var.GetKey() );
154 continue;
155 }
156
157 wxString value = var.GetValue();
158
159 // Vars that existed in JSON are persisted, but if they were overridden
160 // externally, we persist the old value (i.e. the one that was loaded from JSON)
161 if( var.GetDefinedExternally() )
162 {
163 if( var.GetDefinedInSettings() )
164 {
165 wxLogTrace( traceEnvVars,
166 "COMMON_SETTINGS: Env var %s was overridden externally, "
167 "saving previously-loaded value %s",
168 var.GetKey(), var.GetSettingsValue() );
169 value = var.GetSettingsValue();
170 }
171 else
172 {
173 wxLogTrace( traceEnvVars,
174 "COMMON_SETTINGS: Env var %s skipping save (external)",
175 var.GetKey() );
176 continue;
177 }
178 }
179
180 wxLogTrace( traceEnvVars,
181 "COMMON_SETTINGS: Saving env var %s = %s",
182 var.GetKey(), value);
183
184 std::string key( var.GetKey().ToUTF8() );
185 ret[key] = value;
186 }
187
188 return ret;
189 },
190 [&]( const nlohmann::json& aJson )
191 {
192 if( !aJson.is_object() )
193 return;
194
195 for( const auto& entry : aJson.items() )
196 {
197 wxString key = wxString( entry.key().c_str(), wxConvUTF8 );
198 wxString val = entry.value().get<wxString>();
199
200 if( m_Env.vars.count( key ) )
201 {
202 if( m_Env.vars[key].GetDefinedExternally() )
203 {
204 wxLogTrace( traceEnvVars, "COMMON_SETTINGS: %s is defined externally",
205 key );
206 m_Env.vars[key].SetDefinedInSettings();
207 m_Env.vars[key].SetSettingsValue( val );
208 continue;
209 }
210 else
211 {
212 wxLogTrace( traceEnvVars, "COMMON_SETTINGS: Updating %s: %s -> %s",
213 key, m_Env.vars[key].GetValue(), val );
214 m_Env.vars[key].SetValue( val );
215 }
216 }
217 else
218 {
219 wxLogTrace( traceEnvVars, "COMMON_SETTINGS: Loaded new var: %s = %s",
220 key, val );
221 m_Env.vars[key] = ENV_VAR_ITEM( key, val );
222 }
223
224 m_Env.vars[key].SetDefinedInSettings();
225 m_Env.vars[key].SetSettingsValue( val );
226 }
227 },
228 {} ) );
229
230 m_params.emplace_back( new PARAM<bool>( "input.focus_follow_sch_pcb",
231 &m_Input.focus_follow_sch_pcb, false ) );
232
233 m_params.emplace_back( new PARAM<bool>( "input.auto_pan", &m_Input.auto_pan, false ) );
234
235 m_params.emplace_back( new PARAM<int>( "input.auto_pan_acceleration",
237
238 m_params.emplace_back( new PARAM<bool>( "input.center_on_zoom",
239 &m_Input.center_on_zoom, true ) );
240
241 m_params.emplace_back( new PARAM<bool>( "input.immediate_actions",
242 &m_Input.immediate_actions, true ) );
243
244 m_params.emplace_back( new PARAM<bool>( "input.warp_mouse_on_move",
245 &m_Input.warp_mouse_on_move, true ) );
246
247 m_params.emplace_back( new PARAM<bool>( "input.horizontal_pan",
248 &m_Input.horizontal_pan, false ) );
249
250 m_params.emplace_back( new PARAM<bool>( "input.zoom_acceleration",
251 &m_Input.zoom_acceleration, false ) );
252
253#ifdef __WXMAC__
254 int default_zoom_speed = 5;
255#else
256 int default_zoom_speed = 1;
257#endif
258
259 m_params.emplace_back( new PARAM<int>( "input.zoom_speed",
260 &m_Input.zoom_speed, default_zoom_speed ) );
261
262 m_params.emplace_back( new PARAM<bool>( "input.zoom_speed_auto",
263 &m_Input.zoom_speed_auto, true ) );
264
265 m_params.emplace_back( new PARAM<int>( "input.scroll_modifier_zoom",
267
268 m_params.emplace_back( new PARAM<int>( "input.scroll_modifier_pan_h",
269 &m_Input.scroll_modifier_pan_h, WXK_CONTROL ) );
270
271 m_params.emplace_back( new PARAM<int>( "input.scroll_modifier_pan_v",
272 &m_Input.scroll_modifier_pan_v, WXK_SHIFT ) );
273
274 m_params.emplace_back( new PARAM_ENUM<MOUSE_DRAG_ACTION>( "input.mouse_left",
277
278 m_params.emplace_back( new PARAM_ENUM<MOUSE_DRAG_ACTION>( "input.mouse_middle",
281
282 m_params.emplace_back( new PARAM_ENUM<MOUSE_DRAG_ACTION>( "input.mouse_right",
285
286 m_params.emplace_back( new PARAM<int>( "graphics.opengl_antialiasing_mode",
287 &m_Graphics.opengl_aa_mode, 0, 0, 2 ) );
288
289 m_params.emplace_back( new PARAM<int>( "graphics.cairo_antialiasing_mode",
290 &m_Graphics.cairo_aa_mode, 0, 0, 2 ) );
291
292 m_params.emplace_back( new PARAM<int>( "system.autosave_interval",
293 &m_System.autosave_interval, 600 ) );
294
295#ifdef __WXMAC__
296 m_params.emplace_back( new PARAM<wxString>( "system.text_editor",
297 &m_System.text_editor, "/usr/bin/open -e" ) );
298#else
299 m_params.emplace_back( new PARAM<wxString>( "system.text_editor",
300 &m_System.text_editor, "" ) );
301#endif
302
303 m_params.emplace_back( new PARAM<int>( "system.file_history_size",
305
306 m_params.emplace_back( new PARAM<wxString>( "system.language",
307 &m_System.language, "Default" ) );
308
309 m_params.emplace_back( new PARAM<wxString>( "system.pdf_viewer_name",
310 &m_System.pdf_viewer_name, "" ) );
311
312 m_params.emplace_back( new PARAM<bool>( "system.use_system_pdf_viewer",
314
315 m_params.emplace_back( new PARAM<wxString>( "system.working_dir",
316 &m_System.working_dir, "" ) );
317
318 m_params.emplace_back( new PARAM<int>( "system.clear_3d_cache_interval",
320
321 m_params.emplace_back( new PARAM<bool>( "do_not_show_again.zone_fill_warning",
323
324 m_params.emplace_back( new PARAM<bool>( "do_not_show_again.env_var_overwrite_warning",
326
327 m_params.emplace_back( new PARAM<bool>( "do_not_show_again.scaled_3d_models_warning",
329
330 m_params.emplace_back( new PARAM<bool>( "do_not_show_again.data_collection_prompt",
332
333 m_params.emplace_back( new PARAM<bool>( "session.remember_open_files",
334 &m_Session.remember_open_files, false ) );
335
336 m_params.emplace_back( new PARAM_LIST<wxString>( "session.pinned_symbol_libs",
338
339 m_params.emplace_back( new PARAM_LIST<wxString>( "session.pinned_fp_libs",
340 &m_Session.pinned_fp_libs, {} ) );
341
342 m_params.emplace_back( new PARAM<int>( "netclass_panel.sash_pos",
343 &m_NetclassPanel.sash_pos, 160 ) );
344
345 m_params.emplace_back( new PARAM<int>( "package_manager.sash_pos",
346 &m_PackageManager.sash_pos, 380 ) );
347
348 registerMigration( 0, 1, std::bind( &COMMON_SETTINGS::migrateSchema0to1, this ) );
349 registerMigration( 1, 2, std::bind( &COMMON_SETTINGS::migrateSchema1to2, this ) );
350 registerMigration( 2, 3, std::bind( &COMMON_SETTINGS::migrateSchema2to3, this ) );
351}
NETCLASS_PANEL m_NetclassPanel
APPEARANCE m_Appearance
PACKAGE_MANAGER m_PackageManager
AUTO_BACKUP m_Backup
DO_NOT_SHOW_AGAIN m_DoNotShowAgain
ENVIRONMENT m_Env
KiCad uses environment variables internally for determining the base paths for libraries,...
std::vector< PARAM_BASE * > m_params
The list of parameters (owned by this object)
void registerMigration(int aOldSchemaVersion, int aNewSchemaVersion, std::function< bool(void)> aMigrator)
Registers a migration from one schema version to another.
JSON_SETTINGS(const wxString &aFilename, SETTINGS_LOC aLocation, int aSchemaVersion)
Definition: json_settings.h:64
Stores an enum as an integer.
Definition: parameters.h:217
const int commonSchemaVersion
! Update the schema version whenever a migration is required
nlohmann::json json
Definition: gerbview.cpp:44
const wxChar *const traceEnvVars
Flag to enable debug output of environment variable operations.
@ USER
The main config directory (e.g. ~/.config/kicad/)
int min_interval
Minimum time, in seconds, between subsequent backups.
bool backup_on_autosave
Trigger a backup on autosave.
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.
MOUSE_DRAG_ACTION drag_right
MOUSE_DRAG_ACTION drag_middle
MOUSE_DRAG_ACTION drag_left
std::vector< wxString > pinned_fp_libs
std::vector< wxString > pinned_symbol_libs

References COMMON_SETTINGS::APPEARANCE::apply_icon_scale_to_fonts, AUTO, COMMON_SETTINGS::AUTO_BACKUP::backup_on_autosave, COMMON_SETTINGS::APPEARANCE::canvas_scale, COMMON_SETTINGS::AUTO_BACKUP::enabled, COMMON_SETTINGS::APPEARANCE::hicontrast_dimming_factor, COMMON_SETTINGS::APPEARANCE::icon_scale, COMMON_SETTINGS::APPEARANCE::icon_theme, LIGHT, COMMON_SETTINGS::AUTO_BACKUP::limit_daily_files, COMMON_SETTINGS::AUTO_BACKUP::limit_total_files, COMMON_SETTINGS::AUTO_BACKUP::limit_total_size, m_Appearance, m_Backup, m_Env, JSON_SETTINGS::m_params, COMMON_SETTINGS::AUTO_BACKUP::min_interval, COMMON_SETTINGS::APPEARANCE::show_scrollbars, COMMON_SETTINGS::APPEARANCE::text_editor_zoom, traceEnvVars, COMMON_SETTINGS::APPEARANCE::use_icons_in_menus, USER, and COMMON_SETTINGS::ENVIRONMENT::vars.

◆ ~COMMON_SETTINGS()

virtual COMMON_SETTINGS::~COMMON_SETTINGS ( )
inlinevirtual

Definition at line 147 of file common_settings.h.

147{}

Member Function Documentation

◆ AddNestedSettings()

void JSON_SETTINGS::AddNestedSettings ( NESTED_SETTINGS aSettings)
inherited

Transfers ownership of a given NESTED_SETTINGS to this object.

Can be used to construct a NESTED_SETTINGS without the parent object needing to know about the implementation of the nested object;

Parameters
aSettingsis the settings object to take ownership of
aTargetis a pointer to update to the passed in settings

Definition at line 743 of file json_settings.cpp.

744{
745 wxLogTrace( traceSettings, wxT( "AddNestedSettings %s" ), aSettings->GetFilename() );
746 m_nested_settings.push_back( aSettings );
747}
std::vector< NESTED_SETTINGS * > m_nested_settings
Nested settings files that live inside this one, if any.
wxString GetFilename() const
Definition: json_settings.h:73
const wxChar *const traceSettings
Flag to enable debug output of settings operations and management.

References JSON_SETTINGS::GetFilename(), JSON_SETTINGS::m_nested_settings, and traceSettings.

Referenced by NESTED_SETTINGS::SetParent().

◆ At()

nlohmann::json & JSON_SETTINGS::At ( const std::string &  aPath)
inherited

Wrappers for the underlying JSON API so that most consumers don't need json.hpp All of these functions take a string that is passed to PointerFromString internally.

Definition at line 111 of file json_settings.cpp.

112{
113 return m_internals->At( aPath );
114}
std::unique_ptr< JSON_SETTINGS_INTERNALS > m_internals

References JSON_SETTINGS::m_internals.

Referenced by EESCHEMA_SETTINGS::migrateBomSettings(), GERBVIEW_SETTINGS::MigrateFromLegacy(), APP_SETTINGS_BASE::migrateLibTreeWidth(), BOARD_DESIGN_SETTINGS::migrateSchema0to1(), FOOTPRINT_EDITOR_SETTINGS::migrateSchema0to1(), COLOR_SETTINGS::migrateSchema0to1(), PCBNEW_SETTINGS::PCBNEW_SETTINGS(), and PROJECT_LOCAL_SETTINGS::PROJECT_LOCAL_SETTINGS().

◆ Contains()

bool JSON_SETTINGS::Contains ( const std::string &  aPath) const
inherited

◆ Count()

size_t JSON_SETTINGS::Count ( const std::string &  aPath) const
inherited

◆ fromLegacy()

template<typename ValueType >
template bool JSON_SETTINGS::fromLegacy< bool > ( wxConfigBase *  aConfig,
const std::string &  aKey,
const std::string &  aDest 
)
protectedinherited

Translates a legacy wxConfig value to a given JSON pointer value.

Template Parameters
ValueTypeis the basic type of the value
Parameters
aConfigis the legacy config to read from
aKeyis the key (within the current path) to read
aDestis a string that will form a JSON pointer (key1.key2.key3) to write to

Definition at line 655 of file json_settings.cpp.

657{
658 ValueType val;
659
660 if( aConfig->Read( aKey, &val ) )
661 {
662 try
663 {
664 ( *m_internals )[aDest] = val;
665 }
666 catch( ... )
667 {
668 wxASSERT_MSG( false, wxT( "Could not write value in fromLegacy!" ) );
669 return false;
670 }
671
672 return true;
673 }
674
675 return false;
676}

◆ fromLegacyColor()

bool JSON_SETTINGS::fromLegacyColor ( wxConfigBase *  aConfig,
const std::string &  aKey,
const std::string &  aDest 
)
protectedinherited

Translates a legacy COLOR4D stored in a wxConfig string to a given JSON pointer value.

Parameters
aConfigis the legacy config to read from
aKeyis the key (within the current path) to read
aDestis a string that will form a JSON pointer (key1.key2.key3) to write to

Definition at line 715 of file json_settings.cpp.

717{
718 wxString str;
719
720 if( aConfig->Read( aKey, &str ) )
721 {
723 color.SetFromWxString( str );
724
725 try
726 {
727 nlohmann::json js = nlohmann::json::array( { color.r, color.g, color.b, color.a } );
728 ( *m_internals )[aDest] = js;
729 }
730 catch( ... )
731 {
732 wxASSERT_MSG( false, wxT( "Could not write value in fromLegacyColor!" ) );
733 return false;
734 }
735
736 return true;
737 }
738
739 return false;
740}
int color
Definition: DXF_plotter.cpp:57
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104

References color.

Referenced by APP_SETTINGS_BASE::migrateWindowConfig().

◆ fromLegacyString()

bool JSON_SETTINGS::fromLegacyString ( wxConfigBase *  aConfig,
const std::string &  aKey,
const std::string &  aDest 
)
protectedinherited

Translates a legacy wxConfig string value to a given JSON pointer value.

Parameters
aConfigis the legacy config to read from
aKeyis the key (within the current path) to read
aDestis a string that will form a JSON pointer (key1.key2.key3) to write to

Definition at line 691 of file json_settings.cpp.

693{
694 wxString str;
695
696 if( aConfig->Read( aKey, &str ) )
697 {
698 try
699 {
700 ( *m_internals )[aDest] = str.ToUTF8();
701 }
702 catch( ... )
703 {
704 wxASSERT_MSG( false, wxT( "Could not write value in fromLegacyString!" ) );
705 return false;
706 }
707
708 return true;
709 }
710
711 return false;
712}

Referenced by PROJECT_FILE::MigrateFromLegacy(), APP_SETTINGS_BASE::MigrateFromLegacy(), BITMAP2CMP_SETTINGS::MigrateFromLegacy(), EESCHEMA_SETTINGS::MigrateFromLegacy(), SYMBOL_EDITOR_SETTINGS::MigrateFromLegacy(), GERBVIEW_SETTINGS::MigrateFromLegacy(), FOOTPRINT_EDITOR_SETTINGS::MigrateFromLegacy(), MigrateFromLegacy(), PCB_CALCULATOR_SETTINGS::MigrateFromLegacy(), PCBNEW_SETTINGS::MigrateFromLegacy(), and APP_SETTINGS_BASE::migrateWindowConfig().

◆ Get() [1/2]

template<>
std::optional< wxString > JSON_SETTINGS::Get ( const std::string &  aPath) const
inherited

Definition at line 773 of file json_settings.cpp.

774{
775 if( std::optional<nlohmann::json> opt_json = GetJson( aPath ) )
776 return wxString( opt_json->get<std::string>().c_str(), wxConvUTF8 );
777
778 return std::nullopt;
779}
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....

References JSON_SETTINGS::GetJson().

◆ Get() [2/2]

template<typename ValueType >
template std::optional< unsigned long long > JSON_SETTINGS::Get< unsigned long long > ( const std::string &  aPath) const
inherited

Fetches a value from within the JSON document.

Will return an empty optional if the value is not found or a mismatching type.

Template Parameters
ValueTypeis the type to cast to
Parameters
aPathis the path within the document to retrieve
Returns
a value from within this document

Definition at line 494 of file json_settings.cpp.

495{
496 if( std::optional<nlohmann::json> ret = GetJson( aPath ) )
497 {
498 try
499 {
500 return ret->get<ValueType>();
501 }
502 catch( ... )
503 {
504 }
505 }
506
507 return std::nullopt;
508}

References JSON_SETTINGS::GetJson().

Referenced by COLOR_MAP_PARAM::Load(), PARAM< ValueType >::Load(), PARAM_ENUM< EnumType >::Load(), PARAM_LAMBDA< ValueType >::Load(), PARAM_SCALED< ValueType >::Load(), COLOR_MAP_PARAM::MatchesFile(), PARAM< ValueType >::MatchesFile(), PARAM_PATH::MatchesFile(), PARAM_ENUM< EnumType >::MatchesFile(), PARAM_LAMBDA< ValueType >::MatchesFile(), and PARAM_SCALED< ValueType >::MatchesFile().

◆ getFileExt()

virtual wxString JSON_SETTINGS::getFileExt ( ) const
inlineprotectedvirtualinherited

Reimplemented in DATABASE_LIB_SETTINGS, PROJECT_FILE, and PROJECT_LOCAL_SETTINGS.

Definition at line 271 of file json_settings.h.

272 {
273 return wxT( "json" );
274 }

Referenced by JSON_SETTINGS::GetFullFilename(), JSON_SETTINGS::LoadFromFile(), and JSON_SETTINGS::SaveToFile().

◆ GetFilename()

◆ GetFullFilename()

wxString JSON_SETTINGS::GetFullFilename ( ) const
inherited

Definition at line 105 of file json_settings.cpp.

106{
107 return wxString( m_filename + "." + getFileExt() );
108}
virtual wxString getFileExt() const

References JSON_SETTINGS::getFileExt(), and JSON_SETTINGS::m_filename.

Referenced by JSON_SETTINGS::JSON_SETTINGS(), JSON_SETTINGS::LoadFromFile(), NESTED_SETTINGS::LoadFromFile(), and JSON_SETTINGS::SaveToFile().

◆ GetJson()

std::optional< nlohmann::json > JSON_SETTINGS::GetJson ( const std::string &  aPath) const
inherited

Fetches a JSON object that is a subset of this JSON_SETTINGS object, using a path of the form "key1.key2.key3" to refer to nested objects.

Parameters
aPathis a string containing one or more keys separated by '.'
Returns
a JSON object from within this one

Definition at line 474 of file json_settings.cpp.

475{
476 nlohmann::json::json_pointer ptr = m_internals->PointerFromString( aPath );
477
478 if( m_internals->contains( ptr ) )
479 {
480 try
481 {
482 return std::optional<nlohmann::json>{ m_internals->at( ptr ) };
483 }
484 catch( ... )
485 {
486 }
487 }
488
489 return std::optional<nlohmann::json>{};
490}

References JSON_SETTINGS::m_internals.

Referenced by JSON_SETTINGS::Get(), PARAM_LAMBDA< ValueType >::Load(), PARAM_LIST< Type >::Load(), PARAM_SET< Type >::Load(), PARAM_MAP< Value >::Load(), PARAM_LAMBDA< ValueType >::MatchesFile(), PARAM_LIST< Type >::MatchesFile(), PARAM_SET< Type >::MatchesFile(), PARAM_PATH_LIST::MatchesFile(), PARAM_MAP< Value >::MatchesFile(), PARAM_WXSTRING_MAP::MatchesFile(), SETTINGS_MANAGER::SaveColorSettings(), and NESTED_SETTINGS::SaveToFile().

◆ getLegacy3DHollerith()

bool COMMON_SETTINGS::getLegacy3DHollerith ( const std::string &  aString,
size_t &  aIndex,
wxString &  aResult 
)
staticprivate

Definition at line 678 of file common_settings.cpp.

680{
681 aResult.clear();
682
683 if( aIndex >= aString.size() )
684 {
685 std::ostringstream ostr;
686 ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
687 wxString errmsg = "bad Hollerith string on line";
688 ostr << " * " << errmsg.ToUTF8() << "\n'" << aString << "'";
689 wxLogTrace( traceSettings, "%s\n", ostr.str().c_str() );
690
691 return false;
692 }
693
694 size_t i2 = aString.find( '"', aIndex );
695
696 if( std::string::npos == i2 )
697 {
698 std::ostringstream ostr;
699 ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
700 wxString errmsg = "missing opening quote mark in config file";
701 ostr << " * " << errmsg.ToUTF8() << "\n'" << aString << "'";
702 wxLogTrace( traceSettings, "%s\n", ostr.str().c_str() );
703
704 return false;
705 }
706
707 ++i2;
708
709 if( i2 >= aString.size() )
710 {
711 std::ostringstream ostr;
712 ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
713 wxString errmsg = "invalid entry (unexpected end of line)";
714 ostr << " * " << errmsg.ToUTF8() << "\n'" << aString << "'";
715 wxLogTrace( traceSettings, "%s\n", ostr.str().c_str() );
716
717 return false;
718 }
719
720 std::string tnum;
721
722 while( aString[i2] >= '0' && aString[i2] <= '9' )
723 tnum.append( 1, aString[i2++] );
724
725 if( tnum.empty() || aString[i2++] != ':' )
726 {
727 std::ostringstream ostr;
728 ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
729 wxString errmsg = "bad Hollerith string on line";
730 ostr << " * " << errmsg.ToUTF8() << "\n'" << aString << "'";
731 wxLogTrace( traceSettings, "%s\n", ostr.str().c_str() );
732
733 return false;
734 }
735
736 std::istringstream istr;
737 istr.str( tnum );
738 size_t nchars;
739 istr >> nchars;
740
741 if( ( i2 + nchars ) >= aString.size() )
742 {
743 std::ostringstream ostr;
744 ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
745 wxString errmsg = "invalid entry (unexpected end of line)";
746 ostr << " * " << errmsg.ToUTF8() << "\n'" << aString << "'";
747 wxLogTrace( traceSettings, "%s\n", ostr.str().c_str() );
748
749 return false;
750 }
751
752 if( nchars > 0 )
753 {
754 aResult = wxString::FromUTF8( aString.substr( i2, nchars ).c_str() );
755 i2 += nchars;
756 }
757
758 if( i2 >= aString.size() || aString[i2] != '"' )
759 {
760 std::ostringstream ostr;
761 ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
762 wxString errmsg = "missing closing quote mark in config file";
763 ostr << " * " << errmsg.ToUTF8() << "\n'" << aString << "'";
764 wxLogTrace( traceSettings, "%s\n", ostr.str().c_str() );
765
766 return false;
767 }
768
769 aIndex = i2 + 1;
770 return true;
771}

References traceSettings.

Referenced by readLegacy3DResolverCfg().

◆ getLegacyFileExt()

virtual wxString JSON_SETTINGS::getLegacyFileExt ( ) const
inlineprotectedvirtualinherited

Reimplemented in PROJECT_FILE, and PROJECT_LOCAL_SETTINGS.

Definition at line 276 of file json_settings.h.

277 {
278 return wxEmptyString;
279 }

Referenced by JSON_SETTINGS::LoadFromFile().

◆ GetLocation()

SETTINGS_LOC JSON_SETTINGS::GetLocation ( ) const
inlineinherited

Definition at line 80 of file json_settings.h.

80{ return m_location; }
SETTINGS_LOC m_location
The location of this settings file (.

References JSON_SETTINGS::m_location.

Referenced by SETTINGS_MANAGER::GetPathForSettingsFile().

◆ InitializeEnvironment()

void COMMON_SETTINGS::InitializeEnvironment ( )

Creates the built-in environment variables and sets their default values.

Definition at line 534 of file common_settings.cpp.

535{
536 auto addVar =
537 [&]( const wxString& aKey, const wxString& aDefault )
538 {
539 m_Env.vars[aKey] = ENV_VAR_ITEM( aKey, aDefault, aDefault );
540
541 wxString envValue;
542
543 if( wxGetEnv( aKey, &envValue ) == true && !envValue.IsEmpty() )
544 {
545 m_Env.vars[aKey].SetValue( envValue );
546 m_Env.vars[aKey].SetDefinedExternally();
547 wxLogTrace( traceEnvVars,
548 "InitializeEnvironment: Entry %s defined externally as %s", aKey,
549 envValue );
550 }
551 else
552 {
553 wxLogTrace( traceEnvVars, "InitializeEnvironment: Setting entry %s to default %s",
554 aKey, aDefault );
555 }
556 };
557
558 wxFileName basePath( PATHS::GetStockEDALibraryPath(), wxEmptyString );
559
560 wxFileName path( basePath );
561 path.AppendDir( wxT( "footprints" ) );
562 addVar( wxT( "KICAD6_FOOTPRINT_DIR" ), path.GetFullPath() );
563
564 path = basePath;
565 path.AppendDir( wxT( "3dmodels" ) );
566 addVar( wxT( "KICAD6_3DMODEL_DIR" ), path.GetFullPath() );
567
568 addVar( wxT( "KICAD6_TEMPLATE_DIR" ), PATHS::GetStockTemplatesPath() );
569
570 addVar( wxT( "KICAD_USER_TEMPLATE_DIR" ), PATHS::GetUserTemplatesPath() );
571
572 addVar( wxT( "KICAD6_3RD_PARTY" ), PATHS::GetDefault3rdPartyPath() );
573
574 path = basePath;
575 path.AppendDir( wxT( "symbols" ) );
576 addVar( wxT( "KICAD6_SYMBOL_DIR" ), path.GetFullPath() );
577}
static wxString GetUserTemplatesPath()
Gets the user path for custom templates.
Definition: paths.cpp:86
static wxString GetStockEDALibraryPath()
Gets the stock (install) EDA library data path, which is the base path for templates,...
Definition: paths.cpp:186
static wxString GetDefault3rdPartyPath()
Gets the default path for PCM packages.
Definition: paths.cpp:129
static wxString GetStockTemplatesPath()
Gets the stock (install) templates path.
Definition: paths.cpp:242

References PATHS::GetDefault3rdPartyPath(), PATHS::GetStockEDALibraryPath(), PATHS::GetStockTemplatesPath(), PATHS::GetUserTemplatesPath(), m_Env, path, traceEnvVars, and COMMON_SETTINGS::ENVIRONMENT::vars.

Referenced by PGM_BASE::InitPgm().

◆ Internals()

JSON_SETTINGS_INTERNALS * JSON_SETTINGS::Internals ( )
inherited

Definition at line 129 of file json_settings.cpp.

130{
131 return m_internals.get();
132}

References JSON_SETTINGS::m_internals.

Referenced by COLOR_SETTINGS::migrateSchema0to1(), and SETTINGS_MANAGER::SaveColorSettings().

◆ IsReadOnly()

◆ Load()

void JSON_SETTINGS::Load ( )
virtualinherited

Updates the parameters of this object based on the current JSON document contents.

Definition at line 135 of file json_settings.cpp.

136{
137 for( auto param : m_params )
138 {
139 try
140 {
141 param->Load( this, m_resetParamsIfMissing );
142 }
143 catch( ... )
144 {
145 // Skip unreadable parameters in file
146 wxLogTrace( traceSettings, wxT( "param '%s' load err" ), param->GetJsonPath().c_str() );
147 }
148 }
149}
bool m_resetParamsIfMissing
Whether or not to set parameters to their default value if missing from JSON on Load()

References JSON_SETTINGS::m_params, JSON_SETTINGS::m_resetParamsIfMissing, and traceSettings.

Referenced by COLOR_SETTINGS::CreateBuiltinColorSettings(), JSON_SETTINGS::LoadFromFile(), BOARD_DESIGN_SETTINGS::LoadFromFile(), NESTED_SETTINGS::LoadFromFile(), COLOR_SETTINGS::migrateSchema0to1(), PANEL_3D_DISPLAY_OPTIONS::ResetPanel(), PANEL_3D_OPENGL_OPTIONS::ResetPanel(), PANEL_3D_RAYTRACING_OPTIONS::ResetPanel(), PANEL_EESCHEMA_ANNOTATION_OPTIONS::ResetPanel(), PANEL_EESCHEMA_DISPLAY_OPTIONS::ResetPanel(), PANEL_EESCHEMA_EDITING_OPTIONS::ResetPanel(), PANEL_SYM_DISPLAY_OPTIONS::ResetPanel(), PANEL_SYM_EDITING_OPTIONS::ResetPanel(), PANEL_GERBVIEW_DISPLAY_OPTIONS::ResetPanel(), PANEL_PL_EDITOR_DISPLAY_OPTIONS::ResetPanel(), PANEL_DISPLAY_OPTIONS::ResetPanel(), PANEL_EDIT_OPTIONS::ResetPanel(), PANEL_FP_EDITOR_DEFAULTS::ResetPanel(), PANEL_PCBNEW_DISPLAY_ORIGIN::ResetPanel(), and SETTINGS_MANAGER::SaveColorSettings().

◆ LoadFromFile()

bool JSON_SETTINGS::LoadFromFile ( const wxString &  aDirectory = "")
virtualinherited

Loads the backing file from disk and then calls Load()

Parameters
aDirectoryis the path to the file
Returns
true if the file was found on disk and loaded or migrated

Reimplemented in BOARD_DESIGN_SETTINGS, and NESTED_SETTINGS.

Definition at line 152 of file json_settings.cpp.

153{
154 // First, load all params to default values
155 m_internals->clear();
156 Load();
157
158 bool success = true;
159 bool migrated = false;
160 bool legacy_migrated = false;
161
162 LOCALE_IO locale;
163
164 auto migrateFromLegacy = [&] ( wxFileName& aPath ) {
165 // Backup and restore during migration so that the original can be mutated if convenient
166 bool backed_up = false;
167 wxFileName temp;
168
169 if( aPath.IsDirWritable() )
170 {
171 temp.AssignTempFileName( aPath.GetFullPath() );
172
173 if( !wxCopyFile( aPath.GetFullPath(), temp.GetFullPath() ) )
174 {
175 wxLogTrace( traceSettings, wxT( "%s: could not create temp file for migration" ),
176 GetFullFilename() );
177 }
178 else
179 backed_up = true;
180 }
181
182 // Silence popups if legacy file is read-only
183 wxLogNull doNotLog;
184
185 wxConfigBase::DontCreateOnDemand();
186 auto cfg = std::make_unique<wxFileConfig>( wxT( "" ), wxT( "" ), aPath.GetFullPath() );
187
188 // If migrate fails or is not implemented, fall back to built-in defaults that were
189 // already loaded above
190 if( !MigrateFromLegacy( cfg.get() ) )
191 {
192 wxLogTrace( traceSettings,
193 wxT( "%s: migrated; not all settings were found in legacy file" ),
194 GetFullFilename() );
195 }
196 else
197 {
198 wxLogTrace( traceSettings, wxT( "%s: migrated from legacy format" ), GetFullFilename() );
199 }
200
201 if( backed_up )
202 {
203 cfg.reset();
204
205 if( !wxCopyFile( temp.GetFullPath(), aPath.GetFullPath() ) )
206 {
207 wxLogTrace( traceSettings,
208 wxT( "migrate; copy temp file %s to %s failed" ),
209 temp.GetFullPath(), aPath.GetFullPath() );
210 }
211
212 if( !wxRemoveFile( temp.GetFullPath() ) )
213 {
214 wxLogTrace( traceSettings,
215 wxT( "migrate; failed to remove temp file %s" ),
216 temp.GetFullPath() );
217 }
218 }
219
220 // Either way, we want to clean up the old file afterwards
221 legacy_migrated = true;
222 };
223
224 wxFileName path;
225
226 if( aDirectory.empty() )
227 {
228 path.Assign( m_filename );
229 path.SetExt( getFileExt() );
230 }
231 else
232 {
233 wxString dir( aDirectory );
234 path.Assign( dir, m_filename, getFileExt() );
235 }
236
237 if( !path.Exists() )
238 {
239 // Case 1: legacy migration, no .json extension yet
240 path.SetExt( getLegacyFileExt() );
241
242 if( path.Exists() )
243 {
244 migrateFromLegacy( path );
245 }
246 // Case 2: legacy filename is different from new one
247 else if( !m_legacy_filename.empty() )
248 {
249 path.SetName( m_legacy_filename );
250
251 if( path.Exists() )
252 migrateFromLegacy( path );
253 }
254 else
255 {
256 success = false;
257 }
258 }
259 else
260 {
261 if( !path.IsFileWritable() )
262 m_writeFile = false;
263
264 try
265 {
266 wxFFileInputStream fp( path.GetFullPath(), wxT( "rt" ) );
267 wxStdInputStream fstream( fp );
268
269 if( fp.IsOk() )
270 {
271 *static_cast<nlohmann::json*>( m_internals.get() ) =
272 nlohmann::json::parse( fstream, nullptr,
273 /* allow_exceptions = */ true,
274 /* ignore_comments = */ true );
275
276 // If parse succeeds, check if schema migration is required
277 int filever = -1;
278
279 try
280 {
281 filever = m_internals->Get<int>( "meta.version" );
282 }
283 catch( ... )
284 {
285 wxLogTrace( traceSettings, wxT( "%s: file version could not be read!" ),
286 GetFullFilename() );
287 success = false;
288 }
289
290 if( filever >= 0 && filever < m_schemaVersion )
291 {
292 wxLogTrace( traceSettings, wxT( "%s: attempting migration from version %d to %d" ),
293 GetFullFilename(), filever, m_schemaVersion );
294
295 if( Migrate() )
296 {
297 migrated = true;
298 }
299 else
300 {
301 wxLogTrace( traceSettings, wxT( "%s: migration failed!" ), GetFullFilename() );
302 }
303 }
304 else if( filever > m_schemaVersion )
305 {
306 wxLogTrace( traceSettings,
307 wxT( "%s: warning: file version %d is newer than latest (%d)" ),
308 GetFullFilename(), filever, m_schemaVersion );
309 }
310 }
311 else
312 {
313 wxLogTrace( traceSettings, wxT( "%s exists but can't be opened for read" ),
314 GetFullFilename() );
315 }
316 }
317 catch( nlohmann::json::parse_error& error )
318 {
319 wxLogTrace( traceSettings, wxT( "Json parse error reading %s: %s" ),
320 path.GetFullPath(), error.what() );
321 wxLogTrace( traceSettings, wxT( "Attempting migration in case file is in legacy format" ) );
322 migrateFromLegacy( path );
323 }
324 }
325
326 // Now that we have new data in the JSON structure, load the params again
327 Load();
328
329 // And finally load any nested settings
330 for( auto settings : m_nested_settings )
331 settings->LoadFromFile();
332
333 wxLogTrace( traceSettings, wxT( "Loaded <%s> with schema %d" ), GetFullFilename(), m_schemaVersion );
334
335 // If we migrated, clean up the legacy file (with no extension)
336 if( legacy_migrated || migrated )
337 {
338 if( legacy_migrated && m_deleteLegacyAfterMigration && !wxRemoveFile( path.GetFullPath() ) )
339 {
340 wxLogTrace( traceSettings, wxT( "Warning: could not remove legacy file %s" ),
341 path.GetFullPath() );
342 }
343
344 // And write-out immediately so that we don't lose data if the program later crashes.
346 SaveToFile( aDirectory, true );
347 }
348
349 return success;
350}
virtual void Load()
Updates the parameters of this object based on the current JSON document contents.
wxString GetFullFilename() const
bool Migrate()
Migrates the schema of this settings from the version in the file to the latest version.
virtual bool MigrateFromLegacy(wxConfigBase *aLegacyConfig)
Migrates from wxConfig to JSON-based configuration.
bool m_deleteLegacyAfterMigration
Whether or not to delete legacy file after migration.
virtual bool SaveToFile(const wxString &aDirectory="", bool aForce=false)
virtual wxString getLegacyFileExt() const
int m_schemaVersion
Version of this settings schema.
wxString m_legacy_filename
The filename of the wxConfig legacy file (if different from m_filename)
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: locale_io.h:41
bool parse(std::istream &aStream, bool aVerbose)
Parse a PCB or footprint file from the given input stream.

References JSON_SETTINGS::getFileExt(), JSON_SETTINGS::GetFullFilename(), JSON_SETTINGS::getLegacyFileExt(), JSON_SETTINGS::Load(), JSON_SETTINGS::m_deleteLegacyAfterMigration, JSON_SETTINGS::m_filename, JSON_SETTINGS::m_internals, JSON_SETTINGS::m_legacy_filename, JSON_SETTINGS::m_nested_settings, JSON_SETTINGS::m_schemaVersion, JSON_SETTINGS::m_writeFile, JSON_SETTINGS::Migrate(), JSON_SETTINGS::MigrateFromLegacy(), parse(), path, JSON_SETTINGS::SaveToFile(), and traceSettings.

Referenced by SETTINGS_MANAGER::LoadProject(), SETTINGS_MANAGER::loadProjectFile(), SETTINGS_MANAGER::MigrateIfNeeded(), SAVE_AS_TRAVERSER::OnFile(), and SETTINGS_MANAGER::SaveColorSettings().

◆ Migrate()

bool JSON_SETTINGS::Migrate ( )
inherited

Migrates the schema of this settings from the version in the file to the latest version.

Schema migration doesn't need to be used every time a setting is added! This is intended to be more of an "escape hatch" in the event that we decide to move settings around or make other changes to a settings file format that can't simply be handled by loading a new default

Returns
true if migration was successful

Definition at line 552 of file json_settings.cpp.

553{
554 int filever = m_internals->Get<int>( "meta.version" );
555
556 while( filever < m_schemaVersion )
557 {
558 if( !m_migrators.count( filever ) )
559 {
560 wxLogTrace( traceSettings, wxT( "Migrator missing for %s version %d!" ),
561 typeid( *this ).name(), filever );
562 return false;
563 }
564
565 std::pair<int, std::function<bool()>> pair = m_migrators.at( filever );
566
567 if( pair.second() )
568 {
569 wxLogTrace( traceSettings, wxT( "Migrated %s from %d to %d" ), typeid( *this ).name(),
570 filever, pair.first );
571 filever = pair.first;
572 m_internals->At( "meta.version" ) = filever;
573 }
574 else
575 {
576 wxLogTrace( traceSettings, wxT( "Migration failed for %s from %d to %d" ),
577 typeid( *this ).name(), filever, pair.first );
578 return false;
579 }
580 }
581
582 return true;
583}
std::map< int, std::pair< int, std::function< bool()> > > m_migrators
A map of starting schema version to a pair of <ending version, migrator function>

References JSON_SETTINGS::m_internals, JSON_SETTINGS::m_migrators, JSON_SETTINGS::m_schemaVersion, and traceSettings.

Referenced by JSON_SETTINGS::LoadFromFile(), and NESTED_SETTINGS::LoadFromFile().

◆ MigrateFromLegacy()

bool COMMON_SETTINGS::MigrateFromLegacy ( wxConfigBase *  aLegacyConfig)
overridevirtual

Migrates from wxConfig to JSON-based configuration.

Should be implemented by any subclasses of JSON_SETTINGS that map to a legacy (wxConfig-based) config file.

Parameters
aLegacyConfigis a wxConfigBase holding a loaded configuration to migrate
Returns
true if migration was successful

Reimplemented from JSON_SETTINGS.

Definition at line 454 of file common_settings.cpp.

455{
456 bool ret = true;
457
458 ret &= fromLegacy<double>( aCfg, "CanvasScale", "appearance.canvas_scale" );
459 ret &= fromLegacy<int>( aCfg, "IconScale", "appearance.icon_scale" );
460 ret &= fromLegacy<bool>( aCfg, "UseIconsInMenus", "appearance.use_icons_in_menus" );
461 ret &= fromLegacy<bool>( aCfg, "ShowEnvVarWarningDialog", "environment.show_warning_dialog" );
462
463 auto load_env_vars =
464 [&]()
465 {
466 wxString key, value;
467 long index = 0;
468 nlohmann::json::json_pointer ptr = m_internals->PointerFromString( "environment.vars" );
469
470 aCfg->SetPath( "EnvironmentVariables" );
471 ( *m_internals )[ptr] = nlohmann::json( {} );
472
473 while( aCfg->GetNextEntry( key, index ) )
474 {
475 if( envVarBlacklist.count( key ) )
476 {
477 wxLogTrace( traceSettings, wxT( "Migrate Env: %s is blacklisted; skipping." ), key );
478 continue;
479 }
480
481 value = aCfg->Read( key, wxEmptyString );
482
483 if( !value.IsEmpty() )
484 {
485 ptr.push_back( key.ToStdString() );
486
487 wxLogTrace( traceSettings, wxT( "Migrate Env: %s=%s" ), ptr.to_string(), value );
488 ( *m_internals )[ptr] = value.ToUTF8();
489
490 ptr.pop_back();
491 }
492 }
493
494 aCfg->SetPath( ".." );
495 };
496
497 load_env_vars();
498
499 bool mousewheel_pan = false;
500
501 if( aCfg->Read( "MousewheelPAN", &mousewheel_pan ) && mousewheel_pan )
502 {
503 Set( "input.horizontal_pan", true );
504 Set( "input.scroll_modifier_pan_h", static_cast<int>( WXK_SHIFT ) );
505 Set( "input.scroll_modifier_pan_v", 0 );
506 Set( "input.scroll_modifier_zoom", static_cast<int>( WXK_CONTROL ) );
507 }
508
509 ret &= fromLegacy<bool>( aCfg, "AutoPAN", "input.auto_pan" );
510 ret &= fromLegacy<bool>( aCfg, "ImmediateActions", "input.immediate_actions" );
511 ret &= fromLegacy<bool>( aCfg, "PreferSelectionToDragging", "input.prefer_select_to_drag" );
512 ret &= fromLegacy<bool>( aCfg, "MoveWarpsCursor", "input.warp_mouse_on_move" );
513 ret &= fromLegacy<bool>( aCfg, "ZoomNoCenter", "input.center_on_zoom" );
514
515 // This was stored inverted in legacy config
516 if( std::optional<bool> value = Get<bool>( "input.center_on_zoom" ) )
517 Set( "input.center_on_zoom", !( *value ) );
518
519 ret &= fromLegacy<int>( aCfg, "OpenGLAntialiasingMode", "graphics.opengl_antialiasing_mode" );
520 ret &= fromLegacy<int>( aCfg, "CairoAntialiasingMode", "graphics.cairo_antialiasing_mode" );
521
522 ret &= fromLegacy<int>( aCfg, "AutoSaveInterval", "system.autosave_interval" );
523 ret &= fromLegacyString( aCfg, "Editor", "system.editor_name" );
524 ret &= fromLegacy<int>( aCfg, "FileHistorySize", "system.file_history_size" );
525 ret &= fromLegacyString( aCfg, "LanguageID", "system.language" );
526 ret &= fromLegacyString( aCfg, "PdfBrowserName", "system.pdf_viewer_name" );
527 ret &= fromLegacy<bool>( aCfg, "UseSystemBrowser", "system.use_system_pdf_viewer" );
528 ret &= fromLegacyString( aCfg, "WorkingDir", "system.working_dir" );
529
530 return ret;
531}
bool fromLegacyString(wxConfigBase *aConfig, const std::string &aKey, const std::string &aDest)
Translates a legacy wxConfig string value to a given JSON pointer value.
void Set(const std::string &aPath, ValueType aVal)
Stores a value into the JSON document Will throw an exception if ValueType isn't something that the l...
const std::set< wxString > envVarBlacklist
! The following environment variables will never be migrated from a previous version

References envVarBlacklist, JSON_SETTINGS::fromLegacyString(), JSON_SETTINGS::m_internals, JSON_SETTINGS::Set(), and traceSettings.

◆ migrateSchema0to1()

bool COMMON_SETTINGS::migrateSchema0to1 ( )
private

Schema version 0 to 1:

mousewheel_pan is replaced by explicit settings for scroll wheel behavior

Definition at line 354 of file common_settings.cpp.

355{
362 nlohmann::json::json_pointer mwp_pointer( "/input/mousewheel_pan"_json_pointer );
363
364 bool mwp = false;
365
366 try
367 {
368 mwp = m_internals->at( mwp_pointer );
369 m_internals->At( "input" ).erase( "mousewheel_pan" );
370 }
371 catch( ... )
372 {
373 wxLogTrace( traceSettings, wxT( "COMMON_SETTINGS::Migrate 0->1: mousewheel_pan not found" ) );
374 }
375
376 if( mwp )
377 {
378 ( *m_internals )[nlohmann::json::json_pointer( "/input/horizontal_pan" )] = true;
379
380 ( *m_internals )[nlohmann::json::json_pointer( "/input/scroll_modifier_pan_h" )] = WXK_SHIFT;
381 ( *m_internals )[nlohmann::json::json_pointer( "/input/scroll_modifier_pan_v" )] = 0;
382 ( *m_internals )[nlohmann::json::json_pointer( "/input/scroll_modifier_zoom" )] = WXK_CONTROL;
383 }
384 else
385 {
386 ( *m_internals )[nlohmann::json::json_pointer( "/input/horizontal_pan" )] = false;
387
388 ( *m_internals )[nlohmann::json::json_pointer( "/input/scroll_modifier_pan_h" )] = WXK_CONTROL;
389 ( *m_internals )[nlohmann::json::json_pointer( "/input/scroll_modifier_pan_v" )] = WXK_SHIFT;
390 ( *m_internals )[nlohmann::json::json_pointer( "/input/scroll_modifier_zoom" )] = 0;
391 }
392
393 return true;
394}

References JSON_SETTINGS::m_internals, and traceSettings.

◆ migrateSchema1to2()

bool COMMON_SETTINGS::migrateSchema1to2 ( )
private

Definition at line 397 of file common_settings.cpp.

398{
399 nlohmann::json::json_pointer v1_pointer( "/input/prefer_select_to_drag"_json_pointer );
400
401 bool prefer_selection = false;
402
403 try
404 {
405 prefer_selection = m_internals->at( v1_pointer );
406 m_internals->at( nlohmann::json::json_pointer( "/input"_json_pointer ) ).erase( "prefer_select_to_drag" );
407 }
408 catch( ... )
409 {
410 wxLogTrace( traceSettings, wxT( "COMMON_SETTINGS::Migrate 1->2: prefer_select_to_drag not found" ) );
411 }
412
413 if( prefer_selection )
414 ( *m_internals )[nlohmann::json::json_pointer( "/input/mouse_left" )] = MOUSE_DRAG_ACTION::SELECT;
415 else
416 ( *m_internals )[nlohmann::json::json_pointer( "/input/mouse_left" )] = MOUSE_DRAG_ACTION::DRAG_ANY;
417
418 return true;
419}

References DRAG_ANY, JSON_SETTINGS::m_internals, SELECT, and traceSettings.

◆ migrateSchema2to3()

bool COMMON_SETTINGS::migrateSchema2to3 ( )
private

Definition at line 422 of file common_settings.cpp.

423{
424 wxFileName cfgpath;
425 cfgpath.AssignDir( SETTINGS_MANAGER::GetUserSettingsPath() );
426 cfgpath.AppendDir( wxT( "3d" ) );
427 cfgpath.SetFullName( "3Dresolver.cfg" );
428 cfgpath.MakeAbsolute();
429
430 std::vector<LEGACY_3D_SEARCH_PATH> legacyPaths;
431 readLegacy3DResolverCfg( cfgpath.GetFullPath(), legacyPaths );
432
433 for( const LEGACY_3D_SEARCH_PATH& path : legacyPaths )
434 {
435 const wxString& key = path.m_Alias;
436 const wxString& val = path.m_Pathvar;
437
438 if( !m_Env.vars.count( key ) )
439 {
440 wxLogTrace( traceEnvVars, "COMMON_SETTINGS: Loaded new var: %s = %s", key, val );
441 m_Env.vars[key] = ENV_VAR_ITEM( key, val );
442 }
443 }
444
445 if( cfgpath.FileExists() )
446 {
447 wxRemoveFile( cfgpath.GetFullPath() );
448 }
449
450 return true;
451}
bool readLegacy3DResolverCfg(const wxString &aPath, std::vector< LEGACY_3D_SEARCH_PATH > &aSearchPaths)
static wxString GetUserSettingsPath()
Return the user configuration path used to store KiCad's configuration files.

References SETTINGS_MANAGER::GetUserSettingsPath(), m_Env, path, readLegacy3DResolverCfg(), traceEnvVars, and COMMON_SETTINGS::ENVIRONMENT::vars.

◆ readLegacy3DResolverCfg()

bool COMMON_SETTINGS::readLegacy3DResolverCfg ( const wxString &  aPath,
std::vector< LEGACY_3D_SEARCH_PATH > &  aSearchPaths 
)
private

Definition at line 580 of file common_settings.cpp.

582{
583 wxFileName cfgpath( path );
584
585 // This should be the same as wxWidgets 3.0 wxPATH_NORM_ALL which is deprecated in 3.1.
586 // There are known issues with environment variable expansion so maybe we should be using
587 // our own ExpandEnvVarSubstitutions() here instead.
588 cfgpath.Normalize( FN_NORMALIZE_FLAGS | wxPATH_NORM_ENV_VARS );
589 wxString cfgname = cfgpath.GetFullPath();
590
591 std::ifstream cfgFile;
592 std::string cfgLine;
593
594 if( !wxFileName::Exists( cfgname ) )
595 {
596 std::ostringstream ostr;
597 ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
598 wxString errmsg = "no 3D configuration file";
599 ostr << " * " << errmsg.ToUTF8() << " '";
600 ostr << cfgname.ToUTF8() << "'";
601 wxLogTrace( traceSettings, "%s\n", ostr.str().c_str() );
602 return false;
603 }
604
605 cfgFile.open( cfgname.ToUTF8() );
606
607 if( !cfgFile.is_open() )
608 {
609 std::ostringstream ostr;
610 ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
611 wxString errmsg = "Could not open configuration file";
612 ostr << " * " << errmsg.ToUTF8() << " '" << cfgname.ToUTF8() << "'";
613 wxLogTrace( traceSettings, "%s\n", ostr.str().c_str() );
614 return false;
615 }
616
617 int lineno = 0;
618 LEGACY_3D_SEARCH_PATH al;
619 size_t idx;
620 int vnum = 0; // version number
621
622 while( cfgFile.good() )
623 {
624 cfgLine.clear();
625 std::getline( cfgFile, cfgLine );
626 ++lineno;
627
628 if( cfgLine.empty() )
629 {
630 if( cfgFile.eof() )
631 break;
632
633 continue;
634 }
635
636 if( 1 == lineno && cfgLine.compare( 0, 2, "#V" ) == 0 )
637 {
638 // extract the version number and parse accordingly
639 if( cfgLine.size() > 2 )
640 {
641 std::istringstream istr;
642 istr.str( cfgLine.substr( 2 ) );
643 istr >> vnum;
644 }
645
646 continue;
647 }
648
649 idx = 0;
650
651 if( !getLegacy3DHollerith( cfgLine, idx, al.m_Alias ) )
652 continue;
653
654 // Don't add KICAD6_3DMODEL_DIR, one of its legacy equivalents, or KIPRJMOD from a
655 // config file. They're system variables are are defined at runtime.
656 if( al.m_Alias == "${KICAD6_3DMODEL_DIR}" || al.m_Alias == "${KIPRJMOD}"
657 || al.m_Alias == "$(KIPRJMOD)" || al.m_Alias == "${KISYS3DMOD}"
658 || al.m_Alias == "$(KISYS3DMOD)" )
659 {
660 continue;
661 }
662
663 if( !getLegacy3DHollerith( cfgLine, idx, al.m_Pathvar ) )
664 continue;
665
666 if( !getLegacy3DHollerith( cfgLine, idx, al.m_Description ) )
667 continue;
668
669 aSearchPaths.push_back( al );
670 }
671
672 cfgFile.close();
673
674 return true;
675}
static bool getLegacy3DHollerith(const std::string &aString, size_t &aIndex, wxString &aResult)
#define FN_NORMALIZE_FLAGS
Default flags to pass to wxFileName::Normalize().
Definition: wx_filename.h:38

References FN_NORMALIZE_FLAGS, getLegacy3DHollerith(), COMMON_SETTINGS::LEGACY_3D_SEARCH_PATH::m_Alias, COMMON_SETTINGS::LEGACY_3D_SEARCH_PATH::m_Description, COMMON_SETTINGS::LEGACY_3D_SEARCH_PATH::m_Pathvar, path, and traceSettings.

Referenced by migrateSchema2to3().

◆ registerMigration()

void JSON_SETTINGS::registerMigration ( int  aOldSchemaVersion,
int  aNewSchemaVersion,
std::function< bool(void)>  aMigrator 
)
protectedinherited

Registers a migration from one schema version to another.

If the schema version in the file loaded from disk is less than the schema version of the JSON_SETTINGS class, migration functions will be called one after the other until the data is up-to-date.

Parameters
aOldSchemaVersionis the starting schema version for this migration
aNewSchemaVersionis the ending schema version for this migration
aMigratoris a function that performs the migration and returns true if successful

Definition at line 543 of file json_settings.cpp.

545{
546 wxASSERT( aNewSchemaVersion > aOldSchemaVersion );
547 wxASSERT( aNewSchemaVersion <= m_schemaVersion );
548 m_migrators[aOldSchemaVersion] = std::make_pair( aNewSchemaVersion, aMigrator );
549}

References JSON_SETTINGS::m_migrators, and JSON_SETTINGS::m_schemaVersion.

Referenced by BOARD_DESIGN_SETTINGS::BOARD_DESIGN_SETTINGS(), COLOR_SETTINGS::COLOR_SETTINGS(), EDA_3D_VIEWER_SETTINGS::EDA_3D_VIEWER_SETTINGS(), EESCHEMA_SETTINGS::EESCHEMA_SETTINGS(), FOOTPRINT_EDITOR_SETTINGS::FOOTPRINT_EDITOR_SETTINGS(), NET_SETTINGS::NET_SETTINGS(), PCBNEW_SETTINGS::PCBNEW_SETTINGS(), PROJECT_LOCAL_SETTINGS::PROJECT_LOCAL_SETTINGS(), SCHEMATIC_SETTINGS::SCHEMATIC_SETTINGS(), and SYMBOL_EDITOR_SETTINGS::SYMBOL_EDITOR_SETTINGS().

◆ ReleaseNestedSettings()

void JSON_SETTINGS::ReleaseNestedSettings ( NESTED_SETTINGS aSettings)
inherited

Saves and frees a nested settings object, if it exists within this one.

Parameters
aSettingsis a pointer to a NESTED_SETTINGS that has already been added to this one

Definition at line 750 of file json_settings.cpp.

751{
752 if( !aSettings || !m_manager )
753 return;
754
755 auto it = std::find_if( m_nested_settings.begin(), m_nested_settings.end(),
756 [&aSettings]( const JSON_SETTINGS* aPtr ) {
757 return aPtr == aSettings;
758 } );
759
760 if( it != m_nested_settings.end() )
761 {
762 wxLogTrace( traceSettings, wxT( "Flush and release %s" ), ( *it )->GetFilename() );
763 ( *it )->SaveToFile();
764 m_nested_settings.erase( it );
765 }
766
767 aSettings->SetParent( nullptr );
768}
SETTINGS_MANAGER * m_manager
A pointer to the settings manager managing this file (may be null)
void SetParent(JSON_SETTINGS *aParent, bool aLoadFromFile=true)

References JSON_SETTINGS::m_manager, JSON_SETTINGS::m_nested_settings, NESTED_SETTINGS::SetParent(), and traceSettings.

Referenced by BOARD_DESIGN_SETTINGS::~BOARD_DESIGN_SETTINGS(), ERC_SETTINGS::~ERC_SETTINGS(), NESTED_SETTINGS::~NESTED_SETTINGS(), NET_SETTINGS::~NET_SETTINGS(), and SCHEMATIC_SETTINGS::~SCHEMATIC_SETTINGS().

◆ ResetToDefaults()

void JSON_SETTINGS::ResetToDefaults ( )
inherited

Resets all parameters to default values.

Does NOT write to file or update underlying JSON.

Definition at line 367 of file json_settings.cpp.

368{
369 for( auto param : m_params )
370 param->SetDefault();
371}

References JSON_SETTINGS::m_params.

Referenced by EDA_3D_VIEWER_FRAME::Process_Special_Functions(), PANEL_COMMON_SETTINGS::ResetPanel(), and PANEL_MOUSE_SETTINGS::ResetPanel().

◆ SaveToFile()

bool JSON_SETTINGS::SaveToFile ( const wxString &  aDirectory = "",
bool  aForce = false 
)
virtualinherited
   Calls Store() and then writes the contents of the JSON document to a file
   @param aDirectory is the directory to save to, including trailing separator

c *

Returns
true if the file was saved

Reimplemented in PROJECT_FILE, PROJECT_LOCAL_SETTINGS, and NESTED_SETTINGS.

Definition at line 374 of file json_settings.cpp.

375{
376 if( !m_writeFile )
377 return false;
378
379 // Default PROJECT won't have a filename set
380 if( m_filename.IsEmpty() )
381 return false;
382
383 wxFileName path;
384
385 if( aDirectory.empty() )
386 {
387 path.Assign( m_filename );
388 path.SetExt( getFileExt() );
389 }
390 else
391 {
392 wxString dir( aDirectory );
393 path.Assign( dir, m_filename, getFileExt() );
394 }
395
396 if( !m_createIfMissing && !path.FileExists() )
397 {
398 wxLogTrace( traceSettings,
399 wxT( "File for %s doesn't exist and m_createIfMissing == false; not saving" ),
400 GetFullFilename() );
401 return false;
402 }
403
404 // Ensure the path exists, and create it if not.
405 if( !path.DirExists() && !path.Mkdir() )
406 {
407 wxLogTrace( traceSettings, wxT( "Warning: could not create path %s, can't save %s" ),
408 path.GetPath(), GetFullFilename() );
409 return false;
410 }
411
412 if( ( path.FileExists() && !path.IsFileWritable() ) ||
413 ( !path.FileExists() && !path.IsDirWritable() ) )
414 {
415 wxLogTrace( traceSettings, wxT( "File for %s is read-only; not saving" ), GetFullFilename() );
416 return false;
417 }
418
419 bool modified = false;
420
421 for( auto settings : m_nested_settings )
422 modified |= settings->SaveToFile();
423
424 modified |= Store();
425
426 if( !modified && !aForce && path.FileExists() )
427 {
428 wxLogTrace( traceSettings, wxT( "%s contents not modified, skipping save" ), GetFullFilename() );
429 return false;
430 }
431 else if( !modified && !aForce && !m_createIfDefault )
432 {
433 wxLogTrace( traceSettings,
434 wxT( "%s contents still default and m_createIfDefault == false; not saving" ),
435 GetFullFilename() );
436 return false;
437 }
438
439 wxLogTrace( traceSettings, wxT( "Saving %s" ), GetFullFilename() );
440
442 bool success = true;
443
444 try
445 {
446 std::stringstream buffer;
447 buffer << std::setw( 2 ) << *m_internals << std::endl;
448
449 wxFFileOutputStream fileStream( path.GetFullPath(), "wb" );
450
451 if( !fileStream.IsOk()
452 || !fileStream.WriteAll( buffer.str().c_str(), buffer.str().size() ) )
453 {
454 wxLogTrace( traceSettings, wxT( "Warning: could not save %s" ), GetFullFilename() );
455 success = false;
456 }
457 }
458 catch( nlohmann::json::exception& error )
459 {
460 wxLogTrace( traceSettings, wxT( "Catch error: could not save %s. Json error %s" ),
461 GetFullFilename(), error.what() );
462 success = false;
463 }
464 catch( ... )
465 {
466 wxLogTrace( traceSettings, wxT( "Error: could not save %s." ) );
467 success = false;
468 }
469
470 return success;
471}
bool m_createIfDefault
Whether or not the backing store file should be created if all parameters are still at their default ...
bool m_createIfMissing
Whether or not the backing store file should be created it if doesn't exist.
virtual bool Store()
Stores the current parameters into the JSON document represented by this object Note: this doesn't do...
static LIB_SYMBOL * dummy()
Used to draw a dummy shape when a LIB_SYMBOL is not found in library.
Definition: sch_symbol.cpp:74

References dummy(), JSON_SETTINGS::getFileExt(), JSON_SETTINGS::GetFullFilename(), JSON_SETTINGS::m_createIfDefault, JSON_SETTINGS::m_createIfMissing, JSON_SETTINGS::m_filename, JSON_SETTINGS::m_internals, JSON_SETTINGS::m_nested_settings, JSON_SETTINGS::m_writeFile, path, JSON_SETTINGS::Store(), and traceSettings.

Referenced by JSON_SETTINGS::LoadFromFile(), SETTINGS_MANAGER::MigrateIfNeeded(), PANEL_COLOR_SETTINGS::OnThemeChanged(), PROJECT::PinLibrary(), PROJECT_FILE::SaveAs(), PROJECT_LOCAL_SETTINGS::SaveAs(), SETTINGS_MANAGER::SaveColorSettings(), PROJECT_FILE::SaveToFile(), PROJECT_LOCAL_SETTINGS::SaveToFile(), PGM_BASE::SetLanguage(), and PROJECT::UnpinLibrary().

◆ Set() [1/3]

template<typename ValueType >
template void JSON_SETTINGS::Set< const char * > ( const std::string &  aPath,
ValueType  aVal 
)
inherited

Stores a value into the JSON document Will throw an exception if ValueType isn't something that the library can handle.

Template Parameters
ValueTypeis the type to store
Parameters
aPathis a path to store in the form "key1.key2.key3"
aValis the value to store

Definition at line 524 of file json_settings.cpp.

525{
526 m_internals->SetFromString( aPath, aVal );
527}

References JSON_SETTINGS::m_internals.

Referenced by COLOR_SETTINGS::COLOR_SETTINGS(), EDA_3D_VIEWER_SETTINGS::EDA_3D_VIEWER_SETTINGS(), EESCHEMA_SETTINGS::EESCHEMA_SETTINGS(), BOARD_DESIGN_SETTINGS::LoadFromFile(), APP_SETTINGS_BASE::migrateFindReplace(), PROJECT_FILE::MigrateFromLegacy(), APP_SETTINGS_BASE::MigrateFromLegacy(), EDA_3D_VIEWER_SETTINGS::MigrateFromLegacy(), EESCHEMA_SETTINGS::MigrateFromLegacy(), SYMBOL_EDITOR_SETTINGS::MigrateFromLegacy(), GERBVIEW_SETTINGS::MigrateFromLegacy(), FOOTPRINT_EDITOR_SETTINGS::MigrateFromLegacy(), MigrateFromLegacy(), KICAD_SETTINGS::MigrateFromLegacy(), PCBNEW_SETTINGS::MigrateFromLegacy(), BOARD_DESIGN_SETTINGS::migrateSchema0to1(), FOOTPRINT_EDITOR_SETTINGS::migrateSchema0to1(), COLOR_SETTINGS::migrateSchema0to1(), PCBNEW_SETTINGS::PCBNEW_SETTINGS(), PROJECT_FILE::SaveAs(), PROJECT_LOCAL_SETTINGS::SaveAs(), PROJECT_FILE::SaveToFile(), PROJECT_LOCAL_SETTINGS::SaveToFile(), SCHEMATIC_SETTINGS::SCHEMATIC_SETTINGS(), COLOR_MAP_PARAM::Store(), PARAM< ValueType >::Store(), PARAM_PATH::Store(), PARAM_ENUM< EnumType >::Store(), PARAM_LAMBDA< ValueType >::Store(), PARAM_SCALED< ValueType >::Store(), PARAM_LIST< Type >::Store(), PARAM_SET< Type >::Store(), PARAM_PATH_LIST::Store(), and PARAM_MAP< Value >::Store().

◆ Set() [2/3]

template<>
void JSON_SETTINGS::Set ( const std::string &  aPath,
wxString  aVal 
)
inherited

Definition at line 782 of file json_settings.cpp.

783{
784 ( *m_internals )[aPath] = aVal.ToUTF8();
785}

◆ Set() [3/3]

template<>
void JSON_SETTINGS::Set ( const std::string &  aPath,
wxString  aVal 
)
inherited

◆ SetFilename()

void JSON_SETTINGS::SetFilename ( const wxString &  aFilename)
inlineinherited

◆ SetIfPresent() [1/4]

bool JSON_SETTINGS::SetIfPresent ( const nlohmann::json aObj,
const std::string &  aPath,
bool &  aTarget 
)
staticinherited

Sets the given bool if the given key/path is present.

Parameters
aObjis the source object
aTargetis the storage destination
Returns
True if set, false if not

Definition at line 609 of file json_settings.cpp.

611{
612 nlohmann::json::json_pointer ptr = JSON_SETTINGS_INTERNALS::PointerFromString( aPath );
613
614 if( aObj.contains( ptr ) && aObj.at( ptr ).is_boolean() )
615 {
616 aTarget = aObj.at( ptr ).get<bool>();
617 return true;
618 }
619
620 return false;
621}

References JSON_SETTINGS_INTERNALS::PointerFromString().

◆ SetIfPresent() [2/4]

bool JSON_SETTINGS::SetIfPresent ( const nlohmann::json aObj,
const std::string &  aPath,
int &  aTarget 
)
staticinherited

Sets the given int if the given key/path is present.

Parameters
aObjis the source object
aTargetis the storage destination
Returns
True if set, false if not

Definition at line 624 of file json_settings.cpp.

626{
627 nlohmann::json::json_pointer ptr = JSON_SETTINGS_INTERNALS::PointerFromString( aPath );
628
629 if( aObj.contains( ptr ) && aObj.at( ptr ).is_number_integer() )
630 {
631 aTarget = aObj.at( ptr ).get<int>();
632 return true;
633 }
634
635 return false;
636}

References JSON_SETTINGS_INTERNALS::PointerFromString().

◆ SetIfPresent() [3/4]

bool JSON_SETTINGS::SetIfPresent ( const nlohmann::json aObj,
const std::string &  aPath,
unsigned int &  aTarget 
)
staticinherited

Sets the given unsigned int if the given key/path is present.

Parameters
aObjis the source object
aTargetis the storage destination
Returns
True if set, false if not

Definition at line 639 of file json_settings.cpp.

641{
642 nlohmann::json::json_pointer ptr = JSON_SETTINGS_INTERNALS::PointerFromString( aPath );
643
644 if( aObj.contains( ptr ) && aObj.at( ptr ).is_number_unsigned() )
645 {
646 aTarget = aObj.at( ptr ).get<unsigned int>();
647 return true;
648 }
649
650 return false;
651}

References JSON_SETTINGS_INTERNALS::PointerFromString().

◆ SetIfPresent() [4/4]

bool JSON_SETTINGS::SetIfPresent ( const nlohmann::json aObj,
const std::string &  aPath,
wxString &  aTarget 
)
staticinherited

Sets the given string if the given key/path is present.

Parameters
aObjis the source object
aTargetis the storage destination
Returns
True if set, false if not

Definition at line 594 of file json_settings.cpp.

596{
597 nlohmann::json::json_pointer ptr = JSON_SETTINGS_INTERNALS::PointerFromString( aPath );
598
599 if( aObj.contains( ptr ) && aObj.at( ptr ).is_string() )
600 {
601 aTarget = aObj.at( ptr ).get<wxString>();
602 return true;
603 }
604
605 return false;
606}

References JSON_SETTINGS_INTERNALS::PointerFromString().

Referenced by FOOTPRINT_EDITOR_SETTINGS::FOOTPRINT_EDITOR_SETTINGS(), and PROJECT_LOCAL_SETTINGS::PROJECT_LOCAL_SETTINGS().

◆ SetLegacyFilename()

void JSON_SETTINGS::SetLegacyFilename ( const wxString &  aFilename)
inlineinherited

Definition at line 82 of file json_settings.h.

82{ m_legacy_filename = aFilename; }

References JSON_SETTINGS::m_legacy_filename.

Referenced by SYMBOL_EDITOR_SETTINGS::SYMBOL_EDITOR_SETTINGS().

◆ SetLocation()

void JSON_SETTINGS::SetLocation ( SETTINGS_LOC  aLocation)
inlineinherited

Definition at line 79 of file json_settings.h.

79{ m_location = aLocation; }

References JSON_SETTINGS::m_location.

Referenced by COLOR_SETTINGS::COLOR_SETTINGS().

◆ SetManager()

void JSON_SETTINGS::SetManager ( SETTINGS_MANAGER aManager)
inlineinherited

Definition at line 192 of file json_settings.h.

193 {
194 m_manager = aManager;
195 }

References JSON_SETTINGS::m_manager.

◆ SetReadOnly()

◆ Store()

bool JSON_SETTINGS::Store ( )
virtualinherited

Stores the current parameters into the JSON document represented by this object Note: this doesn't do any writing to disk; that's handled by SETTINGS_MANAGER.

Returns
true if any part of the JSON document was updated

Definition at line 353 of file json_settings.cpp.

354{
355 bool modified = false;
356
357 for( auto param : m_params )
358 {
359 modified |= !param->MatchesFile( this );
360 param->Store( this );
361 }
362
363 return modified;
364}

References JSON_SETTINGS::m_params.

Referenced by PANEL_FP_EDITOR_COLOR_SETTINGS::PANEL_FP_EDITOR_COLOR_SETTINGS(), SETTINGS_MANAGER::SaveColorSettings(), JSON_SETTINGS::SaveToFile(), and NESTED_SETTINGS::SaveToFile().

Member Data Documentation

◆ m_Appearance

◆ m_Backup

◆ m_createIfDefault

bool JSON_SETTINGS::m_createIfDefault
protectedinherited

Whether or not the backing store file should be created if all parameters are still at their default values.

Ignored if m_createIfMissing is false or m_writeFile is false.

Definition at line 303 of file json_settings.h.

Referenced by JSON_SETTINGS::SaveToFile().

◆ m_createIfMissing

bool JSON_SETTINGS::m_createIfMissing
protectedinherited

Whether or not the backing store file should be created it if doesn't exist.

Definition at line 297 of file json_settings.h.

Referenced by JSON_SETTINGS::SaveToFile().

◆ m_deleteLegacyAfterMigration

bool JSON_SETTINGS::m_deleteLegacyAfterMigration
protectedinherited

Whether or not to delete legacy file after migration.

Definition at line 309 of file json_settings.h.

Referenced by JSON_SETTINGS::LoadFromFile(), PROJECT_FILE::PROJECT_FILE(), and PROJECT_LOCAL_SETTINGS::PROJECT_LOCAL_SETTINGS().

◆ m_DoNotShowAgain

DO_NOT_SHOW_AGAIN COMMON_SETTINGS::m_DoNotShowAgain

Definition at line 188 of file common_settings.h.

◆ m_Env

◆ m_filename

◆ m_Graphics

◆ m_Input

◆ m_internals

◆ m_legacy_filename

wxString JSON_SETTINGS::m_legacy_filename
protectedinherited

The filename of the wxConfig legacy file (if different from m_filename)

Definition at line 285 of file json_settings.h.

Referenced by JSON_SETTINGS::LoadFromFile(), and JSON_SETTINGS::SetLegacyFilename().

◆ m_location

SETTINGS_LOC JSON_SETTINGS::m_location
protectedinherited

The location of this settings file (.

See also
SETTINGS_LOC)

Definition at line 288 of file json_settings.h.

Referenced by JSON_SETTINGS::GetLocation(), and JSON_SETTINGS::SetLocation().

◆ m_manager

SETTINGS_MANAGER* JSON_SETTINGS::m_manager
protectedinherited

A pointer to the settings manager managing this file (may be null)

Definition at line 318 of file json_settings.h.

Referenced by FOOTPRINT_EDITOR_SETTINGS::migrateSchema0to1(), COLOR_SETTINGS::migrateSchema0to1(), JSON_SETTINGS::ReleaseNestedSettings(), and JSON_SETTINGS::SetManager().

◆ m_migrators

std::map<int, std::pair<int, std::function<bool()> > > JSON_SETTINGS::m_migrators
protectedinherited

A map of starting schema version to a pair of <ending version, migrator function>

Definition at line 321 of file json_settings.h.

Referenced by JSON_SETTINGS::Migrate(), and JSON_SETTINGS::registerMigration().

◆ m_nested_settings

std::vector<NESTED_SETTINGS*> JSON_SETTINGS::m_nested_settings
protectedinherited

Nested settings files that live inside this one, if any.

Definition at line 294 of file json_settings.h.

Referenced by JSON_SETTINGS::AddNestedSettings(), JSON_SETTINGS::LoadFromFile(), JSON_SETTINGS::ReleaseNestedSettings(), and JSON_SETTINGS::SaveToFile().

◆ m_NetclassPanel

◆ m_PackageManager

PACKAGE_MANAGER COMMON_SETTINGS::m_PackageManager

◆ m_params

◆ m_resetParamsIfMissing

bool JSON_SETTINGS::m_resetParamsIfMissing
protectedinherited

Whether or not to set parameters to their default value if missing from JSON on Load()

Definition at line 312 of file json_settings.h.

Referenced by BOARD_DESIGN_SETTINGS::BOARD_DESIGN_SETTINGS(), and JSON_SETTINGS::Load().

◆ m_schemaVersion

int JSON_SETTINGS::m_schemaVersion
protectedinherited

◆ m_Session

◆ m_System

◆ m_writeFile

bool JSON_SETTINGS::m_writeFile
protectedinherited

The documentation for this class was generated from the following files: