70#if defined( __WXGTK__ ) || defined( __WXMSW__ )
77#
if defined( __WXMSW__ )
126 &
m_Appearance.zoom_correction_factor, 1.0, 0.1, 10.0 ) );
138 &
m_Backup.limit_total_size, 104857600 ) );
141 [&]() -> nlohmann::json
143 nlohmann::json ret = {};
145 for(
const std::pair<wxString, ENV_VAR_ITEM> entry :
m_Env.vars )
147 const ENV_VAR_ITEM& var = entry.second;
149 wxASSERT( entry.first == var.GetKey() );
152 if( var.IsDefault() )
154 wxLogTrace( traceEnvVars,
155 wxS(
"COMMON_SETTINGS: Env var %s skipping save (default)" ),
160 wxString value = var.GetValue();
162 value.Trim(
true ).Trim(
false );
166 if( var.GetDefinedExternally() )
168 if( var.GetDefinedInSettings() )
170 wxLogTrace( traceEnvVars,
171 wxS(
"COMMON_SETTINGS: Env var %s was overridden "
172 "externally, saving previously-loaded value %s" ),
173 var.GetKey(), var.GetSettingsValue() );
174 value = var.GetSettingsValue();
178 wxLogTrace( traceEnvVars,
179 wxS(
"COMMON_SETTINGS: Env var %s skipping save "
187 wxS(
"COMMON_SETTINGS: Saving env var %s = %s" ),
188 var.GetKey(), value);
190 std::string key( var.GetKey().Trim(
true ).Trim(
false ).ToUTF8() );
191 ret[ std::move( key ) ] = value;
196 [&](
const nlohmann::json& aJson )
198 if( !aJson.is_object() )
201 for(
const auto& entry : aJson.items() )
203 wxString key = wxString( entry.key().c_str(), wxConvUTF8 ).Trim(
true ).Trim(
false );
204 wxString val = entry.value().get<wxString>().Trim(
true ).Trim(
false );
206 if( m_Env.vars.count( key ) )
208 if( m_Env.vars[key].GetDefinedExternally() )
211 wxS(
"COMMON_SETTINGS: %s is defined externally" ),
213 m_Env.vars[key].SetDefinedInSettings();
214 m_Env.vars[key].SetSettingsValue( val );
220 wxS(
"COMMON_SETTINGS: Updating %s: %s -> %s"),
221 key, m_Env.vars[key].GetValue(), val );
222 m_Env.vars[key].SetValue( val );
228 wxS(
"COMMON_SETTINGS: Loaded new var: %s = %s" ),
233 m_Env.vars[key].SetDefinedInSettings();
234 m_Env.vars[key].SetSettingsValue( val );
238 envVarsParam->SetClearUnknownKeys();
240 m_params.emplace_back(
new PARAM<bool>(
"input.focus_follow_sch_pcb",
241 &m_Input.focus_follow_sch_pcb,
false ) );
243 m_params.emplace_back(
new PARAM<bool>(
"input.auto_pan", &m_Input.auto_pan,
false ) );
245 m_params.emplace_back(
new PARAM<int>(
"input.auto_pan_acceleration",
246 &m_Input.auto_pan_acceleration, 5 ) );
248 m_params.emplace_back(
new PARAM<bool>(
"input.center_on_zoom",
249 &m_Input.center_on_zoom,
true ) );
251 m_params.emplace_back(
new PARAM<bool>(
"input.immediate_actions",
252 &m_Input.immediate_actions,
true ) );
254 m_params.emplace_back(
new PARAM<bool>(
"input.warp_mouse_on_move",
255 &m_Input.warp_mouse_on_move,
true ) );
257 m_params.emplace_back(
new PARAM<bool>(
"input.horizontal_pan",
258 &m_Input.horizontal_pan,
false ) );
260 m_params.emplace_back(
new PARAM<bool>(
"input.hotkey_feedback",
261 &m_Input.hotkey_feedback,
true ) );
263 m_params.emplace_back(
new PARAM<bool>(
"input.zoom_acceleration",
264 &m_Input.zoom_acceleration,
false ) );
267 int default_zoom_speed = 5;
269 int default_zoom_speed = 1;
272 m_params.emplace_back(
new PARAM<int>(
"input.zoom_speed",
273 &m_Input.zoom_speed, default_zoom_speed ) );
275 m_params.emplace_back(
new PARAM<bool>(
"input.zoom_speed_auto",
276 &m_Input.zoom_speed_auto,
true ) );
278 m_params.emplace_back(
new PARAM<int>(
"input.scroll_modifier_zoom",
279 &m_Input.scroll_modifier_zoom, 0 ) );
281 m_params.emplace_back(
new PARAM<int>(
"input.scroll_modifier_pan_h",
282 &m_Input.scroll_modifier_pan_h, WXK_CONTROL ) );
284 m_params.emplace_back(
new PARAM<int>(
"input.scroll_modifier_pan_v",
285 &m_Input.scroll_modifier_pan_v, WXK_SHIFT ) );
287 m_params.emplace_back(
new PARAM<int>(
"input.motion_pan_modifier",
288 &m_Input.motion_pan_modifier, 0 ) );
290 m_params.emplace_back(
new PARAM<bool>(
"input.reverse_scroll_zoom",
291 &m_Input.reverse_scroll_zoom,
false ) );
293 m_params.emplace_back(
new PARAM<bool>(
"input.reverse_scroll_pan_h",
294 &m_Input.reverse_scroll_pan_h,
false ) );
308 m_params.emplace_back(
new PARAM<int>(
"spacemouse.rotate_speed",
309 &m_SpaceMouse.rotate_speed, 5, 1, 10 ) );
311 m_params.emplace_back(
new PARAM<int>(
"spacemouse.pan_speed",
312 &m_SpaceMouse.pan_speed, 5, 1, 10 ) );
314 m_params.emplace_back(
new PARAM<bool>(
"spacemouse.reverse_rotate",
315 &m_SpaceMouse.reverse_rotate,
false ) );
317 m_params.emplace_back(
new PARAM<bool>(
"spacemouse.reverse_pan_x",
318 &m_SpaceMouse.reverse_pan_x,
false ) );
320 m_params.emplace_back(
new PARAM<bool>(
"spacemouse.reverse_pan_y",
321 &m_SpaceMouse.reverse_pan_y,
false ) );
323 m_params.emplace_back(
new PARAM<bool>(
"spacemouse.reverse_zoom",
324 &m_SpaceMouse.reverse_zoom,
false ) );
326 m_params.emplace_back(
new PARAM<int>(
"graphics.canvas_type",
329 m_params.emplace_back(
new PARAM<int>(
"graphics.antialiasing_mode",
330 &m_Graphics.aa_mode, 2, 0, 2 ) );
332 m_params.emplace_back(
new PARAM<bool>(
"system.local_history_enabled",
333 &m_System.local_history_enabled,
true ) );
334 m_params.emplace_back(
new PARAM<int>(
"system.local_history_debounce",
335 &m_System.local_history_debounce, 5, 0, 100000 ) );
339 &m_System.text_editor, wxS(
"/usr/bin/open -e" ) ) );
342 &m_System.text_editor, wxS(
"" ) ) );
345#if defined( __WINDOWS__ )
347 &m_System.file_explorer, wxS(
"explorer.exe /n,/select,%F" ) ) );
350 &m_System.file_explorer, wxS(
"" ) ) );
353 m_params.emplace_back(
new PARAM<int>(
"system.file_history_size",
354 &m_System.file_history_size, 9 ) );
357 &m_System.language, wxS(
"Default" ) ) );
360 &m_System.pdf_viewer_name, wxS(
"" ) ) );
362 m_params.emplace_back(
new PARAM<bool>(
"system.use_system_pdf_viewer",
363 &m_System.use_system_pdf_viewer,
true ) );
366 &m_System.working_dir, wxS(
"" ) ) );
368 m_params.emplace_back(
new PARAM<int>(
"system.clear_3d_cache_interval",
369 &m_System.clear_3d_cache_interval, 30 ) );
371 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.zone_fill_warning",
372 &m_DoNotShowAgain.zone_fill_warning,
false ) );
374 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.env_var_overwrite_warning",
375 &m_DoNotShowAgain.env_var_overwrite_warning,
false ) );
377 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.scaled_3d_models_warning",
378 &m_DoNotShowAgain.scaled_3d_models_warning,
false ) );
380 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.data_collection_prompt",
381 &m_DoNotShowAgain.data_collection_prompt,
false ) );
383 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.update_check_prompt",
384 &m_DoNotShowAgain.update_check_prompt,
false ) );
386 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.migrate_wrl_prompt",
387 &m_DoNotShowAgain.migrate_wrl_prompt,
false ) );
390 &m_Extra3DSearchDirs, {} ) );
392 m_params.emplace_back(
new PARAM<bool>(
"session.remember_open_files",
393 &m_Session.remember_open_files,
false ) );
396 &m_Session.pinned_symbol_libs, {} ) );
399 &m_Session.pinned_fp_libs, {} ) );
402 &m_Session.pinned_design_block_libs, {} ) );
404 m_params.emplace_back(
new PARAM<int>(
"package_manager.sash_pos",
405 &m_PackageManager.sash_pos, 380 ) );
408 [&]() -> nlohmann::json
410 nlohmann::json ret = {};
412 for(
const GIT_REPOSITORY& repo : m_Git.repositories )
414 nlohmann::json repoJson = {};
416 repoJson[
"name"] = repo.name;
417 repoJson[
"path"] = repo.path;
418 repoJson[
"authType"] = repo.authType;
419 repoJson[
"username"] = repo.username;
420 repoJson[
"ssh_path"] = repo.ssh_path;
421 repoJson[
"active"] = repo.active;
423 ret.push_back( repoJson );
428 [&](
const nlohmann::json& aJson )
430 if( !aJson.is_array() )
433 m_Git.repositories.clear();
435 for(
const auto& repoJson : aJson )
439 repo.name = repoJson[
"name"].get<wxString>();
440 repo.path = repoJson[
"path"].get<wxString>();
441 repo.authType = repoJson[
"authType"].get<wxString>();
442 repo.username = repoJson[
"username"].get<wxString>();
443 repo.ssh_path = repoJson[
"ssh_path"].get<wxString>();
444 repo.active = repoJson[
"active"].get<
bool>();
445 repo.checkValid =
true;
447 m_Git.repositories.push_back( repo );
453 &m_Git.authorName, wxS(
"" ) ) );
456 &m_Git.authorEmail, wxS(
"" ) ) );
458 m_params.emplace_back(
new PARAM<bool>(
"git.useDefaultAuthor",
459 &m_Git.useDefaultAuthor,
true ) );
461 m_params.emplace_back(
new PARAM<bool>(
"git.enableGit",
462 &m_Git.enableGit,
true ) );
464 m_params.emplace_back(
new PARAM<int>(
"git.updatInterval",
465 &m_Git.updatInterval, 5 ) );
468 &m_Api.python_interpreter, wxS(
"" ) ) );
470 m_params.emplace_back(
new PARAM<bool>(
"api.enable_server",
471 &m_Api.enable_server,
false ) );
474 [&]() -> nlohmann::json
476 nlohmann::json ret = nlohmann::json::object();
478 for( const auto& dlg : m_csInternals->m_dialogControlValues )
479 ret[ dlg.first ] = dlg.second;
483 [&](
const nlohmann::json& aVal )
485 m_csInternals->m_dialogControlValues.clear();
487 if( !aVal.is_object() )
490 for( auto& [dlgKey, dlgVal] : aVal.items() )
492 if( !dlgVal.is_object() )
495 for( auto& [ctrlKey, ctrlVal] : dlgVal.items() )
496 m_csInternals->m_dialogControlValues[ dlgKey ][ ctrlKey ] = ctrlVal;
499 nlohmann::json::object() ) );
633 const nlohmann::json::json_pointer v3_pointer_eeschema(
"/netclass_panel/eeschema_shown_columns"_json_pointer );
634 wxString eeSchemaColumnList_old =
m_internals->at( v3_pointer_eeschema );
636 wxStringTokenizer eeSchemaShownTokens( eeSchemaColumnList_old,
" \t\r\n" );
637 wxString eeSchemaColumnList_new;
639 while( eeSchemaShownTokens.HasMoreTokens() )
642 eeSchemaShownTokens.GetNextToken().ToLong( &colNumber );
644 if( colNumber >= 10 )
647 eeSchemaColumnList_new += wxString::Format( wxT(
"%ld " ), colNumber );
650 eeSchemaColumnList_new.Trim(
true );
651 eeSchemaColumnList_new.Trim(
false );
653 m_internals->at( v3_pointer_eeschema ) = eeSchemaColumnList_new.ToUTF8();
656 const nlohmann::json::json_pointer v3_pointer_pcbnew(
"/netclass_panel/pcbnew_shown_columns"_json_pointer );
657 wxString pcbnewColumnList_old =
m_internals->at( v3_pointer_pcbnew );
659 wxStringTokenizer pcbnewShownTokens( pcbnewColumnList_old,
" \t\r\n" );
660 wxString pcbnewColumnList_new;
662 while( pcbnewShownTokens.HasMoreTokens() )
665 pcbnewShownTokens.GetNextToken().ToLong( &colNumber );
667 if( colNumber >= 10 )
670 pcbnewColumnList_new += wxString::Format( wxT(
"%ld " ), colNumber );
673 pcbnewColumnList_new.Trim(
true );
674 pcbnewColumnList_new.Trim(
false );
676 m_internals->at( v3_pointer_pcbnew ) = pcbnewColumnList_new.ToUTF8();
680 wxLogTrace(
traceSettings, wxT(
"COMMON_SETTINGS::Migrate 3->4: /netclass_panel/shown_columns not found" ) );