From 009211c740cfcdc13e4087661a0c28bba2930251 Mon Sep 17 00:00:00 2001 From: Jon Evans Date: Thu, 23 Feb 2023 20:23:44 -0500 Subject: [PATCH] Fix some PCB_SHAPE properties Hide irrelevant position/start/end properties for shape classes that don't use them. (cherry picked from commit 1651b44ab10857e7e629fbe9ef4d0179c74c8ce4) --- common/eda_shape.cpp | 23 +++++++++++++++++++---- pcbnew/pcb_shape.cpp | 16 ++++++++++++++++ 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/common/eda_shape.cpp b/common/eda_shape.cpp index c0094f36e0..a0a25a8d91 100644 --- a/common/eda_shape.cpp +++ b/common/eda_shape.cpp @@ -1687,21 +1687,36 @@ static struct EDA_SHAPE_DESC PROPERTY_MANAGER& propMgr = PROPERTY_MANAGER::Instance(); REGISTER_TYPE( EDA_SHAPE ); + + auto isNotPolygon = + []( INSPECTABLE* aItem ) -> bool + { + // Polygons, unlike other shapes, have no meaningful start or end coordinates + if( EDA_SHAPE* shape = dynamic_cast( aItem ) ) + return shape->GetShape() != SHAPE_T::POLY; + + return false; + }; + auto shape = new PROPERTY_ENUM( _HKI( "Shape" ), NO_SETTER( EDA_SHAPE, SHAPE_T ), &EDA_SHAPE::GetShape ); propMgr.AddProperty( shape ); propMgr.AddProperty( new PROPERTY( _HKI( "Start X" ), &EDA_SHAPE::SetStartX, &EDA_SHAPE::GetStartX, PROPERTY_DISPLAY::PT_COORD, - ORIGIN_TRANSFORMS::ABS_X_COORD ) ); + ORIGIN_TRANSFORMS::ABS_X_COORD ) ) + .SetAvailableFunc( isNotPolygon ); propMgr.AddProperty( new PROPERTY( _HKI( "Start Y" ), &EDA_SHAPE::SetStartY, &EDA_SHAPE::GetStartY, PROPERTY_DISPLAY::PT_COORD, - ORIGIN_TRANSFORMS::ABS_Y_COORD ) ); + ORIGIN_TRANSFORMS::ABS_Y_COORD ) ) + .SetAvailableFunc( isNotPolygon ); propMgr.AddProperty( new PROPERTY( _HKI( "End X" ), &EDA_SHAPE::SetEndX, &EDA_SHAPE::GetEndX, PROPERTY_DISPLAY::PT_COORD, - ORIGIN_TRANSFORMS::ABS_X_COORD ) ); + ORIGIN_TRANSFORMS::ABS_X_COORD ) ) + .SetAvailableFunc( isNotPolygon ); propMgr.AddProperty( new PROPERTY( _HKI( "End Y" ), &EDA_SHAPE::SetEndY, &EDA_SHAPE::GetEndY, PROPERTY_DISPLAY::PT_COORD, - ORIGIN_TRANSFORMS::ABS_Y_COORD ) ); + ORIGIN_TRANSFORMS::ABS_Y_COORD ) ) + .SetAvailableFunc( isNotPolygon ); // TODO: m_arcCenter, m_bezierC1, m_bezierC2, m_poly propMgr.AddProperty( new PROPERTY( _HKI( "Line Width" ), &EDA_SHAPE::SetWidth, &EDA_SHAPE::GetWidth, PROPERTY_DISPLAY::PT_SIZE ) ); diff --git a/pcbnew/pcb_shape.cpp b/pcbnew/pcb_shape.cpp index 5b5b687659..b4dbeae966 100644 --- a/pcbnew/pcb_shape.cpp +++ b/pcbnew/pcb_shape.cpp @@ -410,5 +410,21 @@ static struct PCB_SHAPE_DESC _HKI( "Layer" ), &PCB_SHAPE::SetLayer, &PCB_SHAPE::GetLayer ); propMgr.ReplaceProperty( TYPE_HASH( BOARD_ITEM ), _HKI( "Layer" ), layerProperty ); + + // Only polygons have meaningful Position properties. + // On other shapes, these are duplicates of the Start properties. + auto isPolygon = + []( INSPECTABLE* aItem ) -> bool + { + if( PCB_SHAPE* shape = dynamic_cast( aItem ) ) + return shape->GetShape() == SHAPE_T::POLY; + + return false; + }; + + propMgr.OverrideAvailability( TYPE_HASH( PCB_SHAPE ), TYPE_HASH( BOARD_ITEM ), + _HKI( "Position X" ), isPolygon ); + propMgr.OverrideAvailability( TYPE_HASH( PCB_SHAPE ), TYPE_HASH( BOARD_ITEM ), + _HKI( "Position Y" ), isPolygon ); } } _PCB_SHAPE_DESC;