KiCad PCB EDA Suite
Loading...
Searching...
No Matches
footprint_editor_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 (C) 2020 Jon Evans <[email protected]>
5 * Copyright (C) 2020-2023 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software: you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation, either version 3 of the License, or (at your
10 * option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20
21#include <common.h>
23#include <layer_ids.h>
24#include <pgm_base.h>
25#include <eda_text.h>
28#include <settings/parameters.h>
30#include <wx/config.h>
31#include <base_units.h>
32#include <wx/log.h>
33
34
36const int fpEditSchemaVersion = 2;
37
38
41 m_DesignSettings( nullptr, "fpedit.settings" ),
42 m_MagneticItems(),
43 m_Display(),
44 m_UserGrid(),
45 m_PolarCoords( false ),
46 m_DisplayInvertXAxis( false ),
47 m_DisplayInvertYAxis( false ),
48 m_RotationAngle( ANGLE_90 ),
49 m_Use45Limit( true ),
51 m_LibWidth( 250 ),
52 m_LastExportPath(),
53 m_FootprintTextShownColumns()
54{
55 m_MagneticItems.pads = MAGNETIC_OPTIONS::CAPTURE_ALWAYS;
56 m_MagneticItems.tracks = MAGNETIC_OPTIONS::NO_EFFECT;
59
63
64 m_params.emplace_back( new PARAM<int>( "window.lib_width",
65 &m_LibWidth, 250 ) );
66
67 m_params.emplace_back( new PARAM<bool>( "aui.show_layer_manager",
69
70 m_params.emplace_back( new PARAM<int>( "aui.right_panel_width",
72
73 m_params.emplace_back( new PARAM<int>( "aui.appearance_panel_tab",
75
76 m_params.emplace_back( new PARAM<int>( "aui.properties_panel_width",
78
79 m_params.emplace_back( new PARAM<float>( "aui.properties_splitter_proportion",
81
82 m_params.emplace_back( new PARAM<bool>( "aui.show_properties",
83 &m_AuiPanels.show_properties, false ) );
84
85 m_params.emplace_back( new PARAM<int>( "library.sort_mode",
86 &m_LibrarySortMode, 0 ) );
87
88 m_params.emplace_back( new PARAM<wxString>( "system.last_import_export_path",
89 &m_LastExportPath, "" ) );
90
91 m_params.emplace_back( new PARAM<bool>( "pcb_display.graphics_fill",
93
94 m_params.emplace_back( new PARAM<bool>( "pcb_display.text_fill",
96
97 m_params.emplace_back( new PARAM<bool>( "pcb_display.pad_fill",
99
100 m_params.emplace_back( new PARAM<bool>( "pcb_display.pad_numbers",
102
103 m_params.emplace_back( new PARAM<wxString>( "window.footprint_text_shown_columns",
104 &m_FootprintTextShownColumns, "0 1 2 3 4 5 6" ) );
105
106 m_params.emplace_back( new PARAM<int>( "editing.magnetic_pads",
107 reinterpret_cast<int*>( &m_MagneticItems.pads ),
108 static_cast<int>( MAGNETIC_OPTIONS::CAPTURE_ALWAYS ) ) );
109
110 m_params.emplace_back( new PARAM<bool>( "editing.magnetic_graphics",
111 &m_MagneticItems.graphics, true ) );
112
113 m_params.emplace_back( new PARAM<bool>( "editing.magnetic_all_layers",
114 &m_MagneticItems.allLayers, false ) );
115
116 m_params.emplace_back( new PARAM<bool>( "editing.polar_coords",
117 &m_PolarCoords, false ) );
118
119 m_params.emplace_back( new PARAM<bool>( "origin_invert_x_axis",
120 &m_DisplayInvertXAxis, false ) );
121
122 m_params.emplace_back( new PARAM<bool>( "origin_invert_y_axis",
123 &m_DisplayInvertYAxis, false ) );
124
125 m_params.emplace_back( new PARAM_LAMBDA<int>( "editing.rotation_angle",
126 [this] () -> int
127 {
129 },
130 [this] ( int aVal )
131 {
132 if( aVal )
134 },
135 900 ) );
136
137 m_params.emplace_back( new PARAM<bool>( "editing.fp_use_45_degree_limit",
138 &m_Use45Limit, false ) );
139
140 m_params.emplace_back( new PARAM_LAYER_PRESET( "pcb_display.layer_presets", &m_LayerPresets ) );
141
142 m_params.emplace_back( new PARAM<wxString>( "pcb_display.active_layer_preset",
143 &m_ActiveLayerPreset, "" ) );
144
145 m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>(
146 "design_settings.default_footprint_text_items",
147 [&] () -> nlohmann::json
148 {
149 nlohmann::json js = nlohmann::json::array();
150
152 {
153 js.push_back( nlohmann::json( { item.m_Text.ToUTF8(),
154 item.m_Visible,
155 item.m_Layer } ) );
156 }
157
158 return js;
159 },
160 [&] ( const nlohmann::json& aObj )
161 {
163
164 if( !aObj.is_array() )
165 return;
166
167 for( const nlohmann::json& entry : aObj )
168 {
169 if( entry.empty() || !entry.is_array() )
170 continue;
171
172 TEXT_ITEM_INFO textInfo( wxT( "" ), true, F_SilkS );
173
174 textInfo.m_Text = entry.at(0).get<wxString>();
175 textInfo.m_Visible = entry.at(1).get<bool>();
176 textInfo.m_Layer = entry.at(2).get<int>();
177
178 m_DesignSettings.m_DefaultFPTextItems.push_back( std::move( textInfo ) );
179 }
180 },
181 nlohmann::json::array( {
182 { "REF**", true, F_SilkS },
183 { "", true, F_Fab },
184 { "${REFERENCE}", true, F_Fab }
185 } ) ) );
186
187 int minTextSize = pcbIUScale.MilsToIU( TEXT_MIN_SIZE_MILS );
188 int maxTextSize = pcbIUScale.MilsToIU( TEXT_MAX_SIZE_MILS );
189 int minStroke = 1;
190 int maxStroke = pcbIUScale.mmToIU( 100 );
191
192 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_line_width",
194 pcbIUScale.mmToIU( DEFAULT_SILK_LINE_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
195
196 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_text_size_h",
198 pcbIUScale.mmToIU( DEFAULT_SILK_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
199
200 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_text_size_v",
202 pcbIUScale.mmToIU( DEFAULT_SILK_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
203
204 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_text_thickness",
207
208 m_params.emplace_back( new PARAM<bool>( "design_settings.silk_text_italic",
210
211 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_line_width",
213 pcbIUScale.mmToIU( DEFAULT_COPPER_LINE_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
214
215 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_text_size_h",
217 pcbIUScale.mmToIU( DEFAULT_COPPER_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
218
219 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_text_size_v",
221 pcbIUScale.mmToIU( DEFAULT_COPPER_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
222
223 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_text_thickness",
225 pcbIUScale.mmToIU( DEFAULT_COPPER_TEXT_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
226
227 m_params.emplace_back( new PARAM<bool>( "design_settings.copper_text_italic",
229
230 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.edge_line_width",
232 pcbIUScale.mmToIU( DEFAULT_EDGE_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
233
234 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.courtyard_line_width",
236 pcbIUScale.mmToIU( DEFAULT_COURTYARD_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
237
238 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_line_width",
240 pcbIUScale.mmToIU( DEFAULT_LINE_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
241
242 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_text_size_h",
244 pcbIUScale.mmToIU( DEFAULT_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
245
246 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_text_size_v",
248 pcbIUScale.mmToIU( DEFAULT_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
249
250 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_text_thickness",
253
254 m_params.emplace_back( new PARAM<bool>( "design_settings.fab_text_italic",
256
257 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_line_width",
259 pcbIUScale.mmToIU( DEFAULT_LINE_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
260
261 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_text_size_h",
263 pcbIUScale.mmToIU( DEFAULT_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
264
265 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_text_size_v",
267 pcbIUScale.mmToIU( DEFAULT_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
268
269 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_text_thickness",
272
273 m_params.emplace_back( new PARAM<bool>( "design_settings.others_text_italic",
275
276 m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>( "editing.selection_filter",
277 [&]() -> nlohmann::json
278 {
279 nlohmann::json ret;
280
281 ret["lockedItems"] = m_SelectionFilter.lockedItems;
282 ret["footprints"] = m_SelectionFilter.footprints;
283 ret["text"] = m_SelectionFilter.text;
284 ret["tracks"] = m_SelectionFilter.tracks;
285 ret["vias"] = m_SelectionFilter.vias;
286 ret["pads"] = m_SelectionFilter.pads;
287 ret["graphics"] = m_SelectionFilter.graphics;
288 ret["zones"] = m_SelectionFilter.zones;
289 ret["keepouts"] = m_SelectionFilter.keepouts;
290 ret["dimensions"] = m_SelectionFilter.dimensions;
291 ret["otherItems"] = m_SelectionFilter.otherItems;
292
293 return ret;
294 },
295 [&]( const nlohmann::json& aVal )
296 {
297 if( aVal.empty() || !aVal.is_object() )
298 return;
299
300 SetIfPresent( aVal, "lockedItems", m_SelectionFilter.lockedItems );
301 SetIfPresent( aVal, "footprints", m_SelectionFilter.footprints );
302 SetIfPresent( aVal, "text", m_SelectionFilter.text );
303 SetIfPresent( aVal, "tracks", m_SelectionFilter.tracks );
304 SetIfPresent( aVal, "vias", m_SelectionFilter.vias );
305 SetIfPresent( aVal, "pads", m_SelectionFilter.pads );
306 SetIfPresent( aVal, "graphics", m_SelectionFilter.graphics );
307 SetIfPresent( aVal, "zones", m_SelectionFilter.zones );
308 SetIfPresent( aVal, "keepouts", m_SelectionFilter.keepouts );
309 SetIfPresent( aVal, "dimensions", m_SelectionFilter.dimensions );
310 SetIfPresent( aVal, "otherItems", m_SelectionFilter.otherItems );
311 },
312 {
313 { "lockedItems", false },
314 { "footprints", true },
315 { "text", true },
316 { "tracks", true },
317 { "vias", true },
318 { "pads", true },
319 { "graphics", true },
320 { "zones", true },
321 { "keepouts", true },
322 { "dimensions", true },
323 { "otherItems", true }
324 } ) );
325
327
328 registerMigration( 1, 2,
329 [&]() -> bool
330 {
331 // This is actually a migration for APP_SETTINGS_BASE::m_LibTree
332 return migrateLibTreeWidth();
333 } );
334}
335
336
338{
339 bool ret = APP_SETTINGS_BASE::MigrateFromLegacy( aCfg );
340
341 //
342 // NOTE: there's no value in line-wrapping these; it just makes the table unreadable.
343 //
344 ret &= fromLegacy<int>( aCfg, "ModeditLibWidth", "window.lib_width" );
345 ret &= fromLegacyString( aCfg, "import_last_path", "system.last_import_export_path" );
346 ret &= fromLegacyString( aCfg, "LibFootprintTextShownColumns", "window.footprint_text_shown_columns" );
347
348 ret &= fromLegacy<int>( aCfg, "FpEditorMagneticPads", "editing.magnetic_pads" );
349 ret &= fromLegacy<bool>( aCfg, "FpEditorDisplayPolarCoords", "editing.polar_coords" );
350 ret &= fromLegacy<int>( aCfg, "FpEditorUse45DegreeGraphicSegments", "editing.use_45_degree_graphic_segments" );
351
352 ret &= fromLegacy<bool>( aCfg, "FpEditorGraphicLinesDisplayMode", "pcb_display.graphic_items_fill" );
353 ret &= fromLegacy<bool>( aCfg, "FpEditorPadDisplayMode", "pcb_display.pad_fill" );
354 ret &= fromLegacy<bool>( aCfg, "FpEditorTextsDisplayMode", "pcb_display.footprint_text" );
355
356 ret &= fromLegacy<double>( aCfg, "FpEditorSilkLineWidth", "design_settings.silk_line_width" );
357 ret &= fromLegacy<double>( aCfg, "FpEditorSilkTextSizeH", "design_settings.silk_text_size_h" );
358 ret &= fromLegacy<double>( aCfg, "FpEditorSilkTextSizeV", "design_settings.silk_text_size_v" );
359 ret &= fromLegacy<double>( aCfg, "FpEditorSilkTextThickness", "design_settings.silk_text_thickness" );
360 ret &= fromLegacy<bool>( aCfg, "FpEditorSilkTextItalic", "design_settings.silk_text_italic" );
361 ret &= fromLegacy<double>( aCfg, "FpEditorCopperLineWidth", "design_settings.copper_line_width" );
362 ret &= fromLegacy<double>( aCfg, "FpEditorCopperTextSizeH", "design_settings.copper_text_size_h" );
363 ret &= fromLegacy<double>( aCfg, "FpEditorCopperTextSizeV", "design_settings.copper_text_size_v" );
364 ret &= fromLegacy<double>( aCfg, "FpEditorCopperTextThickness", "design_settings.copper_text_thickness" );
365 ret &= fromLegacy<bool>( aCfg, "FpEditorCopperTextItalic", "design_settings.copper_text_italic" );
366 ret &= fromLegacy<double>( aCfg, "FpEditorEdgeCutLineWidth", "design_settings.edge_line_width" );
367 ret &= fromLegacy<double>( aCfg, "FpEditorCourtyardLineWidth", "design_settings.courtyard_line_width" );
368 ret &= fromLegacy<double>( aCfg, "FpEditorOthersLineWidth", "design_settings.others_line_width" );
369 ret &= fromLegacy<double>( aCfg, "FpEditorOthersTextSizeH", "design_settings.others_text_size_h" );
370 ret &= fromLegacy<double>( aCfg, "FpEditorOthersTextSizeV", "design_settings.others_text_size_v" );
371 ret &= fromLegacy<double>( aCfg, "FpEditorOthersTextThickness", "design_settings.others_text_thickness" );
372 ret &= fromLegacy<bool>( aCfg, "FpEditorOthersTextItalic", "design_settings.others_text_italic" );
373
374 nlohmann::json textItems = nlohmann::json::array( {
375 { "REF**", true, F_SilkS },
376 { "", true, F_Fab }
377 } );
378
379 Set( "design_settings.default_footprint_text_items", std::move( textItems ) );
380
381 ret &= fromLegacyString( aCfg, "FpEditorRefDefaultText", "design_settings.default_footprint_text_items.0.0" );
382 ret &= fromLegacy<bool>( aCfg, "FpEditorRefDefaultVisibility", "design_settings.default_footprint_text_items.0.1" );
383 ret &= fromLegacy<int>( aCfg, "FpEditorRefDefaultLayer", "design_settings.default_footprint_text_items.0.2" );
384 ret &= fromLegacyString( aCfg, "FpEditorValueDefaultText", "design_settings.default_footprint_text_items.1.0" );
385 ret &= fromLegacy<bool>( aCfg, "FpEditorValueDefaultVisibility", "design_settings.default_footprint_text_items.1.1" );
386 ret &= fromLegacy<int>( aCfg, "FpEditorValueDefaultLayer", "design_settings.default_footprint_text_items.1.2" );
387
388
389 std::string f = "ModEdit";
390
391 // Migrate color settings that were stored in the pcbnew config file
392 // We create a copy of the user scheme for the footprint editor context
393
394 SETTINGS_MANAGER& manager = Pgm().GetSettingsManager();
395 COLOR_SETTINGS* cs = manager.AddNewColorSettings( "user_footprints" );
396
397 cs->SetName( wxT( "User (Footprints)" ) );
398 manager.Save( cs );
399
400 auto migrateLegacyColor = [&] ( const std::string& aKey, int aLayerId )
401 {
402 wxString str;
403
404 if( aCfg->Read( aKey, &str ) )
405 cs->SetColor( aLayerId, COLOR4D( str ) );
406 };
407
408 for( int i = 0; i < PCB_LAYER_ID_COUNT; ++i )
409 {
410 wxString layer = LSET::Name( PCB_LAYER_ID( i ) );
411 migrateLegacyColor( f + "Color4DPCBLayer_" + layer.ToStdString(), PCB_LAYER_ID( i ) );
412 }
413
414 migrateLegacyColor( f + "Color4DAnchorEx", LAYER_ANCHOR );
415 migrateLegacyColor( f + "Color4DAuxItems", LAYER_AUX_ITEMS );
416 migrateLegacyColor( f + "Color4DGrid", LAYER_GRID );
417 migrateLegacyColor( f + "Color4DNonPlatedEx", LAYER_NON_PLATEDHOLES );
418 migrateLegacyColor( f + "Color4DPadThruHoleEx", LAYER_PADS_TH );
419 migrateLegacyColor( f + "Color4DPCBBackground", LAYER_PCB_BACKGROUND );
420 migrateLegacyColor( f + "Color4DPCBCursor", LAYER_CURSOR );
421 migrateLegacyColor( f + "Color4DRatsEx", LAYER_RATSNEST );
422 migrateLegacyColor( f + "Color4DTxtInvisEx", LAYER_HIDDEN_TEXT );
423 migrateLegacyColor( f + "Color4DViaBBlindEx", LAYER_VIA_BBLIND );
424 migrateLegacyColor( f + "Color4DViaMicroEx", LAYER_VIA_MICROVIA );
425 migrateLegacyColor( f + "Color4DViaThruEx", LAYER_VIA_THROUGH );
426 migrateLegacyColor( f + "Color4DWorksheet", LAYER_DRAWINGSHEET );
427
428 manager.SaveColorSettings( cs, "board" );
429
430 ( *m_internals )[m_internals->PointerFromString( "appearance.color_theme" )] = "user_footprints";
431
432 double x = 0, y = 0;
433 f = "ModEditFrame";
434
435 if( aCfg->Read( f + "PcbUserGrid_X", &x ) && aCfg->Read( f + "PcbUserGrid_Y", &y ) )
436 {
437 EDA_UNITS u = static_cast<EDA_UNITS>( aCfg->ReadLong( f + "PcbUserGrid_Unit",
438 static_cast<long>( EDA_UNITS::INCHES ) ) );
439
440 // Convert to internal units
443
444 Set( "window.grid.user_grid_x", EDA_UNIT_UTILS::UI::StringFromValue( pcbIUScale, u, x ) );
445 Set( "window.grid.user_grid_y", EDA_UNIT_UTILS::UI::StringFromValue( pcbIUScale, u, y ) );
446 }
447
448 return ret;
449}
450
451
453{
461 if( !m_manager )
462 {
463 wxLogTrace( traceSettings,
464 wxT( "Error: FOOTPRINT_EDITOR_SETTINGS migration cannot run unmanaged!" ) );
465 return false;
466 }
467
468 std::string theme_ptr( "appearance.color_theme" );
469
470 if( !Contains( theme_ptr ) )
471 return true;
472
473 wxString selected = At( theme_ptr ).get<wxString>();
474 wxString search = selected + wxT( "_footprints" );
475
476 for( COLOR_SETTINGS* settings : Pgm().GetSettingsManager().GetColorSettingsList() )
477 {
478 if( settings->GetFilename() == search )
479 {
480 wxLogTrace( traceSettings, wxT( "Updating footprint editor theme from %s to %s" ),
481 selected, search );
482 Set( theme_ptr, search );
483 return true;
484 }
485 }
486
487 return true;
488}
ARC_EDIT_MODE
Settings for arc editing.
Definition: app_settings.h:52
@ KEEP_CENTER_ADJUST_ANGLE_RADIUS
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:109
#define DEFAULT_TEXT_WIDTH
#define DEFAULT_COPPER_TEXT_WIDTH
#define DEFAULT_SILK_TEXT_SIZE
#define DEFAULT_COPPER_LINE_WIDTH
#define DEFAULT_SILK_LINE_WIDTH
@ LAYER_CLASS_OTHERS
@ LAYER_CLASS_FAB
@ LAYER_CLASS_COURTYARD
@ LAYER_CLASS_SILK
@ LAYER_CLASS_COPPER
@ LAYER_CLASS_EDGES
#define DEFAULT_SILK_TEXT_WIDTH
#define DEFAULT_EDGE_WIDTH
#define DEFAULT_COPPER_TEXT_SIZE
#define DEFAULT_LINE_WIDTH
#define DEFAULT_COURTYARD_WIDTH
virtual bool MigrateFromLegacy(wxConfigBase *aCfg) override
Migrates from wxConfig to JSON-based configuration.
bool migrateLibTreeWidth()
Migrates the library tree width setting from a single column (Item) to multi-column.
std::vector< TEXT_ITEM_INFO > m_DefaultFPTextItems
int m_TextThickness[LAYER_CLASS_COUNT]
int m_LineThickness[LAYER_CLASS_COUNT]
VECTOR2I m_TextSize[LAYER_CLASS_COUNT]
bool m_TextItalic[LAYER_CLASS_COUNT]
Color settings are a bit different than most of the settings objects in that there can be more than o...
void SetName(const wxString &aName)
void SetColor(int aLayer, const COLOR4D &aColor)
int AsTenthsOfADegree() const
Definition: eda_angle.h:157
BOARD_DESIGN_SETTINGS m_DesignSettings
Only some of these settings are actually used for footprint editing.
std::vector< LAYER_PRESET > m_LayerPresets
SELECTION_FILTER_OPTIONS m_SelectionFilter
virtual bool MigrateFromLegacy(wxConfigBase *aLegacyConfig) override
Migrates from wxConfig to JSON-based configuration.
bool fromLegacyString(wxConfigBase *aConfig, const std::string &aKey, const std::string &aDest)
Translates a legacy wxConfig string value to a given JSON pointer value.
SETTINGS_MANAGER * m_manager
A pointer to the settings manager managing this file (may be null)
bool Contains(const std::string &aPath) const
static bool SetIfPresent(const nlohmann::json &aObj, const std::string &aPath, wxString &aTarget)
Sets the given string if the given key/path is present.
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...
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...
std::unique_ptr< JSON_SETTINGS_INTERNALS > m_internals
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
static const wxChar * Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
Definition: lset.cpp:89
Like a normal param, but with custom getter and setter functions.
Definition: parameters.h:291
Represents a parameter that has a scaling factor between the value in the file and the value used int...
Definition: parameters.h:342
VIEWERS_DISPLAY_OPTIONS m_ViewersDisplay
void SaveColorSettings(COLOR_SETTINGS *aSettings, const std::string &aNamespace="")
Safely saves a COLOR_SETTINGS to disk, preserving any changes outside the given namespace.
COLOR_SETTINGS * AddNewColorSettings(const wxString &aFilename)
Registers a new color settings object with the given filename.
The common library.
#define DEFAULT_TEXT_SIZE
Ratio of the font height to the baseline of the text above the wire.
static constexpr EDA_ANGLE ANGLE_90
Definition: eda_angle.h:437
@ TENTHS_OF_A_DEGREE_T
Definition: eda_angle.h:30
#define TEXT_MIN_SIZE_MILS
Minimum text size in mils.
Definition: eda_text.h:42
#define TEXT_MAX_SIZE_MILS
Maximum text size in mils (10 inches)
Definition: eda_text.h:43
EDA_UNITS
Definition: eda_units.h:46
const int fpEditSchemaVersion
! Update the schema version whenever a migration is required
const wxChar *const traceSettings
Flag to enable debug output of settings operations and management.
@ LAYER_GRID
Definition: layer_ids.h:208
@ LAYER_NON_PLATEDHOLES
handle color for not plated holes (holes, not pads)
Definition: layer_ids.h:200
@ LAYER_DRAWINGSHEET
drawingsheet frame and titleblock
Definition: layer_ids.h:220
@ LAYER_PCB_BACKGROUND
PCB background color.
Definition: layer_ids.h:223
@ LAYER_HIDDEN_TEXT
text marked as invisible
Definition: layer_ids.h:203
@ LAYER_CURSOR
PCB cursor.
Definition: layer_ids.h:224
@ LAYER_AUX_ITEMS
Auxiliary items (guides, rule, etc)
Definition: layer_ids.h:225
@ LAYER_RATSNEST
Definition: layer_ids.h:207
@ LAYER_ANCHOR
anchor of items having an anchor point (texts, footprints)
Definition: layer_ids.h:204
@ LAYER_PADS_TH
multilayer pads, usually with holes
Definition: layer_ids.h:216
@ LAYER_VIA_MICROVIA
to draw micro vias
Definition: layer_ids.h:197
@ LAYER_VIA_THROUGH
to draw usual through hole vias
Definition: layer_ids.h:199
@ LAYER_VIA_BBLIND
to draw blind/buried vias
Definition: layer_ids.h:198
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:60
@ F_Fab
Definition: layer_ids.h:121
@ F_SilkS
Definition: layer_ids.h:105
@ PCB_LAYER_ID_COUNT
Definition: layer_ids.h:138
KICOMMON_API double FromUserUnit(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnit, double aValue)
Return in internal units the value aValue given in a real unit such as "in", "mm",...
Definition: eda_units.cpp:499
KICOMMON_API wxString StringFromValue(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, double aValue, bool aAddUnitsText=false, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Returns the string from aValue according to aUnits (inch, mm ...) for display.
Definition: eda_units.cpp:284
SETTINGS_MANAGER * GetSettingsManager()
see class PGM_BASE
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:119
const double MM_PER_IU
Definition: base_units.h:79
constexpr int MilsToIU(int mils) const
Definition: base_units.h:94
constexpr int mmToIU(double mm) const
Definition: base_units.h:89
MAGNETIC_OPTIONS tracks
MAGNETIC_OPTIONS pads
bool graphics
Graphic lines, shapes, polygons.
bool text
Text (free or attached to a footprint)
bool lockedItems
Allow selecting locked items.
bool footprints
Allow selecting entire footprints.
bool dimensions
Dimension items.
bool otherItems
Anything not fitting one of the above categories.