Browse Source

Keep track of user layer mapping for footprints

Footprints in orgs have standard naming.  We need to allow designers to
keep their standard namings outside of boards where they are fixed.
This belongs in the preferences as a set-once for local standards
pcb_db
Seth Hillbrand 11 months ago
parent
commit
81fbaacae2
  1. 3
      include/board_design_settings.h
  2. 2
      pcbnew/board_design_settings.cpp
  3. 264
      pcbnew/dialogs/panel_fp_editor_field_defaults.cpp
  4. 7
      pcbnew/dialogs/panel_fp_editor_field_defaults.h
  5. 80
      pcbnew/dialogs/panel_fp_editor_field_defaults_base.cpp
  6. 383
      pcbnew/dialogs/panel_fp_editor_field_defaults_base.fbp
  7. 9
      pcbnew/dialogs/panel_fp_editor_field_defaults_base.h
  8. 10
      pcbnew/footprint_edit_frame.cpp
  9. 3
      pcbnew/footprint_editor_settings.cpp

3
include/board_design_settings.h

@ -739,6 +739,9 @@ public:
// Variables used in footprint editing (default value in item/footprint creation)
std::vector<TEXT_ITEM_INFO> m_DefaultFPTextItems;
// Map between user layer default names and custom names
std::map<std::string, wxString> m_UserLayerNames;
// Arrays of default values for the various layer classes.
int m_LineThickness[ LAYER_CLASS_COUNT ];
VECTOR2I m_TextSize[LAYER_CLASS_COUNT];

2
pcbnew/board_design_settings.cpp

@ -977,6 +977,7 @@ void BOARD_DESIGN_SETTINGS::initFromOther( const BOARD_DESIGN_SETTINGS& aOther )
m_TentViasFront = aOther.m_TentViasFront;
m_TentViasBack = aOther.m_TentViasBack;
m_DefaultFPTextItems = aOther.m_DefaultFPTextItems;
m_UserLayerNames = aOther.m_UserLayerNames;
std::copy( std::begin( aOther.m_LineThickness ), std::end( aOther.m_LineThickness ),
std::begin( m_LineThickness ) );
@ -1068,6 +1069,7 @@ bool BOARD_DESIGN_SETTINGS::operator==( const BOARD_DESIGN_SETTINGS& aOther ) co
if( m_TentViasFront != aOther.m_TentViasFront ) return false;
if( m_TentViasBack != aOther.m_TentViasBack ) return false;
if( m_DefaultFPTextItems != aOther.m_DefaultFPTextItems ) return false;
if( m_UserLayerNames != aOther.m_UserLayerNames ) return false;
if( !std::equal( std::begin( m_LineThickness ), std::end( m_LineThickness ),
std::begin( aOther.m_LineThickness ) ) )

264
pcbnew/dialogs/panel_fp_editor_field_defaults.cpp

