Properties: add color swatch to layer enum

This commit is contained in:
Jon Evans 2021-08-22 11:59:02 -04:00
parent 239fd29da4
commit f5597238fb
3 changed files with 85 additions and 23 deletions

View File

@ -27,6 +27,7 @@
#include <validators.h>
#include <convert_to_biu.h>
#include <property.h>
#include <widgets/color_swatch.h>
// reg-ex describing a signed valid value with a unit
static const wxChar REGEX_SIGNED_DISTANCE[] = wxT( "([-+]?[0-9]+[\\.?[0-9]*) *(mm|in)*" );
@ -275,3 +276,30 @@ wxString PGPROPERTY_ANGLE::ValueToString( wxVariant& aVariant, int aArgFlags ) c
wxCHECK( aVariant.GetType() == wxPG_VARIANT_TYPE_DOUBLE, wxEmptyString );
return wxString::Format( wxT("%g\u00B0"), aVariant.GetDouble() / m_scale );
}
wxSize PGPROPERTY_COLORENUM::OnMeasureImage( int aItem ) const
{
// TODO(JE) calculate size from window metrics?
return wxSize( 16, 12 );
}
void PGPROPERTY_COLORENUM::OnCustomPaint( wxDC& aDC, const wxRect& aRect,
wxPGPaintData& aPaintData )
{
int index = aPaintData.m_choiceItem;
if( index < 0 )
index = GetIndex();
wxString layer = GetChoices().GetLabel( index );
wxColour color = GetColor( layer );
if( color == wxNullColour )
return;
aDC.SetPen( *wxTRANSPARENT_PEN );
aDC.SetBrush( wxBrush( color ) );
aDC.DrawRectangle( aRect );
}

View File

@ -109,4 +109,34 @@ protected:
double m_scale;
};
///> A wxEnumProperty that displays a color next to the enum value
class PGPROPERTY_COLORENUM : public wxEnumProperty
{
public:
PGPROPERTY_COLORENUM( const wxString& aLabel, wxString& aName, const wxPGChoices& aChoices,
int aValue = 0 ) :
wxEnumProperty( aLabel, aName, const_cast<wxPGChoices&>( aChoices ), aValue ),
m_colorFunc( []( const wxString& aChoice ) { return wxNullColour; } )
{
}
wxSize OnMeasureImage( int aItem = -1 ) const override;
void OnCustomPaint( wxDC& aDC, const wxRect& aRect, wxPGPaintData& aPaintData ) override;
void SetColorFunc( std::function<wxColour( const wxString& aChoice )> aFunc )
{
m_colorFunc = aFunc;
}
wxColour GetColor( const wxString& aChoice )
{
return m_colorFunc( aChoice );
}
protected:
std::function<wxColour( const wxString& aChoice )> m_colorFunc;
};
#endif /* PG_PROPERTIES_H */

View File

@ -28,6 +28,7 @@
#include <board_connected_item.h>
#include <pg_properties.h>
#include <pcb_shape.h>
#include <settings/color_settings.h>
PCB_PROPERTIES_PANEL::PCB_PROPERTIES_PANEL( wxWindow* aParent, PCB_EDIT_FRAME* aFrame )
@ -50,6 +51,29 @@ void PCB_PROPERTIES_PANEL::UpdateData()
wxPGProperty* PCB_PROPERTIES_PANEL::createPGProperty( const PROPERTY_BASE* aProperty ) const
{
if( aProperty->TypeHash() == TYPE_HASH( PCB_LAYER_ID ) )
{
wxASSERT( aProperty->HasChoices() );
PGPROPERTY_COLORENUM* ret = new PGPROPERTY_COLORENUM( wxPG_LABEL, wxPG_LABEL,
const_cast<wxPGChoices&>( aProperty->Choices() ) );
ret->SetColorFunc(
[&]( const wxString& aChoice ) -> wxColour
{
PCB_LAYER_ID l = ENUM_MAP<PCB_LAYER_ID>::Instance().ToEnum( aChoice );
wxASSERT( IsPcbLayer( l ) );
return m_frame->GetColorSettings()->GetColor( l ).ToColour();
} );
ret->SetLabel( aProperty->Name() );
ret->SetName( aProperty->Name() );
ret->Enable( !aProperty->IsReadOnly() );
ret->SetClientData( const_cast<PROPERTY_BASE*>( aProperty ) );
return ret;
}
return PGPropertyFactory( aProperty );
}
@ -83,29 +107,9 @@ void PCB_PROPERTIES_PANEL::updateLists( const BOARD* aBoard )
for( LSEQ layerSeq = aBoard->GetEnabledLayers().UIOrder(); layerSeq; ++layerSeq )
layersAll.Add( LSET::Name( *layerSeq ), *layerSeq );
m_propMgr.GetProperty( TYPE_HASH( BOARD_ITEM ), _( "Layer" ) )->SetChoices( layersAll );
// Regenerate non-copper layers
for( LSEQ layerSeq = LSET( LSET::AllNonCuMask() & aBoard->GetEnabledLayers() ).UIOrder(); layerSeq; ++layerSeq )
layersNonCu.Add( LSET::Name( *layerSeq ), *layerSeq );
m_propMgr.GetProperty( TYPE_HASH( PCB_SHAPE ), _( "Layer" ) )->SetChoices( layersNonCu );
// Regenerate copper layers
for( LSEQ layerSeq = LSET( LSET::AllCuMask() & aBoard->GetEnabledLayers() ).UIOrder(); layerSeq; ++layerSeq )
layersCu.Add( LSET::Name( *layerSeq ), *layerSeq );
m_propMgr.GetProperty( TYPE_HASH( BOARD_CONNECTED_ITEM ), _( "Layer" ) )->SetChoices( layersCu );
// Regenerate non-copper layers
for( LSEQ layerSeq = LSET( LSET::AllNonCuMask() & aBoard->GetEnabledLayers() ).UIOrder(); layerSeq; ++layerSeq )
layersNonCu.Add( LSET::Name( *layerSeq ), *layerSeq );
m_propMgr.GetProperty( TYPE_HASH( PCB_SHAPE ), _( "Layer" ) )->SetChoices( layersNonCu );
m_propMgr.GetProperty( TYPE_HASH( BOARD_ITEM ), _HKI( "Layer" ) )->SetChoices( layersAll );
m_propMgr.GetProperty( TYPE_HASH( PCB_SHAPE ), _HKI( "Layer" ) )->SetChoices( layersAll );
m_propMgr.GetProperty( TYPE_HASH( BOARD_CONNECTED_ITEM ), _HKI( "Layer" ) )->SetChoices( layersAll );
// Regenerate nets
for( const auto& netinfo : aBoard->GetNetInfo().NetsByNetcode() )