You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							457 lines
						
					
					
						
							22 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							457 lines
						
					
					
						
							22 KiB
						
					
					
				
								/*
							 | 
						|
								 * This program source code file is part of KiCad, a free EDA CAD application.
							 | 
						|
								 *
							 | 
						|
								 * Copyright (C) 2020 Jon Evans <jon@craftyjon.com>
							 | 
						|
								 * Copyright (C) 2020-2022 KiCad Developers, see AUTHORS.txt for contributors.
							 | 
						|
								 *
							 | 
						|
								 * This program is free software: you can redistribute it and/or modify it
							 | 
						|
								 * under the terms of the GNU General Public License as published by the
							 | 
						|
								 * Free Software Foundation, either version 3 of the License, or (at your
							 | 
						|
								 * option) any later version.
							 | 
						|
								 *
							 | 
						|
								 * This program is distributed in the hope that it will be useful, but
							 | 
						|
								 * WITHOUT ANY WARRANTY; without even the implied warranty of
							 | 
						|
								 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
							 | 
						|
								 * General Public License for more details.
							 | 
						|
								 *
							 | 
						|
								 * You should have received a copy of the GNU General Public License along
							 | 
						|
								 * with this program.  If not, see <http://www.gnu.org/licenses/>.
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								#include <common.h>
							 | 
						|
								#include <footprint_editor_settings.h>
							 | 
						|
								#include <layer_ids.h>
							 | 
						|
								#include <pgm_base.h>
							 | 
						|
								#include <settings/common_settings.h>
							 | 
						|
								#include <settings/json_settings_internals.h>
							 | 
						|
								#include <settings/parameters.h>
							 | 
						|
								#include <settings/settings_manager.h>
							 | 
						|
								#include <wx/config.h>
							 | 
						|
								#include <base_units.h>
							 | 
						|
								#include <widgets/ui_common.h>
							 | 
						|
								#include <wx/log.h>
							 | 
						|
								#include <pcbnew.h>
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								///! Update the schema version whenever a migration is required
							 | 
						|
								const int fpEditSchemaVersion = 2;
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								FOOTPRINT_EDITOR_SETTINGS::FOOTPRINT_EDITOR_SETTINGS() :
							 | 
						|
								        APP_SETTINGS_BASE( "fpedit", fpEditSchemaVersion ),
							 | 
						|
								        m_DesignSettings( nullptr, "fpedit.settings" ),
							 | 
						|
								        m_MagneticItems(),
							 | 
						|
								        m_Display(),
							 | 
						|
								        m_UserGrid(),
							 | 
						|
								        m_PolarCoords( false ),
							 | 
						|
								        m_RotationAngle( ANGLE_90 ),
							 | 
						|
								        m_Use45Limit( true ),
							 | 
						|
								        m_ArcEditMode( ARC_EDIT_MODE::KEEP_CENTER_ADJUST_ANGLE_RADIUS ),
							 | 
						|
								        m_LibWidth( 250 ),
							 | 
						|
								        m_LastImportExportPath(),
							 | 
						|
								        m_FootprintTextShownColumns()
							 | 
						|
								{
							 | 
						|
								    m_MagneticItems.pads     = MAGNETIC_OPTIONS::CAPTURE_ALWAYS;
							 | 
						|
								    m_MagneticItems.tracks   = MAGNETIC_OPTIONS::NO_EFFECT;
							 | 
						|
								    m_MagneticItems.graphics = true;
							 | 
						|
								
							 | 
						|
								    m_AuiPanels.appearance_panel_tab = 0;
							 | 
						|
								    m_AuiPanels.right_panel_width = -1;
							 | 
						|
								    m_AuiPanels.show_layer_manager = true;
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM<int>( "window.lib_width",
							 | 
						|
								            &m_LibWidth, 250 ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM<bool>( "aui.show_layer_manager",
							 | 
						|
								            &m_AuiPanels.show_layer_manager, true ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM<int>( "aui.right_panel_width",
							 | 
						|
								            &m_AuiPanels.right_panel_width, -1 ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM<int>( "aui.appearance_panel_tab",
							 | 
						|
								            &m_AuiPanels.appearance_panel_tab, 0, 0, 2 ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM<wxString>( "system.last_import_export_path",
							 | 
						|
								            &m_LastImportExportPath, "" ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM<wxString>( "window.footprint_text_shown_columns",
							 | 
						|
								            &m_FootprintTextShownColumns, "0 1 2 3 4 5 6" ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM<int>( "editing.magnetic_pads",
							 | 
						|
								            reinterpret_cast<int*>( &m_MagneticItems.pads ),
							 | 
						|
								            static_cast<int>( MAGNETIC_OPTIONS::CAPTURE_ALWAYS ) ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM<bool>( "editing.magnetic_graphics",
							 | 
						|
								            &m_MagneticItems.graphics, true ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM<bool>( "editing.polar_coords",
							 | 
						|
								            &m_PolarCoords, false ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM_LAMBDA<int>( "editing.rotation_angle",
							 | 
						|
								            [this] () -> int
							 | 
						|
								            {
							 | 
						|
								                return m_RotationAngle.AsTenthsOfADegree();
							 | 
						|
								            },
							 | 
						|
								            [this] ( int aVal )
							 | 
						|
								            {
							 | 
						|
								                if( aVal )
							 | 
						|
								                    m_RotationAngle = EDA_ANGLE( aVal, TENTHS_OF_A_DEGREE_T );
							 | 
						|
								            },
							 | 
						|
								            900 ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM<bool>( "editing.fp_use_45_degree_limit",
							 | 
						|
								            &m_Use45Limit, false ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM_LAYER_PRESET( "pcb_display.layer_presets", &m_LayerPresets ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM<wxString>( "pcb_display.active_layer_preset",
							 | 
						|
								            &m_ActiveLayerPreset, "" ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>(
							 | 
						|
								            "design_settings.default_footprint_text_items",
							 | 
						|
								            [&] () -> nlohmann::json
							 | 
						|
								            {
							 | 
						|
								                nlohmann::json js = nlohmann::json::array();
							 | 
						|
								
							 | 
						|
								                for( const TEXT_ITEM_INFO& item : m_DesignSettings.m_DefaultFPTextItems )
							 | 
						|
								                {
							 | 
						|
								                    js.push_back( nlohmann::json( { item.m_Text.ToUTF8(),
							 | 
						|
								                                                    item.m_Visible,
							 | 
						|
								                                                    item.m_Layer } ) );
							 | 
						|
								                }
							 | 
						|
								
							 | 
						|
								                return js;
							 | 
						|
								            },
							 | 
						|
								            [&] ( const nlohmann::json& aObj )
							 | 
						|
								            {
							 | 
						|
								                m_DesignSettings.m_DefaultFPTextItems.clear();
							 | 
						|
								
							 | 
						|
								                if( !aObj.is_array() )
							 | 
						|
								                    return;
							 | 
						|
								
							 | 
						|
								                for( const nlohmann::json& entry : aObj )
							 | 
						|
								                {
							 | 
						|
								                    if( entry.empty() || !entry.is_array() )
							 | 
						|
								                        continue;
							 | 
						|
								
							 | 
						|
								                    TEXT_ITEM_INFO textInfo( wxT( "" ), true, F_SilkS );
							 | 
						|
								
							 | 
						|
								                    textInfo.m_Text = entry.at(0).get<wxString>();
							 | 
						|
								                    textInfo.m_Visible = entry.at(1).get<bool>();
							 | 
						|
								                    textInfo.m_Layer = entry.at(2).get<int>();
							 | 
						|
								
							 | 
						|
								                    m_DesignSettings.m_DefaultFPTextItems.push_back( std::move( textInfo ) );
							 | 
						|
								                }
							 | 
						|
								            },
							 | 
						|
								            nlohmann::json::array( {
							 | 
						|
								                                       { "REF**", true, F_SilkS },
							 | 
						|
								                                       { "", true, F_Fab },
							 | 
						|
								                                       { "${REFERENCE}", true, F_Fab }
							 | 
						|
								                                   } ) ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_line_width",
							 | 
						|
								            &m_DesignSettings.m_LineThickness[ LAYER_CLASS_SILK ],
							 | 
						|
								            pcbIUScale.mmToIU( DEFAULT_SILK_LINE_WIDTH ), pcbIUScale.mmToIU( 0.01 ), pcbIUScale.mmToIU( 100.0 ),
							 | 
						|
								            pcbIUScale.MM_PER_IU ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_text_size_h",
							 | 
						|
								            &m_DesignSettings.m_TextSize[ LAYER_CLASS_SILK ].x,
							 | 
						|
								            pcbIUScale.mmToIU( DEFAULT_SILK_TEXT_SIZE ), TEXTS_MIN_SIZE, TEXTS_MAX_SIZE, pcbIUScale.MM_PER_IU ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_text_size_v",
							 | 
						|
								            &m_DesignSettings.m_TextSize[ LAYER_CLASS_SILK ].y,
							 | 
						|
								            pcbIUScale.mmToIU( DEFAULT_SILK_TEXT_SIZE ), TEXTS_MIN_SIZE, TEXTS_MAX_SIZE, pcbIUScale.MM_PER_IU ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_text_thickness",
							 | 
						|
								            &m_DesignSettings.m_TextThickness[ LAYER_CLASS_SILK ],
							 | 
						|
								            pcbIUScale.mmToIU( DEFAULT_SILK_TEXT_WIDTH ), 1, TEXTS_MAX_WIDTH, pcbIUScale.MM_PER_IU ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM<bool>( "design_settings.silk_text_italic",
							 | 
						|
								            &m_DesignSettings.m_TextItalic[ LAYER_CLASS_SILK ], false ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_line_width",
							 | 
						|
								            &m_DesignSettings.m_LineThickness[ LAYER_CLASS_COPPER ],
							 | 
						|
								            pcbIUScale.mmToIU( DEFAULT_COPPER_LINE_WIDTH ), pcbIUScale.mmToIU( 0.01 ), pcbIUScale.mmToIU( 5.0 ),
							 | 
						|
								            pcbIUScale.MM_PER_IU ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_text_size_h",
							 | 
						|
								            &m_DesignSettings.m_TextSize[ LAYER_CLASS_COPPER ].x,
							 | 
						|
								            pcbIUScale.mmToIU( DEFAULT_COPPER_TEXT_SIZE ), TEXTS_MIN_SIZE, TEXTS_MAX_SIZE,
							 | 
						|
								            pcbIUScale.MM_PER_IU ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_text_size_v",
							 | 
						|
								            &m_DesignSettings.m_TextSize[ LAYER_CLASS_COPPER ].y,
							 | 
						|
								            pcbIUScale.mmToIU( DEFAULT_COPPER_TEXT_SIZE ), TEXTS_MIN_SIZE, TEXTS_MAX_SIZE,
							 | 
						|
								            pcbIUScale.MM_PER_IU ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_text_thickness",
							 | 
						|
								            &m_DesignSettings.m_TextThickness[ LAYER_CLASS_COPPER ],
							 | 
						|
								            pcbIUScale.mmToIU( DEFAULT_COPPER_TEXT_WIDTH ), pcbIUScale.mmToIU( 0.01 ), pcbIUScale.mmToIU( 5.0 ),
							 | 
						|
								            pcbIUScale.MM_PER_IU ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM<bool>( "design_settings.copper_text_italic",
							 | 
						|
								            &m_DesignSettings.m_TextItalic[ LAYER_CLASS_COPPER ], false ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.edge_line_width",
							 | 
						|
								            &m_DesignSettings.m_LineThickness[ LAYER_CLASS_EDGES ],
							 | 
						|
								            pcbIUScale.mmToIU( DEFAULT_EDGE_WIDTH ), pcbIUScale.mmToIU( 0.01 ), pcbIUScale.mmToIU( 5.0 ),
							 | 
						|
								            pcbIUScale.MM_PER_IU ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.courtyard_line_width",
							 | 
						|
								            &m_DesignSettings.m_LineThickness[ LAYER_CLASS_COURTYARD ],
							 | 
						|
								            pcbIUScale.mmToIU( DEFAULT_COURTYARD_WIDTH ), pcbIUScale.mmToIU( 0.01 ), pcbIUScale.mmToIU( 5.0 ),
							 | 
						|
								            pcbIUScale.MM_PER_IU ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_line_width",
							 | 
						|
								           &m_DesignSettings.m_LineThickness[ LAYER_CLASS_FAB ],
							 | 
						|
								           pcbIUScale.mmToIU( DEFAULT_LINE_WIDTH ), pcbIUScale.mmToIU( 0.01 ), pcbIUScale.mmToIU( 5.0 ),
							 | 
						|
								           pcbIUScale.MM_PER_IU ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_text_size_h",
							 | 
						|
								           &m_DesignSettings.m_TextSize[ LAYER_CLASS_FAB ].x,
							 | 
						|
								           pcbIUScale.mmToIU( DEFAULT_TEXT_SIZE ), TEXTS_MIN_SIZE, TEXTS_MAX_SIZE, pcbIUScale.MM_PER_IU ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_text_size_v",
							 | 
						|
								           &m_DesignSettings.m_TextSize[ LAYER_CLASS_FAB ].y,
							 | 
						|
								           pcbIUScale.mmToIU( DEFAULT_TEXT_SIZE ), TEXTS_MIN_SIZE, TEXTS_MAX_SIZE, pcbIUScale.MM_PER_IU ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_text_thickness",
							 | 
						|
								           &m_DesignSettings.m_TextThickness[ LAYER_CLASS_FAB ],
							 | 
						|
								           pcbIUScale.mmToIU( DEFAULT_TEXT_WIDTH ), 1, TEXTS_MAX_WIDTH, pcbIUScale.MM_PER_IU ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM<bool>( "design_settings.fab_text_italic",
							 | 
						|
								            &m_DesignSettings.m_TextItalic[ LAYER_CLASS_FAB ], false ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_line_width",
							 | 
						|
								           &m_DesignSettings.m_LineThickness[ LAYER_CLASS_OTHERS ],
							 | 
						|
								           pcbIUScale.mmToIU( DEFAULT_LINE_WIDTH ), pcbIUScale.mmToIU( 0.01 ), pcbIUScale.mmToIU( 5.0 ),
							 | 
						|
								           pcbIUScale.MM_PER_IU ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_text_size_h",
							 | 
						|
								           &m_DesignSettings.m_TextSize[ LAYER_CLASS_OTHERS ].x,
							 | 
						|
								           pcbIUScale.mmToIU( DEFAULT_TEXT_SIZE ), TEXTS_MIN_SIZE, TEXTS_MAX_SIZE, pcbIUScale.MM_PER_IU ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_text_size_v",
							 | 
						|
								           &m_DesignSettings.m_TextSize[ LAYER_CLASS_OTHERS ].y,
							 | 
						|
								           pcbIUScale.mmToIU( DEFAULT_TEXT_SIZE ), TEXTS_MIN_SIZE, TEXTS_MAX_SIZE, pcbIUScale.MM_PER_IU ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_text_thickness",
							 | 
						|
								           &m_DesignSettings.m_TextThickness[ LAYER_CLASS_OTHERS ],
							 | 
						|
								           pcbIUScale.mmToIU( DEFAULT_TEXT_WIDTH ), 1, TEXTS_MAX_WIDTH, pcbIUScale.MM_PER_IU ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM<bool>( "design_settings.others_text_italic",
							 | 
						|
								            &m_DesignSettings.m_TextItalic[ LAYER_CLASS_OTHERS ], false ) );
							 | 
						|
								
							 | 
						|
								    m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>( "editing.selection_filter",
							 | 
						|
								            [&]() -> nlohmann::json
							 | 
						|
								            {
							 | 
						|
								                nlohmann::json ret;
							 | 
						|
								
							 | 
						|
								                ret["lockedItems"] = m_SelectionFilter.lockedItems;
							 | 
						|
								                ret["footprints"]  = m_SelectionFilter.footprints;
							 | 
						|
								                ret["text"]        = m_SelectionFilter.text;
							 | 
						|
								                ret["tracks"]      = m_SelectionFilter.tracks;
							 | 
						|
								                ret["vias"]        = m_SelectionFilter.vias;
							 | 
						|
								                ret["pads"]        = m_SelectionFilter.pads;
							 | 
						|
								                ret["graphics"]    = m_SelectionFilter.graphics;
							 | 
						|
								                ret["zones"]       = m_SelectionFilter.zones;
							 | 
						|
								                ret["keepouts"]    = m_SelectionFilter.keepouts;
							 | 
						|
								                ret["dimensions"]  = m_SelectionFilter.dimensions;
							 | 
						|
								                ret["otherItems"]  = m_SelectionFilter.otherItems;
							 | 
						|
								
							 | 
						|
								                return ret;
							 | 
						|
								            },
							 | 
						|
								            [&]( const nlohmann::json& aVal )
							 | 
						|
								            {
							 | 
						|
								                if( aVal.empty() || !aVal.is_object() )
							 | 
						|
								                    return;
							 | 
						|
								
							 | 
						|
								                SetIfPresent( aVal, "lockedItems", m_SelectionFilter.lockedItems );
							 | 
						|
								                SetIfPresent( aVal, "footprints", m_SelectionFilter.footprints );
							 | 
						|
								                SetIfPresent( aVal, "text", m_SelectionFilter.text );
							 | 
						|
								                SetIfPresent( aVal, "tracks", m_SelectionFilter.tracks );
							 | 
						|
								                SetIfPresent( aVal, "vias", m_SelectionFilter.vias );
							 | 
						|
								                SetIfPresent( aVal, "pads", m_SelectionFilter.pads );
							 | 
						|
								                SetIfPresent( aVal, "graphics", m_SelectionFilter.graphics );
							 | 
						|
								                SetIfPresent( aVal, "zones", m_SelectionFilter.zones );
							 | 
						|
								                SetIfPresent( aVal, "keepouts", m_SelectionFilter.keepouts );
							 | 
						|
								                SetIfPresent( aVal, "dimensions", m_SelectionFilter.dimensions );
							 | 
						|
								                SetIfPresent( aVal, "otherItems", m_SelectionFilter.otherItems );
							 | 
						|
								            },
							 | 
						|
								            {
							 | 
						|
								                { "lockedItems", true },
							 | 
						|
								                { "footprints", true },
							 | 
						|
								                { "text", true },
							 | 
						|
								                { "tracks", true },
							 | 
						|
								                { "vias", true },
							 | 
						|
								                { "pads", true },
							 | 
						|
								                { "graphics", true },
							 | 
						|
								                { "zones", true },
							 | 
						|
								                { "keepouts", true },
							 | 
						|
								                { "dimensions", true },
							 | 
						|
								                { "otherItems", true }
							 | 
						|
								            } ) );
							 | 
						|
								
							 | 
						|
								    registerMigration( 0, 1, std::bind( &FOOTPRINT_EDITOR_SETTINGS::migrateSchema0to1, this ) );
							 | 
						|
								
							 | 
						|
								    registerMigration( 1, 2,
							 | 
						|
								                       [&]() -> bool
							 | 
						|
								                       {
							 | 
						|
								                           // This is actually a migration for APP_SETTINGS_BASE::m_LibTree
							 | 
						|
								                           return migrateLibTreeWidth();
							 | 
						|
								                       } );
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								bool FOOTPRINT_EDITOR_SETTINGS::MigrateFromLegacy( wxConfigBase* aCfg )
							 | 
						|
								{
							 | 
						|
								    bool ret = APP_SETTINGS_BASE::MigrateFromLegacy( aCfg );
							 | 
						|
								
							 | 
						|
								    //
							 | 
						|
								    // NOTE: there's no value in line-wrapping these; it just makes the table unreadable.
							 | 
						|
								    //
							 | 
						|
								    ret &= fromLegacy<int>(  aCfg, "ModeditLibWidth",              "window.lib_width" );
							 | 
						|
								    ret &= fromLegacyString( aCfg, "import_last_path",             "system.last_import_export_path" );
							 | 
						|
								    ret &= fromLegacyString( aCfg, "LibFootprintTextShownColumns", "window.footprint_text_shown_columns" );
							 | 
						|
								
							 | 
						|
								    ret &= fromLegacy<int>(  aCfg, "FpEditorMagneticPads",               "editing.magnetic_pads" );
							 | 
						|
								    ret &= fromLegacy<bool>( aCfg, "FpEditorDisplayPolarCoords",         "editing.polar_coords" );
							 | 
						|
								    ret &= fromLegacy<int>(  aCfg, "FpEditorUse45DegreeGraphicSegments", "editing.use_45_degree_graphic_segments" );
							 | 
						|
								
							 | 
						|
								    ret &= fromLegacy<bool>(  aCfg, "FpEditorGraphicLinesDisplayMode", "pcb_display.graphic_items_fill" );
							 | 
						|
								    ret &= fromLegacy<bool>(  aCfg, "FpEditorPadDisplayMode",          "pcb_display.pad_fill" );
							 | 
						|
								    ret &= fromLegacy<bool>(  aCfg, "FpEditorTextsDisplayMode",        "pcb_display.footprint_text" );
							 | 
						|
								
							 | 
						|
								    ret &= fromLegacy<double>( aCfg, "FpEditorSilkLineWidth",       "design_settings.silk_line_width" );
							 | 
						|
								    ret &= fromLegacy<double>( aCfg, "FpEditorSilkTextSizeH",       "design_settings.silk_text_size_h" );
							 | 
						|
								    ret &= fromLegacy<double>( aCfg, "FpEditorSilkTextSizeV",       "design_settings.silk_text_size_v" );
							 | 
						|
								    ret &= fromLegacy<double>( aCfg, "FpEditorSilkTextThickness",   "design_settings.silk_text_thickness" );
							 | 
						|
								    ret &= fromLegacy<bool>(   aCfg, "FpEditorSilkTextItalic",      "design_settings.silk_text_italic" );
							 | 
						|
								    ret &= fromLegacy<double>( aCfg, "FpEditorCopperLineWidth",     "design_settings.copper_line_width" );
							 | 
						|
								    ret &= fromLegacy<double>( aCfg, "FpEditorCopperTextSizeH",     "design_settings.copper_text_size_h" );
							 | 
						|
								    ret &= fromLegacy<double>( aCfg, "FpEditorCopperTextSizeV",     "design_settings.copper_text_size_v" );
							 | 
						|
								    ret &= fromLegacy<double>( aCfg, "FpEditorCopperTextThickness", "design_settings.copper_text_thickness" );
							 | 
						|
								    ret &= fromLegacy<bool>(   aCfg, "FpEditorCopperTextItalic",    "design_settings.copper_text_italic" );
							 | 
						|
								    ret &= fromLegacy<double>( aCfg, "FpEditorEdgeCutLineWidth",    "design_settings.edge_line_width" );
							 | 
						|
								    ret &= fromLegacy<double>( aCfg, "FpEditorCourtyardLineWidth",  "design_settings.courtyard_line_width" );
							 | 
						|
								    ret &= fromLegacy<double>( aCfg, "FpEditorOthersLineWidth",     "design_settings.others_line_width" );
							 | 
						|
								    ret &= fromLegacy<double>( aCfg, "FpEditorOthersTextSizeH",     "design_settings.others_text_size_h" );
							 | 
						|
								    ret &= fromLegacy<double>( aCfg, "FpEditorOthersTextSizeV",     "design_settings.others_text_size_v" );
							 | 
						|
								    ret &= fromLegacy<double>( aCfg, "FpEditorOthersTextThickness", "design_settings.others_text_thickness" );
							 | 
						|
								    ret &= fromLegacy<bool>(   aCfg, "FpEditorOthersTextItalic",    "design_settings.others_text_italic" );
							 | 
						|
								
							 | 
						|
								    nlohmann::json textItems = nlohmann::json::array( {
							 | 
						|
								                                                          { "REF**", true, F_SilkS },
							 | 
						|
								                                                          { "", true, F_Fab }
							 | 
						|
								                                                      } );
							 | 
						|
								
							 | 
						|
								    Set( "design_settings.default_footprint_text_items", textItems );
							 | 
						|
								
							 | 
						|
								    ret &= fromLegacyString( aCfg, "FpEditorRefDefaultText",         "design_settings.default_footprint_text_items.0.0" );
							 | 
						|
								    ret &= fromLegacy<bool>( aCfg, "FpEditorRefDefaultVisibility",   "design_settings.default_footprint_text_items.0.1" );
							 | 
						|
								    ret &= fromLegacy<int>(  aCfg, "FpEditorRefDefaultLayer",        "design_settings.default_footprint_text_items.0.2" );
							 | 
						|
								    ret &= fromLegacyString( aCfg, "FpEditorValueDefaultText",       "design_settings.default_footprint_text_items.1.0" );
							 | 
						|
								    ret &= fromLegacy<bool>( aCfg, "FpEditorValueDefaultVisibility", "design_settings.default_footprint_text_items.1.1" );
							 | 
						|
								    ret &= fromLegacy<int>( aCfg,  "FpEditorValueDefaultLayer",      "design_settings.default_footprint_text_items.1.2" );
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								    std::string f = "ModEdit";
							 | 
						|
								
							 | 
						|
								    // Migrate color settings that were stored in the pcbnew config file
							 | 
						|
								    // We create a copy of the user scheme for the footprint editor context
							 | 
						|
								
							 | 
						|
								    SETTINGS_MANAGER& manager = Pgm().GetSettingsManager();
							 | 
						|
								    COLOR_SETTINGS* cs = manager.AddNewColorSettings( "user_footprints" );
							 | 
						|
								
							 | 
						|
								    cs->SetName( wxT( "User (Footprints)" ) );
							 | 
						|
								    manager.Save( cs );
							 | 
						|
								
							 | 
						|
								    auto migrateLegacyColor = [&] ( const std::string& aKey, int aLayerId )
							 | 
						|
								                              {
							 | 
						|
								                                  wxString str;
							 | 
						|
								
							 | 
						|
								                                  if( aCfg->Read( aKey, &str ) )
							 | 
						|
								                                      cs->SetColor( aLayerId, COLOR4D( str ) );
							 | 
						|
								                              };
							 | 
						|
								
							 | 
						|
								    for( int i = 0; i < PCB_LAYER_ID_COUNT; ++i )
							 | 
						|
								    {
							 | 
						|
								        wxString layer = LSET::Name( PCB_LAYER_ID( i ) );
							 | 
						|
								        migrateLegacyColor( f + "Color4DPCBLayer_" + layer.ToStdString(), PCB_LAYER_ID( i ) );
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    migrateLegacyColor( f + "Color4DAnchorEx",           LAYER_ANCHOR );
							 | 
						|
								    migrateLegacyColor( f + "Color4DAuxItems",           LAYER_AUX_ITEMS );
							 | 
						|
								    migrateLegacyColor( f + "Color4DGrid",               LAYER_GRID );
							 | 
						|
								    migrateLegacyColor( f + "Color4DNonPlatedEx",        LAYER_NON_PLATEDHOLES );
							 | 
						|
								    migrateLegacyColor( f + "Color4DPadThruHoleEx",      LAYER_PADS_TH );
							 | 
						|
								    migrateLegacyColor( f + "Color4DPCBBackground",      LAYER_PCB_BACKGROUND );
							 | 
						|
								    migrateLegacyColor( f + "Color4DPCBCursor",          LAYER_CURSOR );
							 | 
						|
								    migrateLegacyColor( f + "Color4DRatsEx",             LAYER_RATSNEST );
							 | 
						|
								    migrateLegacyColor( f + "Color4DTxtInvisEx",         LAYER_MOD_TEXT_INVISIBLE );
							 | 
						|
								    migrateLegacyColor( f + "Color4DViaBBlindEx",        LAYER_VIA_BBLIND );
							 | 
						|
								    migrateLegacyColor( f + "Color4DViaMicroEx",         LAYER_VIA_MICROVIA );
							 | 
						|
								    migrateLegacyColor( f + "Color4DViaThruEx",          LAYER_VIA_THROUGH );
							 | 
						|
								    migrateLegacyColor( f + "Color4DWorksheet",          LAYER_DRAWINGSHEET );
							 | 
						|
								
							 | 
						|
								    manager.SaveColorSettings( cs, "board" );
							 | 
						|
								
							 | 
						|
								    ( *m_internals )[m_internals->PointerFromString( "appearance.color_theme" )] = "user_footprints";
							 | 
						|
								
							 | 
						|
								    double x, y;
							 | 
						|
								    f = "ModEditFrame";
							 | 
						|
								
							 | 
						|
								    if( aCfg->Read( f + "PcbUserGrid_X", &x ) && aCfg->Read( f + "PcbUserGrid_Y", &y ) )
							 | 
						|
								    {
							 | 
						|
								        EDA_UNITS u = static_cast<EDA_UNITS>( aCfg->ReadLong( f + "PcbUserGrid_Unit",
							 | 
						|
								                                                              static_cast<long>( EDA_UNITS::INCHES ) ) );
							 | 
						|
								
							 | 
						|
								        // Convert to internal units
							 | 
						|
								        x = EDA_UNIT_UTILS::UI::FromUserUnit( pcbIUScale, u, x );
							 | 
						|
								        y = EDA_UNIT_UTILS::UI::FromUserUnit( pcbIUScale, u, y );
							 | 
						|
								
							 | 
						|
								        Set( "window.grid.user_grid_x", EDA_UNIT_UTILS::UI::StringFromValue( pcbIUScale, u, x ) );
							 | 
						|
								        Set( "window.grid.user_grid_y", EDA_UNIT_UTILS::UI::StringFromValue( pcbIUScale, u, y ) );
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    return ret;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								bool FOOTPRINT_EDITOR_SETTINGS::migrateSchema0to1()
							 | 
						|
								{
							 | 
						|
								    /**
							 | 
						|
								     * Schema version 0 to 1:
							 | 
						|
								     *
							 | 
						|
								     * - Check to see if a footprints version of the currently selected theme exists.
							 | 
						|
								     * - If so, select it
							 | 
						|
								     */
							 | 
						|
								
							 | 
						|
								    if( !m_manager )
							 | 
						|
								    {
							 | 
						|
								        wxLogTrace( traceSettings,
							 | 
						|
								                    wxT( "Error: FOOTPRINT_EDITOR_SETTINGS migration cannot run unmanaged!" ) );
							 | 
						|
								        return false;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    std::string theme_ptr( "appearance.color_theme" );
							 | 
						|
								
							 | 
						|
								    if( !Contains( theme_ptr ) )
							 | 
						|
								        return true;
							 | 
						|
								
							 | 
						|
								    wxString selected = At( theme_ptr ).get<wxString>();
							 | 
						|
								    wxString search   = selected + wxT( "_footprints" );
							 | 
						|
								
							 | 
						|
								    for( COLOR_SETTINGS* settings : Pgm().GetSettingsManager().GetColorSettingsList() )
							 | 
						|
								    {
							 | 
						|
								        if( settings->GetFilename() == search )
							 | 
						|
								        {
							 | 
						|
								            wxLogTrace( traceSettings, wxT( "Updating footprint editor theme from %s to %s" ),
							 | 
						|
								                        selected, search );
							 | 
						|
								            Set( theme_ptr, search );
							 | 
						|
								            return true;
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    return true;
							 | 
						|
								}
							 |