64#if defined( __WXGTK__ ) || defined( __WXMSW__ )
113 &
m_Appearance.zoom_correction_factor, 1.0, 0.1, 10.0 ) );
118 &
m_Backup.limit_total_size, 104857600 ) );
121 [&]() -> nlohmann::json
123 nlohmann::json ret = {};
125 for(
const std::pair<wxString, ENV_VAR_ITEM> entry :
m_Env.vars )
127 const ENV_VAR_ITEM& var = entry.second;
129 wxASSERT( entry.first == var.GetKey() );
132 if( var.IsDefault() )
134 wxLogTrace( traceEnvVars,
135 wxS(
"COMMON_SETTINGS: Env var %s skipping save (default)" ),
140 wxString value = var.GetValue();
142 value.Trim(
true ).Trim(
false );
146 if( var.GetDefinedExternally() )
148 if( var.GetDefinedInSettings() )
150 wxLogTrace( traceEnvVars,
151 wxS(
"COMMON_SETTINGS: Env var %s was overridden "
152 "externally, saving previously-loaded value %s" ),
153 var.GetKey(), var.GetSettingsValue() );
154 value = var.GetSettingsValue();
158 wxLogTrace( traceEnvVars,
159 wxS(
"COMMON_SETTINGS: Env var %s skipping save "
167 wxS(
"COMMON_SETTINGS: Saving env var %s = %s" ),
168 var.GetKey(), value);
170 std::string key( var.GetKey().Trim(
true ).Trim(
false ).ToUTF8() );
171 ret[ std::move( key ) ] = value;
176 [&](
const nlohmann::json& aJson )
178 if( !aJson.is_object() )
181 for(
const auto& entry : aJson.items() )
183 wxString key = wxString( entry.key().c_str(), wxConvUTF8 ).Trim(
true ).Trim(
false );
184 wxString val = entry.value().get<wxString>().Trim(
true ).Trim(
false );
186 if( m_Env.vars.count( key ) )
188 if( m_Env.vars[key].GetDefinedExternally() )
191 wxS(
"COMMON_SETTINGS: %s is defined externally" ),
193 m_Env.vars[key].SetDefinedInSettings();
194 m_Env.vars[key].SetSettingsValue( val );
200 wxS(
"COMMON_SETTINGS: Updating %s: %s -> %s"),
201 key, m_Env.vars[key].GetValue(), val );
202 m_Env.vars[key].SetValue( val );
208 wxS(
"COMMON_SETTINGS: Loaded new var: %s = %s" ),
213 m_Env.vars[key].SetDefinedInSettings();
214 m_Env.vars[key].SetSettingsValue( val );
218 envVarsParam->SetClearUnknownKeys();
220 m_params.emplace_back(
new PARAM<bool>(
"input.focus_follow_sch_pcb",
221 &m_Input.focus_follow_sch_pcb,
false ) );
223 m_params.emplace_back(
new PARAM<bool>(
"input.auto_pan", &m_Input.auto_pan,
false ) );
225 m_params.emplace_back(
new PARAM<int>(
"input.auto_pan_acceleration",
226 &m_Input.auto_pan_acceleration, 5 ) );
228 m_params.emplace_back(
new PARAM<bool>(
"input.center_on_zoom",
229 &m_Input.center_on_zoom,
true ) );
231 m_params.emplace_back(
new PARAM<bool>(
"input.immediate_actions",
232 &m_Input.immediate_actions,
true ) );
234 m_params.emplace_back(
new PARAM<bool>(
"input.warp_mouse_on_move",
235 &m_Input.warp_mouse_on_move,
true ) );
237 m_params.emplace_back(
new PARAM<bool>(
"input.horizontal_pan",
238 &m_Input.horizontal_pan,
false ) );
240 m_params.emplace_back(
new PARAM<bool>(
"input.hotkey_feedback",
241 &m_Input.hotkey_feedback,
true ) );
243 m_params.emplace_back(
new PARAM<bool>(
"input.zoom_acceleration",
244 &m_Input.zoom_acceleration,
false ) );
247 int default_zoom_speed = 5;
249 int default_zoom_speed = 1;
252 m_params.emplace_back(
new PARAM<int>(
"input.zoom_speed",
253 &m_Input.zoom_speed, default_zoom_speed ) );
255 m_params.emplace_back(
new PARAM<bool>(
"input.zoom_speed_auto",
256 &m_Input.zoom_speed_auto,
true ) );
258 m_params.emplace_back(
new PARAM<int>(
"input.scroll_modifier_zoom",
259 &m_Input.scroll_modifier_zoom, 0 ) );
261 m_params.emplace_back(
new PARAM<int>(
"input.scroll_modifier_pan_h",
262 &m_Input.scroll_modifier_pan_h, WXK_CONTROL ) );
264 m_params.emplace_back(
new PARAM<int>(
"input.scroll_modifier_pan_v",
265 &m_Input.scroll_modifier_pan_v, WXK_SHIFT ) );
267 m_params.emplace_back(
new PARAM<int>(
"input.motion_pan_modifier",
268 &m_Input.motion_pan_modifier, 0 ) );
270 m_params.emplace_back(
new PARAM<bool>(
"input.reverse_scroll_zoom",
271 &m_Input.reverse_scroll_zoom,
false ) );
273 m_params.emplace_back(
new PARAM<bool>(
"input.reverse_scroll_pan_h",
274 &m_Input.reverse_scroll_pan_h,
false ) );
288 m_params.emplace_back(
new PARAM<int>(
"spacemouse.rotate_speed",
289 &m_SpaceMouse.rotate_speed, 5, 1, 10 ) );
291 m_params.emplace_back(
new PARAM<int>(
"spacemouse.pan_speed",
292 &m_SpaceMouse.pan_speed, 5, 1, 10 ) );
294 m_params.emplace_back(
new PARAM<bool>(
"spacemouse.reverse_rotate",
295 &m_SpaceMouse.reverse_rotate,
false ) );
297 m_params.emplace_back(
new PARAM<bool>(
"spacemouse.reverse_pan_x",
298 &m_SpaceMouse.reverse_pan_x,
false ) );
300 m_params.emplace_back(
new PARAM<bool>(
"spacemouse.reverse_pan_y",
301 &m_SpaceMouse.reverse_pan_y,
false ) );
303 m_params.emplace_back(
new PARAM<bool>(
"spacemouse.reverse_zoom",
304 &m_SpaceMouse.reverse_zoom,
false ) );
306 m_params.emplace_back(
new PARAM<int>(
"graphics.canvas_type",
309 m_params.emplace_back(
new PARAM<int>(
"graphics.antialiasing_mode",
310 &m_Graphics.aa_mode, 2, 0, 2 ) );
312 m_params.emplace_back(
new PARAM<bool>(
"system.local_history_enabled",
313 &m_System.local_history_enabled,
true ) );
314 m_params.emplace_back(
new PARAM<int>(
"system.local_history_debounce",
315 &m_System.local_history_debounce, 5, 0, 100000 ) );
319 &m_System.text_editor, wxS(
"/usr/bin/open -e" ) ) );
322 &m_System.text_editor, wxS(
"" ) ) );
325#if defined( __WINDOWS__ )
327 &m_System.file_explorer, wxS(
"explorer.exe /n,/select,%F" ) ) );
330 &m_System.file_explorer, wxS(
"" ) ) );
333 m_params.emplace_back(
new PARAM<int>(
"system.file_history_size",
334 &m_System.file_history_size, 9 ) );
337 &m_System.language, wxS(
"Default" ) ) );
340 &m_System.pdf_viewer_name, wxS(
"" ) ) );
342 m_params.emplace_back(
new PARAM<bool>(
"system.use_system_pdf_viewer",
343 &m_System.use_system_pdf_viewer,
true ) );
346 &m_System.working_dir, wxS(
"" ) ) );
348 m_params.emplace_back(
new PARAM<int>(
"system.clear_3d_cache_interval",
349 &m_System.clear_3d_cache_interval, 30 ) );
351 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.zone_fill_warning",
352 &m_DoNotShowAgain.zone_fill_warning,
false ) );
354 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.env_var_overwrite_warning",
355 &m_DoNotShowAgain.env_var_overwrite_warning,
false ) );
357 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.scaled_3d_models_warning",
358 &m_DoNotShowAgain.scaled_3d_models_warning,
false ) );
360 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.data_collection_prompt",
361 &m_DoNotShowAgain.data_collection_prompt,
false ) );
363 m_params.emplace_back(
new PARAM<bool>(
"do_not_show_again.update_check_prompt",
364 &m_DoNotShowAgain.update_check_prompt,
false ) );
366 m_params.emplace_back(
new PARAM<bool>(
"session.remember_open_files",
367 &m_Session.remember_open_files,
false ) );
370 &m_Session.pinned_symbol_libs, {} ) );
373 &m_Session.pinned_fp_libs, {} ) );
376 &m_Session.pinned_design_block_libs, {} ) );
378 m_params.emplace_back(
new PARAM<int>(
"package_manager.sash_pos",
379 &m_PackageManager.sash_pos, 380 ) );
382 [&]() -> nlohmann::json
384 nlohmann::json ret = {};
386 for(
const GIT_REPOSITORY& repo : m_Git.repositories )
388 nlohmann::json repoJson = {};
390 repoJson[
"name"] = repo.name;
391 repoJson[
"path"] = repo.path;
392 repoJson[
"authType"] = repo.authType;
393 repoJson[
"username"] = repo.username;
394 repoJson[
"ssh_path"] = repo.ssh_path;
395 repoJson[
"active"] = repo.active;
397 ret.push_back( repoJson );
402 [&](
const nlohmann::json& aJson )
404 if( !aJson.is_array() )
407 m_Git.repositories.clear();
409 for(
const auto& repoJson : aJson )
413 repo.name = repoJson[
"name"].get<wxString>();
414 repo.path = repoJson[
"path"].get<wxString>();
415 repo.authType = repoJson[
"authType"].get<wxString>();
416 repo.username = repoJson[
"username"].get<wxString>();
417 repo.ssh_path = repoJson[
"ssh_path"].get<wxString>();
418 repo.active = repoJson[
"active"].get<
bool>();
419 repo.checkValid =
true;
421 m_Git.repositories.push_back( repo );
427 &m_Git.authorName, wxS(
"" ) ) );
430 &m_Git.authorEmail, wxS(
"" ) ) );
432 m_params.emplace_back(
new PARAM<bool>(
"git.useDefaultAuthor",
433 &m_Git.useDefaultAuthor,
true ) );
435 m_params.emplace_back(
new PARAM<bool>(
"git.enableGit",
436 &m_Git.enableGit,
true ) );
438 m_params.emplace_back(
new PARAM<int>(
"git.updatInterval",
439 &m_Git.updatInterval, 5 ) );
442 &m_Api.python_interpreter, wxS(
"" ) ) );
444 m_params.emplace_back(
new PARAM<bool>(
"api.enable_server",
445 &m_Api.enable_server,
false ) );
448 [&]() -> nlohmann::json
450 nlohmann::json ret = nlohmann::json::object();
452 for( const auto& dlg : m_dialogControlValues )
453 ret[ dlg.first ] = dlg.second;
457 [&](
const nlohmann::json& aVal )
459 m_dialogControlValues.clear();
461 if( !aVal.is_object() )
464 for( auto& [dlgKey, dlgVal] : aVal.items() )
466 if( !dlgVal.is_object() )
469 for( auto& [ctrlKey, ctrlVal] : dlgVal.items() )
470 m_dialogControlValues[ dlgKey ][ ctrlKey ] = ctrlVal;
473 nlohmann::json::object() ) );
605 const nlohmann::json::json_pointer v3_pointer_eeschema(
"/netclass_panel/eeschema_shown_columns"_json_pointer );
606 wxString eeSchemaColumnList_old =
m_internals->at( v3_pointer_eeschema );
608 wxStringTokenizer eeSchemaShownTokens( eeSchemaColumnList_old,
" \t\r\n" );
609 wxString eeSchemaColumnList_new;
611 while( eeSchemaShownTokens.HasMoreTokens() )
614 eeSchemaShownTokens.GetNextToken().ToLong( &colNumber );
616 if( colNumber >= 10 )
619 eeSchemaColumnList_new += wxString::Format( wxT(
"%ld " ), colNumber );
622 eeSchemaColumnList_new.Trim(
true );
623 eeSchemaColumnList_new.Trim(
false );
625 m_internals->at( v3_pointer_eeschema ) = eeSchemaColumnList_new.ToUTF8();
628 const nlohmann::json::json_pointer v3_pointer_pcbnew(
"/netclass_panel/pcbnew_shown_columns"_json_pointer );
629 wxString pcbnewColumnList_old =
m_internals->at( v3_pointer_pcbnew );
631 wxStringTokenizer pcbnewShownTokens( pcbnewColumnList_old,
" \t\r\n" );
632 wxString pcbnewColumnList_new;
634 while( pcbnewShownTokens.HasMoreTokens() )
637 pcbnewShownTokens.GetNextToken().ToLong( &colNumber );
639 if( colNumber >= 10 )
642 pcbnewColumnList_new += wxString::Format( wxT(
"%ld " ), colNumber );
645 pcbnewColumnList_new.Trim(
true );
646 pcbnewColumnList_new.Trim(
false );
648 m_internals->at( v3_pointer_pcbnew ) = pcbnewColumnList_new.ToUTF8();
652 wxLogTrace(
traceSettings, wxT(
"COMMON_SETTINGS::Migrate 3->4: /netclass_panel/shown_columns not found" ) );