KiCad PCB EDA Suite
Loading...
Searching...
No Matches
eeschema_settings.cpp
Go to the documentation of this file.
1/*
2* This program source code file is part of KiCad, a free EDA CAD application.
3*
4* Copyright The KiCad Developers, see AUTHORS.txt for contributors.
5*
6* This program is free software; you can redistribute it and/or
7* modify it under the terms of the GNU General Public License
8* as published by the Free Software Foundation; either version 2
9* of the License, or (at your option) any later version.
10*
11* This program is distributed in the hope that it will be useful,
12* but WITHOUT ANY WARRANTY; without even the implied warranty of
13* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14* GNU General Public License for more details.
15*
16* You should have received a copy of the GNU General Public License
17* along with this program; if not, you may find one here:
18* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19* or you may search the http://www.gnu.org website for the version 2 license,
20* or you may write to the Free Software Foundation, Inc.,
21* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22*/
23
24#include <functional>
25
26#include <dialogs/dialog_bom_cfg_lexer.h>
27#include <eda_draw_frame.h>
28#include <eeschema_settings.h>
29#include <layer_ids.h>
31#include <string_utils.h>
32#include <pgm_base.h>
35#include <settings/parameters.h>
38#include <wx/config.h>
39#include <widgets/ui_common.h>
40#include <default_values.h> // For some default values
41
42using namespace T_BOMCFG_T; // for the BOM_CFG_PARSER parser and its keywords
43
46
47
49const nlohmann::json defaultBomPlugins =
50 {
51 {
52 { "name", "bom_csv_grouped_extra" },
53 { "path", "bom_csv_grouped_extra.py" }
54 },
55 {
56 { "name", "bom_csv_grouped_by_value" },
57 { "path", "bom_csv_grouped_by_value.py" }
58 },
59 {
60 { "name", "bom_csv_grouped_by_value_with_fp" },
61 { "path", "bom_csv_grouped_by_value_with_fp.py" }
62 },
63 };
64
65
66const wxAuiPaneInfo& defaultNetNavigatorPaneInfo()
67{
68 static wxAuiPaneInfo paneInfo;
69
70 paneInfo.Name( wxS( "NetNavigator" ) )
71 .Caption( _( "Net Navigator" ) )
72 .CaptionVisible( true )
73 .PaneBorder( true )
74 .Left().Layer( 3 ).Position( 0 )
75 .TopDockable( false )
76 .BottomDockable( false )
77 .CloseButton( true )
78 .MinSize( 120, 60 )
79 .BestSize( 200, 200 )
80 .FloatingSize( 200, 200 )
81 .FloatingPosition( 50, 200 )
82 .Show( false );
83
84 return paneInfo;
85}
86
87
88const wxAuiPaneInfo& defaultPropertiesPaneInfo( wxWindow* aWindow )
89{
90 static wxAuiPaneInfo paneInfo;
91
92 paneInfo.Name( EDA_DRAW_FRAME::PropertiesPaneName() )
93 .Caption( _( "Properties" ) )
94 .CaptionVisible( true )
95 .PaneBorder( true )
96 .Left().Layer( 3 ).Position( 2 )
97 .TopDockable( false )
98 .BottomDockable( false )
99 .CloseButton( true )
100 .MinSize( aWindow->FromDIP( wxSize( 240, 60 ) ) )
101 .BestSize( aWindow->FromDIP( wxSize( 300, 200 ) ) )
102 .FloatingSize( aWindow->FromDIP( wxSize( 300, 400 ) ) )
103 .FloatingPosition( aWindow->FromDIP( wxPoint( 50, 200 ) ) )
104 .Show( true );
105
106 return paneInfo;
107}
108
109
110const wxAuiPaneInfo& defaultSchSelectionFilterPaneInfo( wxWindow* aWindow )
111{
112 static wxAuiPaneInfo paneInfo;
113
114 paneInfo.Name( wxS( "SelectionFilter" ) )
115 .Caption( _( "Selection Filter" ) )
116 .CaptionVisible( true )
117 .PaneBorder( false )
118 .Left().Layer( 3 ).Position( 4 )
119 .TopDockable( false )
120 .BottomDockable( false )
121 .CloseButton( true )
122 .MinSize( aWindow->FromDIP( wxSize( 180, -1 ) ) )
123 .BestSize( aWindow->FromDIP( wxSize( 180, -1 ) ) )
124 .Show( true );
125
126 return paneInfo;
127}
128
129
130const wxAuiPaneInfo& defaultDesignBlocksPaneInfo( wxWindow* aWindow )
131{
132 static wxAuiPaneInfo paneInfo;
133
134 paneInfo.Name( EDA_DRAW_FRAME::DesignBlocksPaneName() )
135 .Caption( _( "Design Blocks" ) )
136 .CaptionVisible( true )
137 .PaneBorder( true )
138 .Right().Layer( 3 ).Position( 2 )
139 .TopDockable( false )
140 .BottomDockable( false )
141 .CloseButton( true )
142 .MinSize( aWindow->FromDIP( wxSize( 240, 60 ) ) )
143 .BestSize( aWindow->FromDIP( wxSize( 300, 200 ) ) )
144 .FloatingSize( aWindow->FromDIP( wxSize( 800, 600 ) ) )
145 .FloatingPosition( aWindow->FromDIP( wxPoint( 50, 200 ) ) )
146 .Show( true );
147
148 return paneInfo;
149}
150
151
154 m_Appearance(),
155 m_Drawing(),
156 m_Input(),
158 m_Selection(),
161 m_BomPanel(),
167 m_ERCDialog(),
169 m_Simulator(),
170 m_RescueNeverShow( false )
171{
172 m_params.emplace_back( new PARAM<wxString>( "appearance.edit_symbol_visible_columns",
173 &m_Appearance.edit_symbol_visible_columns, "0 1 2 3 4 5 6 7" ) );
174
175 m_params.emplace_back( new PARAM<int>( "appearance.edit_symbol_width",
176 &m_Appearance.edit_symbol_width, -1 ) );
177
178 m_params.emplace_back( new PARAM<int>( "appearance.edit_symbol_height",
179 &m_Appearance.edit_symbol_height, -1 ) );
180
181 m_params.emplace_back( new PARAM<wxString>( "appearance.edit_sheet_visible_columns",
182 &m_Appearance.edit_sheet_visible_columns, "0 1 2 3 4 5 6 7" ) );
183
184 m_params.emplace_back( new PARAM<wxString>( "appearance.edit_label_visible_columns",
185 &m_Appearance.edit_label_visible_columns, "0 1 2 3 4 5 6 7" ) );
186
187 m_params.emplace_back( new PARAM<int>( "appearance.edit_label_width",
188 &m_Appearance.edit_label_width, -1 ) );
189
190 m_params.emplace_back( new PARAM<int>( "appearance.edit_label_height",
191 &m_Appearance.edit_label_height, -1 ) );
192
193 m_params.emplace_back( new PARAM<bool>( "appearance.footprint_preview",
194 &m_Appearance.footprint_preview, true ) );
195
196 m_params.emplace_back( new PARAM<bool>( "appearance.print_sheet_reference",
197 &m_Appearance.print_sheet_reference, true ) );
198
199 m_params.emplace_back( new PARAM<wxString>( "appearance.default_font",
200 &m_Appearance.default_font, "KiCad Font" ) );
201
202 m_params.emplace_back( new PARAM<bool>( "appearance.show_hidden_pins",
203 &m_Appearance.show_hidden_pins, false ) );
204
205 m_params.emplace_back( new PARAM<bool>( "appearance.show_hidden_fields",
206 &m_Appearance.show_hidden_fields, false ) );
207
208 m_params.emplace_back( new PARAM<bool>( "appearance.show_directive_labels",
209 &m_Appearance.show_directive_labels, true ) );
210
211 m_params.emplace_back( new PARAM<bool>( "appearance.show_erc_warnings",
212 &m_Appearance.show_erc_warnings, true ) );
213
214 m_params.emplace_back( new PARAM<bool>( "appearance.show_erc_errors",
215 &m_Appearance.show_erc_errors, true ) );
216
217 m_params.emplace_back( new PARAM<bool>( "appearance.show_erc_exclusions",
218 &m_Appearance.show_erc_exclusions, false ) );
219
220 m_params.emplace_back( new PARAM<bool>( "appearance.mark_sim_exclusions",
221 &m_Appearance.mark_sim_exclusions, true ) );
222
223 m_params.emplace_back( new PARAM<bool>( "appearance.show_op_voltages",
224 &m_Appearance.show_op_voltages, true ) );
225
226 m_params.emplace_back( new PARAM<bool>( "appearance.show_op_currents",
227 &m_Appearance.show_op_currents, true ) );
228
229 m_params.emplace_back( new PARAM<bool>( "appearance.show_pin_alt_icons",
230 &m_Appearance.show_pin_alt_icons, true ) );
231
232 m_params.emplace_back( new PARAM<bool>( "appearance.show_illegal_symbol_lib_dialog",
233 &m_Appearance.show_illegal_symbol_lib_dialog, true ) );
234
235 m_params.emplace_back( new PARAM<bool>( "appearance.show_page_limits",
236 &m_Appearance.show_page_limits, true ) );
237
238 m_params.emplace_back( new PARAM<bool>( "appearance.show_sexpr_file_convert_warning",
239 &m_Appearance.show_sexpr_file_convert_warning, true ) );
240
241 m_params.emplace_back( new PARAM<bool>( "appearance.show_sheet_filename_case_sensitivity_dialog",
242 &m_Appearance.show_sheet_filename_case_sensitivity_dialog, true ) );
243
244 m_params.emplace_back( new PARAM<bool>( "aui.show_schematic_hierarchy",
245 &m_AuiPanels.show_schematic_hierarchy, true ) );
246
247 m_params.emplace_back( new PARAM<int>( "aui.hierarchy_panel_docked_width",
248 &m_AuiPanels.hierarchy_panel_docked_width, -1 ) );
249
250 m_params.emplace_back( new PARAM<int>( "aui.hierarchy_panel_docked_height",
251 &m_AuiPanels.hierarchy_panel_docked_height, -1 ) );
252
253 m_params.emplace_back( new PARAM<int>( "aui.hierarchy_panel_float_width",
254 &m_AuiPanels.hierarchy_panel_float_width, -1 ) );
255
256 m_params.emplace_back( new PARAM<int>( "aui.hierarchy_panel_float_height",
257 &m_AuiPanels.hierarchy_panel_float_height, -1 ) );
258
259 m_params.emplace_back( new PARAM<bool>( "aui.design_blocks_show",
260 &m_AuiPanels.design_blocks_show, false ) );
261
262 m_params.emplace_back( new PARAM<int>( "aui.design_blocks_panel_docked_width",
263 &m_AuiPanels.design_blocks_panel_docked_width, -1 ) );
264
265 m_params.emplace_back( new PARAM<int>( "aui.design_blocks_panel_float_width",
266 &m_AuiPanels.design_blocks_panel_float_width, -1 ) );
267
268 m_params.emplace_back( new PARAM<int>( "aui.design_blocks_panel_float_height",
269 &m_AuiPanels.design_blocks_panel_float_height, -1 ) );
270
271 m_params.emplace_back( new PARAM<bool>( "aui.schematic_hierarchy_float",
272 &m_AuiPanels.schematic_hierarchy_float, false ) );
273
274 m_params.emplace_back( new PARAM<int>( "aui.search_panel_height",
275 &m_AuiPanels.search_panel_height, -1 ) );
276
277 m_params.emplace_back( new PARAM<int>( "aui.search_panel_width",
278 &m_AuiPanels.search_panel_width, -1 ) );
279
280 m_params.emplace_back( new PARAM<int>( "aui.search_panel_dock_direction",
281 &m_AuiPanels.search_panel_dock_direction, 3 ) );
282
283 m_params.emplace_back( new PARAM<bool>( "aui.show_search",
284 &m_AuiPanels.show_search, false ) );
285
286 m_params.emplace_back( new PARAM<bool>( "aui.show_net_nav_panel",
287 &m_AuiPanels.show_net_nav_panel, false ) );
288
289 m_params.emplace_back( new PARAM<bool>( "aui.float_net_nav_panel",
290 &m_AuiPanels.float_net_nav_panel, false ) );
291
292 m_params.emplace_back( new PARAM<wxSize>( "aui.net_nav_panel_docked_size",
293 &m_AuiPanels.net_nav_panel_docked_size, wxSize( 120, -1 ) ) );
294
295 m_params.emplace_back( new PARAM<wxPoint>( "aui.net_nav_panel_float_pos",
296 &m_AuiPanels.net_nav_panel_float_pos, wxPoint( 50, 200 ), false ) );
297
298 m_params.emplace_back( new PARAM<wxSize>( "aui.net_nav_panel_float_size",
299 &m_AuiPanels.net_nav_panel_float_size, wxSize( 200, 200 ) ) );
300
301 m_params.emplace_back( new PARAM<bool>( "aui.show_properties",
302 &m_AuiPanels.show_properties, true ) );
303
304 m_params.emplace_back( new PARAM<int>( "aui.properties_panel_width",
305 &m_AuiPanels.properties_panel_width, -1 ) );
306
307 m_params.emplace_back( new PARAM<float>( "aui.properties_splitter_proportion",
308 &m_AuiPanels.properties_splitter, 0.5f ) );
309
310 m_params.emplace_back( new PARAM<bool>( "autoplace_fields.enable",
311 &m_AutoplaceFields.enable, true ) );
312
313 m_params.emplace_back( new PARAM<bool>( "autoplace_fields.allow_rejustify",
314 &m_AutoplaceFields.allow_rejustify, true ) );
315
316 m_params.emplace_back( new PARAM<bool>( "autoplace_fields.align_to_grid",
317 &m_AutoplaceFields.align_to_grid, true ) );
318
319 m_params.emplace_back( new PARAM<int>( "drawing.default_bus_thickness",
320 &m_Drawing.default_bus_thickness, DEFAULT_BUS_WIDTH_MILS ) );
321
322 m_params.emplace_back( new PARAM<int>( "drawing.default_junction_size",
323 &m_Drawing.default_junction_size, DEFAULT_JUNCTION_DIAM ) );
324
325 m_params.emplace_back( new PARAM<int>( "drawing.pin_symbol_size",
326 &m_Drawing.pin_symbol_size, DEFAULT_TEXT_SIZE / 2 ) );
327
328 m_params.emplace_back( new PARAM<double>( "drawing.text_offset_ratio",
329 &m_Drawing.text_offset_ratio, 0.08 ) );
330
331 m_params.emplace_back( new PARAM<int>( "drawing.default_line_thickness",
332 &m_Drawing.default_line_thickness, DEFAULT_LINE_WIDTH_MILS ) );
333
334 m_params.emplace_back( new PARAM<int>( "drawing.default_repeat_offset_x",
335 &m_Drawing.default_repeat_offset_x, 0 ) );
336
337 m_params.emplace_back( new PARAM<int>( "drawing.default_repeat_offset_y",
338 &m_Drawing.default_repeat_offset_y, 100 ) );
339
340 m_params.emplace_back( new PARAM<int>( "drawing.default_wire_thickness",
341 &m_Drawing.default_wire_thickness, DEFAULT_WIRE_WIDTH_MILS ) );
342
343 m_params.emplace_back( new PARAM<int>( "drawing.default_text_size",
344 &m_Drawing.default_text_size, DEFAULT_TEXT_SIZE ) );
345
346 m_params.emplace_back( new PARAM<wxString>( "drawing.field_names",
347 &m_Drawing.field_names, "" ) );
348
349 m_params.emplace_back( new PARAM<int>( "drawing.line_mode",
350 &m_Drawing.line_mode, LINE_MODE::LINE_MODE_90 ) );
351
352 m_params.emplace_back( new PARAM<int>( "editing.arc_edit_mode",
353 reinterpret_cast<int*>( &m_Drawing.arc_edit_mode ),
355
356 m_params.emplace_back( new PARAM<bool>( "drawing.auto_start_wires",
357 &m_Drawing.auto_start_wires, true ) );
358
359 m_params.emplace_back( new PARAM<int>( "drawing.repeat_label_increment",
360 &m_Drawing.repeat_label_increment, 1 ) );
361
362 m_params.emplace_back( new PARAM<COLOR4D>( "drawing.default_sheet_border_color",
363 &m_Drawing.default_sheet_border_color, COLOR4D::UNSPECIFIED ) );
364
365 m_params.emplace_back( new PARAM<COLOR4D>( "drawing.default_sheet_background_color",
366 &m_Drawing.default_sheet_background_color, COLOR4D::UNSPECIFIED ) );
367
368 m_params.emplace_back( new PARAM_ENUM<POWER_SYMBOLS>( "drawing.new_power_symbols",
370
371 m_params.emplace_back( new PARAM_LIST<double>( "drawing.junction_size_mult_list",
372 &m_Drawing.junction_size_mult_list, { 0.0, 1.7, 4.0, 6.0, 9.0, 12.0 } ) );
373
374 m_params.emplace_back( new PARAM<int>( "drawing.junction_size_choice",
375 &m_Drawing.junction_size_choice, 3 ) );
376
377 m_params.emplace_back( new PARAM<int>( "drawing.hop_over_size_choice",
378 &m_Drawing.hop_over_size_choice, 0 ) );
379
380 m_params.emplace_back( new PARAM<bool>( "find_replace.search_all_fields",
381 &m_FindReplaceExtra.search_all_fields, false ) );
382
383 m_params.emplace_back( new PARAM<bool>( "find_replace.search_all_pins",
384 &m_FindReplaceExtra.search_all_pins, false ) );
385
386 m_params.emplace_back( new PARAM<bool>( "find_replace.search_current_sheet_only",
387 &m_FindReplaceExtra.search_current_sheet_only, false ) );
388
389 m_params.emplace_back( new PARAM<bool>( "find_replace.replace_references",
390 &m_FindReplaceExtra.replace_references, false ) );
391
392 m_params.emplace_back( new PARAM<bool>( "input.drag_is_move",
393 &m_Input.drag_is_move, false ) );
394
395 m_params.emplace_back( new PARAM<bool>( "input.esc_clears_net_highlight",
396 &m_Input.esc_clears_net_highlight, true ) );
397
398 m_params.emplace_back( new PARAM<int>( "selection.thickness",
399 &m_Selection.selection_thickness, 3 ) );
400
401 m_params.emplace_back( new PARAM<int>( "selection.highlight_thickness",
402 &m_Selection.highlight_thickness, 2 ) );
403
404 m_params.emplace_back( new PARAM<bool>( "selection.draw_selected_children",
405 &m_Selection.draw_selected_children, true ) );
406
407 m_params.emplace_back( new PARAM<bool>( "selection.fill_shapes",
408 &m_Selection.fill_shapes, false ) );
409
410 m_params.emplace_back( new PARAM<bool>( "selection.highlight_netclass_colors",
411 &m_Selection.highlight_netclass_colors, false ) );
412
413 m_params.emplace_back( new PARAM<int>( "selection.highlight_netclass_colors_thickness",
414 &m_Selection.highlight_netclass_colors_thickness, 15, 0, 50 ) );
415
416 m_params.emplace_back( new PARAM<double>( "selection.highlight_netclass_colors_alpha",
417 &m_Selection.highlight_netclass_colors_alpha, 0.6, 0, 1 ) );
418
419 m_params.emplace_back( new PARAM<bool>( "annotation.automatic",
420 &m_AnnotatePanel.automatic, true ) );
421
422 m_params.emplace_back( new PARAM<bool>( "annotation.recursive",
423 &m_AnnotatePanel.recursive, true ) );
424
425 m_params.emplace_back( new PARAM<int>( "annotation.scope",
426 &m_AnnotatePanel.scope, 0, 0, 2 ) );
427
428 m_params.emplace_back( new PARAM<int>( "annotation.options",
429 &m_AnnotatePanel.options, 0, 0, 2 ) );
430
431 m_params.emplace_back( new PARAM<int>( "annotation.messages_filter",
432 &m_AnnotatePanel.messages_filter, -1 ) );
433
434
435 m_params.emplace_back( new PARAM<wxString>( "bom.selected_plugin",
436 &m_BomPanel.selected_plugin, "" ) );
437
438 m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>( "bom.plugins",
439 std::bind( &EESCHEMA_SETTINGS::bomSettingsToJson, this ),
440 [&]( const nlohmann::json& aObj )
441 {
442 if( !aObj.is_array() )
443 return;
444
445 const nlohmann::json& list = aObj.empty() ? defaultBomPlugins : aObj;
446
447 m_BomPanel.plugins = bomSettingsFromJson( list );
448 },
450
451 m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>( "netlist.plugins",
453 [&]( const nlohmann::json& aObj )
454 {
455 if( !aObj.is_array() )
456 return;
457
458 if( aObj.empty() )
459 return;
460
461 const nlohmann::json& list = aObj;
462
463 m_NetlistPanel.plugins = netlistSettingsFromJson( list );
464 },
465 nullptr ) );
466
467 m_params.emplace_back( new PARAM<bool>( "page_settings.export_paper",
468 &m_PageSettings.export_paper, false ) );
469
470 m_params.emplace_back( new PARAM<bool>( "page_settings.export_revision",
471 &m_PageSettings.export_revision, false ) );
472
473 m_params.emplace_back( new PARAM<bool>( "page_settings.export_date",
474 &m_PageSettings.export_date, false ) );
475
476 m_params.emplace_back( new PARAM<bool>( "page_settings.export_title",
477 &m_PageSettings.export_title, false ) );
478
479 m_params.emplace_back( new PARAM<bool>( "page_settings.export_company",
480 &m_PageSettings.export_company, false ) );
481
482 m_params.emplace_back( new PARAM<bool>( "page_settings.export_comment1",
483 &m_PageSettings.export_comment1, false ) );
484
485 m_params.emplace_back( new PARAM<bool>( "page_settings.export_comment2",
486 &m_PageSettings.export_comment2, false ) );
487
488 m_params.emplace_back( new PARAM<bool>( "page_settings.export_comment3",
489 &m_PageSettings.export_comment3, false ) );
490
491 m_params.emplace_back( new PARAM<bool>( "page_settings.export_comment4",
492 &m_PageSettings.export_comment4, false ) );
493
494 m_params.emplace_back( new PARAM<bool>( "page_settings.export_comment5",
495 &m_PageSettings.export_comment5, false ) );
496
497 m_params.emplace_back( new PARAM<bool>( "page_settings.export_comment6",
498 &m_PageSettings.export_comment6, false ) );
499
500 m_params.emplace_back( new PARAM<bool>( "page_settings.export_comment7",
501 &m_PageSettings.export_comment7, false ) );
502
503 m_params.emplace_back( new PARAM<bool>( "page_settings.export_comment8",
504 &m_PageSettings.export_comment8, false ) );
505
506 m_params.emplace_back( new PARAM<bool>( "page_settings.export_comment9",
507 &m_PageSettings.export_comment9, false ) );
508
509 m_params.emplace_back( new PARAM_MAP<int>( "field_editor.field_widths",
510 &m_FieldEditorPanel.field_widths, {} ) );
511
512 m_params.emplace_back( new PARAM<int>( "field_editor.page",
513 &m_FieldEditorPanel.page, 0 ) );
514
515 m_params.emplace_back( new PARAM<wxString>( "field_editor.export_filename",
516 &m_FieldEditorPanel.export_filename, wxT( "" ) ) );
517
518 m_params.emplace_back( new PARAM<int>( "field_editor.selection_mode",
519 &m_FieldEditorPanel.selection_mode, 0 ) );
520
521 m_params.emplace_back( new PARAM<int>( "field_editor.scope",
522 &m_FieldEditorPanel.scope, 0 ) );
523
524 m_params.emplace_back( new PARAM<wxString>( "field_editor.view_controls_visible_columns",
525 &m_FieldEditorPanel.view_controls_visible_columns, "0 1 2 3" ) );
526
527 m_params.emplace_back( new PARAM<int>( "field_editor.sash_pos",
528 &m_FieldEditorPanel.sash_pos, 400 ) );
529
530 m_params.emplace_back( new PARAM<bool>( "field_editor.sidebar_collapsed",
531 &m_FieldEditorPanel.sidebar_collapsed, false ) );
532
533 addParamsForWindow( &m_Simulator.window, "simulator.window", 500, 400 );
534
535 m_params.emplace_back( new PARAM<int>( "simulator.plot_panel_width",
536 &m_Simulator.view.plot_panel_width, 0 ) );
537
538 m_params.emplace_back( new PARAM<int>( "simulator.plot_panel_height",
539 &m_Simulator.view.plot_panel_height, 0 ) );
540
541 m_params.emplace_back( new PARAM<int>( "simulator.signal_panel_height",
542 &m_Simulator.view.signal_panel_height, 0 ) );
543
544 m_params.emplace_back( new PARAM<int>( "simulator.cursors_panel_height",
545 &m_Simulator.view.cursors_panel_height, 0 ) );
546
547 m_params.emplace_back( new PARAM<int>( "simulator.measurements_panel_height",
548 &m_Simulator.view.measurements_panel_height, 0 ) );
549
550 m_params.emplace_back( new PARAM<bool>( "simulator.white_background",
551 &m_Simulator.view.white_background, false ) );
552
553 m_params.emplace_back( new PARAM_ENUM<SIM_MOUSE_WHEEL_ACTION>( "simulator.mouse_wheel_actions.vertical_unmodified",
554 &m_Simulator.preferences.mouse_wheel_actions.vertical_unmodified,
557
558 m_params.emplace_back( new PARAM_ENUM<SIM_MOUSE_WHEEL_ACTION>( "simulator.mouse_wheel_actions.vertical_with_ctrl",
559 &m_Simulator.preferences.mouse_wheel_actions.vertical_with_ctrl,
562
563 m_params.emplace_back( new PARAM_ENUM<SIM_MOUSE_WHEEL_ACTION>( "simulator.mouse_wheel_actions.vertical_with_shift",
564 &m_Simulator.preferences.mouse_wheel_actions.vertical_with_shift,
567
568 m_params.emplace_back( new PARAM_ENUM<SIM_MOUSE_WHEEL_ACTION>( "simulator.mouse_wheel_actions.vertical_with_alt",
569 &m_Simulator.preferences.mouse_wheel_actions.vertical_with_alt,
572
573 m_params.emplace_back( new PARAM_ENUM<SIM_MOUSE_WHEEL_ACTION>( "simulator.mouse_wheel_actions.horizontal",
574 &m_Simulator.preferences.mouse_wheel_actions.horizontal, SIM_MOUSE_WHEEL_ACTION::NONE,
576
577 m_params.emplace_back( new PARAM<int>( "symbol_chooser.sash_pos_h",
578 &m_SymChooserPanel.sash_pos_h, -1 ) );
579
580 m_params.emplace_back( new PARAM<int>( "symbol_chooser.sash_pos_v",
581 &m_SymChooserPanel.sash_pos_v, -1 ) );
582
583 m_params.emplace_back( new PARAM<int>( "symbol_chooser.width",
584 &m_SymChooserPanel.width, -1 ) );
585
586 m_params.emplace_back( new PARAM<int>( "symbol_chooser.height",
587 &m_SymChooserPanel.height, -1 ) );
588
589 m_params.emplace_back( new PARAM<int>( "symbol_chooser.sort_mode",
590 &m_SymChooserPanel.sort_mode, 0 ) );
591
592 m_params.emplace_back( new PARAM<bool>( "ERC.crossprobe",
593 &m_ERCDialog.crossprobe, true ) );
594
595 m_params.emplace_back( new PARAM<bool>( "ERC.scroll_on_crossprobe",
596 &m_ERCDialog.scroll_on_crossprobe, true ) );
597
598 m_params.emplace_back( new PARAM<bool>( "import_graphics.interactive_placement",
599 &m_ImportGraphics.interactive_placement, true ) );
600
601 m_params.emplace_back( new PARAM<int>( "import_graphics.line_width_units",
602 &m_ImportGraphics.dxf_line_width_units, 0 ) );
603
604 m_params.emplace_back( new PARAM<double>( "import_graphics.line_width",
605 &m_ImportGraphics.dxf_line_width, 0.2 ) );
606
607 m_params.emplace_back( new PARAM<int>( "import_graphics.origin_units",
608 &m_ImportGraphics.origin_units, 0 ) );
609
610 m_params.emplace_back( new PARAM<double>( "import_graphics.origin_x",
611 &m_ImportGraphics.origin_x, 0 ) );
612
613 m_params.emplace_back( new PARAM<double>( "import_graphics.origin_y",
614 &m_ImportGraphics.origin_y, 0 ) );
615
616 m_params.emplace_back( new PARAM<int>( "import_graphics.dxf_units",
617 &m_ImportGraphics.dxf_units, 0 ) );
618
619 m_params.emplace_back( new PARAM<bool>( "system.never_show_rescue_dialog",
620 &m_RescueNeverShow, false ) );
621
622 addParamsForWindow( &m_LibViewPanel.window, "lib_view.window", 500, 400 );
623
624 m_params.emplace_back( new PARAM<int>( "lib_view.lib_list_width",
625 &m_LibViewPanel.lib_list_width, 150 ) );
626
627 m_params.emplace_back( new PARAM<int>( "lib_view.cmp_list_width",
628 &m_LibViewPanel.cmp_list_width, 150 ) );
629
630 m_params.emplace_back( new PARAM<bool>( "lib_view.show_pin_electrical_type",
631 &m_LibViewPanel.show_pin_electrical_type, true ) );
632
633 m_params.emplace_back( new PARAM<wxString>( "system.last_symbol_lib_dir",
634 &m_lastSymbolLibDir, "" ) );
635
636 // Migrations
637 registerMigration( 0, 1,
638 [&]() -> bool
639 {
640 // Version 0 to 1: BOM plugin settings moved from sexpr to JSON
641 return migrateBomSettings();
642 } );
643
644
645 registerMigration( 1, 2,
646 [&]() -> bool
647 {
648 // We used to have a bug on GTK which would set the lib tree column width way
649 // too narrow.
650 if( std::optional<int> optval = Get<int>( "lib_tree.column_width" ) )
651 {
652 if( optval < 150 )
653 Set( "lib_tree.column_width", 300 );
654 }
655
656 return true;
657 } );
658
659 registerMigration( 2, 3,
660 [&]() -> bool
661 {
662 // This is actually a migration for APP_SETTINGS_BASE::m_LibTree
663 return migrateLibTreeWidth();
664 } );
665}
666
667
668bool EESCHEMA_SETTINGS::MigrateFromLegacy( wxConfigBase* aCfg )
669{
670 bool ret = APP_SETTINGS_BASE::MigrateFromLegacy( aCfg );
671
672 // Now modify the loaded grid selection, because in earlier versions the grids index was shared
673 // between all applications and started at 1000 mils. There is a 4-position offset between
674 // this index and the possible eeschema grids list that we have to subtract.
675 std::string gridSizePtr = "window.grid.last_size";
676
677 if( std::optional<int> currentSize = Get<int>( gridSizePtr ) )
678 {
679 Set( gridSizePtr, *currentSize - 4 );
680 }
681 else
682 {
683 // Otherwise, default grid size should be 50 mils; index 1
684 Set( gridSizePtr, 1 );
685 }
686
687 ret &= fromLegacy<bool>( aCfg, "FootprintPreview", "appearance.footprint_preview" );
688 ret &= fromLegacy<bool>( aCfg, "NavigatorStaysOpen", "appearance.navigator_stays_open" );
689 ret &= fromLegacy<bool>( aCfg, "PrintSheetReferenceAndTitleBlock",
690 "appearance.print_sheet_reference" );
691 ret &= fromLegacy<bool>( aCfg, "ShowHiddenPins", "appearance.show_hidden_pins" );
692 ret &= fromLegacy<bool>( aCfg, "ShowIllegalSymbolLibDialog",
693 "appearance.show_illegal_symbol_lib_dialog" );
694 ret &= fromLegacy<bool>( aCfg, "ShowPageLimits", "appearance.show_page_limits" );
695 ret &= fromLegacy<bool>( aCfg, "ShowSheetFileNameCaseSensitivityDlg",
696 "appearance.show_sheet_filename_case_sensitivity_dialog" );
697
698 ret &= fromLegacy<bool>( aCfg, "AutoplaceFields", "autoplace_fields.enable" );
699 ret &= fromLegacy<bool>( aCfg, "AutoplaceJustify", "autoplace_fields.allow_rejustify" );
700 ret &= fromLegacy<bool>( aCfg, "AutoplaceAlign", "autoplace_fields.align_to_grid" );
701
702 ret &= fromLegacy<int>( aCfg, "DefaultBusWidth", "drawing.default_bus_thickness" );
703 ret &= fromLegacy<int>( aCfg, "DefaultJunctionSize", "drawing.default_junction_size" );
704 ret &= fromLegacy<int>( aCfg, "DefaultDrawLineWidth", "drawing.default_line_thickness" );
705 ret &= fromLegacy<int>( aCfg, "RepeatStepX", "drawing.default_repeat_offset_x" );
706 ret &= fromLegacy<int>( aCfg, "RepeatStepY", "drawing.default_repeat_offset_y" );
707 ret &= fromLegacy<int>( aCfg, "DefaultWireWidth", "drawing.default_wire_thickness" );
708 ret &= fromLegacyString( aCfg, "FieldNames", "drawing.field_names" );
709 ret &= fromLegacy<bool>( aCfg, "HorizVertLinesOnly", "drawing.line_mode" );
710 ret &= fromLegacy<int>( aCfg, "RepeatLabelIncrement", "drawing.repeat_label_increment" );
711
712 ret &= fromLegacy<bool>( aCfg, "DragActionIsMove", "input.drag_is_move" );
713
714 ret &= fromLegacy<int>( aCfg, "SelectionThickness", "selection.thickness" );
715 ret &= fromLegacy<bool>( aCfg, "SelectionDrawChildItems", "selection.draw_selected_children" );
716 ret &= fromLegacy<bool>( aCfg, "SelectionFillShapes", "selection.fill_shapes" );
717 ret &= fromLegacy<bool>( aCfg, "SelectPinSelectSymbolOpt",
718 "selection.select_pin_selects_symbol" );
719
720 ret &= fromLegacy<int>( aCfg, "AnnotateFilterMsg", "annotation.messages_filter" );
721
722 ret &= fromLegacyString( aCfg, "bom_plugin_selected", "bom.selected_plugin" );
723 ret &= fromLegacyString( aCfg, "bom_plugins", "bom.plugins" );
724
726
727 ret &= fromLegacyString( aCfg, "SymbolFieldsShownColumns",
728 "edit_sch_component.visible_columns" );
729
730 ret &= fromLegacy<bool>( aCfg, "PageSettingsExportRevision", "page_settings.export_revision" );
731 ret &= fromLegacy<bool>( aCfg, "PageSettingsExportDate", "page_settings.export_date" );
732 ret &= fromLegacy<bool>( aCfg, "PageSettingsExportTitle", "page_settings.export_title" );
733 ret &= fromLegacy<bool>( aCfg, "PageSettingsExportCompany", "page_settings.export_company" );
734 ret &= fromLegacy<bool>( aCfg, "PageSettingsExportComment1", "page_settings.export_comment1" );
735 ret &= fromLegacy<bool>( aCfg, "PageSettingsExportComment2", "page_settings.export_comment2" );
736 ret &= fromLegacy<bool>( aCfg, "PageSettingsExportComment3", "page_settings.export_comment3" );
737 ret &= fromLegacy<bool>( aCfg, "PageSettingsExportComment4", "page_settings.export_comment4" );
738 ret &= fromLegacy<bool>( aCfg, "PageSettingsExportComment5", "page_settings.export_comment5" );
739 ret &= fromLegacy<bool>( aCfg, "PageSettingsExportComment6", "page_settings.export_comment6" );
740 ret &= fromLegacy<bool>( aCfg, "PageSettingsExportComment7", "page_settings.export_comment7" );
741 ret &= fromLegacy<bool>( aCfg, "PageSettingsExportComment8", "page_settings.export_comment8" );
742 ret &= fromLegacy<bool>( aCfg, "PageSettingsExportComment9", "page_settings.export_comment9" );
743
744 #if 0 // To do: move this code to the new netlist plugin management in settings
745 {
746 constexpr int max_custom_commands = 8; // from DIALOG_NETLIST
747 nlohmann::json js_cmd = nlohmann::json::array();
748 nlohmann::json js_title = nlohmann::json::array();
749 wxString cmd_key, title_key, cmd, title;
750
751 for( int i = 1; i <= max_custom_commands; ++i )
752 {
753 // Only migrate if both title and command are specified
754 cmd_key.Printf( "CustomNetlistCommand%d", i );
755 title_key.Printf( "CustomNetlistTitle%d", i );
756
757 if( aCfg->Read( cmd_key, &cmd ) && aCfg->Read( title_key, &title )
758 && !cmd.IsEmpty() && !title.IsEmpty() )
759 {
760 js_cmd.push_back( cmd.ToUTF8() );
761 js_title.push_back( title.ToUTF8() );
762 }
763 }
764
765 Set( "netlist.custom_command_titles", js_title );
766 Set( "netlist.custom_command_paths", js_cmd );
767 }
768 #endif
769
770 {
771 // NOTE(JE) These parameters should move to project-local storage before V6, but we are
772 // migrating them here in order to preserve data. There is a bug here that is preserved:
773 // keys are taken directly from the (translated) UI and stored in the config, so if the user
774 // changes languages the keys will no longer work.
775 aCfg->SetPath( "SymbolFieldEditor/Show/" );
776
777 nlohmann::json js = nlohmann::json( {} );
778 wxString key;
779 bool value = false;
780 long index = 0;
781
782 while( aCfg->GetNextEntry( key, index ) )
783 {
784 if( aCfg->Read( key, &value ) )
785 {
786 std::string key_utf( key.ToUTF8() );
787
788 try
789 {
790 js[ std::move( key_utf ) ] = value;
791 }
792 catch(...)
793 {
794 continue;
795 }
796 }
797 }
798
799 Set( "field_editor.fields_show", js );
800
801 aCfg->SetPath( "../GroupBy" );
802
803 while( aCfg->GetNextEntry( key, index ) )
804 {
805 if( aCfg->Read( key, &value ) )
806 {
807 std::string key_utf( key.ToUTF8() );
808
809 try
810 {
811 js[ std::move( key_utf ) ] = value;
812 }
813 catch(...)
814 {
815 continue;
816 }
817 }
818 }
819
820 Set( "field_editor.fields_group_by", js );
821
822 aCfg->SetPath( "../.." );
823 }
824
825 ret &= fromLegacy<bool>( aCfg, "PlotModeColor", "plot.color" );
826 ret &= fromLegacy<int>( aCfg, "PlotFormat", "plot.format" );
827 ret &= fromLegacy<bool>( aCfg, "PlotFrameRef", "plot.frame_reference" );
828
829 ret &= fromLegacy<int>( aCfg, "SIM_PLOT_FRAMEPos_x", "simulator.window.pos_x" );
830 ret &= fromLegacy<int>( aCfg, "SIM_PLOT_FRAMEPos_y", "simulator.window.pos_y" );
831 ret &= fromLegacy<int>( aCfg, "SIM_PLOT_FRAMESize_x", "simulator.window.size_x" );
832 ret &= fromLegacy<int>( aCfg, "SIM_PLOT_FRAMESize_y", "simulator.window.size_y" );
833 ret &= fromLegacy<bool>( aCfg, "SIM_PLOT_FRAMEMaximized", "simulator.window.maximized" );
834 ret &= fromLegacyString( aCfg, "SIM_PLOT_FRAMEPerspective", "simulator.window.perspective" );
835 ret &= fromLegacyString( aCfg, "SIM_PLOT_FRAMEMostRecentlyUsedPath", "simulator.mru_path" );
836 ret &= fromLegacy<int>( aCfg, "SimPlotPanelWidth", "simulator.plot_panel_width" );
837 ret &= fromLegacy<int>( aCfg, "SimPlotPanelHeight", "simulator.plot_panel_height" );
838 ret &= fromLegacy<int>( aCfg, "SimSignalPanelHeight", "simulator.signal_panel_height" );
839 ret &= fromLegacy<int>( aCfg, "SimCursorsPanelHeight", "simulator.cursors_panel_height" );
840 ret &= fromLegacy<bool>( aCfg, "SimPlotWhiteBg", "simulator.white_background" );
841
842 ret &= fromLegacy<int>( aCfg, "SymbolChooserHSashPosition", "symbol_chooser.sash_pos_h" );
843 ret &= fromLegacy<int>( aCfg, "SymbolChooserVSashPosition", "symbol_chooser.sash_pos_v" );
844 ret &= fromLegacy<int>( aCfg, "SymbolChooserWidth", "symbol_chooser.width" );
845 ret &= fromLegacy<int>( aCfg, "SymbolChooserHeight", "symbol_chooser.height" );
846
847 const std::string vlf = "ViewlibFrame";
848 ret &= fromLegacy<bool>( aCfg, vlf + "Maximized", "lib_view.window.maximized" );
849 ret &= fromLegacyString( aCfg, vlf + "MostRecentlyUsedPath", "lib_view.window.mru_path" );
850 ret &= fromLegacy<int>( aCfg, vlf + "Size_x", "lib_view.window.size_x" );
851 ret &= fromLegacy<int>( aCfg, vlf + "Size_y", "lib_view.window.size_y" );
852 ret &= fromLegacyString( aCfg, vlf + "Perspective", "lib_view.window.perspective" );
853 ret &= fromLegacy<int>( aCfg, vlf + "Pos_x", "lib_view.window.pos_x" );
854 ret &= fromLegacy<int>( aCfg, vlf + "Pos_y", "lib_view.window.pos_y" );
855 ret &= fromLegacy<int>( aCfg, "ViewLiblistWidth", "lib_view.lib_list_width" );
856 ret &= fromLegacy<int>( aCfg, "ViewCmplistWidth", "lib_view.cmp_list_width" );
857 ret &= fromLegacy<bool>( aCfg,
858 "ViewCmpShowPinElectricalType", "lib_view.show_pin_electrical_type" );
859 ret &= fromLegacy<bool>( aCfg, vlf + "ShowGrid", "lib_view.grid.show" );
860 ret &= fromLegacy<int>( aCfg, vlf + "_LastGridSize", "lib_view.grid.last_size" );
861
862 ret &= fromLegacy<bool>( aCfg, "RescueNeverShow", "system.never_show_rescue_dialog" );
863
864 // Legacy version stored this setting in eeschema, so move it to common if it exists
865 bool tmp;
866
867 if( aCfg->Read( "MoveWarpsCursor", &tmp ) )
868 Pgm().GetCommonSettings()->m_Input.warp_mouse_on_move = tmp;
869
872
873 auto migrateLegacyColor =
874 [&] ( const std::string& aKey, int aLayerId )
875 {
876 wxString str;
877
878 if( aCfg->Read( aKey, &str ) )
879 cs->SetColor( aLayerId, COLOR4D( str ) );
880 };
881
882 migrateLegacyColor( "Color4DBgCanvasEx", LAYER_SCHEMATIC_BACKGROUND );
883 migrateLegacyColor( "Color4DBodyBgEx", LAYER_DEVICE_BACKGROUND );
884 migrateLegacyColor( "Color4DBodyEx", LAYER_DEVICE );
885 migrateLegacyColor( "Color4DBrightenedEx", LAYER_BRIGHTENED );
886 migrateLegacyColor( "Color4DBusEx", LAYER_BUS );
887 migrateLegacyColor( "Color4DConnEx", LAYER_JUNCTION );
888 migrateLegacyColor( "Color4DCursorEx", LAYER_SCHEMATIC_CURSOR );
889 migrateLegacyColor( "Color4DErcEEx", LAYER_ERC_ERR );
890 migrateLegacyColor( "Color4DErcWEx", LAYER_ERC_WARN );
891 migrateLegacyColor( "Color4DFieldEx", LAYER_FIELDS );
892 migrateLegacyColor( "Color4DGLabelEx", LAYER_GLOBLABEL );
893 migrateLegacyColor( "Color4DGridEx", LAYER_SCHEMATIC_GRID );
894 migrateLegacyColor( "Color4DHLabelEx", LAYER_HIERLABEL );
895 migrateLegacyColor( "Color4DHiddenEx", LAYER_HIDDEN );
896 migrateLegacyColor( "Color4DLLabelEx", LAYER_LOCLABEL );
897 migrateLegacyColor( "Color4DNoConnectEx", LAYER_NOCONNECT );
898 migrateLegacyColor( "Color4DNoteEx", LAYER_NOTES );
899 migrateLegacyColor( "Color4DPinEx", LAYER_PIN );
900 migrateLegacyColor( "Color4DPinNameEx", LAYER_PINNAM );
901 migrateLegacyColor( "Color4DPinNumEx", LAYER_PINNUM );
902 migrateLegacyColor( "Color4DReferenceEx", LAYER_REFERENCEPART );
903 migrateLegacyColor( "Color4DShadowEx", LAYER_SELECTION_SHADOWS );
904 migrateLegacyColor( "Color4DSheetEx", LAYER_SHEET );
905 migrateLegacyColor( "Color4DSheetFileNameEx", LAYER_SHEETFILENAME );
906 migrateLegacyColor( "Color4DSheetLabelEx", LAYER_SHEETLABEL );
907 migrateLegacyColor( "Color4DSheetNameEx", LAYER_SHEETNAME );
908 migrateLegacyColor( "Color4DValueEx", LAYER_VALUEPART );
909 migrateLegacyColor( "Color4DWireEx", LAYER_WIRE );
910 migrateLegacyColor( "Color4DWorksheetEx", LAYER_SCHEMATIC_DRAWINGSHEET );
911
912 mgr.SaveColorSettings( cs, "schematic" );
913
914 Set( "appearance.color_theme", cs->GetFilename() );
915
916 // LibEdit settings were stored with eeschema. If eeschema is the first app to run,
917 // we need to migrate the LibEdit settings here
918
919 if( SYMBOL_EDITOR_SETTINGS* sym_edit_cfg = GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" ) )
920 {
921 sym_edit_cfg->MigrateFromLegacy( aCfg );
922 sym_edit_cfg->Load();
923 }
924
925 return ret;
926}
927
928
933class BOM_CFG_PARSER : public DIALOG_BOM_CFG_LEXER
934{
935 std::vector<EESCHEMA_SETTINGS::BOM_PLUGIN_SETTINGS>* m_pluginList;
936
937public:
938 BOM_CFG_PARSER( std::vector<EESCHEMA_SETTINGS::BOM_PLUGIN_SETTINGS>* aPluginList,
939 const char* aData, const wxString& aSource );
940
941 void Parse();
942
943private:
944 void parseGenerator();
945};
946
947
948std::vector<EESCHEMA_SETTINGS::BOM_PLUGIN_SETTINGS> EESCHEMA_SETTINGS::DefaultBomPlugins()
949{
951}
952
953
955{
956 if( !Contains( "bom.plugins" ) )
957 return false;
958
959 wxString list = *Get<wxString>( "bom.plugins" );
960
961 BOM_CFG_PARSER cfg_parser( &m_BomPanel.plugins, TO_UTF8( list ), wxT( "plugins" ) );
962
963 try
964 {
965 cfg_parser.Parse();
966 }
967 catch( const IO_ERROR& )
968 {
969 return false;
970 }
971
972 // Parser will have loaded up our array, let's dump it out to JSON
973 At( "bom.plugins" ) = bomSettingsToJson();
974
975 return true;
976}
977
978
980{
981 nlohmann::json js = nlohmann::json::array();
982
983 for( const BOM_PLUGIN_SETTINGS& plugin : m_BomPanel.plugins )
984 {
985 nlohmann::json pluginJson;
986
987 pluginJson["name"] = plugin.name.ToUTF8();
988 pluginJson["path"] = plugin.path.ToUTF8();
989 pluginJson["command"] = plugin.command.ToUTF8();
990
991 js.push_back( pluginJson );
992 }
993
994 return js;
995}
996
997
998std::vector<EESCHEMA_SETTINGS::BOM_PLUGIN_SETTINGS> EESCHEMA_SETTINGS::bomSettingsFromJson(
999 const nlohmann::json& aObj )
1000{
1001 std::vector<EESCHEMA_SETTINGS::BOM_PLUGIN_SETTINGS> ret;
1002
1003 wxASSERT( aObj.is_array() );
1004
1005 for( const nlohmann::json& entry : aObj )
1006 {
1007 if( entry.empty() || !entry.is_object() )
1008 continue;
1009
1010 if( !entry.contains( "name" ) || !entry.contains( "path" ) )
1011 continue;
1012
1013 BOM_PLUGIN_SETTINGS plugin( entry.at( "name" ).get<wxString>(),
1014 entry.at( "path" ).get<wxString>() );
1015
1016 if( entry.contains( "command" ) )
1017 plugin.command = entry.at( "command" ).get<wxString>();
1018
1019 ret.emplace_back( plugin );
1020 }
1021
1022 return ret;
1023}
1024
1025
1027{
1028 nlohmann::json js = nlohmann::json::array();
1029
1030 for( const NETLIST_PLUGIN_SETTINGS& plugin : m_NetlistPanel.plugins )
1031 {
1032 nlohmann::json pluginJson;
1033
1034 pluginJson["name"] = plugin.name.ToUTF8();
1035 pluginJson["path"] = plugin.path.ToUTF8();
1036 pluginJson["command"] = plugin.command.ToUTF8();
1037
1038 js.push_back( pluginJson );
1039 }
1040
1041 return js;
1042}
1043
1044
1045std::vector<EESCHEMA_SETTINGS::NETLIST_PLUGIN_SETTINGS> EESCHEMA_SETTINGS::netlistSettingsFromJson(
1046 const nlohmann::json& aObj )
1047{
1048 std::vector<EESCHEMA_SETTINGS::NETLIST_PLUGIN_SETTINGS> ret;
1049
1050 wxASSERT( aObj.is_array() );
1051
1052 for( const nlohmann::json& entry : aObj )
1053 {
1054 if( entry.empty() || !entry.is_object() )
1055 continue;
1056
1057 if( !entry.contains( "name" ) || !entry.contains( "path" ) )
1058 continue;
1059
1060 NETLIST_PLUGIN_SETTINGS plugin( entry.at( "name" ).get<wxString>(),
1061 entry.at( "path" ).get<wxString>() );
1062
1063 if( entry.contains( "command" ) )
1064 plugin.command = entry.at( "command" ).get<wxString>();
1065
1066 ret.emplace_back( plugin );
1067 }
1068
1069 return ret;
1070}
1071
1072
1073BOM_CFG_PARSER::BOM_CFG_PARSER( std::vector<EESCHEMA_SETTINGS::BOM_PLUGIN_SETTINGS>* aPluginList,
1074 const char* aLine, const wxString& aSource ) :
1075 DIALOG_BOM_CFG_LEXER( aLine, aSource )
1076{
1077 wxASSERT( aPluginList );
1078 m_pluginList = aPluginList;
1079}
1080
1081
1083{
1084 T token;
1085
1086 while( ( token = NextTok() ) != T_RIGHT )
1087 {
1088 if( token == T_EOF)
1089 break;
1090
1091 if( token == T_LEFT )
1092 token = NextTok();
1093
1094 if( token == T_plugins )
1095 continue;
1096
1097 switch( token )
1098 {
1099 case T_plugin: // Defines a new plugin
1101 break;
1102
1103 default:
1104// Unexpected( CurText() );
1105 break;
1106 }
1107 }
1108}
1109
1110
1112{
1113 wxString str;
1115
1116 NeedSYMBOLorNUMBER();
1117 settings.path = FromUTF8();
1118
1119 T token;
1120
1121 while( ( token = NextTok() ) != T_RIGHT )
1122 {
1123 if( token == T_EOF)
1124 break;
1125
1126 switch( token )
1127 {
1128 case T_LEFT:
1129 break;
1130
1131 case T_cmd:
1132 NeedSYMBOLorNUMBER();
1133
1134 settings.command = FromUTF8();
1135
1136 NeedRIGHT();
1137 break;
1138
1139 case T_opts:
1140 {
1141 NeedSYMBOLorNUMBER();
1142
1143 wxString option = FromUTF8();
1144
1145 if( option.StartsWith( wxS( "nickname=" ), &str ) )
1146 settings.name = str;
1147
1148 NeedRIGHT();
1149 break;
1150 }
1151
1152 default:
1153 Unexpected( CurText() );
1154 break;
1155 }
1156 }
1157
1158 m_pluginList->emplace_back( settings );
1159}
@ KEEP_CENTER_ADJUST_ANGLE_RADIUS
When editing endpoints, the angle and radius are adjusted.
APP_SETTINGS_BASE(const std::string &aFilename, int aSchemaVersion)
void addParamsForWindow(WINDOW_SETTINGS *aWindow, const std::string &aJsonPath, int aDefaultWidth=0, int aDefaultHeight=0)
Add parameters for the given window object.
virtual bool MigrateFromLegacy(wxConfigBase *aCfg) override
Migrates from wxConfig to JSON-based configuration.
bool migrateLibTreeWidth()
Migrate the library tree width setting from a single column (Item) to multi-column.
Used for parsing legacy-format bom plugin configurations.
BOM_CFG_PARSER(std::vector< EESCHEMA_SETTINGS::BOM_PLUGIN_SETTINGS > *aPluginList, const char *aData, const wxString &aSource)
std::vector< EESCHEMA_SETTINGS::BOM_PLUGIN_SETTINGS > * m_pluginList
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
Definition color4d.h:398
Color settings are a bit different than most of the settings objects in that there can be more than o...
void SetColor(int aLayer, const COLOR4D &aColor)
static const wxString PropertiesPaneName()
static const wxString DesignBlocksPaneName()
PANEL_ANNOTATE m_AnnotatePanel
static std::vector< BOM_PLUGIN_SETTINGS > DefaultBomPlugins()
PANEL_NETLIST m_NetlistPanel
nlohmann::json bomSettingsToJson() const
virtual bool MigrateFromLegacy(wxConfigBase *aLegacyConfig) override
Migrates from wxConfig to JSON-based configuration.
nlohmann::json netlistSettingsToJson() const
PANEL_SYM_CHOOSER m_SymChooserPanel
PAGE_SETTINGS m_PageSettings
static std::vector< BOM_PLUGIN_SETTINGS > bomSettingsFromJson(const nlohmann::json &aObj)
FIND_REPLACE_EXTRA m_FindReplaceExtra
PANEL_LIB_VIEW m_LibViewPanel
AUTOPLACE_FIELDS m_AutoplaceFields
DIALOG_IMPORT_GRAPHICS m_ImportGraphics
static std::vector< NETLIST_PLUGIN_SETTINGS > netlistSettingsFromJson(const nlohmann::json &aObj)
PANEL_SYMBOL_FIELDS_TABLE m_FieldEditorPanel
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
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 fromLegacy(wxConfigBase *aConfig, const std::string &aKey, const std::string &aDest)
Translates a legacy wxConfig value to a given JSON pointer value.
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...
bool Contains(const std::string &aPath) const
std::optional< ValueType > Get(const std::string &aPath) const
Fetches a value from within the JSON document.
std::vector< PARAM_BASE * > m_params
The list of parameters (owned by this object)
void registerMigration(int aOldSchemaVersion, int aNewSchemaVersion, std::function< bool(void)> aMigrator)
Registers a migration from one schema version to another.
nlohmann::json & At(const std::string &aPath)
Wrappers for the underlying JSON API so that most consumers don't need json.hpp All of these function...
wxString GetFilename() const
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:104
Stores an enum as an integer.
Definition parameters.h:229
Like a normal param, but with custom getter and setter functions.
Definition parameters.h:296
Represents a map of <std::string, Value>.
Definition parameters.h:735
virtual COMMON_SETTINGS * GetCommonSettings() const
Definition pgm_base.cpp:576
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition pgm_base.h:125
void SaveColorSettings(COLOR_SETTINGS *aSettings, const std::string &aNamespace="")
Safely save a COLOR_SETTINGS to disk, preserving any changes outside the given namespace.
COLOR_SETTINGS * GetMigratedColorSettings()
Return a color theme for storing colors migrated from legacy (5.x and earlier) settings,...
#define DEFAULT_BUS_WIDTH_MILS
The default noconnect size in mils.
#define DEFAULT_JUNCTION_DIAM
The default bus and wire entry size in mils.
#define DEFAULT_WIRE_WIDTH_MILS
The default bus width in mils. (can be changed in preference menu)
#define DEFAULT_LINE_WIDTH_MILS
The default wire width in mils. (can be changed in preference menu)
#define DEFAULT_TEXT_SIZE
Ratio of the font height to the baseline of the text above the wire.
#define _(s)
const nlohmann::json defaultBomPlugins
Default value for bom.plugins.
const wxAuiPaneInfo & defaultSchSelectionFilterPaneInfo(wxWindow *aWindow)
const wxAuiPaneInfo & defaultPropertiesPaneInfo(wxWindow *aWindow)
const wxAuiPaneInfo & defaultNetNavigatorPaneInfo()
const int eeschemaSchemaVersion
Update the schema version whenever a migration is required.
const wxAuiPaneInfo & defaultDesignBlocksPaneInfo(wxWindow *aWindow)
@ LINE_MODE_90
@ LAYER_SHEETNAME
Definition layer_ids.h:471
@ LAYER_ERC_WARN
Definition layer_ids.h:478
@ LAYER_SHEETLABEL
Definition layer_ids.h:474
@ LAYER_PINNUM
Definition layer_ids.h:457
@ LAYER_DEVICE
Definition layer_ids.h:465
@ LAYER_BRIGHTENED
Definition layer_ids.h:490
@ LAYER_HIDDEN
Definition layer_ids.h:491
@ LAYER_HIERLABEL
Definition layer_ids.h:456
@ LAYER_PINNAM
Definition layer_ids.h:458
@ LAYER_GLOBLABEL
Definition layer_ids.h:455
@ LAYER_WIRE
Definition layer_ids.h:451
@ LAYER_NOTES
Definition layer_ids.h:466
@ LAYER_ERC_ERR
Definition layer_ids.h:479
@ LAYER_PIN
Definition layer_ids.h:469
@ LAYER_VALUEPART
Definition layer_ids.h:460
@ LAYER_BUS
Definition layer_ids.h:452
@ LAYER_SCHEMATIC_CURSOR
Definition layer_ids.h:488
@ LAYER_FIELDS
Definition layer_ids.h:461
@ LAYER_DEVICE_BACKGROUND
Definition layer_ids.h:483
@ LAYER_SCHEMATIC_DRAWINGSHEET
Definition layer_ids.h:494
@ LAYER_LOCLABEL
Definition layer_ids.h:454
@ LAYER_JUNCTION
Definition layer_ids.h:453
@ LAYER_REFERENCEPART
Definition layer_ids.h:459
@ LAYER_SHEET
Definition layer_ids.h:470
@ LAYER_SELECTION_SHADOWS
Definition layer_ids.h:493
@ LAYER_SCHEMATIC_BACKGROUND
Definition layer_ids.h:487
@ LAYER_SHEETFILENAME
Definition layer_ids.h:472
@ LAYER_NOCONNECT
Definition layer_ids.h:475
@ LAYER_SCHEMATIC_GRID
Definition layer_ids.h:485
PGM_BASE & Pgm()
The global program "get" accessor.
Definition pgm_base.cpp:913
see class PGM_BASE
T * GetAppSettings(const char *aFilename)
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Functions to provide common constants and other functions to assist in making a consistent UI.