@ -26,6 +26,7 @@
#include <pgm_base.h>
#include <settings/settings_manager.h>
#include <footprint_editor_settings.h>
#include <widgets/paged_dialog.h>
#include <template_fieldnames.h>
#include <widgets/std_bitmap_button.h>
#include <grid_tricks.h>
@ -35,6 +36,109 @@
#include <confirm.h>
class LAYER_NAMES_GRID_TABLE : public wxGridTableBase
{
std::vector<TEXT_ITEM_INFO> m_items;
public:
LAYER_NAMES_GRID_TABLE() {}
int GetNumberRows() override { return m_items.size(); }
int GetNumberCols() override { return 2; }
wxString GetColLabelValue( int aCol ) override
{
switch( aCol )
{
case 0: return _( "Layer" );
case 1: return _( "Name" );
default: return wxEmptyString;
}
}
bool CanGetValueAs( int aRow, int aCol, const wxString& aTypeName ) override
{
switch( aCol )
{
case 0: return aTypeName == wxGRID_VALUE_NUMBER;
case 1: return aTypeName == wxGRID_VALUE_STRING;
default: wxFAIL; return false;
}
}
bool CanSetValueAs( int aRow, int aCol, const wxString& aTypeName ) override
{
return CanGetValueAs( aRow, aCol, aTypeName );
}
wxString GetValue( int row, int col ) override { return m_items[row].m_Text; }
void SetValue( int row, int col, const wxString& value ) override
{
if( col == 1 )
m_items[row].m_Text = value;
}
long GetValueAsLong( int row, int col ) override { return m_items[row].m_Layer; }
void SetValueAsLong( int row, int col, long value ) override
{
if( col == 0 )
m_items[row].m_Layer = static_cast<int>( value );
}
bool AppendRows( size_t aNumRows = 1 ) override
{
std::set<int> layers;
int layer = User_1;
for( const TEXT_ITEM_INFO& item : m_items )
layers.insert( item.m_Layer );
for( size_t i = 0; i < aNumRows; ++i )
{
while( layers.contains( layer ) )
layer = layer + 2;
if( IsUserLayer( static_cast<PCB_LAYER_ID>( layer ) ) )
{
layers.insert( layer );
m_items.emplace_back( wxT( "" ), true, layer );
}
else
{
return false;
}
}
if( GetView() )
{
wxGridTableMessage msg( this, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, aNumRows );
GetView()->ProcessTableMessage( msg );
}
return true;
}
bool DeleteRows( size_t aPos, size_t aNumRows ) override
{
// aPos may be a large positive, e.g. size_t(-1), and the sum of
// aPos+aNumRows may wrap here, so both ends of the range are tested.
if( aPos < m_items.size() && aPos + aNumRows <= m_items.size() )
{
m_items.erase( m_items.begin() + aPos, m_items.begin() + aPos + aNumRows );
if( GetView() )
{
wxGridTableMessage msg( this, wxGRIDTABLE_NOTIFY_ROWS_DELETED, aPos, aNumRows );
GetView()->ProcessTableMessage( msg );
}
return true;
}
return false;
}
};
class TEXT_ITEMS_GRID_TABLE : public wxGridTableBase
{
bool m_forFieldProps;
@ -184,6 +288,19 @@ PANEL_FP_EDITOR_FIELD_DEFAULTS::PANEL_FP_EDITOR_FIELD_DEFAULTS( wxWindow*
attr->SetRenderer( new GRID_CELL_LAYER_RENDERER( nullptr ) );
attr->SetEditor( new GRID_CELL_LAYER_SELECTOR( nullptr, {} ) );
m_textItemsGrid->SetColAttr( 2, attr );
m_layerNameitemsGrid->SetDefaultRowSize( m_layerNameitemsGrid->GetDefaultRowSize() + 4 );
m_layerNameitemsGrid->SetTable( new LAYER_NAMES_GRID_TABLE(), true );
m_layerNameitemsGrid->PushEventHandler( new GRID_TRICKS( m_layerNameitemsGrid ) );
m_layerNameitemsGrid->SetSelectionMode( wxGrid::wxGridSelectRows );
attr = new wxGridCellAttr;
attr->SetRenderer( new GRID_CELL_LAYER_RENDERER( nullptr ) );
attr->SetEditor( new GRID_CELL_LAYER_SELECTOR( nullptr, LSET::AllTechMask() | LSET::AllCuMask() | Edge_Cuts | Margin ) );
m_layerNameitemsGrid->SetColAttr( 0, attr );
}
@ -192,6 +309,7 @@ PANEL_FP_EDITOR_FIELD_DEFAULTS::~PANEL_FP_EDITOR_FIELD_DEFAULTS()
// destroy GRID_TRICKS before grids.
m_fieldPropsGrid->PopEventHandler( true );
m_textItemsGrid->PopEventHandler( true );
m_layerNameitemsGrid->PopEventHandler( true );
}
@ -223,6 +341,22 @@ void PANEL_FP_EDITOR_FIELD_DEFAULTS::loadFPSettings( const FOOTPRINT_EDITOR_SETT
m_textItemsGrid->GetTable()->SetValueAsLong( i - 2, 2, item.m_Layer );
}
for( auto& item : aCfg->m_DesignSettings.m_UserLayerNames )
{
wxString orig_name = item.first;
int layer = LSET::NameToLayer( orig_name );
if( !IsUserLayer( static_cast<PCB_LAYER_ID>( layer ) ) )
continue;
if( !m_layerNameitemsGrid->GetTable()->AppendRows( 1 ) )
break;
int row = m_layerNameitemsGrid->GetNumberRows() - 1;
m_layerNameitemsGrid->GetTable()->SetValueAsLong( row, 0, layer );
m_layerNameitemsGrid->GetTable()->SetValue( row, 1, item.second );
}
Layout();
}
@ -248,6 +382,8 @@ bool PANEL_FP_EDITOR_FIELD_DEFAULTS::Show( bool aShow )
// first then the icons will be blank unless they're set here.
m_bpAdd->SetBitmap( KiBitmapBundle( BITMAPS::small_plus ) );
m_bpDelete->SetBitmap( KiBitmapBundle( BITMAPS::small_trash ) );
m_bpAddLayer->SetBitmap( KiBitmapBundle( BITMAPS::small_plus ) );
m_bpDeleteLayer->SetBitmap( KiBitmapBundle( BITMAPS::small_trash ) );
}
return retVal;
@ -286,10 +422,85 @@ bool PANEL_FP_EDITOR_FIELD_DEFAULTS::TransferDataFromWindow()
cfg.m_DefaultFPTextItems.emplace_back( text, visible, layer );
}
cfg.m_UserLayerNames.clear();
table = m_layerNameitemsGrid->GetTable();
for( int i = 0; i < m_layerNameitemsGrid->GetNumberRows(); ++i )
{
PCB_LAYER_ID layer = static_cast<PCB_LAYER_ID>( table->GetValueAsLong( i, 0 ) );
wxString orig_name = LSET::Name( static_cast<PCB_LAYER_ID>( layer ) );
wxString name = table->GetValue( i, 1 );
if( layer >= 0 && IsUserLayer( layer ) && !name.IsEmpty() )
cfg.m_UserLayerNames.emplace( orig_name.ToStdString(), name );
}
return true;
}
bool PANEL_FP_EDITOR_FIELD_DEFAULTS::isLayerAvailable( int aLayer ) const
{
for( int i = 0; i < m_layerNameitemsGrid->GetNumberRows(); ++i )
{
if( m_layerNameitemsGrid->GetTable()->GetValueAsLong( i, 0 ) == aLayer )
return false;
}
return true;
}
int PANEL_FP_EDITOR_FIELD_DEFAULTS::getNextAvailableLayer() const
{
std::set<int> usedLayers;
for( int i = 0; i < m_layerNameitemsGrid->GetNumberRows(); ++i )
usedLayers.insert( m_layerNameitemsGrid->GetTable()->GetValueAsLong( i, 0 ) );
for( int ii = User_1; ii < User_45; ++ii )
{
if( !usedLayers.contains( ii ) )
return ii;
}
return -1;
}
void PANEL_FP_EDITOR_FIELD_DEFAULTS::onLayerChange( wxGridEvent& event )
{
wxGridTableBase* table = m_layerNameitemsGrid->GetTable();
if( event.GetCol() == 0 )
{
int layer = static_cast<int>( table->GetValueAsLong( event.GetRow(), 0 ) );
for( int i = 0; i < m_layerNameitemsGrid->GetNumberRows(); ++i )
{
if( i != event.GetRow()
&& table->GetValueAsLong( i, 0 ) == layer )
{
table->SetValueAsLong( event.GetRow(), 0, getNextAvailableLayer() );
return;
}
}
}
for( int ii = 0; ii < m_layerNameitemsGrid->GetNumberRows(); ++ii )
{
wxString layerName = table->GetValue( ii, 1 );
if( ii != event.GetRow() && layerName == table->GetValue( event.GetRow(), 1 ) )
{
wxString msg = wxString::Format( _( "Layer name %s already in use." ), layerName );
PAGED_DIALOG::GetDialog( this )->SetError( msg, this, m_layerNameitemsGrid, ii, 1 );
return;
}
}
}
void PANEL_FP_EDITOR_FIELD_DEFAULTS::OnAddTextItem( wxCommandEvent& event )
{
if( !m_textItemsGrid->CommitPendingChanges() )
@ -310,6 +521,24 @@ void PANEL_FP_EDITOR_FIELD_DEFAULTS::OnAddTextItem( wxCommandEvent& event )
}
void PANEL_FP_EDITOR_FIELD_DEFAULTS::OnAddLayerItem( wxCommandEvent& event )
{
if( !m_layerNameitemsGrid->CommitPendingChanges() )
return;
wxGridTableBase* table = m_layerNameitemsGrid->GetTable();
int newRow = m_layerNameitemsGrid->GetNumberRows();
table->AppendRows( 1 );
m_layerNameitemsGrid->MakeCellVisible( newRow, 0 );
m_layerNameitemsGrid->SetGridCursor( newRow, 0 );
m_layerNameitemsGrid->EnableCellEditControl( true );
m_layerNameitemsGrid->ShowCellEditControl();
}
void PANEL_FP_EDITOR_FIELD_DEFAULTS::OnDeleteTextItem( wxCommandEvent& event )
{
wxArrayInt selectedRows = m_textItemsGrid->GetSelectedRows();
@ -345,6 +574,41 @@ void PANEL_FP_EDITOR_FIELD_DEFAULTS::OnDeleteTextItem( wxCommandEvent& event )
}
void PANEL_FP_EDITOR_FIELD_DEFAULTS::OnDeleteLayerItem( wxCommandEvent& event )
{
wxArrayInt selectedRows = m_layerNameitemsGrid->GetSelectedRows();
if( selectedRows.empty() && m_layerNameitemsGrid->GetGridCursorRow() >= 0 )
selectedRows.push_back( m_layerNameitemsGrid->GetGridCursorRow() );
if( selectedRows.empty() )
return;
if( !m_layerNameitemsGrid->CommitPendingChanges() )
return;
// Reverse sort so deleting a row doesn't change the indexes of the other rows.
selectedRows.Sort(
[]( int* first, int* second )
{
return *second - *first;
} );
for( int row : selectedRows )
{
m_layerNameitemsGrid->GetTable()->DeleteRows( row, 1 );
if( m_layerNameitemsGrid->GetNumberRows() > 0 )
{
m_layerNameitemsGrid->MakeCellVisible( std::max( 0, row - 1 ),
m_layerNameitemsGrid->GetGridCursorCol() );
m_layerNameitemsGrid->SetGridCursor( std::max( 0, row - 1 ),
m_layerNameitemsGrid->GetGridCursorCol() );
}
}
}
void PANEL_FP_EDITOR_FIELD_DEFAULTS::ResetPanel()
{
FOOTPRINT_EDITOR_SETTINGS cfg;

7
pcbnew/dialogs/panel_fp_editor_field_defaults.h

@ -43,11 +43,18 @@ public:
private:
virtual void OnAddTextItem( wxCommandEvent& event ) override;
virtual void OnDeleteTextItem( wxCommandEvent& event ) override;
virtual void OnAddLayerItem( wxCommandEvent& event ) override;
virtual void OnDeleteLayerItem( wxCommandEvent& event ) override;
virtual void onLayerChange( wxGridEvent& event ) override;
bool Show( bool aShow ) override;
void loadFPSettings( const FOOTPRINT_EDITOR_SETTINGS* aCfg );
bool isLayerAvailable( int aLayerId ) const;
int getNextAvailableLayer() const;
private:
UNITS_PROVIDER* m_unitProvider;
BOARD_DESIGN_SETTINGS& m_designSettings;

80
pcbnew/dialogs/panel_fp_editor_field_defaults_base.cpp

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6)
// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6a-dirty)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
@ -140,6 +140,76 @@ PANEL_FP_EDITOR_FIELD_DEFAULTS_BASE::PANEL_FP_EDITOR_FIELD_DEFAULTS_BASE( wxWind
bSizerMargins->Add( defaultTextItemsSizer, 1, wxEXPAND, 20 );
bSizerMargins->Add( 5, 25, 0, wxEXPAND, 5 );
defaultValuesLabel = new wxStaticText( this, wxID_ANY, _("Default Values"), wxDefaultPosition, wxDefaultSize, 0 );
defaultValuesLabel->Wrap( -1 );
bSizerMargins->Add( defaultValuesLabel, 0, wxEXPAND|wxLEFT|wxTOP, 8 );
bSizerMargins->Add( 0, 4, 0, wxEXPAND, 5 );
wxBoxSizer* defaultFieldsSizer;
defaultFieldsSizer = new wxBoxSizer( wxVERTICAL );
m_layerNameitemsGrid = new WX_GRID( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxTAB_TRAVERSAL );
// Grid
m_layerNameitemsGrid->CreateGrid( 0, 2 );
m_layerNameitemsGrid->EnableEditing( true );
m_layerNameitemsGrid->EnableGridLines( true );
m_layerNameitemsGrid->EnableDragGridSize( false );
m_layerNameitemsGrid->SetMargins( 0, 0 );
// Columns
m_layerNameitemsGrid->SetColSize( 0, 200 );
m_layerNameitemsGrid->SetColSize( 1, 380 );
m_layerNameitemsGrid->EnableDragColMove( false );
m_layerNameitemsGrid->EnableDragColSize( true );
m_layerNameitemsGrid->SetColLabelValue( 0, _("Layer") );
m_layerNameitemsGrid->SetColLabelValue( 1, _("Name") );
m_layerNameitemsGrid->SetColLabelSize( wxGRID_AUTOSIZE );
m_layerNameitemsGrid->SetColLabelAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
// Rows
m_layerNameitemsGrid->EnableDragRowSize( false );
m_layerNameitemsGrid->SetRowLabelSize( 0 );
m_layerNameitemsGrid->SetRowLabelAlignment( wxALIGN_LEFT, wxALIGN_CENTER );
// Label Appearance
// Cell Defaults
m_layerNameitemsGrid->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_CENTER );
m_layerNameitemsGrid->SetMinSize( wxSize( -1,140 ) );
defaultFieldsSizer->Add( m_layerNameitemsGrid, 0, wxEXPAND, 5 );
wxBoxSizer* bButtonSize1;
bButtonSize1 = new wxBoxSizer( wxHORIZONTAL );
m_bpAddLayer = new STD_BITMAP_BUTTON( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 );
m_bpAddLayer->SetMinSize( wxSize( 30,29 ) );
bButtonSize1->Add( m_bpAddLayer, 0, wxBOTTOM|wxLEFT|wxTOP, 5 );
bButtonSize1->Add( 20, 0, 0, wxEXPAND, 5 );
m_bpDeleteLayer = new STD_BITMAP_BUTTON( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 );
m_bpDeleteLayer->SetMinSize( wxSize( 30,29 ) );
bButtonSize1->Add( m_bpDeleteLayer, 0, wxBOTTOM|wxLEFT|wxRIGHT|wxTOP, 5 );
bButtonSize1->Add( 0, 0, 1, wxEXPAND, 5 );
defaultFieldsSizer->Add( bButtonSize1, 1, wxEXPAND, 5 );
bSizerMargins->Add( defaultFieldsSizer, 1, wxEXPAND, 20 );
bSizerMain->Add( bSizerMargins, 1, wxEXPAND, 5 );
@ -152,6 +222,10 @@ PANEL_FP_EDITOR_FIELD_DEFAULTS_BASE::PANEL_FP_EDITOR_FIELD_DEFAULTS_BASE( wxWind
m_textItemsGrid->Connect( wxEVT_SIZE, wxSizeEventHandler( PANEL_FP_EDITOR_FIELD_DEFAULTS_BASE::OnGridSize ), NULL, this );
m_bpAdd->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_FP_EDITOR_FIELD_DEFAULTS_BASE::OnAddTextItem ), NULL, this );
m_bpDelete->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_FP_EDITOR_FIELD_DEFAULTS_BASE::OnDeleteTextItem ), NULL, this );
m_layerNameitemsGrid->Connect( wxEVT_GRID_CELL_CHANGED, wxGridEventHandler( PANEL_FP_EDITOR_FIELD_DEFAULTS_BASE::onLayerChange ), NULL, this );
m_layerNameitemsGrid->Connect( wxEVT_SIZE, wxSizeEventHandler( PANEL_FP_EDITOR_FIELD_DEFAULTS_BASE::OnGridSize ), NULL, this );
m_bpAddLayer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_FP_EDITOR_FIELD_DEFAULTS_BASE::OnAddLayerItem ), NULL, this );
m_bpDeleteLayer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_FP_EDITOR_FIELD_DEFAULTS_BASE::OnDeleteLayerItem ), NULL, this );
}
PANEL_FP_EDITOR_FIELD_DEFAULTS_BASE::~PANEL_FP_EDITOR_FIELD_DEFAULTS_BASE()
@ -161,5 +235,9 @@ PANEL_FP_EDITOR_FIELD_DEFAULTS_BASE::~PANEL_FP_EDITOR_FIELD_DEFAULTS_BASE()
m_textItemsGrid->Disconnect( wxEVT_SIZE, wxSizeEventHandler( PANEL_FP_EDITOR_FIELD_DEFAULTS_BASE::OnGridSize ), NULL, this );
m_bpAdd->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_FP_EDITOR_FIELD_DEFAULTS_BASE::OnAddTextItem ), NULL, this );
m_bpDelete->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_FP_EDITOR_FIELD_DEFAULTS_BASE::OnDeleteTextItem ), NULL, this );
m_layerNameitemsGrid->Disconnect( wxEVT_GRID_CELL_CHANGED, wxGridEventHandler( PANEL_FP_EDITOR_FIELD_DEFAULTS_BASE::onLayerChange ), NULL, this );
m_layerNameitemsGrid->Disconnect( wxEVT_SIZE, wxSizeEventHandler( PANEL_FP_EDITOR_FIELD_DEFAULTS_BASE::OnGridSize ), NULL, this );
m_bpAddLayer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_FP_EDITOR_FIELD_DEFAULTS_BASE::OnAddLayerItem ), NULL, this );
m_bpDeleteLayer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_FP_EDITOR_FIELD_DEFAULTS_BASE::OnDeleteLayerItem ), NULL, this );
}

