Show text item anchor locations in schematic.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/17668
This commit is contained in:
parent
9a1b3471fd
commit
34dbee0693
|
@ -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
|
||||
|
||||
|
|
|
@ -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<const EDA_SHAPE*>( 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<SCH_TEXT*>( 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<const SCH_LABEL*>( 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 );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 <sch_render_settings.h>
|
||||
#include <sch_symbol.h>
|
||||
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue