30 #include <wx/config.h> 37 wxT(
"KICAD6_SYMBOL_DIR" ),
38 wxT(
"KICAD6_FOOTPRINT_DIR" ),
39 wxT(
"KICAD6_TEMPLATES_DIR" ),
40 wxT(
"KICAD6_3DMODEL_DIR" )
61 #if defined( __WXGTK__ ) || defined( __WXMSW__ ) 72 #if defined( __WXGTK__ ) || defined( __WXMSW__ ) 99 #if defined( __WXGTK__ ) && !wxCHECK_VERSION( 3, 1, 0 ) 131 for(
const std::pair<wxString, ENV_VAR_ITEM> entry :
m_Env.
vars )
133 const ENV_VAR_ITEM& var = entry.second;
135 wxASSERT( entry.first == var.GetKey() );
138 if( var.IsDefault() )
140 wxLogTrace( traceEnvVars,
141 "COMMON_SETTINGS: Env var %s skipping save (default)",
146 wxString value = var.GetValue();
150 if( var.GetDefinedExternally() )
152 if( var.GetDefinedInSettings() )
155 "COMMON_SETTINGS: Env var %s was overridden externally, " 156 "saving previously-loaded value %s",
157 var.GetKey(), var.GetSettingsValue() );
158 value = var.GetSettingsValue();
163 "COMMON_SETTINGS: Env var %s skipping save (external)",
170 "COMMON_SETTINGS: Saving env var %s = %s",
171 var.GetKey(), value);
173 std::string key( var.GetKey().ToUTF8() );
181 if( !aJson.is_object() )
184 for(
const auto& entry : aJson.items() )
186 wxString key = wxString( entry.key().c_str(), wxConvUTF8 );
187 wxString val = entry.value().get<wxString>();
189 if( m_Env.vars.count( key ) )
191 if( m_Env.vars[key].GetDefinedExternally() )
193 wxLogTrace(
traceEnvVars,
"COMMON_SETTINGS: %s is defined externally",
195 m_Env.vars[key].SetDefinedInSettings();
196 m_Env.vars[key].SetSettingsValue( val );
201 wxLogTrace(
traceEnvVars,
"COMMON_SETTINGS: Updating %s: %s -> %s",
202 key, m_Env.vars[key].GetValue(), val );
203 m_Env.vars[key].SetValue( val );
208 wxLogTrace(
traceEnvVars,
"COMMON_SETTINGS: Loaded new var: %s = %s",
213 m_Env.vars[key].SetDefinedInSettings();
214 m_Env.vars[key].SetSettingsValue( val );
219 m_params.emplace_back(
new PARAM<bool>(
"input.auto_pan", &m_Input.auto_pan,
false ) );
221 m_params.emplace_back(
new PARAM<int>(
"input.auto_pan_acceleration",
222 &m_Input.auto_pan_acceleration, 5 ) );
224 m_params.emplace_back(
new PARAM<bool>(
"input.center_on_zoom",
225 &m_Input.center_on_zoom,
true ) );
227 m_params.emplace_back(
new PARAM<bool>(
"input.immediate_actions",
228 &m_Input.immediate_actions,
true ) );
230 m_params.emplace_back(
new PARAM<bool>(
"input.warp_mouse_on_move",
231 &m_Input.warp_mouse_on_move,
true ) );
233 m_params.emplace_back(
new PARAM<bool>(
"input.horizontal_pan",
234 &m_Input.horizontal_pan,
false ) );
236 m_params.emplace_back(
new PARAM<bool>(
"input.zoom_acceleration",
237 &m_Input.zoom_acceleration,
false ) );
240 int default_zoom_speed = 5;
242 int default_zoom_speed = 1;
245 m_params.emplace_back(
new PARAM<int>(
"input.zoom_speed",
246 &m_Input.zoom_speed, default_zoom_speed ) );
248 m_params.emplace_back(
new PARAM<bool>(
"input.zoom_speed_auto",
249 &m_Input.zoom_speed_auto,
true ) );
251 m_params.emplace_back(
new PARAM<int>(
"input.scroll_modifier_zoom",
252 &m_Input.scroll_modifier_zoom, 0 ) );
254 m_params.emplace_back(
new PARAM<int>(
"input.scroll_modifier_pan_h",
255 &m_Input.scroll_modifier_pan_h, WXK_CONTROL ) );
257 m_params.emplace_back(
new PARAM<int>(
"input.scroll_modifier_pan_v",
258 &m_Input.scroll_modifier_pan_v, WXK_SHIFT ) );
272 m_params.emplace_back(
new PARAM<int>(
"graphics.opengl_antialiasing_mode",
273 &m_Graphics.opengl_aa_mode, 0, 0, 2 ) );
275 m_params.emplace_back(
new PARAM<int>(
"graphics.cairo_antialiasing_mode",
276 &m_Graphics.cairo_aa_mode, 0, 0, 2 ) );
278 m_params.emplace_back(
new PARAM<int>(
"system.autosave_interval",
279 &m_System.autosave_interval, 600 ) );
283 &m_System.text_editor,
"/usr/bin/open -e" ) );
286 &m_System.text_editor,
"" ) );
289 m_params.emplace_back(
new PARAM<int>(
"system.file_history_size",
290 &m_System.file_history_size, 9 ) );
293 &m_System.language,
"Default" ) );
296 &m_System.pdf_viewer_name,
"" ) );
298 m_params.emplace_back(
new PARAM<bool>(
"system.use_system_pdf_viewer",
299 &m_System.use_system_pdf_viewer,
true ) );
302 &m_System.working_dir,
"" ) );
304 m_params.emplace_back(
new PARAM<int>(
"system.clear_3d_cache_interval",
305 &m_System.clear_3d_cache_interval, 30 ) );
307 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.zone_fill_warning",
308 &m_DoNotShowAgain.zone_fill_warning,
false ) );
310 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.env_var_overwrite_warning",
311 &m_DoNotShowAgain.env_var_overwrite_warning,
false ) );
313 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.scaled_3d_models_warning",
314 &m_DoNotShowAgain.scaled_3d_models_warning,
false ) );
316 m_params.emplace_back(
new PARAM<bool>(
"session.remember_open_files",
317 &m_Session.remember_open_files,
false ) );
319 m_params.emplace_back(
new PARAM<int>(
"netclass_panel.sash_pos",
320 &m_NetclassPanel.sash_pos, 160 ) );
322 m_params.emplace_back(
new PARAM<int>(
"package_manager.sash_pos",
323 &m_PackageManager.sash_pos, 380 ) );
338 nlohmann::json::json_pointer mwp_pointer(
"/input/mousewheel_pan"_json_pointer );
345 m_internals->At(
"input" ).erase(
"mousewheel_pan" );
349 wxLogTrace(
traceSettings, wxT(
"COMMON_SETTINGS::Migrate 0->1: mousewheel_pan not found" ) );
354 ( *m_internals )[nlohmann::json::json_pointer(
"/input/horizontal_pan" )] =
true;
356 ( *m_internals )[nlohmann::json::json_pointer(
"/input/scroll_modifier_pan_h" )] = WXK_SHIFT;
357 ( *m_internals )[nlohmann::json::json_pointer(
"/input/scroll_modifier_pan_v" )] = 0;
358 ( *m_internals )[nlohmann::json::json_pointer(
"/input/scroll_modifier_zoom" )] = WXK_CONTROL;
362 ( *m_internals )[nlohmann::json::json_pointer(
"/input/horizontal_pan" )] =
false;
364 ( *m_internals )[nlohmann::json::json_pointer(
"/input/scroll_modifier_pan_h" )] = WXK_CONTROL;
365 ( *m_internals )[nlohmann::json::json_pointer(
"/input/scroll_modifier_pan_v" )] = WXK_SHIFT;
366 ( *m_internals )[nlohmann::json::json_pointer(
"/input/scroll_modifier_zoom" )] = 0;
375 nlohmann::json::json_pointer v1_pointer(
"/input/prefer_select_to_drag"_json_pointer );
377 bool prefer_selection =
false;
382 m_internals->at( nlohmann::json::json_pointer(
"/input"_json_pointer ) ).erase(
"prefer_select_to_drag" );
386 wxLogTrace(
traceSettings, wxT(
"COMMON_SETTINGS::Migrate 1->2: prefer_select_to_drag not found" ) );
389 if( prefer_selection )
402 ret &= fromLegacy<double>( aCfg,
"CanvasScale",
"appearance.canvas_scale" );
403 ret &= fromLegacy<int>( aCfg,
"IconScale",
"appearance.icon_scale" );
404 ret &= fromLegacy<bool>( aCfg,
"UseIconsInMenus",
"appearance.use_icons_in_menus" );
405 ret &= fromLegacy<bool>( aCfg,
"ShowEnvVarWarningDialog",
"environment.show_warning_dialog" );
412 nlohmann::json::json_pointer ptr =
m_internals->PointerFromString(
"environment.vars" );
414 aCfg->SetPath(
"EnvironmentVariables" );
417 while( aCfg->GetNextEntry( key, index ) )
421 wxLogTrace(
traceSettings, wxT(
"Migrate Env: %s is blacklisted; skipping." ), key );
425 value = aCfg->Read( key, wxEmptyString );
427 if( !value.IsEmpty() )
429 ptr.push_back( key.ToStdString() );
431 wxLogTrace(
traceSettings, wxT(
"Migrate Env: %s=%s" ), ptr.to_string(), value );
432 ( *m_internals )[ptr] = value.ToUTF8();
438 aCfg->SetPath(
".." );
443 bool mousewheel_pan =
false;
445 if( aCfg->Read(
"MousewheelPAN", &mousewheel_pan ) && mousewheel_pan )
447 Set(
"input.horizontal_pan",
true );
448 Set(
"input.scroll_modifier_pan_h", static_cast<int>( WXK_SHIFT ) );
449 Set(
"input.scroll_modifier_pan_v", 0 );
450 Set(
"input.scroll_modifier_zoom", static_cast<int>( WXK_CONTROL ) );
453 ret &= fromLegacy<bool>( aCfg,
"AutoPAN",
"input.auto_pan" );
454 ret &= fromLegacy<bool>( aCfg,
"ImmediateActions",
"input.immediate_actions" );
455 ret &= fromLegacy<bool>( aCfg,
"PreferSelectionToDragging",
"input.prefer_select_to_drag" );
456 ret &= fromLegacy<bool>( aCfg,
"MoveWarpsCursor",
"input.warp_mouse_on_move" );
457 ret &= fromLegacy<bool>( aCfg,
"ZoomNoCenter",
"input.center_on_zoom" );
460 if(
OPT<bool> value = Get<bool>(
"input.center_on_zoom" ) )
461 Set(
"input.center_on_zoom", !( *value ) );
463 ret &= fromLegacy<int>( aCfg,
"OpenGLAntialiasingMode",
"graphics.opengl_antialiasing_mode" );
464 ret &= fromLegacy<int>( aCfg,
"CairoAntialiasingMode",
"graphics.cairo_antialiasing_mode" );
466 ret &= fromLegacy<int>( aCfg,
"AutoSaveInterval",
"system.autosave_interval" );
468 ret &= fromLegacy<int>( aCfg,
"FileHistorySize",
"system.file_history_size" );
470 ret &=
fromLegacyString( aCfg,
"PdfBrowserName",
"system.pdf_viewer_name" );
471 ret &= fromLegacy<bool>( aCfg,
"UseSystemBrowser",
"system.use_system_pdf_viewer" );
481 [&](
const wxString& aKey,
const wxString& aDefault )
487 if( wxGetEnv( aKey, &envValue ) ==
true && !envValue.IsEmpty() )
492 "InitializeEnvironment: Entry %s defined externally as %s", aKey,
497 wxLogTrace(
traceEnvVars,
"InitializeEnvironment: Setting entry %s to default %s",
504 wxFileName
path( basePath );
505 path.AppendDir( wxT(
"footprints" ) );
506 addVar( wxT(
"KICAD6_FOOTPRINT_DIR" ),
path.GetFullPath() );
509 path.AppendDir( wxT(
"3dmodels" ) );
510 addVar( wxT(
"KICAD6_3DMODEL_DIR" ),
path.GetFullPath() );
519 path.AppendDir( wxT(
"symbols" ) );
520 addVar( wxT(
"KICAD6_SYMBOL_DIR" ),
path.GetFullPath() );
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...
std::vector< PARAM_BASE * > m_params
The list of parameters (owned by this object)
unsigned long long limit_total_size
Maximum total size of backups (bytes), 0 for unlimited.
KiCad uses environment variables internally for determining the base paths for libraries,...
const int commonSchemaVersion
! Update the schema version whenever a migration is required
bool enabled
Automatically back up the project when files are saved.
System directories search utilities.
Stores an enum as an integer.
virtual bool MigrateFromLegacy(wxConfigBase *aLegacyConfig) override
Migrates from wxConfig to JSON-based configuration.
static wxString GetStockTemplatesPath()
Gets the stock (install) templates path.
void InitializeEnvironment()
Creates the built-in environment variables and sets their default values.
std::unique_ptr< JSON_SETTINGS_INTERNALS > m_internals
static wxString GetUserTemplatesPath()
Gets the user path for custom templates.
wxLogTrace helper definitions.
const wxChar *const traceEnvVars
Flag to enable debug output of environment variable operations.
int min_interval
Minimum time, in seconds, between subsequent backups.
bool fromLegacyString(wxConfigBase *aConfig, const std::string &aKey, const std::string &aDest)
Translates a legacy wxConfig string value to a given JSON pointer value.
bool apply_icon_scale_to_fonts
const std::set< wxString > envVarBlacklist
! The following environment variables will never be migrated from a previous version
The main config directory (e.g. ~/.config/kicad/)
static wxString GetStockEDALibraryPath()
Gets the stock (install) EDA library data path, which is the base path for templates,...
bool backup_on_autosave
Trigger a backup on autosave.
int limit_daily_files
Maximum files to keep per day, 0 for unlimited.
const wxChar *const traceSettings
Flag to enable debug output of settings operations and management.
static wxString GetDefault3rdPartyPath()
Gets the default path for PCM packages.
int limit_total_files
Maximum number of backup archives to retain.