383
pcbnew/dialogs/panel_fp_editor_field_defaults_base.fbp

@ -145,16 +145,16 @@
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxBoxSizer" expanded="true">
<object class="wxBoxSizer" expanded="false">
<property name="minimum_size"></property>
<property name="name">defaultFieldPropertiesSizer</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="true">
<object class="sizeritem" expanded="false">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxGrid" expanded="true">
<object class="wxGrid" expanded="false">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
@ -333,11 +333,11 @@
<property name="name">defaultTextItemsSizer</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="true">
<object class="sizeritem" expanded="false">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxGrid" expanded="true">
<object class="wxGrid" expanded="false">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
@ -432,11 +432,11 @@
<property name="name">bButtonSize</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="true">
<object class="sizeritem" expanded="false">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxLEFT|wxTOP</property>
<property name="proportion">0</property>
<object class="wxBitmapButton" expanded="true">
<object class="wxBitmapButton" expanded="false">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
@ -507,6 +507,371 @@
<event name="OnButtonClick">OnAddTextItem</event>
</object>
</object>
<object class="sizeritem" expanded="false">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">0</property>
<object class="spacer" expanded="false">
<property name="height">0</property>
<property name="permission">protected</property>
<property name="width">20</property>
</object>
</object>
<object class="sizeritem" expanded="false">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxLEFT|wxRIGHT|wxTOP</property>
<property name="proportion">0</property>
<object class="wxBitmapButton" expanded="false">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="auth_needed">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="bitmap"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="current"></property>
<property name="default">0</property>
<property name="default_pane">0</property>
<property name="disabled"></property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="drag_accept_files">0</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="focus"></property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Delete Field</property>
<property name="margins"></property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size">30,29</property>
<property name="moveable">1</property>
<property name="name">m_bpDelete</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="position"></property>
<property name="pressed"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">STD_BITMAP_BUTTON; widgets/std_bitmap_button.h; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnButtonClick">OnDeleteTextItem</event>
</object>
</object>
<object class="sizeritem" expanded="false">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="spacer" expanded="false">
<property name="height">0</property>
<property name="permission">protected</property>
<property name="width">0</property>
</object>
</object>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">0</property>
<object class="spacer" expanded="true">
<property name="height">25</property>
<property name="permission">protected</property>
<property name="width">5</property>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">8</property>
<property name="flag">wxEXPAND|wxLEFT|wxTOP</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="true">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="drag_accept_files">0</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Default Values</property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">defaultValuesLabel</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">0</property>
<object class="spacer" expanded="true">
<property name="height">4</property>
<property name="permission">protected</property>
<property name="width">0</property>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">20</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="true">
<property name="minimum_size"></property>
<property name="name">defaultFieldsSizer</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxGrid" expanded="true">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="autosize_cols">0</property>
<property name="autosize_rows">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="cell_bg"></property>
<property name="cell_font"></property>
<property name="cell_horiz_alignment">wxALIGN_LEFT</property>
<property name="cell_text"></property>
<property name="cell_vert_alignment">wxALIGN_CENTER</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="col_label_horiz_alignment">wxALIGN_CENTER</property>
<property name="col_label_size">wxGRID_AUTOSIZE</property>
<property name="col_label_values">&quot;Layer&quot; &quot;Name&quot;</property>
<property name="col_label_vert_alignment">wxALIGN_CENTER</property>
<property name="cols">2</property>
<property name="column_sizes">200,380</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="drag_accept_files">0</property>
<property name="drag_col_move">0</property>
<property name="drag_col_size">1</property>
<property name="drag_grid_size">0</property>
<property name="drag_row_size">0</property>
<property name="editing">1</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="grid_line_color"></property>
<property name="grid_lines">1</property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label_bg"></property>
<property name="label_font"></property>
<property name="label_text"></property>
<property name="margin_height">0</property>
<property name="margin_width">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size">-1,140</property>
<property name="moveable">1</property>
<property name="name">m_layerNameitemsGrid</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="row_label_horiz_alignment">wxALIGN_LEFT</property>
<property name="row_label_size">0</property>
<property name="row_label_values"></property>
<property name="row_label_vert_alignment">wxALIGN_CENTER</property>
<property name="row_sizes"></property>
<property name="rows">0</property>
<property name="show">1</property>
<property name="size">-1,-1</property>
<property name="subclass">WX_GRID; widgets/wx_grid.h; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style">wxTAB_TRAVERSAL</property>
<event name="OnGridCellChange">onLayerChange</event>
<event name="OnSize">OnGridSize</event>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="true">
<property name="minimum_size"></property>
<property name="name">bButtonSize1</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxLEFT|wxTOP</property>
<property name="proportion">0</property>
<object class="wxBitmapButton" expanded="true">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="auth_needed">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="bitmap"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="current"></property>
<property name="default">0</property>
<property name="default_pane">0</property>
<property name="disabled"></property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="drag_accept_files">0</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="focus"></property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Add Field</property>
<property name="margins"></property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size">30,29</property>
<property name="moveable">1</property>
<property name="name">m_bpAddLayer</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="position"></property>
<property name="pressed"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">STD_BITMAP_BUTTON; widgets/std_bitmap_button.h; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnButtonClick">OnAddLayerItem</event>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
@ -566,7 +931,7 @@
<property name="minimize_button">0</property>
<property name="minimum_size">30,29</property>
<property name="moveable">1</property>
<property name="name">m_bpDelete</property>
<property name="name">m_bpDeleteLayer</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
@ -589,7 +954,7 @@
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnButtonClick">OnDeleteTextItem</event>
<event name="OnButtonClick">OnDeleteLayerItem</event>
</object>
</object>
<object class="sizeritem" expanded="true">

