KiCad PCB EDA Suite
FOOTPRINT_EDITOR_SETTINGS Class Reference

#include <footprint_editor_settings.h>

Inheritance diagram for FOOTPRINT_EDITOR_SETTINGS:
APP_SETTINGS_BASE JSON_SETTINGS

Classes

struct  AUI_PANELS
 
struct  USER_GRID
 

Public Member Functions

 FOOTPRINT_EDITOR_SETTINGS ()
 
virtual ~FOOTPRINT_EDITOR_SETTINGS ()
 
virtual bool MigrateFromLegacy (wxConfigBase *aLegacyConfig) override
 Migrates from wxConfig to JSON-based configuration. More...
 
virtual const std::vector< wxString > DefaultGridSizeList () const
 By default, this returns the list of grids available in PcbNew-based applications. More...
 
wxString GetFilename () const
 
wxString GetFullFilename () const
 
void SetFilename (const wxString &aFilename)
 
void SetLocation (SETTINGS_LOC aLocation)
 
SETTINGS_LOC GetLocation () const
 
void SetLegacyFilename (const wxString &aFilename)
 
bool IsReadOnly () const
 
void SetReadOnly (bool aReadOnly)
 
nlohmann::jsonAt (const std::string &aPath)
 Wrappers for the underlying JSON API so that most consumers don't need json.hpp All of these functions take a string that is passed to PointerFromString internally. More...
 
bool Contains (const std::string &aPath) const
 
size_t Count (const std::string &aPath) const
 
JSON_SETTINGS_INTERNALSInternals ()
 
virtual void Load ()
 Updates the parameters of this object based on the current JSON document contents. More...
 
virtual bool Store ()
 Stores the current parameters into the JSON document represented by this object Note: this doesn't do any writing to disk; that's handled by SETTINGS_MANAGER. More...
 
virtual bool LoadFromFile (const wxString &aDirectory="")
 Loads the backing file from disk and then calls Load() More...
 
virtual bool SaveToFile (const wxString &aDirectory="", bool aForce=false)
 
void ResetToDefaults ()
 Resets all parameters to default values. More...
 
std::optional< nlohmann::jsonGetJson (const std::string &aPath) const
 Fetches a JSON object that is a subset of this JSON_SETTINGS object, using a path of the form "key1.key2.key3" to refer to nested objects. More...
 
template<typename ValueType >
std::optional< ValueType > Get (const std::string &aPath) const
 Fetches a value from within the JSON document. More...
 
template<>
std::optional< wxString > Get (const std::string &aPath) const
 
template<typename ValueType >
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 library can handle. More...
 
template<>
void Set (const std::string &aPath, wxString aVal)
 
template<>
void Set (const std::string &aPath, wxString aVal)
 
bool Migrate ()
 Migrates the schema of this settings from the version in the file to the latest version. More...
 
void AddNestedSettings (NESTED_SETTINGS *aSettings)
 Transfers ownership of a given NESTED_SETTINGS to this object. More...
 
void ReleaseNestedSettings (NESTED_SETTINGS *aSettings)
 Saves and frees a nested settings object, if it exists within this one. More...
 
void SetManager (SETTINGS_MANAGER *aManager)
 

Static Public Member Functions

static bool SetIfPresent (const nlohmann::json &aObj, const std::string &aPath, wxString &aTarget)
 Sets the given string if the given key/path is present. More...
 
static bool SetIfPresent (const nlohmann::json &aObj, const std::string &aPath, bool &aTarget)
 Sets the given bool if the given key/path is present. More...
 
static bool SetIfPresent (const nlohmann::json &aObj, const std::string &aPath, int &aTarget)
 Sets the given int if the given key/path is present. More...
 
static bool SetIfPresent (const nlohmann::json &aObj, const std::string &aPath, unsigned int &aTarget)
 Sets the given unsigned int if the given key/path is present. More...
 

Public Attributes

BOARD_DESIGN_SETTINGS m_DesignSettings
 Only some of these settings are actually used for footprint editing. More...
 
MAGNETIC_SETTINGS m_MagneticItems
 
PCB_DISPLAY_OPTIONS m_Display
 
AUI_PANELS m_AuiPanels
 
USER_GRID m_UserGrid
 
bool m_PolarCoords
 
EDA_ANGLE m_RotationAngle
 
bool m_Use45Limit
 
int m_LibWidth
 
wxString m_LastImportExportPath
 
wxString m_FootprintTextShownColumns
 
SELECTION_FILTER_OPTIONS m_SelectionFilter
 
std::vector< LAYER_PRESETm_LayerPresets
 
wxString m_ActiveLayerPreset
 
CROSS_PROBING_SETTINGS m_CrossProbing
 
FIND_REPLACE m_FindReplace
 
GRAPHICS m_Graphics
 
COLOR_PICKER m_ColorPicker
 
LIB_TREE m_LibTree
 
PRINTING m_Printing
 
SYSTEM m_System
 
WINDOW_SETTINGS m_Window
 
wxString m_ColorTheme
 Active color theme name. More...
 
int m_appSettingsSchemaVersion
 ! Local schema version for common app settings More...
 

Protected Member Functions

virtual std::string getLegacyFrameName () const override
 
void migrateFindReplace (wxConfigBase *aCfg)
 ! Migrates the find/replace history string lists More...
 
bool migrateWindowConfig (wxConfigBase *aCfg, const std::string &aFrameName, const std::string &aJsonPath)
 Migrates legacy window settings into the JSON document. More...
 
void addParamsForWindow (WINDOW_SETTINGS *aWindow, const std::string &aJsonPath)
 Adds parameters for the given window object. More...
 
bool migrateLibTreeWidth ()
 Migrates the library tree width setting from a single column (Item) to multi-column. More...
 
void registerMigration (int aOldSchemaVersion, int aNewSchemaVersion, std::function< bool(void)> aMigrator)
 Registers a migration from one schema version to another. More...
 
template<typename ValueType >
bool fromLegacy (wxConfigBase *aConfig, const std::string &aKey, const std::string &aDest)
 Translates a legacy wxConfig value to a given JSON pointer value. More...
 
bool fromLegacyString (wxConfigBase *aConfig, const std::string &aKey, const std::string &aDest)
 Translates a legacy wxConfig string value to a given JSON pointer value. More...
 
bool fromLegacyColor (wxConfigBase *aConfig, const std::string &aKey, const std::string &aDest)
 Translates a legacy COLOR4D stored in a wxConfig string to a given JSON pointer value. More...
 
virtual wxString getFileExt () const
 
virtual wxString getLegacyFileExt () const
 

Protected Attributes

wxString m_filename
 The filename (not including path) of this settings file (inicode) More...
 
wxString m_legacy_filename
 The filename of the wxConfig legacy file (if different from m_filename) More...
 
