diff --git a/eeschema/default_values.h b/eeschema/default_values.h index 00303fec5a..e433d5988e 100644 --- a/eeschema/default_values.h +++ b/eeschema/default_values.h @@ -32,6 +32,9 @@ ///< The size of the rectangle indicating a connected, unselected wire end #define UNSELECTED_END_SIZE 4 +///< The size of the rectangle indicating the anchor of a text object (including fields) +#define TEXT_ANCHOR_SIZE 8 + ///< The default pin len value when creating pins(can be changed in preference menu) #define DEFAULT_PIN_LENGTH 100 diff --git a/eeschema/sch_painter.cpp b/eeschema/sch_painter.cpp index 76badbdaef..93e8222609 100644 --- a/eeschema/sch_painter.cpp +++ b/eeschema/sch_painter.cpp @@ -440,8 +440,7 @@ COLOR4D SCH_PAINTER::getRenderColor( const SCH_ITEM* aItem, int aLayer, bool aDr } else if( aItem->IsSelected() && aDrawingShadows ) { - if( aDrawingShadows ) - color = m_schSettings.GetLayerColor( LAYER_SELECTION_SHADOWS ); + color = m_schSettings.GetLayerColor( LAYER_SELECTION_SHADOWS ); } else if( aItem->IsSelected() && ( aLayer == LAYER_DEVICE_BACKGROUND || aLayer == LAYER_SHEET_BACKGROUND @@ -731,94 +730,6 @@ void SCH_PAINTER::draw( const LIB_SYMBOL* aSymbol, int aLayer, bool aDrawFields, } -bool SCH_PAINTER::setDeviceColors( const SCH_ITEM* aItem, int aLayer, bool aDimmed ) -{ - COLOR4D bg = m_schSettings.GetLayerColor( LAYER_SCHEMATIC_BACKGROUND ); - const EDA_SHAPE* shape = dynamic_cast( aItem ); - - switch( aLayer ) - { - case LAYER_SELECTION_SHADOWS: - if( aItem->IsBrightened() || aItem->IsSelected() ) - { - m_gal->SetIsFill( false ); - m_gal->SetIsStroke( true ); - m_gal->SetLineWidth( getLineWidth( aItem, true ) ); - m_gal->SetStrokeColor( getRenderColor( aItem, LAYER_DEVICE, true, aDimmed ) ); - m_gal->SetFillColor( getRenderColor( aItem, LAYER_DEVICE, true, aDimmed ) ); - return true; - } - - return false; - - case LAYER_NOTES_BACKGROUND: - case LAYER_DEVICE_BACKGROUND: - if( shape ) - { - if( shape->GetFillMode() != FILL_T::FILLED_WITH_BG_BODYCOLOR ) - { - return false; // FILLED_SHAPE and FILLED_WITH_COLOR rendered below on - // LAYER_NOTES or LAYER_DEVICE - } - - m_gal->SetIsFill( true ); - m_gal->SetFillColor( getRenderColor( aItem, LAYER_DEVICE_BACKGROUND, false, aDimmed ) ); - m_gal->SetIsStroke( false ); - return true; - } - - return false; - - case LAYER_NOTES: - case LAYER_PRIVATE_NOTES: - case LAYER_DEVICE: - m_gal->SetIsFill( shape && ( shape->GetFillMode() == FILL_T::FILLED_SHAPE - || shape->GetFillMode() == FILL_T::FILLED_WITH_COLOR ) ); - - if( shape && shape->GetFillMode() == FILL_T::FILLED_SHAPE ) - { - m_gal->SetFillColor( getRenderColor( aItem, LAYER_DEVICE, false, aDimmed ) ); - } - else if( shape && shape->GetFillMode() == FILL_T::FILLED_WITH_COLOR ) - { - COLOR4D fillColour = shape->GetFillColor(); - double transparency = aItem->GetForcedTransparency(); - - if( transparency > 0.0 ) - fillColour = fillColour.WithAlpha( fillColour.a * ( 1.0 - transparency ) ); - - if( m_schSettings.m_OverrideItemColors ) - { - fillColour = getRenderColor( aItem, LAYER_DEVICE_BACKGROUND, false, aDimmed ); - } - else if( aDimmed ) - { - fillColour = fillColour.Mix( bg, 0.5f ); - fillColour.Desaturate(); - } - - m_gal->SetFillColor( fillColour ); - } - - if( aItem->GetPenWidth() >= 0 || !shape || !shape->IsFilled() ) - { - m_gal->SetIsStroke( true ); - m_gal->SetLineWidth( getLineWidth( aItem, false ) ); - m_gal->SetStrokeColor( getRenderColor( aItem, aLayer, false, aDimmed ) ); - } - else - { - m_gal->SetIsStroke( false ); - } - - return true; - - default: - return false; - } -} - - int SCH_PAINTER::internalPinDecoSize( const SCH_PIN &aPin ) { if( m_schSettings.m_PinSymbolSize > 0 ) @@ -1336,6 +1247,31 @@ void SCH_PAINTER::draw( const SCH_PIN* aPin, int aLayer, bool aDimmed ) } +// Draw anchor indicating the anchor position of text objects, local labels, or fields. +void SCH_PAINTER::drawAnchor( const VECTOR2I& aPos, bool aDrawingShadows ) +{ + if( m_schSettings.IsPrinting() ) + return; + + // In order for the anchors to be visible but unobtrusive, their size must factor in the + // current zoom level. + const MATRIX3x3D& matrix = m_gal->GetScreenWorldMatrix(); + int radius = KiROUND( std::fabs( matrix.GetScale().x * TEXT_ANCHOR_SIZE ) / 25 ) + + schIUScale.MilsToIU( TEXT_ANCHOR_SIZE ); + + COLOR4D color = aDrawingShadows ? m_schSettings.GetLayerColor( LAYER_SELECTION_SHADOWS ) + : m_schSettings.GetLayerColor( LAYER_SCHEMATIC_ANCHOR ); + + m_gal->SetStrokeColor( color ); + m_gal->SetIsStroke( true ); + m_gal->SetLineWidth( aDrawingShadows ? getShadowWidth( false ) + : m_schSettings.GetDanglingIndicatorThickness() ); + + m_gal->DrawLine( aPos - VECTOR2I( radius, 0 ), aPos + VECTOR2I( radius, 0 ) ); + m_gal->DrawLine( aPos - VECTOR2I( 0, radius ), aPos + VECTOR2I( 0, radius ) ); +} + + // Draw the target (an open square) for a wire or label which has no connection or is // being moved. void SCH_PAINTER::drawDanglingIndicator( const VECTOR2I& aPos, const COLOR4D& aColor, int aWidth, @@ -1886,6 +1822,39 @@ void SCH_PAINTER::draw( const SCH_TEXT* aText, int aLayer, bool aDimmed ) const_cast( aText )->ClearFlags( IS_SHOWN_AS_BITMAP ); } } + + // Draw anchor + if( aText->IsSelected() ) + { + bool showAnchor; + + switch( aText->Type() ) + { + case SCH_TEXT_T: + showAnchor = true; + break; + + case SCH_LABEL_T: + // Don't clutter things up if we're already showing a dangling indicator + showAnchor = !static_cast( aText )->IsDangling(); + break; + + case SCH_DIRECTIVE_LABEL_T: + case SCH_HIER_LABEL_T: + case SCH_GLOBAL_LABEL_T: + case SCH_SHEET_PIN_T: + // These all have shapes and so don't need anchors + showAnchor = false; + break; + + default: + showAnchor = false; + break; + } + + if( showAnchor ) + drawAnchor( aText->GetPosition(), drawingShadows ); + } } @@ -1943,7 +1912,8 @@ void SCH_PAINTER::draw( const SCH_TEXTBOX* aTextBox, int aLayer, bool aDimmed ) } else { - strokeText( shownText, aTextBox->GetDrawPos(), attrs, aTextBox->GetFontMetrics() ); + strokeText( shownText, aTextBox->GetDrawPos(), attrs, + aTextBox->GetFontMetrics() ); } }; @@ -2444,14 +2414,18 @@ void SCH_PAINTER::draw( const SCH_FIELD* aField, int aLayer, bool aDimmed ) } } - // Draw the umbilical line + // Draw anchor or umbilical line if( aField->IsMoving() && m_schematic ) { VECTOR2I parentPos = aField->GetParentPosition(); m_gal->SetLineWidth( m_schSettings.GetOutlineWidth() ); m_gal->SetStrokeColor( getRenderColor( aField, LAYER_SCHEMATIC_ANCHOR, drawingShadows ) ); - m_gal->DrawLine( bbox.Centre(), parentPos ); + m_gal->DrawLine( aField->GetPosition(), parentPos ); + } + else if( aField->IsSelected() ) + { + drawAnchor( aField->GetPosition(), drawingShadows ); } } diff --git a/eeschema/sch_painter.h b/eeschema/sch_painter.h index e725183155..765c848511 100644 --- a/eeschema/sch_painter.h +++ b/eeschema/sch_painter.h @@ -24,8 +24,8 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ -#ifndef __SCH_PAINTER_H -#define __SCH_PAINTER_H +#ifndef SCH_PAINTER_H +#define SCH_PAINTER_H #include #include @@ -105,6 +105,7 @@ private: bool aDrawingShadows, bool aBrightened ); void drawDanglingIndicator( const VECTOR2I& aPos, const COLOR4D& aColor, int aWidth, bool aDangling, bool aDrawingShadows, bool aBrightened ); + void drawAnchor( const VECTOR2I& aPos, bool aDrawingShadows ); int internalPinDecoSize( const SCH_PIN &aPin ); int externalPinDecoSize( const SCH_PIN &aPin ); @@ -123,8 +124,6 @@ private: int getOperatingPointTextSize() const; - bool setDeviceColors( const SCH_ITEM* aItem, int aLayer, bool aDimmed ); - void triLine( const VECTOR2D &a, const VECTOR2D &b, const VECTOR2D &c ); void strokeText( const wxString& aText, const VECTOR2D& aPosition, const TEXT_ATTRIBUTES& aAttrs, const KIFONT::METRICS& aFontMetrics ); @@ -148,4 +147,4 @@ private: }; // namespace KIGFX -#endif // __SCH_PAINTER_H +#endif // SCH_PAINTER_H