9
pcbnew/dialogs/panel_fp_editor_field_defaults_base.h

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6)
// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6a-dirty)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
@ -45,11 +45,18 @@ class PANEL_FP_EDITOR_FIELD_DEFAULTS_BASE : public RESETTABLE_PANEL
WX_GRID* m_textItemsGrid;
STD_BITMAP_BUTTON* m_bpAdd;
STD_BITMAP_BUTTON* m_bpDelete;
wxStaticText* defaultValuesLabel;
WX_GRID* m_layerNameitemsGrid;
STD_BITMAP_BUTTON* m_bpAddLayer;
STD_BITMAP_BUTTON* m_bpDeleteLayer;
// Virtual event handlers, override them in your derived class
virtual void OnGridSize( wxSizeEvent& event ) { event.Skip(); }
virtual void OnAddTextItem( wxCommandEvent& event ) { event.Skip(); }
virtual void OnDeleteTextItem( wxCommandEvent& event ) { event.Skip(); }
virtual void onLayerChange( wxGridEvent& event ) { event.Skip(); }
virtual void OnAddLayerItem( wxCommandEvent& event ) { event.Skip(); }
virtual void OnDeleteLayerItem( wxCommandEvent& event ) { event.Skip(); }
public:

10
pcbnew/footprint_edit_frame.cpp

