PCB Fields: use validators in dialogs, restrict editing of footprint

This commit is contained in:
Mike Williams 2023-06-13 12:56:24 -04:00
parent 7d84fa2a9d
commit b81fcaeaf7
6 changed files with 89 additions and 5 deletions

View File

@ -77,7 +77,7 @@ DIALOG_FOOTPRINT_PROPERTIES::DIALOG_FOOTPRINT_PROPERTIES( PCB_EDIT_FRAME* aParen
m_posX.SetCoordType( ORIGIN_TRANSFORMS::ABS_X_COORD ); m_posX.SetCoordType( ORIGIN_TRANSFORMS::ABS_X_COORD );
m_posY.SetCoordType( ORIGIN_TRANSFORMS::ABS_Y_COORD ); m_posY.SetCoordType( ORIGIN_TRANSFORMS::ABS_Y_COORD );
m_fields = new FP_TEXT_GRID_TABLE( m_frame ); m_fields = new FP_TEXT_GRID_TABLE( m_frame, this );
m_delayedErrorMessage = wxEmptyString; m_delayedErrorMessage = wxEmptyString;
m_delayedFocusGrid = nullptr; m_delayedFocusGrid = nullptr;

View File

@ -142,7 +142,7 @@ DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR(
m_3dPanel = new PANEL_FP_PROPERTIES_3D_MODEL( m_frame, m_footprint, this, m_NoteBook ); m_3dPanel = new PANEL_FP_PROPERTIES_3D_MODEL( m_frame, m_footprint, this, m_NoteBook );
m_NoteBook->AddPage( m_3dPanel, _("3D Models"), false ); m_NoteBook->AddPage( m_3dPanel, _("3D Models"), false );
m_fields = new FP_TEXT_GRID_TABLE( m_frame ); m_fields = new FP_TEXT_GRID_TABLE( m_frame, this );
m_privateLayers = new PRIVATE_LAYERS_GRID_TABLE( m_frame ); m_privateLayers = new PRIVATE_LAYERS_GRID_TABLE( m_frame );
m_delayedErrorMessage = wxEmptyString; m_delayedErrorMessage = wxEmptyString;

View File

@ -98,6 +98,10 @@ DIALOG_TEXT_PROPERTIES::DIALOG_TEXT_PROPERTIES( PCB_BASE_EDIT_FRAME* aParent, PC
} }
else else
{ {
// Don't let users modify the library link
if( field->IsFootprint() )
m_SingleLineText->SetEditable( false );
title = _( "Footprint Field Properties" ); title = _( "Footprint Field Properties" );
m_TextLabel->SetLabel( _( "Text:" ) ); m_TextLabel->SetLabel( _( "Text:" ) );
} }

View File

@ -22,6 +22,7 @@
*/ */
#include <kiway_player.h> #include <kiway_player.h>
#include <project.h>
#include <fp_text_grid_table.h> #include <fp_text_grid_table.h>
#include <widgets/grid_icon_text_helpers.h> #include <widgets/grid_icon_text_helpers.h>
#include <widgets/grid_combobox.h> #include <widgets/grid_combobox.h>
@ -29,6 +30,7 @@
#include <pcb_base_frame.h> #include <pcb_base_frame.h>
#include <footprint.h> #include <footprint.h>
#include "grid_layer_box_helpers.h" #include "grid_layer_box_helpers.h"
#include "widgets/grid_text_button_helpers.h"
enum enum
{ {
@ -40,8 +42,14 @@ enum
wxArrayString g_menuOrientations; wxArrayString g_menuOrientations;
FP_TEXT_GRID_TABLE::FP_TEXT_GRID_TABLE( PCB_BASE_FRAME* aFrame ) : FP_TEXT_GRID_TABLE::FP_TEXT_GRID_TABLE( PCB_BASE_FRAME* aFrame, DIALOG_SHIM* aDialog ) :
m_frame( aFrame ) m_frame( aFrame ),
m_dialog( aDialog ),
m_fieldNameValidator( FIELD_NAME ),
m_referenceValidator( REFERENCE_FIELD ),
m_valueValidator( VALUE_FIELD ),
m_urlValidator( FIELD_VALUE ),
m_nonUrlValidator( FIELD_VALUE )
{ {
// Build the column attributes. // Build the column attributes.
@ -68,6 +76,27 @@ FP_TEXT_GRID_TABLE::FP_TEXT_GRID_TABLE( PCB_BASE_FRAME* aFrame ) :
m_layerColAttr->SetRenderer( new GRID_CELL_LAYER_RENDERER( m_frame ) ); m_layerColAttr->SetRenderer( new GRID_CELL_LAYER_RENDERER( m_frame ) );
m_layerColAttr->SetEditor( new GRID_CELL_LAYER_SELECTOR( m_frame, {} ) ); m_layerColAttr->SetEditor( new GRID_CELL_LAYER_SELECTOR( m_frame, {} ) );
m_referenceAttr = new wxGridCellAttr;
GRID_CELL_TEXT_EDITOR* referenceEditor = new GRID_CELL_TEXT_EDITOR();
referenceEditor->SetValidator( m_referenceValidator );
m_referenceAttr->SetEditor( referenceEditor );
m_valueAttr = new wxGridCellAttr;
GRID_CELL_TEXT_EDITOR* valueEditor = new GRID_CELL_TEXT_EDITOR();
valueEditor->SetValidator( m_valueValidator );
m_valueAttr->SetEditor( valueEditor );
m_footprintAttr = new wxGridCellAttr;
m_footprintAttr->SetReadOnly( true );
GRID_CELL_FPID_EDITOR* fpIdEditor = new GRID_CELL_FPID_EDITOR( m_dialog, "" );
fpIdEditor->SetValidator( m_nonUrlValidator );
m_footprintAttr->SetEditor( fpIdEditor );
m_urlAttr = new wxGridCellAttr;
GRID_CELL_URL_EDITOR* urlEditor = new GRID_CELL_URL_EDITOR( m_dialog );
urlEditor->SetValidator( m_urlValidator );
m_urlAttr->SetEditor( urlEditor );
m_eval = std::make_unique<NUMERIC_EVALUATOR>( m_frame->GetUserUnits() ); m_eval = std::make_unique<NUMERIC_EVALUATOR>( m_frame->GetUserUnits() );
m_frame->Bind( EDA_EVT_UNITS_CHANGED, &FP_TEXT_GRID_TABLE::onUnitsChanged, this ); m_frame->Bind( EDA_EVT_UNITS_CHANGED, &FP_TEXT_GRID_TABLE::onUnitsChanged, this );
@ -80,6 +109,10 @@ FP_TEXT_GRID_TABLE::~FP_TEXT_GRID_TABLE()
m_boolColAttr->DecRef(); m_boolColAttr->DecRef();
m_orientationColAttr->DecRef(); m_orientationColAttr->DecRef();
m_layerColAttr->DecRef(); m_layerColAttr->DecRef();
m_referenceAttr->DecRef();
m_valueAttr->DecRef();
m_footprintAttr->DecRef();
m_urlAttr->DecRef();
m_frame->Unbind( EDA_EVT_UNITS_CHANGED, &FP_TEXT_GRID_TABLE::onUnitsChanged, this ); m_frame->Unbind( EDA_EVT_UNITS_CHANGED, &FP_TEXT_GRID_TABLE::onUnitsChanged, this );
} }
@ -166,6 +199,27 @@ wxGridCellAttr* FP_TEXT_GRID_TABLE::GetAttr( int aRow, int aCol, wxGridCellAttr:
return nullptr; return nullptr;
case FPT_VALUE: case FPT_VALUE:
if( aRow == REFERENCE_FIELD )
{
m_referenceAttr->IncRef();
return m_referenceAttr;
}
else if( aRow == VALUE_FIELD )
{
m_valueAttr->IncRef();
return m_valueAttr;
}
else if( aRow == FOOTPRINT_FIELD )
{
m_footprintAttr->IncRef();
return m_footprintAttr;
}
else if( aRow == DATASHEET_FIELD )
{
m_urlAttr->IncRef();
return m_urlAttr;
}
case FPT_WIDTH: case FPT_WIDTH:
case FPT_HEIGHT: case FPT_HEIGHT:
case FPT_THICKNESS: case FPT_THICKNESS:

View File

@ -27,6 +27,8 @@
#include <wx/grid.h> #include <wx/grid.h>
#include <grid_tricks.h> #include <grid_tricks.h>
#include <pcb_field.h> #include <pcb_field.h>
#include <validators.h>
#include <dialog_shim.h>
class PCB_BASE_FRAME; class PCB_BASE_FRAME;
@ -54,7 +56,7 @@ enum FP_TEXT_COL_ORDER
class FP_TEXT_GRID_TABLE : public wxGridTableBase, public std::vector<PCB_FIELD*> class FP_TEXT_GRID_TABLE : public wxGridTableBase, public std::vector<PCB_FIELD*>
{ {
public: public:
FP_TEXT_GRID_TABLE( PCB_BASE_FRAME* aFrame ); FP_TEXT_GRID_TABLE( PCB_BASE_FRAME* aFrame, DIALOG_SHIM* aDialog );
~FP_TEXT_GRID_TABLE(); ~FP_TEXT_GRID_TABLE();
int GetNumberRows() override { return (int) size(); } int GetNumberRows() override { return (int) size(); }
@ -84,11 +86,22 @@ protected:
private: private:
PCB_BASE_FRAME* m_frame; PCB_BASE_FRAME* m_frame;
DIALOG_SHIM* m_dialog;
FIELD_VALIDATOR m_fieldNameValidator;
FIELD_VALIDATOR m_referenceValidator;
FIELD_VALIDATOR m_valueValidator;
FIELD_VALIDATOR m_urlValidator;
FIELD_VALIDATOR m_nonUrlValidator;
wxGridCellAttr* m_readOnlyAttr; wxGridCellAttr* m_readOnlyAttr;
wxGridCellAttr* m_boolColAttr; wxGridCellAttr* m_boolColAttr;
wxGridCellAttr* m_orientationColAttr; wxGridCellAttr* m_orientationColAttr;
wxGridCellAttr* m_layerColAttr; wxGridCellAttr* m_layerColAttr;
wxGridCellAttr* m_referenceAttr;
wxGridCellAttr* m_valueAttr;
wxGridCellAttr* m_footprintAttr;
wxGridCellAttr* m_urlAttr;
std::unique_ptr<NUMERIC_EVALUATOR> m_eval; std::unique_ptr<NUMERIC_EVALUATOR> m_eval;
std::map< std::pair<int, int>, wxString > m_evalOriginal; std::map< std::pair<int, int>, wxString > m_evalOriginal;

View File

@ -25,6 +25,7 @@
#include <pcb_field.h> #include <pcb_field.h>
#include <footprint.h> #include <footprint.h>
#include <board_design_settings.h> #include <board_design_settings.h>
#include <i18n_utility.h>
PCB_FIELD::PCB_FIELD( FOOTPRINT* aParent, int aFieldId, const wxString& aName ) : PCB_FIELD::PCB_FIELD( FOOTPRINT* aParent, int aFieldId, const wxString& aName ) :
PCB_TEXT( aParent, PCB_FIELD_T ), m_id( aFieldId ), m_name( aName ) PCB_TEXT( aParent, PCB_FIELD_T ), m_id( aFieldId ), m_name( aName )
@ -169,5 +170,17 @@ static struct PCB_FIELD_DESC
propMgr.InheritsAfter( TYPE_HASH( PCB_FIELD ), TYPE_HASH( BOARD_ITEM ) ); propMgr.InheritsAfter( TYPE_HASH( PCB_FIELD ), TYPE_HASH( BOARD_ITEM ) );
propMgr.InheritsAfter( TYPE_HASH( PCB_FIELD ), TYPE_HASH( PCB_TEXT ) ); propMgr.InheritsAfter( TYPE_HASH( PCB_FIELD ), TYPE_HASH( PCB_TEXT ) );
propMgr.InheritsAfter( TYPE_HASH( PCB_FIELD ), TYPE_HASH( EDA_TEXT ) ); propMgr.InheritsAfter( TYPE_HASH( PCB_FIELD ), TYPE_HASH( EDA_TEXT ) );
auto isNotFootprintFootprint =
[]( INSPECTABLE* aItem ) -> bool
{
if( PCB_FIELD* field = dynamic_cast<PCB_FIELD*>( aItem ) )
return !field->IsFootprint();
return true;
};
propMgr.OverrideAvailability( TYPE_HASH( PCB_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Text" ),
isNotFootprintFootprint );
} }
} _PCB_FIELD_DESC; } _PCB_FIELD_DESC;