70#if defined( __WXGTK__ ) || defined( __WXMSW__ )
119 &
m_Appearance.zoom_correction_factor, 1.0, 0.1, 10.0 ) );
124 &
m_Backup.limit_total_size, 104857600 ) );
127 [&]() -> nlohmann::json
129 nlohmann::json ret = {};
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 wxS(
"COMMON_SETTINGS: Env var %s skipping save (default)" ),
146 wxString value = var.GetValue();
148 value.Trim(
true ).Trim(
false );
152 if( var.GetDefinedExternally() )
154 if( var.GetDefinedInSettings() )
156 wxLogTrace( traceEnvVars,
157 wxS(
"COMMON_SETTINGS: Env var %s was overridden "
158 "externally, saving previously-loaded value %s" ),
159 var.GetKey(), var.GetSettingsValue() );
160 value = var.GetSettingsValue();
164 wxLogTrace( traceEnvVars,
165 wxS(
"COMMON_SETTINGS: Env var %s skipping save "
173 wxS(
"COMMON_SETTINGS: Saving env var %s = %s" ),
174 var.GetKey(), value);
176 std::string key( var.GetKey().Trim(
true ).Trim(
false ).ToUTF8() );
177 ret[ std::move( key ) ] = value;
182 [&](
const nlohmann::json& aJson )
184 if( !aJson.is_object() )
187 for(
const auto& entry : aJson.items() )
189 wxString key = wxString( entry.key().c_str(), wxConvUTF8 ).Trim(
true ).Trim(
false );
190 wxString val = entry.value().get<wxString>().Trim(
true ).Trim(
false );
192 if( m_Env.vars.count( key ) )
194 if( m_Env.vars[key].GetDefinedExternally() )
197 wxS(
"COMMON_SETTINGS: %s is defined externally" ),
199 m_Env.vars[key].SetDefinedInSettings();
200 m_Env.vars[key].SetSettingsValue( val );
206 wxS(
"COMMON_SETTINGS: Updating %s: %s -> %s"),
207 key, m_Env.vars[key].GetValue(), val );
208 m_Env.vars[key].SetValue( val );
214 wxS(
"COMMON_SETTINGS: Loaded new var: %s = %s" ),
219 m_Env.vars[key].SetDefinedInSettings();
220 m_Env.vars[key].SetSettingsValue( val );
224 envVarsParam->SetClearUnknownKeys();
226 m_params.emplace_back(
new PARAM<bool>(
"input.focus_follow_sch_pcb",
227 &m_Input.focus_follow_sch_pcb,
false ) );
229 m_params.emplace_back(
new PARAM<bool>(
"input.auto_pan", &m_Input.auto_pan,
false ) );
231 m_params.emplace_back(
new PARAM<int>(
"input.auto_pan_acceleration",
232 &m_Input.auto_pan_acceleration, 5 ) );
234 m_params.emplace_back(
new PARAM<bool>(
"input.center_on_zoom",
235 &m_Input.center_on_zoom,
true ) );
237 m_params.emplace_back(
new PARAM<bool>(
"input.immediate_actions",
238 &m_Input.immediate_actions,
true ) );
240 m_params.emplace_back(
new PARAM<bool>(
"input.warp_mouse_on_move",
241 &m_Input.warp_mouse_on_move,
true ) );
243 m_params.emplace_back(
new PARAM<bool>(
"input.horizontal_pan",
244 &m_Input.horizontal_pan,
false ) );
246 m_params.emplace_back(
new PARAM<bool>(
"input.hotkey_feedback",
247 &m_Input.hotkey_feedback,
true ) );
249 m_params.emplace_back(
new PARAM<bool>(
"input.zoom_acceleration",
250 &m_Input.zoom_acceleration,
false ) );
253 int default_zoom_speed = 5;
255 int default_zoom_speed = 1;
258 m_params.emplace_back(
new PARAM<int>(
"input.zoom_speed",
259 &m_Input.zoom_speed, default_zoom_speed ) );
261 m_params.emplace_back(
new PARAM<bool>(
"input.zoom_speed_auto",
262 &m_Input.zoom_speed_auto,
true ) );
264 m_params.emplace_back(
new PARAM<int>(
"input.scroll_modifier_zoom",
265 &m_Input.scroll_modifier_zoom, 0 ) );
267 m_params.emplace_back(
new PARAM<int>(
"input.scroll_modifier_pan_h",
268 &m_Input.scroll_modifier_pan_h, WXK_CONTROL ) );
270 m_params.emplace_back(
new PARAM<int>(
"input.scroll_modifier_pan_v",
271 &m_Input.scroll_modifier_pan_v, WXK_SHIFT ) );
273 m_params.emplace_back(
new PARAM<int>(
"input.motion_pan_modifier",
274 &m_Input.motion_pan_modifier, 0 ) );
276 m_params.emplace_back(
new PARAM<bool>(
"input.reverse_scroll_zoom",
277 &m_Input.reverse_scroll_zoom,
false ) );
279 m_params.emplace_back(
new PARAM<bool>(
"input.reverse_scroll_pan_h",
280 &m_Input.reverse_scroll_pan_h,
false ) );
294 m_params.emplace_back(
new PARAM<int>(
"spacemouse.rotate_speed",
295 &m_SpaceMouse.rotate_speed, 5, 1, 10 ) );
297 m_params.emplace_back(
new PARAM<int>(
"spacemouse.pan_speed",
298 &m_SpaceMouse.pan_speed, 5, 1, 10 ) );
300 m_params.emplace_back(
new PARAM<bool>(
"spacemouse.reverse_rotate",
301 &m_SpaceMouse.reverse_rotate,
false ) );
303 m_params.emplace_back(
new PARAM<bool>(
"spacemouse.reverse_pan_x",
304 &m_SpaceMouse.reverse_pan_x,
false ) );
306 m_params.emplace_back(
new PARAM<bool>(
"spacemouse.reverse_pan_y",
307 &m_SpaceMouse.reverse_pan_y,
false ) );
309 m_params.emplace_back(
new PARAM<bool>(
"spacemouse.reverse_zoom",
310 &m_SpaceMouse.reverse_zoom,
false ) );
312 m_params.emplace_back(
new PARAM<int>(
"graphics.canvas_type",
315 m_params.emplace_back(
new PARAM<int>(
"graphics.antialiasing_mode",
316 &m_Graphics.aa_mode, 2, 0, 2 ) );
318 m_params.emplace_back(
new PARAM<bool>(
"system.local_history_enabled",
319 &m_System.local_history_enabled,
true ) );
320 m_params.emplace_back(
new PARAM<int>(
"system.local_history_debounce",
321 &m_System.local_history_debounce, 5, 0, 100000 ) );
325 &m_System.text_editor, wxS(
"/usr/bin/open -e" ) ) );
328 &m_System.text_editor, wxS(
"" ) ) );
331#if defined( __WINDOWS__ )
333 &m_System.file_explorer, wxS(
"explorer.exe /n,/select,%F" ) ) );
336 &m_System.file_explorer, wxS(
"" ) ) );
339 m_params.emplace_back(
new PARAM<int>(
"system.file_history_size",
340 &m_System.file_history_size, 9 ) );
343 &m_System.language, wxS(
"Default" ) ) );
346 &m_System.pdf_viewer_name, wxS(
"" ) ) );
348 m_params.emplace_back(
new PARAM<bool>(
"system.use_system_pdf_viewer",
349 &m_System.use_system_pdf_viewer,
true ) );
352 &m_System.working_dir, wxS(
"" ) ) );
354 m_params.emplace_back(
new PARAM<int>(
"system.clear_3d_cache_interval",
355 &m_System.clear_3d_cache_interval, 30 ) );
357 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.zone_fill_warning",
358 &m_DoNotShowAgain.zone_fill_warning,
false ) );
360 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.env_var_overwrite_warning",
361 &m_DoNotShowAgain.env_var_overwrite_warning,
false ) );
363 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.scaled_3d_models_warning",
364 &m_DoNotShowAgain.scaled_3d_models_warning,
false ) );
366 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.data_collection_prompt",
367 &m_DoNotShowAgain.data_collection_prompt,
false ) );
369 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.update_check_prompt",
370 &m_DoNotShowAgain.update_check_prompt,
false ) );
372 m_params.emplace_back(
new PARAM<bool>(
"session.remember_open_files",
373 &m_Session.remember_open_files,
false ) );
376 &m_Session.pinned_symbol_libs, {} ) );
379 &m_Session.pinned_fp_libs, {} ) );
382 &m_Session.pinned_design_block_libs, {} ) );
384 m_params.emplace_back(
new PARAM<int>(
"package_manager.sash_pos",
385 &m_PackageManager.sash_pos, 380 ) );
388 [&]() -> nlohmann::json
390 nlohmann::json ret = {};
392 for(
const GIT_REPOSITORY& repo : m_Git.repositories )
394 nlohmann::json repoJson = {};
396 repoJson[
"name"] = repo.name;
397 repoJson[
"path"] = repo.path;
398 repoJson[
"authType"] = repo.authType;
399 repoJson[
"username"] = repo.username;
400 repoJson[
"ssh_path"] = repo.ssh_path;
401 repoJson[
"active"] = repo.active;
403 ret.push_back( repoJson );
408 [&](
const nlohmann::json& aJson )
410 if( !aJson.is_array() )
413 m_Git.repositories.clear();
415 for(
const auto& repoJson : aJson )
419 repo.name = repoJson[
"name"].get<wxString>();
420 repo.path = repoJson[
"path"].get<wxString>();
421 repo.authType = repoJson[
"authType"].get<wxString>();
422 repo.username = repoJson[
"username"].get<wxString>();
423 repo.ssh_path = repoJson[
"ssh_path"].get<wxString>();
424 repo.active = repoJson[
"active"].get<
bool>();
425 repo.checkValid =
true;
427 m_Git.repositories.push_back( repo );
433 &m_Git.authorName, wxS(
"" ) ) );
436 &m_Git.authorEmail, wxS(
"" ) ) );
438 m_params.emplace_back(
new PARAM<bool>(
"git.useDefaultAuthor",
439 &m_Git.useDefaultAuthor,
true ) );
441 m_params.emplace_back(
new PARAM<bool>(
"git.enableGit",
442 &m_Git.enableGit,
true ) );
444 m_params.emplace_back(
new PARAM<int>(
"git.updatInterval",
445 &m_Git.updatInterval, 5 ) );
448 &m_Api.python_interpreter, wxS(
"" ) ) );
450 m_params.emplace_back(
new PARAM<bool>(
"api.enable_server",
451 &m_Api.enable_server,
false ) );
454 [&]() -> nlohmann::json
456 nlohmann::json ret = nlohmann::json::object();
458 for( const auto& dlg : m_csInternals->m_dialogControlValues )
459 ret[ dlg.first ] = dlg.second;
463 [&](
const nlohmann::json& aVal )
465 m_csInternals->m_dialogControlValues.clear();
467 if( !aVal.is_object() )
470 for( auto& [dlgKey, dlgVal] : aVal.items() )
472 if( !dlgVal.is_object() )
475 for( auto& [ctrlKey, ctrlVal] : dlgVal.items() )
476 m_csInternals->m_dialogControlValues[ dlgKey ][ ctrlKey ] = ctrlVal;
479 nlohmann::json::object() ) );
612 const nlohmann::json::json_pointer v3_pointer_eeschema(
"/netclass_panel/eeschema_shown_columns"_json_pointer );
613 wxString eeSchemaColumnList_old =
m_internals->at( v3_pointer_eeschema );
615 wxStringTokenizer eeSchemaShownTokens( eeSchemaColumnList_old,
" \t\r\n" );
616 wxString eeSchemaColumnList_new;
618 while( eeSchemaShownTokens.HasMoreTokens() )
621 eeSchemaShownTokens.GetNextToken().ToLong( &colNumber );
623 if( colNumber >= 10 )
626 eeSchemaColumnList_new += wxString::Format( wxT(
"%ld " ), colNumber );
629 eeSchemaColumnList_new.Trim(
true );
630 eeSchemaColumnList_new.Trim(
false );
632 m_internals->at( v3_pointer_eeschema ) = eeSchemaColumnList_new.ToUTF8();
635 const nlohmann::json::json_pointer v3_pointer_pcbnew(
"/netclass_panel/pcbnew_shown_columns"_json_pointer );
636 wxString pcbnewColumnList_old =
m_internals->at( v3_pointer_pcbnew );
638 wxStringTokenizer pcbnewShownTokens( pcbnewColumnList_old,
" \t\r\n" );
639 wxString pcbnewColumnList_new;
641 while( pcbnewShownTokens.HasMoreTokens() )
644 pcbnewShownTokens.GetNextToken().ToLong( &colNumber );
646 if( colNumber >= 10 )
649 pcbnewColumnList_new += wxString::Format( wxT(
"%ld " ), colNumber );
652 pcbnewColumnList_new.Trim(
true );
653 pcbnewColumnList_new.Trim(
false );
655 m_internals->at( v3_pointer_pcbnew ) = pcbnewColumnList_new.ToUTF8();
659 wxLogTrace(
traceSettings, wxT(
"COMMON_SETTINGS::Migrate 3->4: /netclass_panel/shown_columns not found" ) );