@ -679,6 +679,16 @@ void FOOTPRINT_EDIT_FRAME::LoadSettings( APP_SETTINGS_BASE* aCfg )
m_selectionFilterPanel->SetCheckboxesFromFilter( cfg->m_SelectionFilter );
GetLibTree()->SetSortMode( (LIB_TREE_MODEL_ADAPTER::SORT_MODE) cfg->m_LibrarySortMode );
for( auto& [source_name, dest_name] : cfg->m_DesignSettings.m_UserLayerNames )
{
wxString wx_source_name = source_name;
PCB_LAYER_ID layer = static_cast<PCB_LAYER_ID>( LSET::NameToLayer( wx_source_name ) );
if( IsUserLayer( layer ) )
GetBoard()->SetLayerName( layer, dest_name );
}
}
}

3
pcbnew/footprint_editor_settings.cpp

@ -188,6 +188,9 @@ FOOTPRINT_EDITOR_SETTINGS::FOOTPRINT_EDITOR_SETTINGS() :
{ "${REFERENCE}", true, F_Fab }
} ) ) );
m_params.emplace_back( new PARAM_MAP<wxString>( "design_settings.default_footprint_layer_names",
&m_DesignSettings.m_UserLayerNames, {} ) );
int minTextSize = pcbIUScale.mmToIU( TEXT_MIN_SIZE_MM );
int maxTextSize = pcbIUScale.mmToIU( TEXT_MAX_SIZE_MM );
int minStroke = 1;

Loading…
Cancel
Save