72#if defined( __WXGTK__ ) || defined( __WXMSW__ )
79#
if defined( __WXMSW__ )
128 &
m_Appearance.zoom_correction_factor, 1.0, 0.1, 10.0 ) );
140 &
m_Backup.limit_total_size, 104857600 ) );
143 [&]() -> nlohmann::json
145 nlohmann::json ret = nlohmann::json::object();
147 for( const std::pair<wxString, ENV_VAR_ITEM> entry : m_Env.vars )
149 const ENV_VAR_ITEM& var = entry.second;
151 wxASSERT( entry.first == var.GetKey() );
154 if( var.IsDefault() )
156 wxLogTrace( traceEnvVars,
157 wxS(
"COMMON_SETTINGS: Env var %s skipping save (default)" ),
162 wxString value = var.GetValue();
164 value.Trim( true ).Trim( false );
168 if( var.GetDefinedExternally() )
170 if( var.GetDefinedInSettings() )
172 wxLogTrace( traceEnvVars,
173 wxS(
"COMMON_SETTINGS: Env var %s was overridden "
174 "externally, saving previously-loaded value %s" ),
175 var.GetKey(), var.GetSettingsValue() );
176 value = var.GetSettingsValue();
180 wxLogTrace( traceEnvVars,
181 wxS(
"COMMON_SETTINGS: Env var %s skipping save "
188 wxLogTrace( traceEnvVars,
189 wxS(
"COMMON_SETTINGS: Saving env var %s = %s" ),
190 var.GetKey(), value);
192 std::string key( var.GetKey().Trim( true ).Trim( false ).ToUTF8() );
193 ret[ std::move( key ) ] = value;
198 [&](
const nlohmann::json& aJson )
200 if( !aJson.is_object() )
203 for(
const auto& entry : aJson.items() )
205 wxString key = wxString( entry.key().c_str(), wxConvUTF8 ).Trim(
true ).Trim(
false );
206 wxString val = entry.value().get<wxString>().Trim(
true ).Trim(
false );
208 if( m_Env.vars.count( key ) )
210 if( m_Env.vars[key].GetDefinedExternally() )
213 wxS(
"COMMON_SETTINGS: %s is defined externally" ),
215 m_Env.vars[key].SetDefinedInSettings();
216 m_Env.vars[key].SetSettingsValue( val );
222 wxS(
"COMMON_SETTINGS: Updating %s: %s -> %s"),
223 key, m_Env.vars[key].GetValue(), val );
224 m_Env.vars[key].SetValue( val );
230 wxS(
"COMMON_SETTINGS: Loaded new var: %s = %s" ),
235 m_Env.vars[key].SetDefinedInSettings();
236 m_Env.vars[key].SetSettingsValue( val );
240 envVarsParam->SetClearUnknownKeys();
242 m_params.emplace_back(
new PARAM<bool>(
"input.focus_follow_sch_pcb",
243 &m_Input.focus_follow_sch_pcb,
false ) );
245 m_params.emplace_back(
new PARAM<bool>(
"input.auto_pan", &m_Input.auto_pan,
false ) );
247 m_params.emplace_back(
new PARAM<int>(
"input.auto_pan_acceleration",
248 &m_Input.auto_pan_acceleration, 5 ) );
250 m_params.emplace_back(
new PARAM<bool>(
"input.center_on_zoom",
251 &m_Input.center_on_zoom,
true ) );
253 m_params.emplace_back(
new PARAM<bool>(
"input.immediate_actions",
254 &m_Input.immediate_actions,
true ) );
256 m_params.emplace_back(
new PARAM<bool>(
"input.warp_mouse_on_move",
257 &m_Input.warp_mouse_on_move,
true ) );
259 m_params.emplace_back(
new PARAM<bool>(
"input.horizontal_pan",
260 &m_Input.horizontal_pan,
true ) );
262 m_params.emplace_back(
new PARAM<bool>(
"input.hotkey_feedback",
263 &m_Input.hotkey_feedback,
true ) );
265 m_params.emplace_back(
new PARAM<bool>(
"input.zoom_acceleration",
266 &m_Input.zoom_acceleration,
false ) );
269 int default_zoom_speed = 5;
271 int default_zoom_speed = 1;
274 m_params.emplace_back(
new PARAM<int>(
"input.zoom_speed",
275 &m_Input.zoom_speed, default_zoom_speed ) );
277 m_params.emplace_back(
new PARAM<bool>(
"input.zoom_speed_auto",
278 &m_Input.zoom_speed_auto,
true ) );
290 m_params.emplace_back(
new PARAM<int>(
"input.scroll_modifier_zoom",
291 &m_Input.scroll_modifier_zoom, 0 ) );
293 m_params.emplace_back(
new PARAM<int>(
"input.scroll_modifier_pan_h",
294 &m_Input.scroll_modifier_pan_h, WXK_CONTROL ) );
296 m_params.emplace_back(
new PARAM<int>(
"input.scroll_modifier_pan_v",
297 &m_Input.scroll_modifier_pan_v, WXK_SHIFT ) );
299 m_params.emplace_back(
new PARAM<int>(
"input.motion_pan_modifier",
300 &m_Input.motion_pan_modifier, 0 ) );
302 m_params.emplace_back(
new PARAM<bool>(
"input.reverse_scroll_zoom",
303 &m_Input.reverse_scroll_zoom,
false ) );
305 m_params.emplace_back(
new PARAM<bool>(
"input.reverse_scroll_pan_h",
306 &m_Input.reverse_scroll_pan_h,
false ) );
320 m_params.emplace_back(
new PARAM<int>(
"spacemouse.rotate_speed",
321 &m_SpaceMouse.rotate_speed, 5, 1, 10 ) );
323 m_params.emplace_back(
new PARAM<int>(
"spacemouse.pan_speed",
324 &m_SpaceMouse.pan_speed, 5, 1, 10 ) );
326 m_params.emplace_back(
new PARAM<bool>(
"spacemouse.reverse_rotate",
327 &m_SpaceMouse.reverse_rotate,
false ) );
329 m_params.emplace_back(
new PARAM<bool>(
"spacemouse.reverse_pan_x",
330 &m_SpaceMouse.reverse_pan_x,
false ) );
332 m_params.emplace_back(
new PARAM<bool>(
"spacemouse.reverse_pan_y",
333 &m_SpaceMouse.reverse_pan_y,
false ) );
335 m_params.emplace_back(
new PARAM<bool>(
"spacemouse.reverse_zoom",
336 &m_SpaceMouse.reverse_zoom,
false ) );
338 m_params.emplace_back(
new PARAM<int>(
"graphics.canvas_type",
341 m_params.emplace_back(
new PARAM<int>(
"graphics.antialiasing_mode",
342 &m_Graphics.aa_mode, 2, 0, 2 ) );
344 m_params.emplace_back(
new PARAM<int>(
"system.local_history_debounce",
345 &m_System.local_history_debounce, 5, 0, 100000 ) );
349 &m_System.text_editor, wxS(
"/usr/bin/open -e" ) ) );
352 &m_System.text_editor, wxS(
"" ) ) );
355#if defined( __WINDOWS__ )
357 &m_System.file_explorer, wxS(
"explorer.exe /n,/select,%F" ) ) );
360 &m_System.file_explorer, wxS(
"" ) ) );
363 m_params.emplace_back(
new PARAM<int>(
"system.file_history_size",
364 &m_System.file_history_size, 9 ) );
367 &m_System.language, wxS(
"Default" ) ) );
370 &m_System.pdf_viewer_name, wxS(
"" ) ) );
372 m_params.emplace_back(
new PARAM<bool>(
"system.use_system_pdf_viewer",
373 &m_System.use_system_pdf_viewer,
true ) );
376 &m_System.working_dir, wxS(
"" ) ) );
378 m_params.emplace_back(
new PARAM<int>(
"system.clear_3d_cache_interval",
379 &m_System.clear_3d_cache_interval, 30 ) );
381 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.zone_fill_warning",
382 &m_DoNotShowAgain.zone_fill_warning,
false ) );
384 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.env_var_overwrite_warning",
385 &m_DoNotShowAgain.env_var_overwrite_warning,
false ) );
387 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.scaled_3d_models_warning",
388 &m_DoNotShowAgain.scaled_3d_models_warning,
false ) );
390 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.data_collection_prompt",
391 &m_DoNotShowAgain.data_collection_prompt,
false ) );
393 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.update_check_prompt",
394 &m_DoNotShowAgain.update_check_prompt,
false ) );
396 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.migrate_wrl_prompt",
397 &m_DoNotShowAgain.migrate_wrl_prompt,
false ) );
399 m_params.emplace_back(
new PARAM<bool>(
"embed_file_defaults.datasheet", &m_EmbedFileDefaults.datasheet,
true ) );
401 m_params.emplace_back(
402 new PARAM<bool>(
"embed_file_defaults.drawing_sheet", &m_EmbedFileDefaults.drawing_sheet,
true ) );
404 m_params.emplace_back(
new PARAM<bool>(
"embed_file_defaults.model_3d", &m_EmbedFileDefaults.model_3d,
false ) );
406 m_params.emplace_back(
new PARAM<bool>(
"embed_file_defaults.sim_model", &m_EmbedFileDefaults.sim_model,
false ) );
409 &m_Extra3DSearchDirs, {} ) );
411 m_params.emplace_back(
new PARAM<bool>(
"session.remember_open_files",
412 &m_Session.remember_open_files,
false ) );
415 &m_Session.pinned_symbol_libs, {} ) );
418 &m_Session.pinned_fp_libs, {} ) );
421 &m_Session.pinned_design_block_libs, {} ) );
426 if( m_FieldNameTemplates.GetTemplateFieldNames( TEMPLATES::SCOPE::GLOBAL ).empty() )
430 m_FieldNameTemplates.Format( &formatter, TEMPLATES::SCOPE::GLOBAL );
433 [&](
const std::string& aSerializedTemplates )
435 m_FieldNameTemplates.DeleteFieldNameTemplates( TEMPLATES::SCOPE::GLOBAL );
437 if( !aSerializedTemplates.empty() )
439 m_FieldNameTemplates.AddTemplateFieldNames(
440 wxString::FromUTF8( aSerializedTemplates ), TEMPLATES::SCOPE::GLOBAL );
444 m_params.emplace_back(
new PARAM<int>(
"package_manager.sash_pos",
445 &m_PackageManager.sash_pos, 380 ) );
448 [&]() -> nlohmann::json
450 nlohmann::json ret = nlohmann::json::array();
452 for( const GIT_REPOSITORY& repo : m_Git.repositories )
454 nlohmann::json repoJson = {};
456 repoJson[
"name"] = repo.name;
457 repoJson[
"path"] = repo.path;
458 repoJson[
"authType"] = repo.authType;
459 repoJson[
"username"] = repo.username;
460 repoJson[
"ssh_path"] = repo.ssh_path;
461 repoJson[
"active"] = repo.active;
463 ret.push_back( repoJson );
468 [&](
const nlohmann::json& aJson )
470 if( !aJson.is_array() )
473 m_Git.repositories.clear();
475 for(
const auto& repoJson : aJson )
479 repo.name = repoJson[
"name"].get<wxString>();
480 repo.path = repoJson[
"path"].get<wxString>();
481 repo.authType = repoJson[
"authType"].get<wxString>();
482 repo.username = repoJson[
"username"].get<wxString>();
483 repo.ssh_path = repoJson[
"ssh_path"].get<wxString>();
484 repo.active = repoJson[
"active"].get<
bool>();
485 repo.checkValid =
true;
487 m_Git.repositories.push_back( repo );
493 &m_Git.authorName, wxS(
"" ) ) );
496 &m_Git.authorEmail, wxS(
"" ) ) );
498 m_params.emplace_back(
new PARAM<bool>(
"git.useDefaultAuthor",
499 &m_Git.useDefaultAuthor,
true ) );
501 m_params.emplace_back(
new PARAM<bool>(
"git.enableGit",
502 &m_Git.enableGit,
true ) );
504 m_params.emplace_back(
new PARAM<int>(
"git.updatInterval",
505 &m_Git.updatInterval, 5 ) );
508 &m_Api.python_interpreter, wxS(
"" ) ) );
510 m_params.emplace_back(
new PARAM<bool>(
"api.enable_server",
511 &m_Api.enable_server,
false ) );
514 [&]() -> nlohmann::json
516 nlohmann::json ret = nlohmann::json::object();
518 for( const auto& dlg : m_csInternals->m_dialogControlValues )
519 ret[ dlg.first ] = dlg.second;
523 [&](
const nlohmann::json& aVal )
525 m_csInternals->m_dialogControlValues.clear();
527 if( !aVal.is_object() )
530 for( auto& [dlgKey, dlgVal] : aVal.items() )
532 if( !dlgVal.is_object() )
535 for( auto& [ctrlKey, ctrlVal] : dlgVal.items() )
536 m_csInternals->m_dialogControlValues[ dlgKey ][ ctrlKey ] = ctrlVal;
539 nlohmann::json::object() ) );
542 m_params.back()->SetClearUnknownKeys();