Fix rotation/flipping properties for text boxes
Fixes https://gitlab.com/kicad/code/kicad/-/issues/14159 Fixes https://gitlab.com/kicad/code/kicad/-/issues/14164
This commit is contained in:
parent
4e99812145
commit
eba0783b38
|
@ -50,6 +50,8 @@
|
||||||
#include <geometry/shape_simple.h>
|
#include <geometry/shape_simple.h>
|
||||||
#include <font/outline_font.h>
|
#include <font/outline_font.h>
|
||||||
#include <geometry/shape_poly_set.h>
|
#include <geometry/shape_poly_set.h>
|
||||||
|
#include <properties/property_validators.h>
|
||||||
|
#include <pcbnew.h> // Text limits are in here for some reason
|
||||||
|
|
||||||
#include <wx/debug.h> // for wxASSERT
|
#include <wx/debug.h> // for wxASSERT
|
||||||
#include <wx/string.h>
|
#include <wx/string.h>
|
||||||
|
@ -1061,12 +1063,18 @@ static struct EDA_TEXT_DESC
|
||||||
&EDA_TEXT::SetTextWidth,
|
&EDA_TEXT::SetTextWidth,
|
||||||
&EDA_TEXT::GetTextWidth,
|
&EDA_TEXT::GetTextWidth,
|
||||||
PROPERTY_DISPLAY::PT_SIZE ),
|
PROPERTY_DISPLAY::PT_SIZE ),
|
||||||
textProps );
|
textProps )
|
||||||
|
.SetValidator( PROPERTY_VALIDATORS::RangeIntValidator<TEXTS_MIN_SIZE,
|
||||||
|
TEXTS_MAX_SIZE> );
|
||||||
|
|
||||||
propMgr.AddProperty( new PROPERTY<EDA_TEXT, int>( _HKI( "Height" ),
|
propMgr.AddProperty( new PROPERTY<EDA_TEXT, int>( _HKI( "Height" ),
|
||||||
&EDA_TEXT::SetTextHeight,
|
&EDA_TEXT::SetTextHeight,
|
||||||
&EDA_TEXT::GetTextHeight,
|
&EDA_TEXT::GetTextHeight,
|
||||||
PROPERTY_DISPLAY::PT_SIZE ),
|
PROPERTY_DISPLAY::PT_SIZE ),
|
||||||
textProps );
|
textProps )
|
||||||
|
.SetValidator( PROPERTY_VALIDATORS::RangeIntValidator<TEXTS_MIN_SIZE,
|
||||||
|
TEXTS_MAX_SIZE> );
|
||||||
|
|
||||||
propMgr.AddProperty( new PROPERTY_ENUM<EDA_TEXT,
|
propMgr.AddProperty( new PROPERTY_ENUM<EDA_TEXT,
|
||||||
GR_TEXT_H_ALIGN_T>( _HKI( "Horizontal Justification" ),
|
GR_TEXT_H_ALIGN_T>( _HKI( "Horizontal Justification" ),
|
||||||
&EDA_TEXT::SetHorizJustify,
|
&EDA_TEXT::SetHorizJustify,
|
||||||
|
|
|
@ -257,6 +257,12 @@ public:
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EDA_ANGLE Normalized() const
|
||||||
|
{
|
||||||
|
EDA_ANGLE ret( *this );
|
||||||
|
return ret.Normalize();
|
||||||
|
}
|
||||||
|
|
||||||
inline EDA_ANGLE NormalizeNegative()
|
inline EDA_ANGLE NormalizeNegative()
|
||||||
{
|
{
|
||||||
while( m_value <= -360.0 )
|
while( m_value <= -360.0 )
|
||||||
|
|
|
@ -356,13 +356,6 @@ bool DIALOG_TEXTBOX_PROPERTIES::TransferDataFromWindow()
|
||||||
m_edaText->SetTextThickness( maxPenWidth );
|
m_edaText->SetTextThickness( maxPenWidth );
|
||||||
}
|
}
|
||||||
|
|
||||||
EDA_ANGLE delta = m_orientation.GetAngleValue().Normalize() - m_edaText->GetTextAngle();
|
|
||||||
|
|
||||||
if( m_fpTextBox )
|
|
||||||
m_fpTextBox->Rotate( m_fpTextBox->GetPosition(), delta );
|
|
||||||
else if( m_pcbTextBox )
|
|
||||||
m_pcbTextBox->Rotate( m_pcbTextBox->GetPosition(), delta );
|
|
||||||
|
|
||||||
m_edaText->SetTextAngle( m_orientation.GetAngleValue().Normalize() );
|
m_edaText->SetTextAngle( m_orientation.GetAngleValue().Normalize() );
|
||||||
|
|
||||||
m_edaText->SetBold( m_bold->IsChecked() );
|
m_edaText->SetBold( m_bold->IsChecked() );
|
||||||
|
|
|
@ -133,6 +133,13 @@ void FP_TEXTBOX::SetRight( int aVal )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void FP_TEXTBOX::SetTextAngle( const EDA_ANGLE& aAngle )
|
||||||
|
{
|
||||||
|
EDA_ANGLE delta = aAngle.Normalized() - GetTextAngle();
|
||||||
|
Rotate( GetPosition(), delta );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
std::vector<VECTOR2I> FP_TEXTBOX::GetCorners() const
|
std::vector<VECTOR2I> FP_TEXTBOX::GetCorners() const
|
||||||
{
|
{
|
||||||
std::vector<VECTOR2I> pts = FP_SHAPE::GetCorners();
|
std::vector<VECTOR2I> pts = FP_SHAPE::GetCorners();
|
||||||
|
@ -217,6 +224,9 @@ VECTOR2I FP_TEXTBOX::GetDrawPos() const
|
||||||
|
|
||||||
if( IsMirrored() != isFlipped )
|
if( IsMirrored() != isFlipped )
|
||||||
{
|
{
|
||||||
|
std::swap( corners[0], corners[1] );
|
||||||
|
std::swap( corners[2], corners[3] );
|
||||||
|
|
||||||
switch( GetHorizJustify() )
|
switch( GetHorizJustify() )
|
||||||
{
|
{
|
||||||
case GR_TEXT_H_ALIGN_LEFT: effectiveAlignment = GR_TEXT_H_ALIGN_RIGHT; break;
|
case GR_TEXT_H_ALIGN_LEFT: effectiveAlignment = GR_TEXT_H_ALIGN_RIGHT; break;
|
||||||
|
@ -280,7 +290,7 @@ void FP_TEXTBOX::Move( const VECTOR2I& aMoveVector )
|
||||||
void FP_TEXTBOX::Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle )
|
void FP_TEXTBOX::Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle )
|
||||||
{
|
{
|
||||||
FP_SHAPE::Rotate( aRotCentre, aAngle );
|
FP_SHAPE::Rotate( aRotCentre, aAngle );
|
||||||
SetTextAngle( GetTextAngle() + aAngle );
|
EDA_TEXT::SetTextAngle( ( GetTextAngle() + aAngle ).Normalized() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -292,12 +302,12 @@ void FP_TEXTBOX::Flip( const VECTOR2I& aCentre, bool aFlipLeftRight )
|
||||||
if( aFlipLeftRight )
|
if( aFlipLeftRight )
|
||||||
{
|
{
|
||||||
SetTextX( MIRRORVAL( GetTextPos().x, aCentre.x ) );
|
SetTextX( MIRRORVAL( GetTextPos().x, aCentre.x ) );
|
||||||
SetTextAngle( -GetTextAngle() );
|
EDA_TEXT::SetTextAngle( -GetTextAngle() );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SetTextY( MIRRORVAL( GetTextPos().y, aCentre.y ) );
|
SetTextY( MIRRORVAL( GetTextPos().y, aCentre.y ) );
|
||||||
SetTextAngle( ANGLE_180 - GetTextAngle() );
|
EDA_TEXT::SetTextAngle( ANGLE_180 - GetTextAngle() );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( ( GetLayerSet() & LSET::SideSpecificMask() ).any() )
|
if( ( GetLayerSet() & LSET::SideSpecificMask() ).any() )
|
||||||
|
@ -593,5 +603,12 @@ static struct FP_TEXTBOX_DESC
|
||||||
propMgr.AddProperty( new PROPERTY<FP_TEXTBOX, wxString>( _HKI( "Parent" ),
|
propMgr.AddProperty( new PROPERTY<FP_TEXTBOX, wxString>( _HKI( "Parent" ),
|
||||||
NO_SETTER( FP_TEXTBOX, wxString ), &FP_TEXTBOX::GetParentAsString ) )
|
NO_SETTER( FP_TEXTBOX, wxString ), &FP_TEXTBOX::GetParentAsString ) )
|
||||||
.SetIsHiddenFromLibraryEditors();
|
.SetIsHiddenFromLibraryEditors();
|
||||||
|
|
||||||
|
propMgr.Mask( TYPE_HASH( FP_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Shape" ) );
|
||||||
|
propMgr.Mask( TYPE_HASH( FP_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Start X" ) );
|
||||||
|
propMgr.Mask( TYPE_HASH( FP_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Start Y" ) );
|
||||||
|
propMgr.Mask( TYPE_HASH( FP_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "End X" ) );
|
||||||
|
propMgr.Mask( TYPE_HASH( FP_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "End Y" ) );
|
||||||
|
propMgr.Mask( TYPE_HASH( FP_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Line Width" ) );
|
||||||
}
|
}
|
||||||
} _FP_TEXTBOX_DESC;
|
} _FP_TEXTBOX_DESC;
|
||||||
|
|
|
@ -71,6 +71,8 @@ public:
|
||||||
void SetRight( int aVal ) override;
|
void SetRight( int aVal ) override;
|
||||||
void SetBottom( int aVal ) override;
|
void SetBottom( int aVal ) override;
|
||||||
|
|
||||||
|
void SetTextAngle( const EDA_ANGLE& aAngle ) override;
|
||||||
|
|
||||||
wxString GetParentAsString() const;
|
wxString GetParentAsString() const;
|
||||||
|
|
||||||
bool Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const override
|
bool Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const override
|
||||||
|
|
|
@ -133,6 +133,13 @@ void PCB_TEXTBOX::SetRight( int aVal )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PCB_TEXTBOX::SetTextAngle( const EDA_ANGLE& aAngle )
|
||||||
|
{
|
||||||
|
EDA_ANGLE delta = aAngle.Normalized() - GetTextAngle();
|
||||||
|
Rotate( GetPosition(), delta );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
std::vector<VECTOR2I> PCB_TEXTBOX::GetAnchorAndOppositeCorner() const
|
std::vector<VECTOR2I> PCB_TEXTBOX::GetAnchorAndOppositeCorner() const
|
||||||
{
|
{
|
||||||
std::vector<VECTOR2I> pts;
|
std::vector<VECTOR2I> pts;
|
||||||
|
@ -185,6 +192,8 @@ VECTOR2I PCB_TEXTBOX::GetDrawPos() const
|
||||||
|
|
||||||
if( IsMirrored() )
|
if( IsMirrored() )
|
||||||
{
|
{
|
||||||
|
std::swap( corners[0], corners[1] );
|
||||||
|
|
||||||
switch( GetHorizJustify() )
|
switch( GetHorizJustify() )
|
||||||
{
|
{
|
||||||
case GR_TEXT_H_ALIGN_LEFT: effectiveAlignment = GR_TEXT_H_ALIGN_RIGHT; break;
|
case GR_TEXT_H_ALIGN_LEFT: effectiveAlignment = GR_TEXT_H_ALIGN_RIGHT; break;
|
||||||
|
@ -313,7 +322,7 @@ void PCB_TEXTBOX::Move( const VECTOR2I& aMoveVector )
|
||||||
void PCB_TEXTBOX::Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle )
|
void PCB_TEXTBOX::Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle )
|
||||||
{
|
{
|
||||||
PCB_SHAPE::Rotate( aRotCentre, aAngle );
|
PCB_SHAPE::Rotate( aRotCentre, aAngle );
|
||||||
SetTextAngle( GetTextAngle() + aAngle );
|
EDA_TEXT::SetTextAngle( ( GetTextAngle() + aAngle ).Normalized() );
|
||||||
|
|
||||||
if( GetTextAngle().IsCardinal() && GetShape() != SHAPE_T::RECT )
|
if( GetTextAngle().IsCardinal() && GetShape() != SHAPE_T::RECT )
|
||||||
{
|
{
|
||||||
|
@ -356,13 +365,13 @@ void PCB_TEXTBOX::Flip( const VECTOR2I& aCentre, bool aFlipLeftRight )
|
||||||
{
|
{
|
||||||
m_start.x = aCentre.x - ( m_start.x - aCentre.x );
|
m_start.x = aCentre.x - ( m_start.x - aCentre.x );
|
||||||
m_end.x = aCentre.x - ( m_end.x - aCentre.x );
|
m_end.x = aCentre.x - ( m_end.x - aCentre.x );
|
||||||
SetTextAngle( -GetTextAngle() );
|
EDA_TEXT::SetTextAngle( -GetTextAngle() );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_start.y = aCentre.y - ( m_start.y - aCentre.y );
|
m_start.y = aCentre.y - ( m_start.y - aCentre.y );
|
||||||
m_end.y = aCentre.y - ( m_end.y - aCentre.y );
|
m_end.y = aCentre.y - ( m_end.y - aCentre.y );
|
||||||
SetTextAngle( ANGLE_180 - GetTextAngle() );
|
EDA_TEXT::SetTextAngle( ANGLE_180 - GetTextAngle() );
|
||||||
}
|
}
|
||||||
|
|
||||||
SetLayer( FlipLayer( GetLayer(), GetBoard()->GetCopperLayerCount() ) );
|
SetLayer( FlipLayer( GetLayer(), GetBoard()->GetCopperLayerCount() ) );
|
||||||
|
|
|
@ -74,6 +74,8 @@ public:
|
||||||
|
|
||||||
VECTOR2I GetDrawPos() const override;
|
VECTOR2I GetDrawPos() const override;
|
||||||
|
|
||||||
|
void SetTextAngle( const EDA_ANGLE& aAngle ) override;
|
||||||
|
|
||||||
wxString GetShownText( int aDepth = 0, bool aAllowExtraText = true ) const override;
|
wxString GetShownText( int aDepth = 0, bool aAllowExtraText = true ) const override;
|
||||||
|
|
||||||
/// PCB_TEXTBOXes are always visible:
|
/// PCB_TEXTBOXes are always visible:
|
||||||
|
|
Loading…
Reference in New Issue