KiCad PCB EDA Suite
Loading...
Searching...
No Matches
sch_textbox.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, you may find one here:
18 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19 * or you may search the http://www.gnu.org website for the version 2 license,
20 * or you may write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
24#include <advanced_config.h>
25#include <base_units.h>
26#include <pgm_base.h>
27#include <sch_edit_frame.h>
28#include <plotters/plotter.h>
29#include <widgets/msgpanel.h>
30#include <bitmaps.h>
31#include <string_utils.h>
32#include <schematic.h>
34#include <sch_painter.h>
35#include <wx/log.h>
38#include <trigo.h>
40#include <sch_textbox.h>
42#include <markup_parser.h>
43#include <properties/property.h>
45
46
47SCH_TEXTBOX::SCH_TEXTBOX( SCH_LAYER_ID aLayer, int aLineWidth, FILL_T aFillType, const wxString& aText,
48 KICAD_T aType ) :
49 SCH_SHAPE( SHAPE_T::RECTANGLE, aLayer, aLineWidth, aFillType, aType ),
50 EDA_TEXT( schIUScale, aText )
51{
52 m_layer = aLayer;
53
56 SetMultilineAllowed( true );
57
58 m_excludedFromSim = false;
59
60 int defaultMargin = GetLegacyTextMargin();
61 m_marginLeft = defaultMargin;
62 m_marginTop = defaultMargin;
63 m_marginRight = defaultMargin;
64 m_marginBottom = defaultMargin;
65}
66
67
78
79
81{
82 if( m_layer == LAYER_DEVICE )
83 return KiROUND( GetTextSize().y * 0.8 );
84 else
85 return KiROUND( GetStroke().GetWidth() / 2.0 ) + KiROUND( GetTextSize().y * 0.75 );
86}
87
88
90{
91 if( GetText().IsEmpty() )
92 return VECTOR2I( 0, 0 );
93
94 BOX2I textBox = GetTextBox( nullptr );
95
96 int textHeight = std::abs( textBox.GetHeight() );
97
98 if( GetTextAngle().IsVertical() )
99 {
100 textHeight += GetMarginLeft() + GetMarginRight();
101 return VECTOR2I( textHeight, 0 );
102 }
103
104 textHeight += GetMarginTop() + GetMarginBottom();
105 return VECTOR2I( 0, textHeight );
106}
107
108
110{
112
113 // Text is NOT really mirrored; it just has its justification flipped
115 {
120 }
121}
122
123
125{
127
128 // Text is NOT really mirrored; it just has its justification flipped
130 {
135 }
136}
137
138
139void SCH_TEXTBOX::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
140{
141 SCH_SHAPE::Rotate( aCenter, aRotateCCW );
143}
144
145
150
151
153{
154 BOX2I bbox = BOX2I( m_start, m_end - m_start );
155
156 bbox.Normalize();
157
158 VECTOR2I pos( bbox.GetLeft() + m_marginLeft, bbox.GetBottom() - m_marginBottom );
159
160 if( GetTextAngle().IsVertical() )
161 {
162 switch( GetHorizJustify() )
163 {
164 case GR_TEXT_H_ALIGN_LEFT: pos.y = bbox.GetBottom() - m_marginBottom; break;
165 case GR_TEXT_H_ALIGN_CENTER: pos.y = ( bbox.GetTop() + bbox.GetBottom() ) / 2; break;
166 case GR_TEXT_H_ALIGN_RIGHT: pos.y = bbox.GetTop() + m_marginTop; break;
167 case GR_TEXT_H_ALIGN_INDETERMINATE: wxFAIL_MSG( wxT( "Indeterminate state legal only in dialogs." ) ); break;
168 }
169
170 switch( GetVertJustify() )
171 {
172 case GR_TEXT_V_ALIGN_TOP: pos.x = bbox.GetLeft() + m_marginLeft; break;
173 case GR_TEXT_V_ALIGN_CENTER: pos.x = ( bbox.GetLeft() + bbox.GetRight() ) / 2; break;
174 case GR_TEXT_V_ALIGN_BOTTOM: pos.x = bbox.GetRight() - m_marginRight; break;
175 case GR_TEXT_V_ALIGN_INDETERMINATE: wxFAIL_MSG( wxT( "Indeterminate state legal only in dialogs." ) ); break;
176 }
177 }
178 else
179 {
180 switch( GetHorizJustify() )
181 {
182 case GR_TEXT_H_ALIGN_LEFT: pos.x = bbox.GetLeft() + m_marginLeft; break;
183 case GR_TEXT_H_ALIGN_CENTER: pos.x = ( bbox.GetLeft() + bbox.GetRight() ) / 2; break;
184 case GR_TEXT_H_ALIGN_RIGHT: pos.x = bbox.GetRight() - m_marginRight; break;
185 case GR_TEXT_H_ALIGN_INDETERMINATE: wxFAIL_MSG( wxT( "Indeterminate state legal only in dialogs." ) ); break;
186 }
187
188 switch( GetVertJustify() )
189 {
190 case GR_TEXT_V_ALIGN_TOP: pos.y = bbox.GetTop() + m_marginTop; break;
191 case GR_TEXT_V_ALIGN_CENTER: pos.y = ( bbox.GetTop() + bbox.GetBottom() ) / 2; break;
192 case GR_TEXT_V_ALIGN_BOTTOM: pos.y = bbox.GetBottom() - m_marginBottom; break;
193 case GR_TEXT_V_ALIGN_INDETERMINATE: wxFAIL_MSG( wxT( "Indeterminate state legal only in dialogs." ) ); break;
194 }
195 }
196
197 return pos;
198}
199
200
202{
203 SCH_SHAPE::swapData( aItem );
204
205 SCH_TEXTBOX* item = static_cast<SCH_TEXTBOX*>( aItem );
206
207 std::swap( m_marginLeft, item->m_marginLeft );
208 std::swap( m_marginTop, item->m_marginTop );
209 std::swap( m_marginRight, item->m_marginRight );
210 std::swap( m_marginBottom, item->m_marginBottom );
211
212 SwapText( *item );
213 SwapAttributes( *item );
214}
215
216
217bool SCH_TEXTBOX::operator<( const SCH_ITEM& aItem ) const
218{
219 if( Type() != aItem.Type() )
220 return Type() < aItem.Type();
221
222 auto other = static_cast<const SCH_TEXTBOX*>( &aItem );
223
224 if( GetLayer() != other->GetLayer() )
225 return GetLayer() < other->GetLayer();
226
227 if( GetPosition().x != other->GetPosition().x )
228 return GetPosition().x < other->GetPosition().x;
229
230 if( GetPosition().y != other->GetPosition().y )
231 return GetPosition().y < other->GetPosition().y;
232
233 if( GetMarginLeft() != other->GetMarginLeft() )
234 return GetMarginLeft() < other->GetMarginLeft();
235
236 if( GetMarginTop() != other->GetMarginTop() )
237 return GetMarginTop() < other->GetMarginTop();
238
239 if( GetMarginRight() != other->GetMarginRight() )
240 return GetMarginRight() < other->GetMarginRight();
241
242 if( GetMarginBottom() != other->GetMarginBottom() )
243 return GetMarginBottom() < other->GetMarginBottom();
244
245 if( GetExcludedFromSim() != other->GetExcludedFromSim() )
246 return GetExcludedFromSim() - other->GetExcludedFromSim();
247
248 return GetText() < other->GetText();
249}
250
251
253{
255
256 if( !font )
257 font = KIFONT::FONT::GetFont( GetDefaultFont( aSettings ), IsBold(), IsItalic() );
258
259 return font;
260}
261
262
263wxString SCH_TEXTBOX::GetShownText( const RENDER_SETTINGS* aSettings, const SCH_SHEET_PATH* aPath, bool aAllowExtraText,
264 int aDepth ) const
265{
266 // Use local depth counter so each text element starts fresh
267 int depth = 0;
268
269 SCH_SHEET* sheet = nullptr;
270
271 if( aPath )
272 sheet = aPath->Last();
273
274 std::function<bool( wxString* )> textResolver = [&]( wxString* token ) -> bool
275 {
276 if( sheet )
277 {
278 if( sheet->ResolveTextVar( aPath, token, depth + 1 ) )
279 return true;
280 }
281
282 return false;
283 };
284
285 wxString text = EDA_TEXT::GetShownText( aAllowExtraText, depth );
286
287 if( HasTextVars() )
288 text = ResolveTextVars( text, &textResolver, depth );
289
290 VECTOR2I size = GetEnd() - GetStart();
291 int colWidth;
292
293 if( GetTextAngle().IsVertical() )
294 colWidth = abs( size.y ) - ( GetMarginTop() + GetMarginBottom() );
295 else
296 colWidth = abs( size.x ) - ( GetMarginLeft() + GetMarginRight() );
297
298 GetDrawFont( aSettings )
300
301 // Convert escape markers back to literals for final display
302 text.Replace( wxT( "<<<ESC_DOLLAR:" ), wxT( "${" ) );
303 text.Replace( wxT( "<<<ESC_AT:" ), wxT( "@{" ) );
304
305 return text;
306}
307
308
309bool SCH_TEXTBOX::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
310{
311 BOX2I rect = GetBoundingBox();
312
313 rect.Inflate( aAccuracy );
314
315 return rect.Contains( aPosition );
316}
317
318
319bool SCH_TEXTBOX::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
320{
321 BOX2I rect = aRect;
322
323 rect.Inflate( aAccuracy );
324
325 if( aContained )
326 return rect.Contains( GetBoundingBox() );
327
328 return rect.Intersects( GetBoundingBox() );
329}
330
331
332bool SCH_TEXTBOX::HitTest( const SHAPE_LINE_CHAIN& aPoly, bool aContained ) const
333{
334 return KIGEOM::BoxHitTest( aPoly, GetBoundingBox(), aContained );
335}
336
337
339{
340 return HasHyperlink() || containsURL();
341}
342
343
345{
346 return !m_activeUrl.IsEmpty();
347}
348
349
350void SCH_TEXTBOX::DoHypertextAction( EDA_DRAW_FRAME* aFrame, const VECTOR2I& aMousePos ) const
351{
353
354 if( HasHyperlink() )
355 navTool->HypertextCommand( m_hyperlink );
356 else if( !m_activeUrl.IsEmpty() )
357 navTool->HypertextCommand( m_activeUrl );
358}
359
360
361wxString SCH_TEXTBOX::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
362{
363 return wxString::Format( _( "Text box '%s'" ),
364 aFull ? GetShownText( false ) : KIUI::EllipsizeMenuText( GetText() ) );
365}
366
367
372
373
374void SCH_TEXTBOX::Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS& aPlotOpts, int aUnit, int aBodyStyle,
375 const VECTOR2I& aOffset, bool aDimmed )
376{
377 if( IsPrivate() )
378 return;
379
380 SCH_SHAPE::Plot( aPlotter, aBackground, aPlotOpts, aUnit, aBodyStyle, aOffset, aDimmed );
381
382 if( aBackground )
383 return;
384
385 SCH_SHEET_PATH* sheet = Schematic() ? &Schematic()->CurrentSheet() : nullptr;
386 SCH_RENDER_SETTINGS* renderSettings = getRenderSettings( aPlotter );
387 int penWidth = GetEffectivePenWidth( renderSettings );
388 COLOR4D color = GetStroke().GetColor();
389 COLOR4D bg = renderSettings->GetBackgroundColor();
390
391 KIFONT::FONT* font = GetDrawFont( renderSettings );
392
393 color = GetTextColor();
394
395 if( !aPlotter->GetColorMode() || color == COLOR4D::UNSPECIFIED )
396 color = renderSettings->GetLayerColor( m_layer );
397
398 if( bg == COLOR4D::UNSPECIFIED || !aPlotter->GetColorMode() )
399 bg = COLOR4D::WHITE;
400
401 if( color.m_text && Schematic() )
402 color = COLOR4D( ResolveText( *color.m_text, &Schematic()->CurrentSheet() ) );
403
404 if( aDimmed )
405 {
406 color.Desaturate();
407 color = color.Mix( bg, 0.5f );
408 }
409
410 penWidth = GetEffectiveTextPenWidth( renderSettings->GetDefaultPenWidth() );
411 penWidth = std::max( penWidth, renderSettings->GetMinPenWidth() );
412 aPlotter->SetCurrentLineWidth( penWidth );
413
414 TEXT_ATTRIBUTES attrs;
415 std::vector<VECTOR2I> positions;
416 wxArrayString strings_list;
417
418 wxStringSplit( GetShownText( renderSettings, sheet, true ), strings_list, '\n' );
419 positions.reserve( strings_list.Count() );
420
421 if( renderSettings->m_Transform != TRANSFORM() || aOffset != VECTOR2I() )
422 {
423 SCH_TEXTBOX temp( *this );
424
425 if( renderSettings->m_Transform.y1 )
426 {
428 }
429
430 temp.SetStart( renderSettings->TransformCoordinate( m_start ) + aOffset );
431 temp.SetEnd( renderSettings->TransformCoordinate( m_end ) + aOffset );
432
433 attrs = temp.GetAttributes();
434 temp.GetLinePositions( renderSettings, positions, (int) strings_list.Count() );
435 }
436 else
437 {
438 attrs = GetAttributes();
439 GetLinePositions( renderSettings, positions, (int) strings_list.Count() );
440 }
441
442 attrs.m_StrokeWidth = penWidth;
443 attrs.m_Multiline = false;
444
445 for( unsigned ii = 0; ii < strings_list.Count(); ii++ )
446 {
447 aPlotter->PlotText( positions[ii], color, strings_list.Item( ii ), attrs, font, GetFontMetrics() );
448 }
449
450 if( HasHyperlink() )
451 aPlotter->HyperlinkBox( GetBoundingBox(), GetHyperlink() );
452}
453
454
455void SCH_TEXTBOX::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
456{
457 // Don't use GetShownText() here; we want to show the user the variable references
458 aList.emplace_back( _( "Text Box" ), KIUI::EllipsizeStatusText( aFrame, GetText() ) );
459
460 SCH_ITEM::GetMsgPanelInfo( aFrame, aList );
461
463 aList.emplace_back( _( "Exclude from" ), _( "Simulation" ) );
464
465 aList.emplace_back( _( "Font" ), GetFont() ? GetFont()->GetName() : _( "Default" ) );
466
467 wxString textStyle[] = { _( "Normal" ), _( "Italic" ), _( "Bold" ), _( "Bold Italic" ) };
468 int style = IsBold() && IsItalic() ? 3 : IsBold() ? 2 : IsItalic() ? 1 : 0;
469 aList.emplace_back( _( "Style" ), textStyle[style] );
470
471 aList.emplace_back( _( "Text Size" ), aFrame->MessageTextFromValue( GetTextWidth() ) );
472
473 aList.emplace_back( _( "Box Width" ), aFrame->MessageTextFromValue( std::abs( GetEnd().x - GetStart().x ) ) );
474
475 aList.emplace_back( _( "Box Height" ), aFrame->MessageTextFromValue( std::abs( GetEnd().y - GetStart().y ) ) );
476
477 m_stroke.GetMsgPanelInfo( aFrame, aList );
478}
479
480
481bool SCH_TEXTBOX::operator==( const SCH_ITEM& aOther ) const
482{
483 if( Type() != aOther.Type() )
484 return false;
485
486 const SCH_TEXTBOX& other = static_cast<const SCH_TEXTBOX&>( aOther );
487
489 return false;
490
491 if( GetMarginLeft() != other.GetMarginLeft() )
492 return false;
493
494 if( GetMarginTop() != other.GetMarginTop() )
495 return false;
496
497 if( GetMarginRight() != other.GetMarginRight() )
498 return false;
499
500 if( GetMarginBottom() != other.GetMarginBottom() )
501 return false;
502
503 return SCH_SHAPE::operator==( aOther ) && EDA_TEXT::operator==( other );
504}
505
506
507double SCH_TEXTBOX::Similarity( const SCH_ITEM& aOther ) const
508{
509 if( m_Uuid == aOther.m_Uuid )
510 return 1.0;
511
512 if( aOther.Type() != Type() )
513 return 0.0;
514
515 auto other = static_cast<const SCH_TEXTBOX&>( aOther );
516
517 double similarity = SimilarityBase( other );
518
519 if( m_excludedFromSim != other.m_excludedFromSim )
520 similarity *= 0.9;
521
522 if( GetMarginLeft() != other.GetMarginLeft() )
523 similarity *= 0.9;
524
525 if( GetMarginTop() != other.GetMarginTop() )
526 similarity *= 0.9;
527
528 if( GetMarginRight() != other.GetMarginRight() )
529 similarity *= 0.9;
530
531 if( GetMarginBottom() != other.GetMarginBottom() )
532 similarity *= 0.9;
533
534 similarity *= SCH_SHAPE::Similarity( aOther );
535 similarity *= EDA_TEXT::Similarity( other );
536
537 return similarity;
538}
539
540
541int SCH_TEXTBOX::compare( const SCH_ITEM& aOther, int aCompareFlags ) const
542{
543 wxASSERT( aOther.Type() == SCH_TEXTBOX_T );
544
545 int retv = SCH_SHAPE::compare( aOther, aCompareFlags );
546
547 if( retv )
548 return retv;
549
550 const SCH_TEXTBOX* tmp = static_cast<const SCH_TEXTBOX*>( &aOther );
551
552 int result = GetText().CmpNoCase( tmp->GetText() );
553
554 if( result != 0 )
555 return result;
556
557 if( GetTextWidth() != tmp->GetTextWidth() )
558 return GetTextWidth() - tmp->GetTextWidth();
559
560 if( GetTextHeight() != tmp->GetTextHeight() )
561 return GetTextHeight() - tmp->GetTextHeight();
562
563 if( IsBold() != tmp->IsBold() )
564 return IsBold() - tmp->IsBold();
565
566 if( IsItalic() != tmp->IsItalic() )
567 return IsItalic() - tmp->IsItalic();
568
569 if( GetHorizJustify() != tmp->GetHorizJustify() )
570 return (int) GetHorizJustify() - (int) tmp->GetHorizJustify();
571
572 if( GetTextAngle().AsTenthsOfADegree() != tmp->GetTextAngle().AsTenthsOfADegree() )
574
575 if( GetMarginLeft() != tmp->GetMarginLeft() )
576 return GetMarginLeft() - tmp->GetMarginLeft();
577
578 if( GetMarginTop() != tmp->GetMarginTop() )
579 return GetMarginTop() - tmp->GetMarginTop();
580
581 if( GetMarginRight() != tmp->GetMarginRight() )
582 return GetMarginRight() - tmp->GetMarginRight();
583
584 if( GetMarginBottom() != tmp->GetMarginBottom() )
585 return GetMarginBottom() - tmp->GetMarginBottom();
586
587 return 0;
588}
589
590
591static struct SCH_TEXTBOX_DESC
592{
594 {
597
604
605 propMgr.Mask( TYPE_HASH( SCH_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Shape" ) );
606 propMgr.Mask( TYPE_HASH( SCH_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Corner Radius" ) );
607
608 propMgr.Mask( TYPE_HASH( SCH_TEXTBOX ), TYPE_HASH( EDA_TEXT ), _HKI( "Width" ) );
609 propMgr.Mask( TYPE_HASH( SCH_TEXTBOX ), TYPE_HASH( EDA_TEXT ), _HKI( "Height" ) );
610 propMgr.Mask( TYPE_HASH( SCH_TEXTBOX ), TYPE_HASH( EDA_TEXT ), _HKI( "Thickness" ) );
611
612 const wxString marginProps = _( "Margins" );
613
616 marginProps );
619 marginProps );
622 marginProps );
625 marginProps );
626
629 _HKI( "Text Properties" ) );
630
631 propMgr.Mask( TYPE_HASH( SCH_TEXTBOX ), TYPE_HASH( EDA_TEXT ), _HKI( "Orientation" ) );
632 }
constexpr EDA_IU_SCALE schIUScale
Definition base_units.h:114
BITMAPS
A list of all bitmap identifiers.
BOX2< VECTOR2I > BOX2I
Definition box2.h:922
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition box2.h:990
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition box2.h:558
constexpr BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
Definition box2.h:146
constexpr size_type GetHeight() const
Definition box2.h:215
constexpr coord_type GetLeft() const
Definition box2.h:228
constexpr bool Contains(const Vec &aPoint) const
Definition box2.h:168
constexpr coord_type GetRight() const
Definition box2.h:217
constexpr coord_type GetTop() const
Definition box2.h:229
constexpr bool Intersects(const BOX2< Vec > &aRect) const
Definition box2.h:311
constexpr coord_type GetBottom() const
Definition box2.h:222
static const COLOR4D WHITE
Definition color4d.h:405
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
Definition color4d.h:402
int AsTenthsOfADegree() const
Definition eda_angle.h:118
The base class for create windows for drawing purpose.
const KIID m_Uuid
Definition eda_item.h:522
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:111
VECTOR2I m_start
Definition eda_shape.h:507
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
Definition eda_shape.h:216
void SetStart(const VECTOR2I &aStart)
Definition eda_shape.h:178
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
Definition eda_shape.h:174
void SetEnd(const VECTOR2I &aEnd)
Definition eda_shape.h:220
VECTOR2I m_end
Definition eda_shape.h:508
virtual int GetWidth() const
Definition eda_shape.h:157
STROKE_PARAMS m_stroke
Definition eda_shape.h:495
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Definition eda_text.h:80
int GetTextHeight() const
Definition eda_text.h:267
COLOR4D GetTextColor() const
Definition eda_text.h:270
bool IsItalic() const
Definition eda_text.h:169
const EDA_ANGLE & GetTextAngle() const
Definition eda_text.h:147
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition eda_text.h:98
KIFONT::FONT * GetFont() const
Definition eda_text.h:247
wxString m_hyperlink
A hyperlink URL.
Definition eda_text.h:455
int GetTextWidth() const
Definition eda_text.h:264
BOX2I GetTextBox(const RENDER_SETTINGS *aSettings, int aLine=-1) const
Useful in multiline texts to calculate the full text or a line area (for zones filling,...
Definition eda_text.cpp:755
virtual bool HasHyperlink() const
Definition eda_text.h:402
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
Definition eda_text.cpp:431
wxString GetHyperlink() const
Definition eda_text.h:403
GR_TEXT_H_ALIGN_T GetHorizJustify() const
Definition eda_text.h:200
bool HasTextVars() const
Indicates the ShownText has text var references which need to be processed.
Definition eda_text.h:117
bool containsURL() const
EDA_TEXT(const EDA_IU_SCALE &aIuScale, const wxString &aText=wxEmptyString)
Definition eda_text.cpp:100
wxString m_activeUrl
Definition eda_text.h:457
double Similarity(const EDA_TEXT &aOther) const
const TEXT_ATTRIBUTES & GetAttributes() const
Definition eda_text.h:231
int GetEffectiveTextPenWidth(int aDefaultPenWidth=0) const
The EffectiveTextPenWidth uses the text thickness if > 1 or aDefaultPenWidth.
Definition eda_text.cpp:479
void SwapAttributes(EDA_TEXT &aTradingPartner)
Swap the text attributes of the two involved instances.
Definition eda_text.cpp:466
void GetLinePositions(const RENDER_SETTINGS *aSettings, std::vector< VECTOR2I > &aPositions, int aLineCount) const
Populate aPositions with the position of each line of a multiline text, according to the vertical jus...
Definition eda_text.cpp:925
bool IsBold() const
Definition eda_text.h:184
GR_TEXT_V_ALIGN_T GetVertJustify() const
Definition eda_text.h:203
virtual wxString GetShownText(bool aAllowExtraText, int aDepth=0) const
Return the string actually shown after processing of the base text.
Definition eda_text.h:109
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
Definition eda_text.cpp:313
void SwapText(EDA_TEXT &aTradingPartner)
Definition eda_text.cpp:459
bool operator==(const EDA_TEXT &aRhs) const
Definition eda_text.h:398
void SetMultilineAllowed(bool aAllow)
Definition eda_text.cpp:415
VECTOR2I GetTextSize() const
Definition eda_text.h:261
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
Definition eda_text.cpp:423
FONT is an abstract base class for both outline and stroke fonts.
Definition font.h:98
static FONT * GetFont(const wxString &aFontName=wxEmptyString, bool aBold=false, bool aItalic=false, const std::vector< wxString > *aEmbeddedFiles=nullptr, bool aForDrawingSheet=false)
Definition font.cpp:147
void LinebreakText(wxString &aText, int aColumnWidth, const VECTOR2I &aGlyphSize, int aThickness, bool aBold, bool aItalic) const
Insert characters into text to ensure that no lines are wider than aColumnWidth.
Definition font.cpp:609
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:105
std::shared_ptr< wxString > m_text
Definition color4d.h:399
COLOR4D & Desaturate()
Removes color (in HSL model)
Definition color4d.cpp:532
COLOR4D Mix(const COLOR4D &aColor, double aFactor) const
Return a color that is mixed with the input by a factor.
Definition color4d.h:296
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
const COLOR4D & GetLayerColor(int aLayer) const
Return the color used to draw a layer.
Base plotter engine class.
Definition plotter.h:136
virtual void HyperlinkBox(const BOX2I &aBox, const wxString &aDestinationURL)
Create a clickable hyperlink with a rectangular click area.
Definition plotter.h:506
bool GetColorMode() const
Definition plotter.h:164
virtual void SetCurrentLineWidth(int width, void *aData=nullptr)=0
Set the line width for the next drawing.
virtual void PlotText(const VECTOR2I &aPos, const COLOR4D &aColor, const wxString &aText, const TEXT_ATTRIBUTES &aAttributes, KIFONT::FONT *aFont=nullptr, const KIFONT::METRICS &aFontMetrics=KIFONT::METRICS::Default(), void *aData=nullptr)
Definition plotter.cpp:696
Provide class metadata.Helper macro to map type hashes to names.
void InheritsAfter(TYPE_ID aDerived, TYPE_ID aBase)
Declare an inheritance relationship between types.
void Mask(TYPE_ID aDerived, TYPE_ID aBase, const wxString &aName)
Sets a base class property as masked in a derived class.
static PROPERTY_MANAGER & Instance()
PROPERTY_BASE & AddProperty(PROPERTY_BASE *aProperty, const wxString &aGroup=wxEmptyString)
Register a property.
void AddTypeCast(TYPE_CAST_BASE *aCast)
Register a type converter.
SCH_SHEET_PATH & CurrentSheet() const
Definition schematic.h:187
void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) override
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
Definition sch_item.cpp:803
SCH_RENDER_SETTINGS * getRenderSettings(PLOTTER *aPlotter) const
Definition sch_item.h:727
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
Definition sch_item.cpp:254
bool IsPrivate() const
Definition sch_item.h:254
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition sch_item.h:341
const wxString & GetDefaultFont(const RENDER_SETTINGS *aSettings) const
Definition sch_item.cpp:746
SCH_ITEM(EDA_ITEM *aParent, KICAD_T aType, int aUnit=0, int aBodyStyle=0)
Definition sch_item.cpp:56
wxString ResolveText(const wxString &aText, const SCH_SHEET_PATH *aPath, int aDepth=0) const
Definition sch_item.cpp:363
const KIFONT::METRICS & GetFontMetrics() const
Definition sch_item.cpp:759
int GetEffectivePenWidth(const SCH_RENDER_SETTINGS *aSettings) const
Definition sch_item.cpp:768
SCH_LAYER_ID m_layer
Definition sch_item.h:778
double SimilarityBase(const SCH_ITEM &aItem) const
Calculate the boilerplate similarity for all LIB_ITEMs without preventing the use above of a pure vir...
Definition sch_item.h:380
Handle actions specific to the schematic editor.
void HypertextCommand(const wxString &aHref)
VECTOR2I TransformCoordinate(const VECTOR2I &aPoint) const
const KIGFX::COLOR4D & GetBackgroundColor() const override
Return current background color settings.
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
void swapData(SCH_ITEM *aItem) override
Swap the internal data structures aItem with the schematic item.
Definition sch_shape.cpp:55
double Similarity(const SCH_ITEM &aOther) const override
Return a measure of how likely the other object is to represent the same object.
void Plot(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed) override
Plot the item to aPlotter.
SCH_SHAPE(SHAPE_T aShape=SHAPE_T::UNDEFINED, SCH_LAYER_ID aLayer=LAYER_NOTES, int aLineWidth=0, FILL_T aFillType=FILL_T::NO_FILL, KICAD_T aType=SCH_SHAPE_T)
Definition sch_shape.cpp:40
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
void Rotate(const VECTOR2I &aCenter, bool aRotateCCW) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
bool operator==(const SCH_ITEM &aOther) const override
STROKE_PARAMS GetStroke() const override
Definition sch_shape.h:58
VECTOR2I GetPosition() const override
Definition sch_shape.h:85
int compare(const SCH_ITEM &aOther, int aCompareFlags=0) const override
Provide the draw object specific comparison called by the == and < operators.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition sch_sheet.h:48
bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the sheet.
void SetMarginBottom(int aBottom)
Definition sch_textbox.h:68
int GetMarginBottom() const
Definition sch_textbox.h:73
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
bool m_excludedFromSim
virtual wxString GetShownText(const RENDER_SETTINGS *aSettings, const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const
bool operator==(const SCH_ITEM &aOther) const override
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
int GetLegacyTextMargin() const
int GetMarginLeft() const
Definition sch_textbox.h:70
int GetSchTextSize() const
Definition sch_textbox.h:75
bool GetExcludedFromSim(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
int compare(const SCH_ITEM &aOther, int aCompareFlags=0) const override
Provide the draw object specific comparison called by the == and < operators.
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
bool operator<(const SCH_ITEM &aItem) const override
bool HasHypertext() const override
Indicates that the item has at least one hypertext action.
VECTOR2I GetDrawPos() const override
int GetMarginRight() const
Definition sch_textbox.h:72
void Rotate(const VECTOR2I &aCenter, bool aRotateCCW) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
VECTOR2I GetMinSize() const
Return the minimum height needed to contain the textbox's wrapped text content plus margins.
void Plot(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed) override
Plot the item to aPlotter.
bool HasHoveredHypertext() const override
Indicates that a hypertext link is currently active.
int GetMarginTop() const
Definition sch_textbox.h:71
void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) override
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
void SetMarginLeft(int aLeft)
Definition sch_textbox.h:65
void swapData(SCH_ITEM *aItem) override
Swap the internal data structures aItem with the schematic item.
void DoHypertextAction(EDA_DRAW_FRAME *aFrame, const VECTOR2I &aMousePos) const override
virtual void Rotate90(bool aClockwise)
void SetMarginRight(int aRight)
Definition sch_textbox.h:67
void SetSchTextSize(int aSize)
Definition sch_textbox.h:76
KIFONT::FONT * GetDrawFont(const RENDER_SETTINGS *aSettings) const override
SCH_TEXTBOX(SCH_LAYER_ID aLayer=LAYER_NOTES, int aLineWidth=0, FILL_T aFillType=FILL_T::NO_FILL, const wxString &aText=wxEmptyString, KICAD_T aType=SCH_TEXTBOX_T)
double Similarity(const SCH_ITEM &aOther) const override
Return a measure of how likely the other object is to represent the same object.
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
void SetMarginTop(int aTop)
Definition sch_textbox.h:66
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
KIGFX::COLOR4D GetColor() const
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
for transforming drawing coordinates for a wxDC device context.
Definition transform.h:46
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
A lower-precision version of StringFromValue().
wxString ResolveTextVars(const wxString &aSource, const std::function< bool(wxString *)> *aResolver, int &aDepth)
Multi-pass text variable expansion and math expression evaluation.
Definition common.cpp:296
#define _(s)
static constexpr EDA_ANGLE ANGLE_VERTICAL
Definition eda_angle.h:408
static constexpr EDA_ANGLE ANGLE_HORIZONTAL
Definition eda_angle.h:407
SHAPE_T
Definition eda_shape.h:43
FILL_T
Definition eda_shape.h:56
a few functions useful in geometry calculations.
SCH_LAYER_ID
Eeschema drawing layers.
Definition layer_ids.h:449
@ LAYER_DEVICE
Definition layer_ids.h:466
Message panel definition file.
bool BoxHitTest(const VECTOR2I &aHitPoint, const BOX2I &aHittee, int aAccuracy)
Perform a point-to-box hit test.
KICOMMON_API wxString EllipsizeMenuText(const wxString &aString)
Ellipsize text (at the end) to be no more than 36 characters.
KICOMMON_API wxString EllipsizeStatusText(wxWindow *aWindow, const wxString &aString)
Ellipsize text (at the end) to be no more than 1/3 of the window width.
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
Definition eda_angle.h:400
#define _HKI(x)
Definition page_info.cpp:44
see class PGM_BASE
#define TYPE_HASH(x)
Definition property.h:74
@ PT_SIZE
Size expressed in distance units (mm/inch)
Definition property.h:63
#define REGISTER_TYPE(x)
static struct SCH_TEXTBOX_DESC _SCH_TEXTBOX_DESC
void wxStringSplit(const wxString &aText, wxArrayString &aStrings, wxChar aSplitter)
Split aString to a string list separated at aSplitter.
wxString result
Test unit parsing edge cases and error handling.
@ GR_TEXT_H_ALIGN_CENTER
@ GR_TEXT_H_ALIGN_RIGHT
@ GR_TEXT_H_ALIGN_LEFT
@ GR_TEXT_H_ALIGN_INDETERMINATE
@ GR_TEXT_V_ALIGN_BOTTOM
@ GR_TEXT_V_ALIGN_INDETERMINATE
@ GR_TEXT_V_ALIGN_CENTER
@ GR_TEXT_V_ALIGN_TOP
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition typeinfo.h:78
@ SCH_TEXTBOX_T
Definition typeinfo.h:156
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:695