SETTINGS_LOC m_location
 The location of this settings file (. More...
 
std::vector< PARAM_BASE * > m_params
 The list of parameters (owned by this object) More...
 
std::vector< NESTED_SETTINGS * > m_nested_settings
 Nested settings files that live inside this one, if any. More...
 
bool m_createIfMissing
 Whether or not the backing store file should be created it if doesn't exist. More...
 
bool m_createIfDefault
 Whether or not the backing store file should be created if all parameters are still at their default values. More...
 
bool m_writeFile
 Whether or not the backing store file should be written. More...
 
bool m_deleteLegacyAfterMigration
 Whether or not to delete legacy file after migration. More...
 
bool m_resetParamsIfMissing
 Whether or not to set parameters to their default value if missing from JSON on Load() More...
 
int m_schemaVersion
 Version of this settings schema. More...
 
SETTINGS_MANAGERm_manager
 A pointer to the settings manager managing this file (may be null) More...
 
std::map< int, std::pair< int, std::function< bool()> > > m_migrators
 A map of starting schema version to a pair of <ending version, migrator function> More...
 
std::unique_ptr< JSON_SETTINGS_INTERNALSm_internals
 

Private Member Functions

bool migrateSchema0to1 ()
 

Detailed Description

Definition at line 30 of file footprint_editor_settings.h.

Constructor & Destructor Documentation

◆ FOOTPRINT_EDITOR_SETTINGS()

FOOTPRINT_EDITOR_SETTINGS::FOOTPRINT_EDITOR_SETTINGS ( )

Definition at line 40 of file footprint_editor_settings.cpp.

40 :
42 m_DesignSettings( nullptr, "fpedit.settings" ),
44 m_Display(),
45 m_UserGrid(),
46 m_PolarCoords( false ),
48 m_Use45Limit( true ),
49 m_LibWidth( 250 ),
52{
56
60
61 m_params.emplace_back( new PARAM<int>( "window.lib_width",
62 &m_LibWidth, 250 ) );
63
64 m_params.emplace_back( new PARAM<bool>( "aui.show_layer_manager",
66
67 m_params.emplace_back( new PARAM<int>( "aui.right_panel_width",
69
70 m_params.emplace_back( new PARAM<int>( "aui.appearance_panel_tab",
72
73 m_params.emplace_back( new PARAM<wxString>( "system.last_import_export_path",
75
76 m_params.emplace_back( new PARAM<wxString>( "window.footprint_text_shown_columns",
77 &m_FootprintTextShownColumns, "0 1 2 3 4 5 6" ) );
78
79 m_params.emplace_back( new PARAM<int>( "editing.magnetic_pads",
80 reinterpret_cast<int*>( &m_MagneticItems.pads ),
81 static_cast<int>( MAGNETIC_OPTIONS::CAPTURE_ALWAYS ) ) );
82
83 m_params.emplace_back( new PARAM<bool>( "editing.magnetic_graphics",
84 &m_MagneticItems.graphics, true ) );
85
86 m_params.emplace_back( new PARAM<bool>( "editing.polar_coords",
87 &m_PolarCoords, false ) );
88
89 m_params.emplace_back( new PARAM_LAMBDA<int>( "editing.rotation_angle",
90 [this] () -> int
91 {
93 },
94 [this] ( int aVal )
95 {
96 if( aVal )
98 },
99 900 ) );
100
101 m_params.emplace_back( new PARAM<bool>( "editing.fp_use_45_degree_limit",
102 &m_Use45Limit, false ) );
103
104 m_params.emplace_back( new PARAM_LAYER_PRESET( "pcb_display.layer_presets", &m_LayerPresets ) );
105
106 m_params.emplace_back( new PARAM<wxString>( "pcb_display.active_layer_preset",
107 &m_ActiveLayerPreset, "" ) );
108
109 m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>(
110 "design_settings.default_footprint_text_items",
111 [&] () -> nlohmann::json
112 {
113 nlohmann::json js = nlohmann::json::array();
114
116 {
117 js.push_back( nlohmann::json( { item.m_Text.ToUTF8(),
118 item.m_Visible,
119 item.m_Layer } ) );
120 }
121
122 return js;
123 },
124 [&] ( const nlohmann::json& aObj )
125 {
127
128 if( !aObj.is_array() )
129 return;
130
131 for( const nlohmann::json& entry : aObj )
132 {
133 if( entry.empty() || !entry.is_array() )
134 continue;
135
136 TEXT_ITEM_INFO textInfo( wxT( "" ), true, F_SilkS );
137
138 textInfo.m_Text = entry.at(0).get<wxString>();
139 textInfo.m_Visible = entry.at(1).get<bool>();
140 textInfo.m_Layer = entry.at(2).get<int>();
141
142 m_DesignSettings.m_DefaultFPTextItems.push_back( std::move( textInfo ) );
143 }
144 },
145 nlohmann::json::array( {
146 { "REF**", true, F_SilkS },
147 { "", true, F_Fab },
148 { "${REFERENCE}", true, F_Fab }
149 } ) ) );
150
151 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_line_width",
155
156 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_text_size_h",
159
160 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_text_size_v",
163
164 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_text_thickness",
167
168 m_params.emplace_back( new PARAM<bool>( "design_settings.silk_text_italic",
170
171 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_line_width",
175
176 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_text_size_h",
180
181 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_text_size_v",
185
186 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_text_thickness",
190
191 m_params.emplace_back( new PARAM<bool>( "design_settings.copper_text_italic",
193
194 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.edge_line_width",
198
199 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.courtyard_line_width",
203
204 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_line_width",
208
209 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_text_size_h",
212
213 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_text_size_v",
216
217 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_text_thickness",
220
221 m_params.emplace_back( new PARAM<bool>( "design_settings.fab_text_italic",
223
224 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_line_width",
228
229 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_text_size_h",
232
233 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_text_size_v",
236
237 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_text_thickness",
240
241 m_params.emplace_back( new PARAM<bool>( "design_settings.others_text_italic",
243
244 m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>( "editing.selection_filter",
245 [&]() -> nlohmann::json
246 {
247 nlohmann::json ret;
248
249 ret["lockedItems"] = m_SelectionFilter.lockedItems;
250 ret["footprints"] = m_SelectionFilter.footprints;
251 ret["text"] = m_SelectionFilter.text;
252 ret["tracks"] = m_SelectionFilter.tracks;
253 ret["vias"] = m_SelectionFilter.vias;
254 ret["pads"] = m_SelectionFilter.pads;
255 ret["graphics"] = m_SelectionFilter.graphics;
256 ret["zones"] = m_SelectionFilter.zones;
257 ret["keepouts"] = m_SelectionFilter.keepouts;
258 ret["dimensions"] = m_SelectionFilter.dimensions;
259 ret["otherItems"] = m_SelectionFilter.otherItems;
260
261 return ret;
262 },
263 [&]( const nlohmann::json& aVal )
264 {
265 if( aVal.empty() || !aVal.is_object() )
266 return;
267
268 SetIfPresent( aVal, "lockedItems", m_SelectionFilter.lockedItems );
269 SetIfPresent( aVal, "footprints", m_SelectionFilter.footprints );
270 SetIfPresent( aVal, "text", m_SelectionFilter.text );
271 SetIfPresent( aVal, "tracks", m_SelectionFilter.tracks );
272 SetIfPresent( aVal, "vias", m_SelectionFilter.vias );
273 SetIfPresent( aVal, "pads", m_SelectionFilter.pads );
274 SetIfPresent( aVal, "graphics", m_SelectionFilter.graphics );
275 SetIfPresent( aVal, "zones", m_SelectionFilter.zones );
276 SetIfPresent( aVal, "keepouts", m_SelectionFilter.keepouts );
277 SetIfPresent( aVal, "dimensions", m_SelectionFilter.dimensions );
278 SetIfPresent( aVal, "otherItems", m_SelectionFilter.otherItems );
279 },
280 {
281 { "lockedItems", true },
282 { "footprints", true },
283 { "text", true },
284 { "tracks", true },
285 { "vias", true },
286 { "pads", true },
287 { "graphics", true },
288 { "zones", true },
289 { "keepouts", true },
290 { "dimensions", true },
291 { "otherItems", true }
292 } ) );
293
295
296 registerMigration( 1, 2,
297 [&]() -> bool
298 {
299 // This is actually a migration for APP_SETTINGS_BASE::m_LibTree
300 return migrateLibTreeWidth();
301 } );
302}
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
APP_SETTINGS_BASE(const std::string &aFilename, int aSchemaVersion)
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]
wxSize m_TextSize[LAYER_CLASS_COUNT]
bool m_TextItalic[LAYER_CLASS_COUNT]
int AsTenthsOfADegree() const
Definition: eda_angle.h:151
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
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.
Like a normal param, but with custom getter and setter functions.
Definition: parameters.h:281
Represents a parameter that has a scaling factor between the value in the file and the value used int...
Definition: parameters.h:334
#define DEFAULT_TEXT_SIZE
Ratio of the font height to the baseline of the text above the wire.
@ TENTHS_OF_A_DEGREE_T
Definition: eda_angle.h:30
static constexpr EDA_ANGLE & ANGLE_90
Definition: eda_angle.h:414
const int fpEditSchemaVersion
! Update the schema version whenever a migration is required
nlohmann::json json
Definition: gerbview.cpp:44
@ F_Fab
Definition: layer_ids.h:120
@ F_SilkS
Definition: layer_ids.h:104
#define TEXTS_MAX_SIZE
Maximum text size in internal units (10 inches)
Definition: pcbnew.h:32
#define TEXTS_MIN_SIZE
Minimum text size in internal units (1 mil)
Definition: pcbnew.h:31
#define TEXTS_MAX_WIDTH
Maximum text width in internal units (10 inches)
Definition: pcbnew.h:33
const double MM_PER_IU
Definition: base_units.h:79
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.

References FOOTPRINT_EDITOR_SETTINGS::AUI_PANELS::appearance_panel_tab, EDA_ANGLE::AsTenthsOfADegree(), CAPTURE_ALWAYS, DEFAULT_COPPER_LINE_WIDTH, DEFAULT_COPPER_TEXT_SIZE, DEFAULT_COPPER_TEXT_WIDTH, DEFAULT_COURTYARD_WIDTH, DEFAULT_EDGE_WIDTH, DEFAULT_LINE_WIDTH, DEFAULT_SILK_LINE_WIDTH, DEFAULT_SILK_TEXT_SIZE, DEFAULT_SILK_TEXT_WIDTH, DEFAULT_TEXT_SIZE, DEFAULT_TEXT_WIDTH, SELECTION_FILTER_OPTIONS::dimensions, F_Fab, F_SilkS, SELECTION_FILTER_OPTIONS::footprints, SELECTION_FILTER_OPTIONS::graphics, MAGNETIC_SETTINGS::graphics, SELECTION_FILTER_OPTIONS::keepouts, LAYER_CLASS_COPPER, LAYER_CLASS_COURTYARD, LAYER_CLASS_EDGES, LAYER_CLASS_FAB, LAYER_CLASS_OTHERS, LAYER_CLASS_SILK, SELECTION_FILTER_OPTIONS::lockedItems, m_ActiveLayerPreset, m_AuiPanels, BOARD_DESIGN_SETTINGS::m_DefaultFPTextItems, m_DesignSettings, m_FootprintTextShownColumns, m_LastImportExportPath, TEXT_ITEM_INFO::m_Layer, m_LayerPresets, m_LibWidth, BOARD_DESIGN_SETTINGS::m_LineThickness, m_MagneticItems, JSON_SETTINGS::m_params, m_PolarCoords, m_RotationAngle, m_SelectionFilter, TEXT_ITEM_INFO::m_Text, BOARD_DESIGN_SETTINGS::m_TextItalic, BOARD_DESIGN_SETTINGS::m_TextSize, BOARD_DESIGN_SETTINGS::m_TextThickness, m_Use45Limit, TEXT_ITEM_INFO::m_Visible, APP_SETTINGS_BASE::migrateLibTreeWidth(), migrateSchema0to1(), EDA_IU_SCALE::MM_PER_IU, EDA_IU_SCALE::mmToIU(), NO_EFFECT, SELECTION_FILTER_OPTIONS::otherItems, SELECTION_FILTER_OPTIONS::pads, MAGNETIC_SETTINGS::pads, pcbIUScale, JSON_SETTINGS::registerMigration(), FOOTPRINT_EDITOR_SETTINGS::AUI_PANELS::right_panel_width, JSON_SETTINGS::SetIfPresent(), FOOTPRINT_EDITOR_SETTINGS::AUI_PANELS::show_layer_manager, TENTHS_OF_A_DEGREE_T, SELECTION_FILTER_OPTIONS::text, TEXTS_MAX_SIZE, TEXTS_MAX_WIDTH, TEXTS_MIN_SIZE, SELECTION_FILTER_OPTIONS::tracks, MAGNETIC_SETTINGS::tracks, SELECTION_FILTER_OPTIONS::vias, and SELECTION_FILTER_OPTIONS::zones.

◆ ~FOOTPRINT_EDITOR_SETTINGS()

virtual FOOTPRINT_EDITOR_SETTINGS::~FOOTPRINT_EDITOR_SETTINGS ( )
inlinevirtual

Definition at line 49 of file footprint_editor_settings.h.

49{}

Member Function Documentation

◆ AddNestedSettings()

void JSON_SETTINGS::AddNestedSettings ( NESTED_SETTINGS aSettings)
inherited

Transfers ownership of a given NESTED_SETTINGS to this object.

Can be used to construct a NESTED_SETTINGS without the parent object needing to know about the implementation of the nested object;

Parameters
aSettingsis the settings object to take ownership of
aTargetis a pointer to update to the passed in settings

Definition at line 743 of file json_settings.cpp.

744{
745 wxLogTrace( traceSettings, wxT( "AddNestedSettings %s" ), aSettings->GetFilename() );
746 m_nested_settings.push_back( aSettings );
747}
std::vector< NESTED_SETTINGS * > m_nested_settings
Nested settings files that live inside this one, if any.
wxString GetFilename() const
Definition: json_settings.h:73
const wxChar *const traceSettings
Flag to enable debug output of settings operations and management.

References JSON_SETTINGS::GetFilename(), JSON_SETTINGS::m_nested_settings, and traceSettings.

Referenced by NESTED_SETTINGS::SetParent().

◆ addParamsForWindow()

void APP_SETTINGS_BASE::addParamsForWindow ( WINDOW_SETTINGS aWindow,
const std::string &  aJsonPath 
)
protectedinherited

Adds parameters for the given window object.

Parameters
aWindowis the target window settings object
aJsonPathis the path to read parameters from

Definition at line 292 of file app_settings.cpp.

293{
294 m_params.emplace_back( new PARAM<bool>( aJsonPath + ".maximized",
295 &aWindow->state.maximized, false ) );
296
297 m_params.emplace_back( new PARAM<wxString>( aJsonPath + ".mru_path",
298 &aWindow->mru_path, "" ) );
299
300 m_params.emplace_back( new PARAM<int>( aJsonPath + ".size_x", &aWindow->state.size_x, 0 ) );
301
302 m_params.emplace_back( new PARAM<int>( aJsonPath + ".size_y", &aWindow->state.size_y, 0 ) );
303
304 m_params.emplace_back( new PARAM<wxString>( aJsonPath + ".perspective",
305 &aWindow->perspective, "" ) );
306
307 m_params.emplace_back( new PARAM<int>( aJsonPath + ".pos_x", &aWindow->state.pos_x, 0 ) );
308
309 m_params.emplace_back( new PARAM<int>( aJsonPath + ".pos_y", &aWindow->state.pos_y, 0 ) );
310
311 m_params.emplace_back( new PARAM<unsigned int>( aJsonPath + ".display", &aWindow->state.display, 0 ) );
312
313 m_params.emplace_back( new PARAM_LIST<double>( aJsonPath + ".zoom_factors",
314 &aWindow->zoom_factors, {} ) );
315
316 m_params.emplace_back( new PARAM<bool>( aJsonPath + ".grid.axes_enabled",
317 &aWindow->grid.axes_enabled, false ) );
318
319 m_params.emplace_back( new PARAM_LIST<wxString>( aJsonPath + ".grid.sizes",
320 &aWindow->grid.sizes, DefaultGridSizeList() ) );
321
322 int defaultGridIdx;
323
324 if( m_filename == "eeschema" || m_filename == "symbol_editor" || m_filename == "pl_editor" )
325 defaultGridIdx = 1;
326 else
327 defaultGridIdx = 4;
328
329 m_params.emplace_back( new PARAM<int>( aJsonPath + ".grid.last_size",
330 &aWindow->grid.last_size_idx, defaultGridIdx ) );
331
332 m_params.emplace_back( new PARAM<int>( aJsonPath + ".grid.fast_grid_1",
333 &aWindow->grid.fast_grid_1, defaultGridIdx ) );
334
335 m_params.emplace_back( new PARAM<int>( aJsonPath + ".grid.fast_grid_2",
336 &aWindow->grid.fast_grid_2, defaultGridIdx + 1 ) );
337
338 // for grid user, use a default value compatible with eeschema and pcbnew (10 mils)
339 m_params.emplace_back( new PARAM<wxString>( aJsonPath + ".grid.user_grid_x",
340 &aWindow->grid.user_grid_x, "10 mil" ) );
341 m_params.emplace_back( new PARAM<wxString>( aJsonPath + ".grid.user_grid_y",
342 &aWindow->grid.user_grid_y, "10 mil" ) );
343
344 m_params.emplace_back( new PARAM<double>( aJsonPath + ".grid.line_width",
345 &aWindow->grid.line_width, 1.0 ) );
346
347 m_params.emplace_back( new PARAM<double>( aJsonPath + ".grid.min_spacing",
348 &aWindow->grid.min_spacing, 10 ) );
349
350 m_params.emplace_back( new PARAM<bool>( aJsonPath + ".grid.show",
351 &aWindow->grid.show, true ) );
352
353 m_params.emplace_back( new PARAM<int>( aJsonPath + ".grid.style",
354 &aWindow->grid.style, 0 ) );
355
356 m_params.emplace_back( new PARAM<int>( aJsonPath + ".grid.snap",
357 &aWindow->grid.snap, 0 ) );
358
359 m_params.emplace_back( new PARAM<bool>( aJsonPath + ".cursor.always_show_cursor",
360 &aWindow->cursor.always_show_cursor, true ) );
361
362 m_params.emplace_back( new PARAM<bool>( aJsonPath + ".cursor.fullscreen_cursor",
363 &aWindow->cursor.fullscreen_cursor, false ) );
364}
virtual const std::vector< wxString > DefaultGridSizeList() const
By default, this returns the list of grids available in PcbNew-based applications.
wxString m_filename
The filename (not including path) of this settings file (inicode)
bool always_show_cursor
Definition: app_settings.h:43
bool fullscreen_cursor
Definition: app_settings.h:44
wxString user_grid_x
Definition: app_settings.h:54
double line_width
Definition: app_settings.h:59
wxString user_grid_y
Definition: app_settings.h:55
double min_spacing
Definition: app_settings.h:60
std::vector< wxString > sizes
Definition: app_settings.h:53
CURSOR_SETTINGS cursor
Definition: app_settings.h:89
WINDOW_STATE state
Definition: app_settings.h:84
GRID_SETTINGS grid
Definition: app_settings.h:90
wxString mru_path
Definition: app_settings.h:85
std::vector< double > zoom_factors
Definition: app_settings.h:87
wxString perspective
Definition: app_settings.h:86
unsigned int display
Definition: app_settings.h:76

References CURSOR_SETTINGS::always_show_cursor, GRID_SETTINGS::axes_enabled, WINDOW_SETTINGS::cursor, APP_SETTINGS_BASE::DefaultGridSizeList(), WINDOW_STATE::display, GRID_SETTINGS::fast_grid_1, GRID_SETTINGS::fast_grid_2, CURSOR_SETTINGS::fullscreen_cursor, WINDOW_SETTINGS::grid, GRID_SETTINGS::last_size_idx, GRID_SETTINGS::line_width, JSON_SETTINGS::m_filename, JSON_SETTINGS::m_params, WINDOW_STATE::maximized, GRID_SETTINGS::min_spacing, WINDOW_SETTINGS::mru_path, WINDOW_SETTINGS::perspective, WINDOW_STATE::pos_x, WINDOW_STATE::pos_y, GRID_SETTINGS::show, WINDOW_STATE::size_x, WINDOW_STATE::size_y, GRID_SETTINGS::sizes, GRID_SETTINGS::snap, WINDOW_SETTINGS::state, GRID_SETTINGS::style, GRID_SETTINGS::user_grid_x, GRID_SETTINGS::user_grid_y, and WINDOW_SETTINGS::zoom_factors.

Referenced by APP_SETTINGS_BASE::APP_SETTINGS_BASE(), CVPCB_SETTINGS::CVPCB_SETTINGS(), and PCBNEW_SETTINGS::PCBNEW_SETTINGS().

◆ At()

nlohmann::json & JSON_SETTINGS::At ( const std::string &  aPath)
inherited

Wrappers for the underlying JSON API so that most consumers don't need json.hpp All of these functions take a string that is passed to PointerFromString internally.

Definition at line 111 of file json_settings.cpp.

112{
113 return m_internals->At( aPath );
114}
std::unique_ptr< JSON_SETTINGS_INTERNALS > m_internals

References JSON_SETTINGS::m_internals.

Referenced by EESCHEMA_SETTINGS::migrateBomSettings(), GERBVIEW_SETTINGS::MigrateFromLegacy(), APP_SETTINGS_BASE::migrateLibTreeWidth(), BOARD_DESIGN_SETTINGS::migrateSchema0to1(), migrateSchema0to1(), COLOR_SETTINGS::migrateSchema0to1(), PCBNEW_SETTINGS::PCBNEW_SETTINGS(), and PROJECT_LOCAL_SETTINGS::PROJECT_LOCAL_SETTINGS().

◆ Contains()

bool JSON_SETTINGS::Contains ( const std::string &  aPath) const
inherited

◆ Count()

size_t JSON_SETTINGS::Count ( const std::string &  aPath) const
inherited

Definition at line 123 of file json_settings.cpp.

124{
126}

References JSON_SETTINGS::m_internals, and JSON_SETTINGS_INTERNALS::PointerFromString().

Referenced by migrateSchema0to1().

◆ DefaultGridSizeList()

const std::vector< wxString > APP_SETTINGS_BASE::DefaultGridSizeList ( ) const
virtualinherited

By default, this returns the list of grids available in PcbNew-based applications.

Eeschema does not allow customization of the grid. If it ever does, override this in Eeschema settings to provide a different set of defaults.

Returns
a default value for the window.grid.sizes parameter

Definition at line 367 of file app_settings.cpp.

368{
369 return { "1000 mil",
370 "500 mil",
371 "250 mil",
372 "200 mil",
373 "100 mil",
374 "50 mil",
375 "25 mil",
376 "20 mil",
377 "10 mil",
378 "5 mil",
379 "2 mil",
380 "1 mil",
381 "5.0 mm",
382 "2.5 mm",
383 "1.0 mm",
384 "0.5 mm",
385 "0.25 mm",
386 "0.2 mm",
387 "0.1 mm",
388 "0.05 mm",
389 "0.025 mm",
390 "0.01 mm" };
391}

Referenced by APP_SETTINGS_BASE::addParamsForWindow(), DIALOG_GRID_SETTINGS::DIALOG_GRID_SETTINGS(), PCB_BASE_FRAME::LoadSettings(), FOOTPRINT_PREVIEW_PANEL::New(), and DIALOG_GRID_SETTINGS::TransferDataToWindow().

◆ fromLegacy()

template<typename ValueType >
template bool JSON_SETTINGS::fromLegacy< bool > ( wxConfigBase *  aConfig,
const std::string &  aKey,
const std::string &  aDest 
)
protectedinherited

Translates a legacy wxConfig value to a given JSON pointer value.

Template Parameters
ValueTypeis the basic type of the value
Parameters
aConfigis the legacy config to read from
aKeyis the key (within the current path) to read
aDestis a string that will form a JSON pointer (key1.key2.key3) to write to

Definition at line 655 of file json_settings.cpp.

657{
658 ValueType val;
659
660 if( aConfig->Read( aKey, &val ) )
661 {
662 try
663 {
664 ( *m_internals )[aDest] = val;
665 }
666 catch( ... )
667 {
668 wxASSERT_MSG( false, wxT( "Could not write value in fromLegacy!" ) );
669 return false;
670 }
671
672 return true;
673 }
674
675 return false;
676}

◆ fromLegacyColor()

bool JSON_SETTINGS::fromLegacyColor ( wxConfigBase *  aConfig,
const std::string &  aKey,
const std::string &  aDest 
)
protectedinherited

Translates a legacy COLOR4D stored in a wxConfig string to a given JSON pointer value.

Parameters
aConfigis the legacy config to read from
aKeyis the key (within the current path) to read
aDestis a string that will form a JSON pointer (key1.key2.key3) to write to

Definition at line 715 of file json_settings.cpp.

717{
718 wxString str;
719
720 if( aConfig->Read( aKey, &str ) )
721 {
723 color.SetFromWxString( str );
724
725 try
726 {
727 nlohmann::json js = nlohmann::json::array( { color.r, color.g, color.b, color.a } );
728 ( *m_internals )[aDest] = js;
729 }
730 catch( ... )
731 {
732 wxASSERT_MSG( false, wxT( "Could not write value in fromLegacyColor!" ) );
733 return false;
734 }
735
736 return true;
737 }
738
739 return false;
740}
int color
Definition: DXF_plotter.cpp:57
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104

References color.

Referenced by APP_SETTINGS_BASE::migrateWindowConfig().

◆ fromLegacyString()

bool JSON_SETTINGS::fromLegacyString ( wxConfigBase *  aConfig,
const std::string &  aKey,
const std::string &  aDest 
)
protectedinherited

Translates a legacy wxConfig string value to a given JSON pointer value.

Parameters
aConfigis the legacy config to read from
aKeyis the key (within the current path) to read
aDestis a string that will form a JSON pointer (key1.key2.key3) to write to

Definition at line 691 of file json_settings.cpp.

693{
694 wxString str;
695
696 if( aConfig->Read( aKey, &str ) )
697 {
698 try
699 {
700 ( *m_internals )[aDest] = str.ToUTF8();
701 }
702 catch( ... )
703 {
704 wxASSERT_MSG( false, wxT( "Could not write value in fromLegacyString!" ) );
705 return false;
706 }
707
708 return true;
709 }
710
711 return false;
712}

Referenced by PROJECT_FILE::MigrateFromLegacy(), APP_SETTINGS_BASE::MigrateFromLegacy(), BITMAP2CMP_SETTINGS::MigrateFromLegacy(), EESCHEMA_SETTINGS::MigrateFromLegacy(), SYMBOL_EDITOR_SETTINGS::MigrateFromLegacy(), GERBVIEW_SETTINGS::MigrateFromLegacy(), MigrateFromLegacy(), COMMON_SETTINGS::MigrateFromLegacy(), PCB_CALCULATOR_SETTINGS::MigrateFromLegacy(), PCBNEW_SETTINGS::MigrateFromLegacy(), and APP_SETTINGS_BASE::migrateWindowConfig().

◆ Get() [1/2]

template<>
std::optional< wxString > JSON_SETTINGS::Get ( const std::string &  aPath) const
inherited

Definition at line 773 of file json_settings.cpp.

774{
775 if( std::optional<nlohmann::json> opt_json = GetJson( aPath ) )
776 return wxString( opt_json->get<std::string>().c_str(), wxConvUTF8 );
777
778 return std::nullopt;
779}
std::optional< nlohmann::json > GetJson(const std::string &aPath) const
Fetches a JSON object that is a subset of this JSON_SETTINGS object, using a path of the form "key1....

References JSON_SETTINGS::GetJson().

◆ Get() [2/2]

template<typename ValueType >
template std::optional< unsigned long long > JSON_SETTINGS::Get< unsigned long long > ( const std::string &  aPath) const
inherited

Fetches a value from within the JSON document.

Will return an empty optional if the value is not found or a mismatching type.

Template Parameters
ValueTypeis the type to cast to
Parameters
aPathis the path within the document to retrieve
Returns
a value from within this document

Definition at line 494 of file json_settings.cpp.

495{
496 if( std::optional<nlohmann::json> ret = GetJson( aPath ) )
497 {
498 try
499 {
500 return ret->get<ValueType>();
501 }
502 catch( ... )
503 {
504 }
505 }
506
507 return std::nullopt;
508}

References JSON_SETTINGS::GetJson().

Referenced by COLOR_MAP_PARAM::Load(), PARAM< ValueType >::Load(), PARAM_ENUM< EnumType >::Load(), PARAM_LAMBDA< ValueType >::Load(), PARAM_SCALED< ValueType >::Load(), COLOR_MAP_PARAM::MatchesFile(), PARAM< ValueType >::MatchesFile(), PARAM_PATH::MatchesFile(), PARAM_ENUM< EnumType >::MatchesFile(), PARAM_LAMBDA< ValueType >::MatchesFile(), and PARAM_SCALED< ValueType >::MatchesFile().

◆ getFileExt()

virtual wxString JSON_SETTINGS::getFileExt ( ) const
inlineprotectedvirtualinherited

Reimplemented in DATABASE_LIB_SETTINGS, PROJECT_FILE, and PROJECT_LOCAL_SETTINGS.

Definition at line 271 of file json_settings.h.

272 {
273 return wxT( "json" );
274 }

Referenced by JSON_SETTINGS::GetFullFilename(), JSON_SETTINGS::LoadFromFile(), and JSON_SETTINGS::SaveToFile().

◆ GetFilename()

◆ GetFullFilename()

wxString JSON_SETTINGS::GetFullFilename ( ) const
inherited

Definition at line 105 of file json_settings.cpp.

106{
107 return wxString( m_filename + "." + getFileExt() );
108}
virtual wxString getFileExt() const

References JSON_SETTINGS::getFileExt(), and JSON_SETTINGS::m_filename.

Referenced by JSON_SETTINGS::JSON_SETTINGS(), JSON_SETTINGS::LoadFromFile(), NESTED_SETTINGS::LoadFromFile(), and JSON_SETTINGS::SaveToFile().

◆ GetJson()

std::optional< nlohmann::json > JSON_SETTINGS::GetJson ( const std::string &  aPath) const
inherited

Fetches a JSON object that is a subset of this JSON_SETTINGS object, using a path of the form "key1.key2.key3" to refer to nested objects.

Parameters
aPathis a string containing one or more keys separated by '.'
Returns
a JSON object from within this one

Definition at line 474 of file json_settings.cpp.

475{
476 nlohmann::json::json_pointer ptr = m_internals->PointerFromString( aPath );
477
478 if( m_internals->contains( ptr ) )
479 {
480 try
481 {
482 return std::optional<nlohmann::json>{ m_internals->at( ptr ) };
483 }
484 catch( ... )
485 {
486 }
487 }
488
489 return std::optional<nlohmann::json>{};
490}

References JSON_SETTINGS::m_internals.

Referenced by JSON_SETTINGS::Get(), PARAM_LAMBDA< ValueType >::Load(), PARAM_LIST< Type >::Load(), PARAM_MAP< Value >::Load(), PARAM_WXSTRING_MAP::Load(), PARAM_LAMBDA< ValueType >::MatchesFile(), PARAM_LIST< Type >::MatchesFile(), PARAM_PATH_LIST::MatchesFile(), PARAM_MAP< Value >::MatchesFile(), PARAM_WXSTRING_MAP::MatchesFile(), SETTINGS_MANAGER::SaveColorSettings(), and NESTED_SETTINGS::SaveToFile().

◆ getLegacyFileExt()

virtual wxString JSON_SETTINGS::getLegacyFileExt ( ) const
inlineprotectedvirtualinherited

Reimplemented in PROJECT_FILE, and PROJECT_LOCAL_SETTINGS.

Definition at line 276 of file json_settings.h.

277 {
278 return wxEmptyString;
279 }

Referenced by JSON_SETTINGS::LoadFromFile().

◆ getLegacyFrameName()

virtual std::string FOOTPRINT_EDITOR_SETTINGS::getLegacyFrameName ( ) const
inlineoverrideprotectedvirtual

Reimplemented from APP_SETTINGS_BASE.

Definition at line 86 of file footprint_editor_settings.h.

86{ return "ModEditFrame"; }

◆ GetLocation()

SETTINGS_LOC JSON_SETTINGS::GetLocation ( ) const
inlineinherited

Definition at line 80 of file json_settings.h.

80{ return m_location; }
SETTINGS_LOC m_location
The location of this settings file (.

References JSON_SETTINGS::m_location.

Referenced by SETTINGS_MANAGER::GetPathForSettingsFile().

◆ Internals()

JSON_SETTINGS_INTERNALS * JSON_SETTINGS::Internals ( )
inherited

Definition at line 129 of file json_settings.cpp.

130{
131 return m_internals.get();
132}

References JSON_SETTINGS::m_internals.

Referenced by COLOR_SETTINGS::migrateSchema0to1(), and SETTINGS_MANAGER::SaveColorSettings().

◆ IsReadOnly()

◆ Load()

void JSON_SETTINGS::Load ( )
virtualinherited

Updates the parameters of this object based on the current JSON document contents.

Definition at line 135 of file json_settings.cpp.

136{
137 for( auto param : m_params )
138 {
139 try
140 {
141 param->Load( this, m_resetParamsIfMissing );
142 }
143 catch( ... )
144 {
145 // Skip unreadable parameters in file
146 wxLogTrace( traceSettings, wxT( "param '%s' load err" ), param->GetJsonPath().c_str() );
147 }
148 }
149}
bool m_resetParamsIfMissing
Whether or not to set parameters to their default value if missing from JSON on Load()

References JSON_SETTINGS::m_params, JSON_SETTINGS::m_resetParamsIfMissing, and traceSettings.

Referenced by COLOR_SETTINGS::CreateBuiltinColorSettings(), JSON_SETTINGS::LoadFromFile(), BOARD_DESIGN_SETTINGS::LoadFromFile(), NESTED_SETTINGS::LoadFromFile(), COLOR_SETTINGS::migrateSchema0to1(), PANEL_3D_DISPLAY_OPTIONS::ResetPanel(), PANEL_3D_OPENGL_OPTIONS::ResetPanel(), PANEL_3D_RAYTRACING_OPTIONS::ResetPanel(), PANEL_EESCHEMA_ANNOTATION_OPTIONS::ResetPanel(), PANEL_EESCHEMA_DISPLAY_OPTIONS::ResetPanel(), PANEL_EESCHEMA_EDITING_OPTIONS::ResetPanel(), PANEL_SYM_DISPLAY_OPTIONS::ResetPanel(), PANEL_SYM_EDITING_OPTIONS::ResetPanel(), PANEL_GERBVIEW_DISPLAY_OPTIONS::ResetPanel(), PANEL_PL_EDITOR_DISPLAY_OPTIONS::ResetPanel(), PANEL_DISPLAY_OPTIONS::ResetPanel(), PANEL_EDIT_OPTIONS::ResetPanel(), PANEL_FP_EDITOR_DEFAULTS::ResetPanel(), PANEL_PCBNEW_DISPLAY_ORIGIN::ResetPanel(), and SETTINGS_MANAGER::SaveColorSettings().

◆ LoadFromFile()

bool JSON_SETTINGS::LoadFromFile ( const wxString &  aDirectory = "")
virtualinherited

Loads the backing file from disk and then calls Load()

Parameters
aDirectoryis the path to the file
Returns
true if the file was found on disk and loaded or migrated

Reimplemented in BOARD_DESIGN_SETTINGS, and NESTED_SETTINGS.

Definition at line 152 of file json_settings.cpp.

153{
154 // First, load all params to default values
155 m_internals->clear();
156 Load();
157
158 bool success = true;
159 bool migrated = false;
160 bool legacy_migrated = false;
161
162 LOCALE_IO locale;
163
164 auto migrateFromLegacy = [&] ( wxFileName& aPath ) {
165 // Backup and restore during migration so that the original can be mutated if convenient
166 bool backed_up = false;
167 wxFileName temp;
168
169 if( aPath.IsDirWritable() )
170 {
171 temp.AssignTempFileName( aPath.GetFullPath() );
172
173 if( !wxCopyFile( aPath.GetFullPath(), temp.GetFullPath() ) )
174 {
175 wxLogTrace( traceSettings, wxT( "%s: could not create temp file for migration" ),
176 GetFullFilename() );
177 }
178 else
179 backed_up = true;
180 }
181
182 // Silence popups if legacy file is read-only
183 wxLogNull doNotLog;
184
185 wxConfigBase::DontCreateOnDemand();
186 auto cfg = std::make_unique<wxFileConfig>( wxT( "" ), wxT( "" ), aPath.GetFullPath() );
187
188 // If migrate fails or is not implemented, fall back to built-in defaults that were
189 // already loaded above
190 if( !MigrateFromLegacy( cfg.get() ) )
191 {
192 wxLogTrace( traceSettings,
193 wxT( "%s: migrated; not all settings were found in legacy file" ),
194 GetFullFilename() );
195 }
196 else
197 {
198 wxLogTrace( traceSettings, wxT( "%s: migrated from legacy format" ), GetFullFilename() );
199 }
200
201 if( backed_up )
202 {
203 cfg.reset();
204
205 if( !wxCopyFile( temp.GetFullPath(), aPath.GetFullPath() ) )
206 {
207 wxLogTrace( traceSettings,
208 wxT( "migrate; copy temp file %s to %s failed" ),
209 temp.GetFullPath(), aPath.GetFullPath() );
210 }
211
212 if( !wxRemoveFile( temp.GetFullPath() ) )
213 {
214 wxLogTrace( traceSettings,
215 wxT( "migrate; failed to remove temp file %s" ),
216 temp.GetFullPath() );
217 }
218 }
219
220 // Either way, we want to clean up the old file afterwards
221 legacy_migrated = true;
222 };
223
224 wxFileName path;
225
226 if( aDirectory.empty() )
227 {
228 path.Assign( m_filename );
229 path.SetExt( getFileExt() );
230 }
231 else
232 {
233 wxString dir( aDirectory );
234 path.Assign( dir, m_filename, getFileExt() );
235 }
236
237 if( !path.Exists() )
238 {
239 // Case 1: legacy migration, no .json extension yet
240 path.SetExt( getLegacyFileExt() );
241
242 if( path.Exists() )
243 {
244 migrateFromLegacy( path );
245 }
246 // Case 2: legacy filename is different from new one
247 else if( !m_legacy_filename.empty() )
248 {
249 path.SetName( m_legacy_filename );
250
251 if( path.Exists() )
252 migrateFromLegacy( path );
253 }
254 else
255 {
256 success = false;
257 }
258 }
259 else
260 {
261 if( !path.IsFileWritable() )
262 m_writeFile = false;
263
264 try
265 {
266 wxFFileInputStream fp( path.GetFullPath(), wxT( "rt" ) );
267 wxStdInputStream fstream( fp );
268
269 if( fp.IsOk() )
270 {
271 *static_cast<nlohmann::json*>( m_internals.get() ) =
272 nlohmann::json::parse( fstream, nullptr,
273 /* allow_exceptions = */ true,
274 /* ignore_comments = */ true );
275
276 // If parse succeeds, check if schema migration is required
277 int filever = -1;
278
279 try
280 {
281 filever = m_internals->Get<int>( "meta.version" );
282 }
283 catch( ... )
284 {
285 wxLogTrace( traceSettings, wxT( "%s: file version could not be read!" ),
286 GetFullFilename() );
287 success = false;
288 }
289
290 if( filever >= 0 && filever < m_schemaVersion )
291 {
292 wxLogTrace( traceSettings, wxT( "%s: attempting migration from version %d to %d" ),
293 GetFullFilename(), filever, m_schemaVersion );
294
295 if( Migrate() )
296 {
297 migrated = true;
298 }
299 else
300 {
301 wxLogTrace( traceSettings, wxT( "%s: migration failed!" ), GetFullFilename() );
302 }
303 }
304 else if( filever > m_schemaVersion )
305 {
306 wxLogTrace( traceSettings,
307 wxT( "%s: warning: file version %d is newer than latest (%d)" ),
308 GetFullFilename(), filever, m_schemaVersion );
309 }
310 }
311 else
312 {
313 wxLogTrace( traceSettings, wxT( "%s exists but can't be opened for read" ),
314 GetFullFilename() );
315 }
316 }
317 catch( nlohmann::json::parse_error& error )
318 {
319 wxLogTrace( traceSettings, wxT( "Json parse error reading %s: %s" ),
320 path.GetFullPath(), error.what() );
321 wxLogTrace( traceSettings, wxT( "Attempting migration in case file is in legacy format" ) );
322 migrateFromLegacy( path );
323 }
324 }
325
326 // Now that we have new data in the JSON structure, load the params again
327 Load();
328
329 // And finally load any nested settings
330 for( auto settings : m_nested_settings )
331 settings->LoadFromFile();
332
333 wxLogTrace( traceSettings, wxT( "Loaded <%s> with schema %d" ), GetFullFilename(), m_schemaVersion );
334
335 // If we migrated, clean up the legacy file (with no extension)
336 if( legacy_migrated || migrated )
337 {
338 if( legacy_migrated && m_deleteLegacyAfterMigration && !wxRemoveFile( path.GetFullPath() ) )
339 {
340 wxLogTrace( traceSettings, wxT( "Warning: could not remove legacy file %s" ),
341 path.GetFullPath() );
342 }
343
344 // And write-out immediately so that we don't lose data if the program later crashes.
346 SaveToFile( aDirectory, true );
347 }
348
349 return success;
350}
virtual void Load()
Updates the parameters of this object based on the current JSON document contents.
wxString GetFullFilename() const
bool Migrate()
Migrates the schema of this settings from the version in the file to the latest version.
virtual bool MigrateFromLegacy(wxConfigBase *aLegacyConfig)
Migrates from wxConfig to JSON-based configuration.
bool m_deleteLegacyAfterMigration
Whether or not to delete legacy file after migration.
virtual bool SaveToFile(const wxString &aDirectory="", bool aForce=false)
virtual wxString getLegacyFileExt() const
int m_schemaVersion
Version of this settings schema.
wxString m_legacy_filename
The filename of the wxConfig legacy file (if different from m_filename)
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: locale_io.h:41
bool parse(std::istream &aStream, bool aVerbose)
Parse a PCB or footprint file from the given input stream.

References JSON_SETTINGS::getFileExt(), JSON_SETTINGS::GetFullFilename(), JSON_SETTINGS::getLegacyFileExt(), JSON_SETTINGS::Load(), JSON_SETTINGS::m_deleteLegacyAfterMigration, JSON_SETTINGS::m_filename, JSON_SETTINGS::m_internals, JSON_SETTINGS::m_legacy_filename, JSON_SETTINGS::m_nested_settings, JSON_SETTINGS::m_schemaVersion, JSON_SETTINGS::m_writeFile, JSON_SETTINGS::Migrate(), JSON_SETTINGS::MigrateFromLegacy(), parse(), path, JSON_SETTINGS::SaveToFile(), and traceSettings.

Referenced by SETTINGS_MANAGER::LoadProject(), SETTINGS_MANAGER::loadProjectFile(), SETTINGS_MANAGER::MigrateIfNeeded(), SAVE_AS_TRAVERSER::OnFile(), and SETTINGS_MANAGER::SaveColorSettings().

◆ Migrate()

bool JSON_SETTINGS::Migrate ( )
inherited

Migrates the schema of this settings from the version in the file to the latest version.

Schema migration doesn't need to be used every time a setting is added! This is intended to be more of an "escape hatch" in the event that we decide to move settings around or make other changes to a settings file format that can't simply be handled by loading a new default

Returns
true if migration was successful

Definition at line 552 of file json_settings.cpp.

553{
554 int filever = m_internals->Get<int>( "meta.version" );
555
556 while( filever < m_schemaVersion )
557 {
558 if( !m_migrators.count( filever ) )
559 {
560 wxLogTrace( traceSettings, wxT( "Migrator missing for %s version %d!" ),
561 typeid( *this ).name(), filever );
562 return false;
563 }
564
565 std::pair<int, std::function<bool()>> pair = m_migrators.at( filever );
566
567 if( pair.second() )
568 {
569 wxLogTrace( traceSettings, wxT( "Migrated %s from %d to %d" ), typeid( *this ).name(),
570 filever, pair.first );
571 filever = pair.first;
572 m_internals->At( "meta.version" ) = filever;
573 }
574 else
575 {
576 wxLogTrace( traceSettings, wxT( "Migration failed for %s from %d to %d" ),
577 typeid( *this ).name(), filever, pair.first );
578 return false;
579 }
580 }
581
582 return true;
583}
std::map< int, std::pair< int, std::function< bool()> > > m_migrators
A map of starting schema version to a pair of <ending version, migrator function>

References JSON_SETTINGS::m_internals, JSON_SETTINGS::m_migrators, JSON_SETTINGS::m_schemaVersion, and traceSettings.

Referenced by JSON_SETTINGS::LoadFromFile(), and NESTED_SETTINGS::LoadFromFile().

◆ migrateFindReplace()

void APP_SETTINGS_BASE::migrateFindReplace ( wxConfigBase *  aCfg)
protectedinherited

! Migrates the find/replace history string lists

Definition at line 232 of file app_settings.cpp.

233{
234 const int find_replace_history_size = 10;
235 nlohmann::json find_history = nlohmann::json::array();
236 nlohmann::json replace_history = nlohmann::json::array();
237 wxString tmp, find_key, replace_key;
238
239 for( int i = 0; i < find_replace_history_size; ++i )
240 {
241 find_key.Printf( "FindStringHistoryList%d", i );
242 replace_key.Printf( "ReplaceStringHistoryList%d", i );
243
244 if( aCfg->Read( find_key, &tmp ) )
245 find_history.push_back( tmp.ToStdString() );
246
247 if( aCfg->Read( replace_key, &tmp ) )
248 replace_history.push_back( tmp.ToStdString() );
249 }
250
251 Set( "find_replace.find_history", find_history );
252 Set( "find_replace.replace_history", replace_history );
253}
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...

References JSON_SETTINGS::Set().

Referenced by APP_SETTINGS_BASE::MigrateFromLegacy().

◆ MigrateFromLegacy()

bool FOOTPRINT_EDITOR_SETTINGS::MigrateFromLegacy ( wxConfigBase *  aLegacyConfig)
overridevirtual

Migrates from wxConfig to JSON-based configuration.

Should be implemented by any subclasses of JSON_SETTINGS that map to a legacy (wxConfig-based) config file.

Parameters
aLegacyConfigis a wxConfigBase holding a loaded configuration to migrate
Returns
true if migration was successful

Reimplemented from APP_SETTINGS_BASE.

Definition at line 305 of file footprint_editor_settings.cpp.

306{
307 bool ret = APP_SETTINGS_BASE::MigrateFromLegacy( aCfg );
308
309 //
310 // NOTE: there's no value in line-wrapping these; it just makes the table unreadable.
311 //
312 ret &= fromLegacy<int>( aCfg, "ModeditLibWidth", "window.lib_width" );
313 ret &= fromLegacyString( aCfg, "import_last_path", "system.last_import_export_path" );
314 ret &= fromLegacyString( aCfg, "LibFootprintTextShownColumns", "window.footprint_text_shown_columns" );
315
316 ret &= fromLegacy<int>( aCfg, "FpEditorMagneticPads", "editing.magnetic_pads" );
317 ret &= fromLegacy<bool>( aCfg, "FpEditorDisplayPolarCoords", "editing.polar_coords" );
318 ret &= fromLegacy<int>( aCfg, "FpEditorUse45DegreeGraphicSegments", "editing.use_45_degree_graphic_segments" );
319
320 ret &= fromLegacy<bool>( aCfg, "FpEditorGraphicLinesDisplayMode", "pcb_display.graphic_items_fill" );
321 ret &= fromLegacy<bool>( aCfg, "FpEditorPadDisplayMode", "pcb_display.pad_fill" );
322 ret &= fromLegacy<bool>( aCfg, "FpEditorTextsDisplayMode", "pcb_display.footprint_text" );
323
324 ret &= fromLegacy<double>( aCfg, "FpEditorSilkLineWidth", "design_settings.silk_line_width" );
325 ret &= fromLegacy<double>( aCfg, "FpEditorSilkTextSizeH", "design_settings.silk_text_size_h" );
326 ret &= fromLegacy<double>( aCfg, "FpEditorSilkTextSizeV", "design_settings.silk_text_size_v" );
327 ret &= fromLegacy<double>( aCfg, "FpEditorSilkTextThickness", "design_settings.silk_text_thickness" );
328 ret &= fromLegacy<bool>( aCfg, "FpEditorSilkTextItalic", "design_settings.silk_text_italic" );
329 ret &= fromLegacy<double>( aCfg, "FpEditorCopperLineWidth", "design_settings.copper_line_width" );
330 ret &= fromLegacy<double>( aCfg, "FpEditorCopperTextSizeH", "design_settings.copper_text_size_h" );
331 ret &= fromLegacy<double>( aCfg, "FpEditorCopperTextSizeV", "design_settings.copper_text_size_v" );
332 ret &= fromLegacy<double>( aCfg, "FpEditorCopperTextThickness", "design_settings.copper_text_thickness" );
333 ret &= fromLegacy<bool>( aCfg, "FpEditorCopperTextItalic", "design_settings.copper_text_italic" );
334 ret &= fromLegacy<double>( aCfg, "FpEditorEdgeCutLineWidth", "design_settings.edge_line_width" );
335 ret &= fromLegacy<double>( aCfg, "FpEditorCourtyardLineWidth", "design_settings.courtyard_line_width" );
336 ret &= fromLegacy<double>( aCfg, "FpEditorOthersLineWidth", "design_settings.others_line_width" );
337 ret &= fromLegacy<double>( aCfg, "FpEditorOthersTextSizeH", "design_settings.others_text_size_h" );
338 ret &= fromLegacy<double>( aCfg, "FpEditorOthersTextSizeV", "design_settings.others_text_size_v" );
339 ret &= fromLegacy<double>( aCfg, "FpEditorOthersTextThickness", "design_settings.others_text_thickness" );
340 ret &= fromLegacy<bool>( aCfg, "FpEditorOthersTextItalic", "design_settings.others_text_italic" );
341
342 nlohmann::json textItems = nlohmann::json::array( {
343 { "REF**", true, F_SilkS },
344 { "", true, F_Fab }
345 } );
346
347 Set( "design_settings.default_footprint_text_items", textItems );
348
349 ret &= fromLegacyString( aCfg, "FpEditorRefDefaultText", "design_settings.default_footprint_text_items.0.0" );
350 ret &= fromLegacy<bool>( aCfg, "FpEditorRefDefaultVisibility", "design_settings.default_footprint_text_items.0.1" );
351 ret &= fromLegacy<int>( aCfg, "FpEditorRefDefaultLayer", "design_settings.default_footprint_text_items.0.2" );
352 ret &= fromLegacyString( aCfg, "FpEditorValueDefaultText", "design_settings.default_footprint_text_items.1.0" );
353 ret &= fromLegacy<bool>( aCfg, "FpEditorValueDefaultVisibility", "design_settings.default_footprint_text_items.1.1" );
354 ret &= fromLegacy<int>( aCfg, "FpEditorValueDefaultLayer", "design_settings.default_footprint_text_items.1.2" );
355
356
357 std::string f = "ModEdit";
358
359 // Migrate color settings that were stored in the pcbnew config file
360 // We create a copy of the user scheme for the footprint editor context
361
362 SETTINGS_MANAGER& manager = Pgm().GetSettingsManager();
363 COLOR_SETTINGS* cs = manager.AddNewColorSettings( "user_footprints" );
364
365 cs->SetName( wxT( "User (Footprints)" ) );
366 manager.Save( cs );
367
368 auto migrateLegacyColor = [&] ( const std::string& aKey, int aLayerId )
369 {
370 wxString str;
371
372 if( aCfg->Read( aKey, &str ) )
373 cs->SetColor( aLayerId, COLOR4D( str ) );
374 };
375
376 for( int i = 0; i < PCB_LAYER_ID_COUNT; ++i )
377 {
378 wxString layer = LSET::Name( PCB_LAYER_ID( i ) );
379 migrateLegacyColor( f + "Color4DPCBLayer_" + layer.ToStdString(), PCB_LAYER_ID( i ) );
380 }
381
382 migrateLegacyColor( f + "Color4DAnchorEx", LAYER_ANCHOR );
383 migrateLegacyColor( f + "Color4DAuxItems", LAYER_AUX_ITEMS );
384 migrateLegacyColor( f + "Color4DGrid", LAYER_GRID );
385 migrateLegacyColor( f + "Color4DNonPlatedEx", LAYER_NON_PLATEDHOLES );
386 migrateLegacyColor( f + "Color4DPadThruHoleEx", LAYER_PADS_TH );
387 migrateLegacyColor( f + "Color4DPCBBackground", LAYER_PCB_BACKGROUND );
388 migrateLegacyColor( f + "Color4DPCBCursor", LAYER_CURSOR );
389 migrateLegacyColor( f + "Color4DRatsEx", LAYER_RATSNEST );
390 migrateLegacyColor( f + "Color4DTxtInvisEx", LAYER_MOD_TEXT_INVISIBLE );
391 migrateLegacyColor( f + "Color4DViaBBlindEx", LAYER_VIA_BBLIND );
392 migrateLegacyColor( f + "Color4DViaMicroEx", LAYER_VIA_MICROVIA );
393 migrateLegacyColor( f + "Color4DViaThruEx", LAYER_VIA_THROUGH );
394 migrateLegacyColor( f + "Color4DWorksheet", LAYER_DRAWINGSHEET );
395
396 manager.SaveColorSettings( cs, "board" );
397
398 ( *m_internals )[m_internals->PointerFromString( "appearance.color_theme" )] = "user_footprints";
399
400 double x, y;
401 f = "ModEditFrame";
402
403 if( aCfg->Read( f + "PcbUserGrid_X", &x ) && aCfg->Read( f + "PcbUserGrid_Y", &y ) )
404 {
405 EDA_UNITS u = static_cast<EDA_UNITS>( aCfg->ReadLong( f + "PcbUserGrid_Unit",
406 static_cast<long>( EDA_UNITS::INCHES ) ) );
407
408 // Convert to internal units
411
412 Set( "window.grid.user_grid_x", EDA_UNIT_UTILS::UI::StringFromValue( pcbIUScale, u, x ) );
413 Set( "window.grid.user_grid_y", EDA_UNIT_UTILS::UI::StringFromValue( pcbIUScale, u, y ) );
414 }
415
416 return ret;
417}
virtual bool MigrateFromLegacy(wxConfigBase *aCfg) override
Migrates from wxConfig to JSON-based configuration.
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)
bool fromLegacyString(wxConfigBase *aConfig, const std::string &aKey, const std::string &aDest)
Translates a legacy wxConfig string value to a given JSON pointer value.
static const wxChar * Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
Definition: lset.cpp:82
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.
EDA_UNITS
Definition: eda_units.h:43
@ LAYER_GRID
Definition: layer_ids.h:205
@ LAYER_MOD_TEXT_INVISIBLE
text marked as invisible
Definition: layer_ids.h:200
@ LAYER_NON_PLATEDHOLES
handle color for not plated holes (holes, not pads)
Definition: layer_ids.h:197
@ LAYER_DRAWINGSHEET
drawingsheet frame and titleblock
Definition: layer_ids.h:217
@ LAYER_PCB_BACKGROUND
PCB background color.
Definition: layer_ids.h:220
@ LAYER_CURSOR
PCB cursor.
Definition: layer_ids.h:221
@ LAYER_AUX_ITEMS
Auxiliary items (guides, rule, etc)
Definition: layer_ids.h:222
@ LAYER_RATSNEST
Definition: layer_ids.h:204
@ LAYER_ANCHOR
anchor of items having an anchor point (texts, footprints)
Definition: layer_ids.h:201
@ LAYER_PADS_TH
multilayer pads, usually with holes
Definition: layer_ids.h:213
@ LAYER_VIA_MICROVIA
to draw micro vias
Definition: layer_ids.h:194
@ LAYER_VIA_THROUGH
to draw usual through hole vias
Definition: layer_ids.h:196
@ LAYER_VIA_BBLIND
to draw blind/buried vias
Definition: layer_ids.h:195
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:59
@ PCB_LAYER_ID_COUNT
Definition: layer_ids.h:137
double FromUserUnit(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnit, double aValue)
Return in internal units the value "val" given in a real unit such as "in", "mm" or "deg".
Definition: eda_units.cpp:393
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:233
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:111

References SETTINGS_MANAGER::AddNewColorSettings(), F_Fab, F_SilkS, JSON_SETTINGS::fromLegacyString(), EDA_UNIT_UTILS::UI::FromUserUnit(), INCHES, LAYER_ANCHOR, LAYER_AUX_ITEMS, LAYER_CURSOR, LAYER_DRAWINGSHEET, LAYER_GRID, LAYER_MOD_TEXT_INVISIBLE, LAYER_NON_PLATEDHOLES, LAYER_PADS_TH, LAYER_PCB_BACKGROUND, LAYER_RATSNEST, LAYER_VIA_BBLIND, LAYER_VIA_MICROVIA, LAYER_VIA_THROUGH, JSON_SETTINGS::m_internals, APP_SETTINGS_BASE::MigrateFromLegacy(), LSET::Name(), PCB_LAYER_ID_COUNT, pcbIUScale, Pgm(), SETTINGS_MANAGER::Save(), SETTINGS_MANAGER::SaveColorSettings(), JSON_SETTINGS::Set(), COLOR_SETTINGS::SetColor(), COLOR_SETTINGS::SetName(), and EDA_UNIT_UTILS::UI::StringFromValue().

Referenced by PCBNEW_SETTINGS::MigrateFromLegacy().

◆ migrateLibTreeWidth()

bool APP_SETTINGS_BASE::migrateLibTreeWidth ( )
protectedinherited

Migrates the library tree width setting from a single column (Item) to multi-column.

Definition at line 394 of file app_settings.cpp.

395{
396 // We used to store only the width of the first column, because there were only
397 // two possible columns.
398 if( std::optional<int> optWidth = Get<int>( "lib_tree.column_width" ) )
399 {
400 Set<nlohmann::json>( "lib_tree.column_widths", { { "Item", *optWidth } } );
401 At( "lib_tree" ).erase( "column_width" );
402 }
403
404 return true;
405}
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...

References JSON_SETTINGS::At().

Referenced by EESCHEMA_SETTINGS::EESCHEMA_SETTINGS(), FOOTPRINT_EDITOR_SETTINGS(), PCBNEW_SETTINGS::PCBNEW_SETTINGS(), and SYMBOL_EDITOR_SETTINGS::SYMBOL_EDITOR_SETTINGS().

◆ migrateSchema0to1()

bool FOOTPRINT_EDITOR_SETTINGS::migrateSchema0to1 ( )
private

Schema version 0 to 1:

  • Check to see if a footprints version of the currently selected theme exists.
  • If so, select it

Definition at line 420 of file footprint_editor_settings.cpp.

421{
429 if( !m_manager )
430 {
431 wxLogTrace( traceSettings,
432 wxT( "Error: FOOTPRINT_EDITOR_SETTINGS migration cannot run unmanaged!" ) );
433 return false;
434 }
435
436 std::string theme_ptr( "appearance.color_theme" );
437
438 if( !Count( theme_ptr ) )
439 return true;
440
441 wxString selected = At( theme_ptr ).get<wxString>();
442 wxString search = selected + wxT( "_footprints" );
443
444 for( COLOR_SETTINGS* settings : Pgm().GetSettingsManager().GetColorSettingsList() )
445 {
446 if( settings->GetFilename() == search )
447 {
448 wxLogTrace( traceSettings, wxT( "Updating footprint editor theme from %s to %s" ),
449 selected, search );
450 Set( theme_ptr, search );
451 return true;
452 }
453 }
454
455 return true;
456}
SETTINGS_MANAGER * m_manager
A pointer to the settings manager managing this file (may be null)
size_t Count(const std::string &aPath) const
SETTINGS_MANAGER * GetSettingsManager()

References JSON_SETTINGS::At(), JSON_SETTINGS::Count(), GetSettingsManager(), JSON_SETTINGS::m_manager, Pgm(), JSON_SETTINGS::Set(), and traceSettings.

Referenced by FOOTPRINT_EDITOR_SETTINGS().

◆ migrateWindowConfig()

bool APP_SETTINGS_BASE::migrateWindowConfig ( wxConfigBase *  aCfg,
const std::string &  aFrameName,
const std::string &  aJsonPath 
)
protectedinherited

Migrates legacy window settings into the JSON document.

Parameters
aCfgis the wxConfig object to read from
aFrameNameis the prefix for window settings in the legacy config file
aJsonPathis the prefix for storing window settings in the JSON file
Returns
true if all settings were migrated

Definition at line 256 of file app_settings.cpp.

258{
259 bool ret = true;
260
261 const std::string frameGDO = aFrame + "GalDisplayOptions";
262 const std::string cursorPath = aJsonPath + ".cursor";
263 const std::string gridPath = aJsonPath + ".grid";
264
265 ret &= fromLegacy<bool>( aCfg, aFrame + "Maximized", aJsonPath + ".maximized" );
266 ret &= fromLegacyString( aCfg, aFrame + "MostRecentlyUsedPath", aJsonPath + ".mru_path" );
267 ret &= fromLegacy<int>( aCfg, aFrame + "Size_x", aJsonPath + ".size_x" );
268 ret &= fromLegacy<int>( aCfg, aFrame + "Size_y", aJsonPath + ".size_y" );
269 ret &= fromLegacyString( aCfg, aFrame + "Perspective", aJsonPath + ".perspective" );
270 ret &= fromLegacy<int>( aCfg, aFrame + "Pos_x", aJsonPath + ".pos_x" );
271 ret &= fromLegacy<int>( aCfg, aFrame + "Pos_y", aJsonPath + ".pos_y" );
272
273 ret &= fromLegacy<bool>( aCfg, frameGDO + "ForceDisplayCursor", cursorPath + ".always_show_cursor" );
274 ret &= fromLegacy<bool>( aCfg, frameGDO + "CursorFullscreen", cursorPath + ".fullscreen_cursor" );
275
276 ret &= fromLegacy<int>( aCfg, aFrame + "_LastGridSize", gridPath + ".last_size" );
277
278 ret &= fromLegacy<int>( aCfg, aFrame + "FastGrid1", gridPath + ".fast_grid_1" );
279 ret &= fromLegacy<int>( aCfg, aFrame + "FastGrid2", gridPath + ".fast_grid_2" );
280
281 ret &= fromLegacy<bool>( aCfg, frameGDO + "GridAxesEnabled", gridPath + ".axes_enabled" );
282 ret &= fromLegacy<double>( aCfg, frameGDO + "GridLineWidth", gridPath + ".line_width" );
283 ret &= fromLegacy<double>( aCfg, frameGDO + "GridMaxDensity", gridPath + ".min_spacing" );
284 ret &= fromLegacy<bool>( aCfg, frameGDO + "ShowGrid", gridPath + ".show" );
285 ret &= fromLegacy<int>( aCfg, frameGDO + "GridStyle", gridPath + ".style" );
286 ret &= fromLegacyColor( aCfg, frameGDO + "GridColor", gridPath + ".color" );
287
288 return ret;
289}
bool fromLegacyColor(wxConfigBase *aConfig, const std::string &aKey, const std::string &aDest)
Translates a legacy COLOR4D stored in a wxConfig string to a given JSON pointer value.

References JSON_SETTINGS::fromLegacyColor(), and JSON_SETTINGS::fromLegacyString().

Referenced by APP_SETTINGS_BASE::MigrateFromLegacy(), CVPCB_SETTINGS::MigrateFromLegacy(), and PCBNEW_SETTINGS::MigrateFromLegacy().

◆ registerMigration()

void JSON_SETTINGS::registerMigration ( int  aOldSchemaVersion,
int  aNewSchemaVersion,
std::function< bool(void)>  aMigrator 
)
protectedinherited

Registers a migration from one schema version to another.

If the schema version in the file loaded from disk is less than the schema version of the JSON_SETTINGS class, migration functions will be called one after the other until the data is up-to-date.

Parameters
aOldSchemaVersionis the starting schema version for this migration
aNewSchemaVersionis the ending schema version for this migration
aMigratoris a function that performs the migration and returns true if successful

Definition at line 543 of file json_settings.cpp.

545{
546 wxASSERT( aNewSchemaVersion > aOldSchemaVersion );
547 wxASSERT( aNewSchemaVersion <= m_schemaVersion );
548 m_migrators[aOldSchemaVersion] = std::make_pair( aNewSchemaVersion, aMigrator );
549}

References JSON_SETTINGS::m_migrators, and JSON_SETTINGS::m_schemaVersion.

Referenced by BOARD_DESIGN_SETTINGS::BOARD_DESIGN_SETTINGS(), COLOR_SETTINGS::COLOR_SETTINGS(), EDA_3D_VIEWER_SETTINGS::EDA_3D_VIEWER_SETTINGS(), EESCHEMA_SETTINGS::EESCHEMA_SETTINGS(), FOOTPRINT_EDITOR_SETTINGS(), NET_SETTINGS::NET_SETTINGS(), PCBNEW_SETTINGS::PCBNEW_SETTINGS(), PROJECT_LOCAL_SETTINGS::PROJECT_LOCAL_SETTINGS(), SCHEMATIC_SETTINGS::SCHEMATIC_SETTINGS(), and SYMBOL_EDITOR_SETTINGS::SYMBOL_EDITOR_SETTINGS().

◆ ReleaseNestedSettings()

void JSON_SETTINGS::ReleaseNestedSettings ( NESTED_SETTINGS aSettings)
inherited

Saves and frees a nested settings object, if it exists within this one.

Parameters
aSettingsis a pointer to a NESTED_SETTINGS that has already been added to this one

Definition at line 750 of file json_settings.cpp.

751{
752 if( !aSettings || !m_manager )
753 return;
754
755 auto it = std::find_if( m_nested_settings.begin(), m_nested_settings.end(),
756 [&aSettings]( const JSON_SETTINGS* aPtr ) {
757 return aPtr == aSettings;
758 } );
759
760 if( it != m_nested_settings.end() )
761 {
762 wxLogTrace( traceSettings, wxT( "Flush and release %s" ), ( *it )->GetFilename() );
763 ( *it )->SaveToFile();
764 m_nested_settings.erase( it );
765 }
766
767 aSettings->SetParent( nullptr );
768}
void SetParent(JSON_SETTINGS *aParent, bool aLoadFromFile=true)

References JSON_SETTINGS::m_manager, JSON_SETTINGS::m_nested_settings, NESTED_SETTINGS::SetParent(), and traceSettings.

Referenced by BOARD_DESIGN_SETTINGS::~BOARD_DESIGN_SETTINGS(), ERC_SETTINGS::~ERC_SETTINGS(), NESTED_SETTINGS::~NESTED_SETTINGS(), NET_SETTINGS::~NET_SETTINGS(), and SCHEMATIC_SETTINGS::~SCHEMATIC_SETTINGS().

◆ ResetToDefaults()

void JSON_SETTINGS::ResetToDefaults ( )
inherited

Resets all parameters to default values.

Does NOT write to file or update underlying JSON.

Definition at line 367 of file json_settings.cpp.

368{
369 for( auto param : m_params )
370 param->SetDefault();
371}

References JSON_SETTINGS::m_params.

Referenced by EDA_3D_VIEWER_FRAME::Process_Special_Functions(), PANEL_COMMON_SETTINGS::ResetPanel(), and PANEL_MOUSE_SETTINGS::ResetPanel().

◆ SaveToFile()

bool JSON_SETTINGS::SaveToFile ( const wxString &  aDirectory = "",
bool  aForce = false 
)
virtualinherited
   Calls Store() and then writes the contents of the JSON document to a file
   @param aDirectory is the directory to save to, including trailing separator

c *

Returns
true if the file was saved

Reimplemented in PROJECT_FILE, PROJECT_LOCAL_SETTINGS, and NESTED_SETTINGS.

Definition at line 374 of file json_settings.cpp.

375{
376 if( !m_writeFile )
377 return false;
378
379 // Default PROJECT won't have a filename set
380 if( m_filename.IsEmpty() )
381 return false;
382
383 wxFileName path;
384
385 if( aDirectory.empty() )
386 {
387 path.Assign( m_filename );
388 path.SetExt( getFileExt() );
389 }
390 else
391 {
392 wxString dir( aDirectory );
393 path.Assign( dir, m_filename, getFileExt() );
394 }
395
396 if( !m_createIfMissing && !path.FileExists() )
397 {
398 wxLogTrace( traceSettings,
399 wxT( "File for %s doesn't exist and m_createIfMissing == false; not saving" ),
400 GetFullFilename() );
401 return false;
402 }
403
404 // Ensure the path exists, and create it if not.
405 if( !path.DirExists() && !path.Mkdir() )
406 {
407 wxLogTrace( traceSettings, wxT( "Warning: could not create path %s, can't save %s" ),
408 path.GetPath(), GetFullFilename() );
409 return false;
410 }
411
412 if( ( path.FileExists() && !path.IsFileWritable() ) ||
413 ( !path.FileExists() && !path.IsDirWritable() ) )
414 {
415 wxLogTrace( traceSettings, wxT( "File for %s is read-only; not saving" ), GetFullFilename() );
416 return false;
417 }
418
419 bool modified = false;
420
421 for( auto settings : m_nested_settings )
422 modified |= settings->SaveToFile();
423
424 modified |= Store();
425
426 if( !modified && !aForce && path.FileExists() )
427 {
428 wxLogTrace( traceSettings, wxT( "%s contents not modified, skipping save" ), GetFullFilename() );
429 return false;
430 }
431 else if( !modified && !aForce && !m_createIfDefault )
432 {
433 wxLogTrace( traceSettings,
434 wxT( "%s contents still default and m_createIfDefault == false; not saving" ),
435 GetFullFilename() );
436 return false;
437 }
438
439 wxLogTrace( traceSettings, wxT( "Saving %s" ), GetFullFilename() );
440
442 bool success = true;
443
444 try
445 {
446 std::stringstream buffer;
447 buffer << std::setw( 2 ) << *m_internals << std::endl;
448
449 wxFFileOutputStream fileStream( path.GetFullPath(), "wb" );
450
451 if( !fileStream.IsOk()
452 || !fileStream.WriteAll( buffer.str().c_str(), buffer.str().size() ) )
453 {
454 wxLogTrace( traceSettings, wxT( "Warning: could not save %s" ), GetFullFilename() );
455 success = false;
456 }
457 }
458 catch( nlohmann::json::exception& error )
459 {
460 wxLogTrace( traceSettings, wxT( "Catch error: could not save %s. Json error %s" ),
461 GetFullFilename(), error.what() );
462 success = false;
463 }
464 catch( ... )
465 {
466 wxLogTrace( traceSettings, wxT( "Error: could not save %s." ) );
467 success = false;
468 }
469
470 return success;
471}
bool m_createIfDefault
Whether or not the backing store file should be created if all parameters are still at their default ...
bool m_createIfMissing
Whether or not the backing store file should be created it if doesn't exist.
virtual bool Store()
Stores the current parameters into the JSON document represented by this object Note: this doesn't do...
static LIB_SYMBOL * dummy()
Used to draw a dummy shape when a LIB_SYMBOL is not found in library.
Definition: sch_symbol.cpp:74

References dummy(), JSON_SETTINGS::getFileExt(), JSON_SETTINGS::GetFullFilename(), JSON_SETTINGS::m_createIfDefault, JSON_SETTINGS::m_createIfMissing, JSON_SETTINGS::m_filename, JSON_SETTINGS::m_internals, JSON_SETTINGS::m_nested_settings, JSON_SETTINGS::m_writeFile, path, JSON_SETTINGS::Store(), and traceSettings.

Referenced by JSON_SETTINGS::LoadFromFile(), SETTINGS_MANAGER::MigrateIfNeeded(), PANEL_COLOR_SETTINGS::OnThemeChanged(), PROJECT::PinLibrary(), PROJECT_FILE::SaveAs(), PROJECT_LOCAL_SETTINGS::SaveAs(), SETTINGS_MANAGER::SaveColorSettings(), PROJECT_FILE::SaveToFile(), PROJECT_LOCAL_SETTINGS::SaveToFile(), PGM_BASE::SetLanguage(), and PROJECT::UnpinLibrary().

◆ Set() [1/3]

template<typename ValueType >
template void JSON_SETTINGS::Set< const char * > ( const std::string &  aPath,
ValueType  aVal 
)
inherited

Stores a value into the JSON document Will throw an exception if ValueType isn't something that the library can handle.

Template Parameters
ValueTypeis the type to store
Parameters
aPathis a path to store in the form "key1.key2.key3"
aValis the value to store

Definition at line 524 of file json_settings.cpp.

525{
526 m_internals->SetFromString( aPath, aVal );
527}

References JSON_SETTINGS::m_internals.

Referenced by COLOR_SETTINGS::COLOR_SETTINGS(), EDA_3D_VIEWER_SETTINGS::EDA_3D_VIEWER_SETTINGS(), EESCHEMA_SETTINGS::EESCHEMA_SETTINGS(), BOARD_DESIGN_SETTINGS::LoadFromFile(), APP_SETTINGS_BASE::migrateFindReplace(), PROJECT_FILE::MigrateFromLegacy(), APP_SETTINGS_BASE::MigrateFromLegacy(), EDA_3D_VIEWER_SETTINGS::MigrateFromLegacy(), EESCHEMA_SETTINGS::MigrateFromLegacy(), SYMBOL_EDITOR_SETTINGS::MigrateFromLegacy(), GERBVIEW_SETTINGS::MigrateFromLegacy(), MigrateFromLegacy(), COMMON_SETTINGS::MigrateFromLegacy(), KICAD_SETTINGS::MigrateFromLegacy(), PCBNEW_SETTINGS::MigrateFromLegacy(), BOARD_DESIGN_SETTINGS::migrateSchema0to1(), migrateSchema0to1(), COLOR_SETTINGS::migrateSchema0to1(), PCBNEW_SETTINGS::PCBNEW_SETTINGS(), PROJECT_FILE::SaveAs(), PROJECT_LOCAL_SETTINGS::SaveAs(), PROJECT_FILE::SaveToFile(), PROJECT_LOCAL_SETTINGS::SaveToFile(), SCHEMATIC_SETTINGS::SCHEMATIC_SETTINGS(), COLOR_MAP_PARAM::Store(), PARAM< ValueType >::Store(), PARAM_PATH::Store(), PARAM_ENUM< EnumType >::Store(), PARAM_LAMBDA< ValueType >::Store(), PARAM_SCALED< ValueType >::Store(), PARAM_LIST< Type >::Store(), PARAM_PATH_LIST::Store(), PARAM_MAP< Value >::Store(), and PARAM_WXSTRING_MAP::Store().

◆ Set() [2/3]

template<>
void JSON_SETTINGS::Set ( const std::string &  aPath,
wxString  aVal 
)
inherited

Definition at line 782 of file json_settings.cpp.

783{
784 ( *m_internals )[aPath] = aVal.ToUTF8();
785}

◆ Set() [3/3]

template<>
void JSON_SETTINGS::Set ( const std::string &  aPath,
wxString  aVal 
)
inherited

◆ SetFilename()

void JSON_SETTINGS::SetFilename ( const wxString &  aFilename)
inlineinherited

◆ SetIfPresent() [1/4]

bool JSON_SETTINGS::SetIfPresent ( const nlohmann::json aObj,
const std::string &  aPath,
bool &  aTarget 
)
staticinherited

Sets the given bool if the given key/path is present.

Parameters
aObjis the source object
aTargetis the storage destination
Returns
True if set, false if not

Definition at line 609 of file json_settings.cpp.

611{
612 nlohmann::json::json_pointer ptr = JSON_SETTINGS_INTERNALS::PointerFromString( aPath );
613
614 if( aObj.contains( ptr ) && aObj.at( ptr ).is_boolean() )
615 {
616 aTarget = aObj.at( ptr ).get<bool>();
617 return true;
618 }
619
620 return false;
621}

References JSON_SETTINGS_INTERNALS::PointerFromString().

◆ SetIfPresent() [2/4]

bool JSON_SETTINGS::SetIfPresent ( const nlohmann::json aObj,
const std::string &  aPath,
int &  aTarget 
)
staticinherited

Sets the given int if the given key/path is present.

Parameters
aObjis the source object
aTargetis the storage destination
Returns
True if set, false if not

Definition at line 624 of file json_settings.cpp.

626{
627 nlohmann::json::json_pointer ptr = JSON_SETTINGS_INTERNALS::PointerFromString( aPath );
628
629 if( aObj.contains( ptr ) && aObj.at( ptr ).is_number_integer() )
630 {
631 aTarget = aObj.at( ptr ).get<int>();
632 return true;
633 }
634
635 return false;
636}

References JSON_SETTINGS_INTERNALS::PointerFromString().

◆ SetIfPresent() [3/4]

bool JSON_SETTINGS::SetIfPresent ( const nlohmann::json aObj,
const std::string &  aPath,
unsigned int &  aTarget 
)
staticinherited

Sets the given unsigned int if the given key/path is present.

Parameters
aObjis the source object
aTargetis the storage destination
Returns
True if set, false if not

Definition at line 639 of file json_settings.cpp.

641{
642 nlohmann::json::json_pointer ptr = JSON_SETTINGS_INTERNALS::PointerFromString( aPath );
643
644 if( aObj.contains( ptr ) && aObj.at( ptr ).is_number_unsigned() )
645 {
646 aTarget = aObj.at( ptr ).get<unsigned int>();
647 return true;
648 }
649
650 return false;
651}

References JSON_SETTINGS_INTERNALS::PointerFromString().

◆ SetIfPresent() [4/4]

bool JSON_SETTINGS::SetIfPresent ( const nlohmann::json aObj,
const std::string &  aPath,
wxString &  aTarget 
)
staticinherited

Sets the given string if the given key/path is present.

Parameters
aObjis the source object
aTargetis the storage destination
Returns
True if set, false if not

Definition at line 594 of file json_settings.cpp.

596{
597 nlohmann::json::json_pointer ptr = JSON_SETTINGS_INTERNALS::PointerFromString( aPath );
598
599 if( aObj.contains( ptr ) && aObj.at( ptr ).is_string() )
600 {
601 aTarget = aObj.at( ptr ).get<wxString>();
602 return true;
603 }
604
605 return false;
606}

References JSON_SETTINGS_INTERNALS::PointerFromString().

Referenced by FOOTPRINT_EDITOR_SETTINGS(), and PROJECT_LOCAL_SETTINGS::PROJECT_LOCAL_SETTINGS().

◆ SetLegacyFilename()

void JSON_SETTINGS::SetLegacyFilename ( const wxString &  aFilename)
inlineinherited

Definition at line 82 of file json_settings.h.

82{ m_legacy_filename = aFilename; }

References JSON_SETTINGS::m_legacy_filename.

Referenced by SYMBOL_EDITOR_SETTINGS::SYMBOL_EDITOR_SETTINGS().

◆ SetLocation()

void JSON_SETTINGS::SetLocation ( SETTINGS_LOC  aLocation)
inlineinherited

Definition at line 79 of file json_settings.h.

79{ m_location = aLocation; }

References JSON_SETTINGS::m_location.

Referenced by COLOR_SETTINGS::COLOR_SETTINGS().

◆ SetManager()

void JSON_SETTINGS::SetManager ( SETTINGS_MANAGER aManager)
inlineinherited

Definition at line 192 of file json_settings.h.

193 {
194 m_manager = aManager;
195 }

References JSON_SETTINGS::m_manager.

◆ SetReadOnly()

◆ Store()

bool JSON_SETTINGS::Store ( )
virtualinherited

Stores the current parameters into the JSON document represented by this object Note: this doesn't do any writing to disk; that's handled by SETTINGS_MANAGER.

Returns
true if any part of the JSON document was updated

Definition at line 353 of file json_settings.cpp.

354{
355 bool modified = false;
356
357 for( auto param : m_params )
358 {
359 modified |= !param->MatchesFile( this );
360 param->Store( this );
361 }
362
363 return modified;
364}

References JSON_SETTINGS::m_params.

Referenced by PANEL_FP_EDITOR_COLOR_SETTINGS::PANEL_FP_EDITOR_COLOR_SETTINGS(), SETTINGS_MANAGER::SaveColorSettings(), JSON_SETTINGS::SaveToFile(), and NESTED_SETTINGS::SaveToFile().

Member Data Documentation

◆ m_ActiveLayerPreset

wxString FOOTPRINT_EDITOR_SETTINGS::m_ActiveLayerPreset

◆ m_appSettingsSchemaVersion

int APP_SETTINGS_BASE::m_appSettingsSchemaVersion
inherited

! Local schema version for common app settings

Definition at line 190 of file app_settings.h.

◆ m_AuiPanels

◆ m_ColorPicker

◆ m_ColorTheme

◆ m_createIfDefault

bool JSON_SETTINGS::m_createIfDefault
protectedinherited

Whether or not the backing store file should be created if all parameters are still at their default values.

Ignored if m_createIfMissing is false or m_writeFile is false.

Definition at line 303 of file json_settings.h.

Referenced by JSON_SETTINGS::SaveToFile().

◆ m_createIfMissing

bool JSON_SETTINGS::m_createIfMissing
protectedinherited

Whether or not the backing store file should be created it if doesn't exist.

Definition at line 297 of file json_settings.h.

Referenced by JSON_SETTINGS::SaveToFile().

◆ m_CrossProbing

◆ m_deleteLegacyAfterMigration

bool JSON_SETTINGS::m_deleteLegacyAfterMigration
protectedinherited

Whether or not to delete legacy file after migration.

Definition at line 309 of file json_settings.h.

Referenced by JSON_SETTINGS::LoadFromFile(), PROJECT_FILE::PROJECT_FILE(), and PROJECT_LOCAL_SETTINGS::PROJECT_LOCAL_SETTINGS().

◆ m_DesignSettings

BOARD_DESIGN_SETTINGS FOOTPRINT_EDITOR_SETTINGS::m_DesignSettings

◆ m_Display

PCB_DISPLAY_OPTIONS FOOTPRINT_EDITOR_SETTINGS::m_Display

◆ m_filename

◆ m_FindReplace

FIND_REPLACE APP_SETTINGS_BASE::m_FindReplace
inherited

◆ m_FootprintTextShownColumns

◆ m_Graphics

◆ m_internals

◆ m_LastImportExportPath

wxString FOOTPRINT_EDITOR_SETTINGS::m_LastImportExportPath

◆ m_LayerPresets

std::vector<LAYER_PRESET> FOOTPRINT_EDITOR_SETTINGS::m_LayerPresets

◆ m_legacy_filename

wxString JSON_SETTINGS::m_legacy_filename
protectedinherited

The filename of the wxConfig legacy file (if different from m_filename)

Definition at line 285 of file json_settings.h.

Referenced by JSON_SETTINGS::LoadFromFile(), and JSON_SETTINGS::SetLegacyFilename().

◆ m_LibTree

◆ m_LibWidth

◆ m_location

SETTINGS_LOC JSON_SETTINGS::m_location
protectedinherited

The location of this settings file (.

See also
SETTINGS_LOC)

Definition at line 288 of file json_settings.h.

Referenced by JSON_SETTINGS::GetLocation(), and JSON_SETTINGS::SetLocation().

◆ m_MagneticItems

◆ m_manager

SETTINGS_MANAGER* JSON_SETTINGS::m_manager
protectedinherited

A pointer to the settings manager managing this file (may be null)

Definition at line 318 of file json_settings.h.

Referenced by migrateSchema0to1(), COLOR_SETTINGS::migrateSchema0to1(), JSON_SETTINGS::ReleaseNestedSettings(), and JSON_SETTINGS::SetManager().

◆ m_migrators

std::map<int, std::pair<int, std::function<bool()> > > JSON_SETTINGS::m_migrators
protectedinherited

A map of starting schema version to a pair of <ending version, migrator function>

Definition at line 321 of file json_settings.h.

Referenced by JSON_SETTINGS::Migrate(), and JSON_SETTINGS::registerMigration().

◆ m_nested_settings

std::vector<NESTED_SETTINGS*> JSON_SETTINGS::m_nested_settings
protectedinherited

Nested settings files that live inside this one, if any.

Definition at line 294 of file json_settings.h.

Referenced by JSON_SETTINGS::AddNestedSettings(), JSON_SETTINGS::LoadFromFile(), JSON_SETTINGS::ReleaseNestedSettings(), and JSON_SETTINGS::SaveToFile().

◆ m_params

◆ m_PolarCoords

bool FOOTPRINT_EDITOR_SETTINGS::m_PolarCoords

Definition at line 66 of file footprint_editor_settings.h.

Referenced by FOOTPRINT_EDITOR_SETTINGS().

◆ m_Printing

◆ m_resetParamsIfMissing

bool JSON_SETTINGS::m_resetParamsIfMissing
protectedinherited

Whether or not to set parameters to their default value if missing from JSON on Load()

Definition at line 312 of file json_settings.h.

Referenced by BOARD_DESIGN_SETTINGS::BOARD_DESIGN_SETTINGS(), and JSON_SETTINGS::Load().

◆ m_RotationAngle

◆ m_schemaVersion

int JSON_SETTINGS::m_schemaVersion
protectedinherited

◆ m_SelectionFilter

◆ m_System

◆ m_Use45Limit

◆ m_UserGrid

USER_GRID FOOTPRINT_EDITOR_SETTINGS::m_UserGrid

Definition at line 64 of file footprint_editor_settings.h.

◆ m_Window

◆ m_writeFile

bool JSON_SETTINGS::m_writeFile
protectedinherited

The documentation for this class was generated from the following files: