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, see <https://www.gnu.org/licenses/>.
18 */
19
20#include <google/protobuf/any.pb.h>
21
22#include <advanced_config.h>
23#include <api/api_enums.h>
24#include <api/api_utils.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#include <api/schematic/schematic_types.pb.h>
46
47
48SCH_TEXTBOX::SCH_TEXTBOX( SCH_LAYER_ID aLayer, int aLineWidth, FILL_T aFillType, const wxString& aText,
49 KICAD_T aType ) :
50 SCH_SHAPE( SHAPE_T::RECTANGLE, aLayer, aLineWidth, aFillType, aType ),
51 EDA_TEXT( schIUScale, aText )
52{
53 m_layer = aLayer;
54
57 SetMultilineAllowed( true );
58
59 m_excludedFromSim = false;
60
61 int defaultMargin = GetLegacyTextMargin();
62 m_marginLeft = defaultMargin;
63 m_marginTop = defaultMargin;
64 m_marginRight = defaultMargin;
65 m_marginBottom = defaultMargin;
66}
67
68
79
80
81void SCH_TEXTBOX::Serialize( google::protobuf::Any& aContainer ) const
82{
83 using namespace kiapi::common;
84
85 kiapi::schematic::types::SchematicTextBox textBox;
86
87 textBox.mutable_id()->set_value( m_Uuid.AsStdString() );
88 textBox.set_locked( IsLocked() ? types::LockedState::LS_LOCKED : types::LockedState::LS_UNLOCKED );
89 textBox.set_exclude_from_sim( GetExcludedFromSim() );
90 PackDistance( *textBox.mutable_margin_left(), GetMarginLeft(), schIUScale );
91 PackDistance( *textBox.mutable_margin_top(), GetMarginTop(), schIUScale );
92 PackDistance( *textBox.mutable_margin_right(), GetMarginRight(), schIUScale );
93 PackDistance( *textBox.mutable_margin_bottom(), GetMarginBottom(), schIUScale );
94
95 types::TextBox& text = *textBox.mutable_textbox();
96 PackVector2( *text.mutable_top_left(), GetPosition(), schIUScale );
97 PackVector2( *text.mutable_bottom_right(), GetEnd(), schIUScale );
98 text.set_text( GetText().ToUTF8() );
99
100 types::TextAttributes* attrs = text.mutable_attributes();
101
102 if( GetFont() )
103 attrs->set_font_name( GetFont()->GetName().ToUTF8() );
104
107 attrs->mutable_angle()->set_value_degrees( GetTextAngleDegrees() );
108 attrs->set_line_spacing( GetLineSpacing() );
109 PackDistance( *attrs->mutable_stroke_width(), GetTextThickness(), schIUScale );
110 attrs->set_italic( IsItalic() );
111 attrs->set_bold( IsBold() );
112 attrs->set_underlined( GetAttributes().m_Underlined );
113 attrs->set_mirrored( IsMirrored() );
114 attrs->set_multiline( IsMultilineAllowed() );
115 attrs->set_keep_upright( IsKeepUpright() );
116 PackVector2( *attrs->mutable_size(), GetTextSize(), schIUScale );
117
119 PackColor( *attrs->mutable_color(), GetTextColor() );
120
121 types::StrokeAttributes* stroke = textBox.mutable_graphic_attributes()->mutable_stroke();
122 PackDistance( *stroke->mutable_width(), GetStroke().GetWidth(), schIUScale );
124
125 if( GetStroke().GetColor() != COLOR4D::UNSPECIFIED )
126 PackColor( *stroke->mutable_color(), GetStroke().GetColor() );
127
128 types::GraphicFillAttributes* fill = textBox.mutable_graphic_attributes()->mutable_fill();
130
132 PackColor( *fill->mutable_color(), GetFillColor() );
133
134 aContainer.PackFrom( textBox );
135}
136
137
138bool SCH_TEXTBOX::Deserialize( const google::protobuf::Any& aContainer )
139{
140 using namespace kiapi::common;
141
142 kiapi::schematic::types::SchematicTextBox textBox;
143
144 if( !aContainer.UnpackTo( &textBox ) )
145 return false;
146
147 const_cast<KIID&>( m_Uuid ) = KIID( textBox.id().value() );
148 SetLocked( textBox.locked() == types::LockedState::LS_LOCKED );
149 SetExcludedFromSim( textBox.exclude_from_sim() );
150 SetPosition( UnpackVector2( textBox.textbox().top_left(), schIUScale ) );
151 SetEnd( UnpackVector2( textBox.textbox().bottom_right(), schIUScale ) );
152 SetText( wxString::FromUTF8( textBox.textbox().text() ) );
153
154 if( textBox.has_margin_left() )
155 SetMarginLeft( UnpackDistance( textBox.margin_left(), schIUScale ) );
156
157 if( textBox.has_margin_top() )
158 SetMarginTop( UnpackDistance( textBox.margin_top(), schIUScale ) );
159
160 if( textBox.has_margin_right() )
161 SetMarginRight( UnpackDistance( textBox.margin_right(), schIUScale ) );
162
163 if( textBox.has_margin_bottom() )
164 SetMarginBottom( UnpackDistance( textBox.margin_bottom(), schIUScale ) );
165
166 if( textBox.textbox().has_attributes() )
167 {
169
170 attrs.m_Bold = textBox.textbox().attributes().bold();
171 attrs.m_Italic = textBox.textbox().attributes().italic();
172 attrs.m_Underlined = textBox.textbox().attributes().underlined();
173 attrs.m_Mirrored = textBox.textbox().attributes().mirrored();
174 attrs.m_Multiline = textBox.textbox().attributes().multiline();
175 attrs.m_KeepUpright = textBox.textbox().attributes().keep_upright();
176 attrs.m_Size = UnpackVector2( textBox.textbox().attributes().size(), schIUScale );
177
178 if( textBox.textbox().attributes().has_color() )
179 attrs.m_Color = UnpackColor( textBox.textbox().attributes().color() );
180 else
182
183 if( !textBox.textbox().attributes().font_name().empty() )
184 {
185 attrs.m_Font = KIFONT::FONT::GetFont( wxString::FromUTF8( textBox.textbox().attributes().font_name() ),
186 attrs.m_Bold, attrs.m_Italic );
187 }
188
189 attrs.m_Angle = EDA_ANGLE( textBox.textbox().attributes().angle().value_degrees(), DEGREES_T );
190 attrs.m_LineSpacing = textBox.textbox().attributes().line_spacing();
191 attrs.m_StrokeWidth = UnpackDistance( textBox.textbox().attributes().stroke_width(), schIUScale );
193 textBox.textbox().attributes().horizontal_alignment() );
195 textBox.textbox().attributes().vertical_alignment() );
196
197 SetAttributes( attrs );
198 }
199
200 if( textBox.has_graphic_attributes() )
201 {
202 if( textBox.graphic_attributes().stroke().has_color() )
203 m_stroke.SetColor( UnpackColor( textBox.graphic_attributes().stroke().color() ) );
204 else
205 m_stroke.SetColor( COLOR4D::UNSPECIFIED );
206
207 if( textBox.graphic_attributes().fill().has_color() )
208 SetFillColor( UnpackColor( textBox.graphic_attributes().fill().color() ) );
209 else
211
212 SetWidth( UnpackDistance( textBox.graphic_attributes().stroke().width(), schIUScale ) );
214 FromProtoEnum<LINE_STYLE, types::StrokeLineStyle>( textBox.graphic_attributes().stroke().style() ) );
215 SetFillMode( FromProtoEnum<FILL_T, types::GraphicFillType>( textBox.graphic_attributes().fill().fill_type() ) );
216 }
217
218 return true;
219}
220
221
223{
224 if( m_layer == LAYER_DEVICE )
225 return KiROUND( GetTextSize().y * 0.8 );
226 else
227 return KiROUND( GetStroke().GetWidth() / 2.0 ) + KiROUND( GetTextSize().y * 0.75 );
228}
229
230
232{
233 if( GetText().IsEmpty() )
234 return VECTOR2I( 0, 0 );
235
236 BOX2I textBox = GetTextBox( nullptr );
237
238 int textHeight = std::abs( textBox.GetHeight() );
239
240 if( GetTextAngle().IsVertical() )
241 {
242 textHeight += GetMarginLeft() + GetMarginRight();
243 return VECTOR2I( textHeight, 0 );
244 }
245
246 textHeight += GetMarginTop() + GetMarginBottom();
247 return VECTOR2I( 0, textHeight );
248}
249
250
252{
254
255 // Text is NOT really mirrored; it just has its justification flipped
257 {
262 }
263}
264
265
267{
269
270 // Text is NOT really mirrored; it just has its justification flipped
272 {
277 }
278}
279
280
281void SCH_TEXTBOX::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
282{
283 SCH_SHAPE::Rotate( aCenter, aRotateCCW );
285}
286
287
292
293
295{
296 BOX2I bbox = BOX2I( m_start, m_end - m_start );
297
298 bbox.Normalize();
299
300 VECTOR2I pos( bbox.GetLeft() + m_marginLeft, bbox.GetBottom() - m_marginBottom );
301
302 if( GetTextAngle().IsVertical() )
303 {
304 switch( GetHorizJustify() )
305 {
306 case GR_TEXT_H_ALIGN_LEFT: pos.y = bbox.GetBottom() - m_marginBottom; break;
307 case GR_TEXT_H_ALIGN_CENTER: pos.y = ( bbox.GetTop() + bbox.GetBottom() ) / 2; break;
308 case GR_TEXT_H_ALIGN_RIGHT: pos.y = bbox.GetTop() + m_marginTop; break;
309 case GR_TEXT_H_ALIGN_INDETERMINATE: wxFAIL_MSG( wxT( "Indeterminate state legal only in dialogs." ) ); break;
310 }
311
312 switch( GetVertJustify() )
313 {
314 case GR_TEXT_V_ALIGN_TOP: pos.x = bbox.GetLeft() + m_marginLeft; break;
315 case GR_TEXT_V_ALIGN_CENTER: pos.x = ( bbox.GetLeft() + bbox.GetRight() ) / 2; break;
316 case GR_TEXT_V_ALIGN_BOTTOM: pos.x = bbox.GetRight() - m_marginRight; break;
317 case GR_TEXT_V_ALIGN_INDETERMINATE: wxFAIL_MSG( wxT( "Indeterminate state legal only in dialogs." ) ); break;
318 }
319 }
320 else
321 {
322 switch( GetHorizJustify() )
323 {
324 case GR_TEXT_H_ALIGN_LEFT: pos.x = bbox.GetLeft() + m_marginLeft; break;
325 case GR_TEXT_H_ALIGN_CENTER: pos.x = ( bbox.GetLeft() + bbox.GetRight() ) / 2; break;
326 case GR_TEXT_H_ALIGN_RIGHT: pos.x = bbox.GetRight() - m_marginRight; break;
327 case GR_TEXT_H_ALIGN_INDETERMINATE: wxFAIL_MSG( wxT( "Indeterminate state legal only in dialogs." ) ); break;
328 }
329
330 switch( GetVertJustify() )
331 {
332 case GR_TEXT_V_ALIGN_TOP: pos.y = bbox.GetTop() + m_marginTop; break;
333 case GR_TEXT_V_ALIGN_CENTER: pos.y = ( bbox.GetTop() + bbox.GetBottom() ) / 2; break;
334 case GR_TEXT_V_ALIGN_BOTTOM: pos.y = bbox.GetBottom() - m_marginBottom; break;
335 case GR_TEXT_V_ALIGN_INDETERMINATE: wxFAIL_MSG( wxT( "Indeterminate state legal only in dialogs." ) ); break;
336 }
337 }
338
339 return pos;
340}
341
342
344{
345 SCH_SHAPE::swapData( aItem );
346
347 SCH_TEXTBOX* item = static_cast<SCH_TEXTBOX*>( aItem );
348
349 std::swap( m_marginLeft, item->m_marginLeft );
350 std::swap( m_marginTop, item->m_marginTop );
351 std::swap( m_marginRight, item->m_marginRight );
352 std::swap( m_marginBottom, item->m_marginBottom );
353
354 SwapText( *item );
355 SwapAttributes( *item );
356}
357
358
359bool SCH_TEXTBOX::operator<( const SCH_ITEM& aItem ) const
360{
361 if( Type() != aItem.Type() )
362 return Type() < aItem.Type();
363
364 auto other = static_cast<const SCH_TEXTBOX*>( &aItem );
365
366 if( GetLayer() != other->GetLayer() )
367 return GetLayer() < other->GetLayer();
368
369 if( GetPosition().x != other->GetPosition().x )
370 return GetPosition().x < other->GetPosition().x;
371
372 if( GetPosition().y != other->GetPosition().y )
373 return GetPosition().y < other->GetPosition().y;
374
375 if( GetMarginLeft() != other->GetMarginLeft() )
376 return GetMarginLeft() < other->GetMarginLeft();
377
378 if( GetMarginTop() != other->GetMarginTop() )
379 return GetMarginTop() < other->GetMarginTop();
380
381 if( GetMarginRight() != other->GetMarginRight() )
382 return GetMarginRight() < other->GetMarginRight();
383
384 if( GetMarginBottom() != other->GetMarginBottom() )
385 return GetMarginBottom() < other->GetMarginBottom();
386
387 if( GetExcludedFromSim() != other->GetExcludedFromSim() )
388 return GetExcludedFromSim() - other->GetExcludedFromSim();
389
390 return GetText() < other->GetText();
391}
392
393
395{
397
398 if( !font )
399 font = KIFONT::FONT::GetFont( GetDefaultFont( aSettings ), IsBold(), IsItalic() );
400
401 return font;
402}
403
404
405wxString SCH_TEXTBOX::GetShownText( const RENDER_SETTINGS* aSettings, const SCH_SHEET_PATH* aPath, bool aAllowExtraText,
406 int aDepth ) const
407{
408 // Use local depth counter so each text element starts fresh
409 int depth = 0;
410
411 SCH_SHEET* sheet = nullptr;
412
413 if( aPath )
414 sheet = aPath->Last();
415
416 std::function<bool( wxString* )> textResolver = [&]( wxString* token ) -> bool
417 {
418 if( sheet )
419 {
420 if( sheet->ResolveTextVar( aPath, token, depth + 1 ) )
421 return true;
422 }
423
424 return false;
425 };
426
427 wxString text = EDA_TEXT::GetShownText( aAllowExtraText, depth );
428
429 if( HasTextVars() )
430 text = ResolveTextVars( text, &textResolver, depth );
431
432 VECTOR2I size = GetEnd() - GetStart();
433 int colWidth;
434
435 if( GetTextAngle().IsVertical() )
436 colWidth = abs( size.y ) - ( GetMarginTop() + GetMarginBottom() );
437 else
438 colWidth = abs( size.x ) - ( GetMarginLeft() + GetMarginRight() );
439
440 GetDrawFont( aSettings )
442
443 // Convert escape markers back to literals for final display
444 text.Replace( wxT( "<<<ESC_DOLLAR:" ), wxT( "${" ) );
445 text.Replace( wxT( "<<<ESC_AT:" ), wxT( "@{" ) );
446
447 return text;
448}
449
450
451bool SCH_TEXTBOX::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
452{
453 BOX2I rect = GetBoundingBox();
454
455 rect.Inflate( aAccuracy );
456
457 return rect.Contains( aPosition );
458}
459
460
461bool SCH_TEXTBOX::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
462{
463 BOX2I rect = aRect;
464
465 rect.Inflate( aAccuracy );
466
467 if( aContained )
468 return rect.Contains( GetBoundingBox() );
469
470 return rect.Intersects( GetBoundingBox() );
471}
472
473
474bool SCH_TEXTBOX::HitTest( const SHAPE_LINE_CHAIN& aPoly, bool aContained ) const
475{
476 return KIGEOM::BoxHitTest( aPoly, GetBoundingBox(), aContained );
477}
478
479
481{
482 return HasHyperlink() || containsURL();
483}
484
485
487{
488 return !m_activeUrl.IsEmpty();
489}
490
491
492void SCH_TEXTBOX::DoHypertextAction( EDA_DRAW_FRAME* aFrame, const VECTOR2I& aMousePos ) const
493{
495
496 if( HasHyperlink() )
497 navTool->HypertextCommand( m_hyperlink );
498 else if( !m_activeUrl.IsEmpty() )
499 navTool->HypertextCommand( m_activeUrl );
500}
501
502
503wxString SCH_TEXTBOX::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
504{
505 return wxString::Format( _( "Text box '%s'" ),
506 aFull ? GetShownText( false ) : KIUI::EllipsizeMenuText( GetText() ) );
507}
508
509
514
515
516void SCH_TEXTBOX::Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS& aPlotOpts, int aUnit, int aBodyStyle,
517 const VECTOR2I& aOffset, bool aDimmed )
518{
519 if( IsPrivate() )
520 return;
521
522 SCH_SHAPE::Plot( aPlotter, aBackground, aPlotOpts, aUnit, aBodyStyle, aOffset, aDimmed );
523
524 if( aBackground )
525 return;
526
527 SCH_SHEET_PATH* sheet = Schematic() ? &Schematic()->CurrentSheet() : nullptr;
528 SCH_RENDER_SETTINGS* renderSettings = getRenderSettings( aPlotter );
529 int penWidth = GetEffectivePenWidth( renderSettings );
530 COLOR4D color = GetStroke().GetColor();
531 COLOR4D bg = renderSettings->GetBackgroundColor();
532
533 KIFONT::FONT* font = GetDrawFont( renderSettings );
534
535 color = GetTextColor();
536
537 if( !aPlotter->GetColorMode() || color == COLOR4D::UNSPECIFIED )
538 color = renderSettings->GetLayerColor( m_layer );
539
540 if( bg == COLOR4D::UNSPECIFIED || !aPlotter->GetColorMode() )
541 bg = COLOR4D::WHITE;
542
543 if( color.m_text && Schematic() )
544 color = COLOR4D( ResolveText( *color.m_text, &Schematic()->CurrentSheet() ) );
545
546 if( aDimmed )
547 {
548 color.Desaturate();
549 color = color.Mix( bg, 0.5f );
550 }
551
552 penWidth = GetEffectiveTextPenWidth( renderSettings->GetDefaultPenWidth() );
553 penWidth = std::max( penWidth, renderSettings->GetMinPenWidth() );
554 aPlotter->SetCurrentLineWidth( penWidth );
555
556 TEXT_ATTRIBUTES attrs;
557 std::vector<VECTOR2I> positions;
558 wxArrayString strings_list;
559
560 wxStringSplit( GetShownText( renderSettings, sheet, true ), strings_list, '\n' );
561 positions.reserve( strings_list.Count() );
562
563 if( renderSettings->m_Transform != TRANSFORM() || aOffset != VECTOR2I() )
564 {
565 SCH_TEXTBOX temp( *this );
566
567 if( renderSettings->m_Transform.y1 )
568 {
570 }
571
572 temp.SetStart( renderSettings->TransformCoordinate( m_start ) + aOffset );
573 temp.SetEnd( renderSettings->TransformCoordinate( m_end ) + aOffset );
574
575 attrs = temp.GetAttributes();
576 temp.GetLinePositions( renderSettings, positions, (int) strings_list.Count() );
577 }
578 else
579 {
580 attrs = GetAttributes();
581 GetLinePositions( renderSettings, positions, (int) strings_list.Count() );
582 }
583
584 attrs.m_StrokeWidth = penWidth;
585 attrs.m_Multiline = false;
586
587 for( unsigned ii = 0; ii < strings_list.Count(); ii++ )
588 {
589 aPlotter->PlotText( positions[ii], color, strings_list.Item( ii ), attrs, font, GetFontMetrics() );
590 }
591
592 if( HasHyperlink() )
593 aPlotter->HyperlinkBox( GetBoundingBox(), GetHyperlink() );
594}
595
596
597void SCH_TEXTBOX::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
598{
599 // Don't use GetShownText() here; we want to show the user the variable references
600 aList.emplace_back( _( "Text Box" ), KIUI::EllipsizeStatusText( aFrame, GetText() ) );
601
602 SCH_ITEM::GetMsgPanelInfo( aFrame, aList );
603
605 aList.emplace_back( _( "Exclude from" ), _( "Simulation" ) );
606
607 aList.emplace_back( _( "Font" ), GetFont() ? GetFont()->GetName() : _( "Default" ) );
608
609 wxString textStyle[] = { _( "Normal" ), _( "Italic" ), _( "Bold" ), _( "Bold Italic" ) };
610 int style = IsBold() && IsItalic() ? 3 : IsBold() ? 2 : IsItalic() ? 1 : 0;
611 aList.emplace_back( _( "Style" ), textStyle[style] );
612
613 aList.emplace_back( _( "Text Size" ), aFrame->MessageTextFromValue( GetTextWidth() ) );
614
615 aList.emplace_back( _( "Box Width" ), aFrame->MessageTextFromValue( std::abs( GetEnd().x - GetStart().x ) ) );
616
617 aList.emplace_back( _( "Box Height" ), aFrame->MessageTextFromValue( std::abs( GetEnd().y - GetStart().y ) ) );
618
619 m_stroke.GetMsgPanelInfo( aFrame, aList );
620}
621
622
623bool SCH_TEXTBOX::operator==( const SCH_ITEM& aOther ) const
624{
625 if( Type() != aOther.Type() )
626 return false;
627
628 const SCH_TEXTBOX& other = static_cast<const SCH_TEXTBOX&>( aOther );
629
631 return false;
632
633 if( GetMarginLeft() != other.GetMarginLeft() )
634 return false;
635
636 if( GetMarginTop() != other.GetMarginTop() )
637 return false;
638
639 if( GetMarginRight() != other.GetMarginRight() )
640 return false;
641
642 if( GetMarginBottom() != other.GetMarginBottom() )
643 return false;
644
645 return SCH_SHAPE::operator==( aOther ) && EDA_TEXT::operator==( other );
646}
647
648
649double SCH_TEXTBOX::Similarity( const SCH_ITEM& aOther ) const
650{
651 if( m_Uuid == aOther.m_Uuid )
652 return 1.0;
653
654 if( aOther.Type() != Type() )
655 return 0.0;
656
657 auto other = static_cast<const SCH_TEXTBOX&>( aOther );
658
659 double similarity = SimilarityBase( other );
660
661 if( m_excludedFromSim != other.m_excludedFromSim )
662 similarity *= 0.9;
663
664 if( GetMarginLeft() != other.GetMarginLeft() )
665 similarity *= 0.9;
666
667 if( GetMarginTop() != other.GetMarginTop() )
668 similarity *= 0.9;
669
670 if( GetMarginRight() != other.GetMarginRight() )
671 similarity *= 0.9;
672
673 if( GetMarginBottom() != other.GetMarginBottom() )
674 similarity *= 0.9;
675
676 similarity *= SCH_SHAPE::Similarity( aOther );
677 similarity *= EDA_TEXT::Similarity( other );
678
679 return similarity;
680}
681
682
683int SCH_TEXTBOX::compare( const SCH_ITEM& aOther, int aCompareFlags ) const
684{
685 wxASSERT( aOther.Type() == SCH_TEXTBOX_T );
686
687 int retv = SCH_SHAPE::compare( aOther, aCompareFlags );
688
689 if( retv )
690 return retv;
691
692 const SCH_TEXTBOX* tmp = static_cast<const SCH_TEXTBOX*>( &aOther );
693
694 int result = GetText().CmpNoCase( tmp->GetText() );
695
696 if( result != 0 )
697 return result;
698
699 if( GetTextWidth() != tmp->GetTextWidth() )
700 return GetTextWidth() - tmp->GetTextWidth();
701
702 if( GetTextHeight() != tmp->GetTextHeight() )
703 return GetTextHeight() - tmp->GetTextHeight();
704
705 if( IsBold() != tmp->IsBold() )
706 return IsBold() - tmp->IsBold();
707
708 if( IsItalic() != tmp->IsItalic() )
709 return IsItalic() - tmp->IsItalic();
710
711 if( GetHorizJustify() != tmp->GetHorizJustify() )
712 return (int) GetHorizJustify() - (int) tmp->GetHorizJustify();
713
714 if( GetTextAngle().AsTenthsOfADegree() != tmp->GetTextAngle().AsTenthsOfADegree() )
716
717 if( GetMarginLeft() != tmp->GetMarginLeft() )
718 return GetMarginLeft() - tmp->GetMarginLeft();
719
720 if( GetMarginTop() != tmp->GetMarginTop() )
721 return GetMarginTop() - tmp->GetMarginTop();
722
723 if( GetMarginRight() != tmp->GetMarginRight() )
724 return GetMarginRight() - tmp->GetMarginRight();
725
726 if( GetMarginBottom() != tmp->GetMarginBottom() )
727 return GetMarginBottom() - tmp->GetMarginBottom();
728
729 return 0;
730}
731
732
733static struct SCH_TEXTBOX_DESC
734{
736 {
739
746
747 propMgr.Mask( TYPE_HASH( SCH_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Shape" ) );
748 propMgr.Mask( TYPE_HASH( SCH_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Corner Radius" ) );
749
750 propMgr.Mask( TYPE_HASH( SCH_TEXTBOX ), TYPE_HASH( EDA_TEXT ), _HKI( "Width" ) );
751 propMgr.Mask( TYPE_HASH( SCH_TEXTBOX ), TYPE_HASH( EDA_TEXT ), _HKI( "Height" ) );
752 propMgr.Mask( TYPE_HASH( SCH_TEXTBOX ), TYPE_HASH( EDA_TEXT ), _HKI( "Thickness" ) );
753
754 const wxString marginProps = _( "Margins" );
755
758 marginProps );
761 marginProps );
764 marginProps );
767 marginProps );
768
771 _HKI( "Text Properties" ) );
772
773 propMgr.Mask( TYPE_HASH( SCH_TEXTBOX ), TYPE_HASH( EDA_TEXT ), _HKI( "Orientation" ) );
774 }
types::KiCadObjectType ToProtoEnum(KICAD_T aValue)
KICAD_T FromProtoEnum(types::KiCadObjectType aValue)
Definition api_enums.cpp:47
constexpr EDA_IU_SCALE schIUScale
Definition base_units.h:123
BITMAPS
A list of all bitmap identifiers.
BOX2< VECTOR2I > BOX2I
Definition box2.h:918
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition box2.h:986
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition box2.h:554
constexpr BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
Definition box2.h:142
constexpr size_type GetHeight() const
Definition box2.h:211
constexpr coord_type GetLeft() const
Definition box2.h:224
constexpr bool Contains(const Vec &aPoint) const
Definition box2.h:164
constexpr coord_type GetRight() const
Definition box2.h:213
constexpr coord_type GetTop() const
Definition box2.h:225
constexpr bool Intersects(const BOX2< Vec > &aRect) const
Definition box2.h:307
constexpr coord_type GetBottom() const
Definition box2.h:218
static const COLOR4D WHITE
Definition color4d.h:401
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
Definition color4d.h:398
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:531
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:108
virtual void SetEnd(const VECTOR2I &aEnd)
Definition eda_shape.h:244
FILL_T GetFillMode() const
Definition eda_shape.h:158
void SetLineStyle(const LINE_STYLE aStyle)
void SetFillColor(const COLOR4D &aColor)
Definition eda_shape.h:170
VECTOR2I m_start
Definition eda_shape.h:604
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
Definition eda_shape.h:240
LINE_STYLE GetLineStyle() const
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
Definition eda_shape.h:190
COLOR4D GetFillColor() const
Definition eda_shape.h:169
VECTOR2I m_end
Definition eda_shape.h:605
virtual int GetWidth() const
Definition eda_shape.h:173
STROKE_PARAMS m_stroke
Definition eda_shape.h:593
virtual void SetWidth(int aWidth)
void SetFillMode(FILL_T aFill)
virtual void SetStart(const VECTOR2I &aStart)
Definition eda_shape.h:194
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Definition eda_text.h:89
virtual VECTOR2I GetTextSize() const
Definition eda_text.h:282
COLOR4D GetTextColor() const
Definition eda_text.h:291
bool IsItalic() const
Definition eda_text.h:190
bool IsMultilineAllowed() const
Definition eda_text.h:218
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition eda_text.h:110
bool IsKeepUpright() const
Definition eda_text.h:227
virtual int GetTextHeight() const
Definition eda_text.h:288
KIFONT::FONT * GetFont() const
Definition eda_text.h:268
void SetAttributes(const EDA_TEXT &aSrc, bool aSetPosition=true)
Set the text attributes from another instance.
Definition eda_text.cpp:428
wxString m_hyperlink
A hyperlink URL.
Definition eda_text.h:476
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:773
virtual bool HasHyperlink() const
Definition eda_text.h:423
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
Definition eda_text.cpp:412
wxString GetHyperlink() const
Definition eda_text.h:424
virtual int GetTextWidth() const
Definition eda_text.h:285
GR_TEXT_H_ALIGN_T GetHorizJustify() const
Definition eda_text.h:221
bool HasTextVars() const
Indicates the ShownText has text var references which need to be processed.
Definition eda_text.h:129
bool containsURL() const
EDA_TEXT(const EDA_IU_SCALE &aIuScale, const wxString &aText=wxEmptyString)
Definition eda_text.cpp:98
wxString m_activeUrl
Definition eda_text.h:478
double GetLineSpacing() const
Definition eda_text.h:279
double Similarity(const EDA_TEXT &aOther) const
virtual EDA_ANGLE GetTextAngle() const
Definition eda_text.h:168
const TEXT_ATTRIBUTES & GetAttributes() const
Definition eda_text.h:252
bool IsMirrored() const
Definition eda_text.h:211
int GetEffectiveTextPenWidth(int aDefaultPenWidth=0) const
The EffectiveTextPenWidth uses the text thickness if > 1 or aDefaultPenWidth.
Definition eda_text.cpp:461
void SwapAttributes(EDA_TEXT &aTradingPartner)
Swap the text attributes of the two involved instances.
Definition eda_text.cpp:448
double GetTextAngleDegrees() const
Definition eda_text.h:175
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:943
bool IsBold() const
Definition eda_text.h:205
GR_TEXT_V_ALIGN_T GetVertJustify() const
Definition eda_text.h:224
virtual wxString GetShownText(bool aAllowExtraText, int aDepth=0) const
Return the string actually shown after processing of the base text.
Definition eda_text.h:121
virtual int GetTextThickness() const
Definition eda_text.h:149
virtual void SetText(const wxString &aText)
Definition eda_text.cpp:265
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
Definition eda_text.cpp:294
void SwapText(EDA_TEXT &aTradingPartner)
Definition eda_text.cpp:440
bool operator==(const EDA_TEXT &aRhs) const
Definition eda_text.h:419
void SetMultilineAllowed(bool aAllow)
Definition eda_text.cpp:396
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
Definition eda_text.cpp:404
FONT is an abstract base class for both outline and stroke fonts.
Definition font.h:94
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:143
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:605
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:101
std::shared_ptr< wxString > m_text
Definition color4d.h:395
COLOR4D & Desaturate()
Removes color (in HSL model)
Definition color4d.cpp:528
COLOR4D Mix(const COLOR4D &aColor, double aFactor) const
Return a color that is mixed with the input by a factor.
Definition color4d.h:292
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.
Definition kiid.h:44
Base plotter engine class.
Definition plotter.h:133
virtual void HyperlinkBox(const BOX2I &aBox, const wxString &aDestinationURL)
Create a clickable hyperlink with a rectangular click area.
Definition plotter.h:503
bool GetColorMode() const
Definition plotter.h:161
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:712
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:189
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:825
void SetLocked(bool aLocked) override
Definition sch_item.h:251
SCH_RENDER_SETTINGS * getRenderSettings(PLOTTER *aPlotter) const
Definition sch_item.h:724
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
Definition sch_item.cpp:268
bool IsLocked() const override
Definition sch_item.cpp:148
bool IsPrivate() const
Definition sch_item.h:248
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition sch_item.h:338
const wxString & GetDefaultFont(const RENDER_SETTINGS *aSettings) const
Definition sch_item.cpp:768
SCH_ITEM(EDA_ITEM *aParent, KICAD_T aType, int aUnit=0, int aBodyStyle=0)
Definition sch_item.cpp:52
wxString ResolveText(const wxString &aText, const SCH_SHEET_PATH *aPath, int aDepth=0) const
Definition sch_item.cpp:377
const KIFONT::METRICS & GetFontMetrics() const
Definition sch_item.cpp:781
int GetEffectivePenWidth(const SCH_RENDER_SETTINGS *aSettings) const
Definition sch_item.cpp:790
SCH_LAYER_ID m_layer
Definition sch_item.h:775
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:377
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 SetPosition(const VECTOR2I &aPos) override
Definition sch_shape.h:85
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:90
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:57
VECTOR2I GetPosition() const override
Definition sch_shape.h:84
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:44
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:67
int GetMarginBottom() const
Definition sch_textbox.h:72
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:69
int GetSchTextSize() const
Definition sch_textbox.h:74
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 Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
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:71
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:70
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
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:64
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:66
void SetSchTextSize(int aSize)
Definition sch_textbox.h:75
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 SetExcludedFromSim(bool aExclude, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
Definition sch_textbox.h:98
void SetMarginTop(int aTop)
Definition sch_textbox.h:65
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
KIGFX::COLOR4D GetColor() const
KIGFX::COLOR4D m_Color
GR_TEXT_H_ALIGN_T m_Halign
GR_TEXT_V_ALIGN_T m_Valign
KIFONT::FONT * m_Font
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
for transforming drawing coordinates for a wxDC device context.
Definition transform.h:42
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)
@ DEGREES_T
Definition eda_angle.h:31
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:44
FILL_T
Definition eda_shape.h:59
a few functions useful in geometry calculations.
SCH_LAYER_ID
Eeschema drawing layers.
Definition layer_ids.h:447
@ LAYER_DEVICE
Definition layer_ids.h:464
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.
KICOMMON_API void PackColor(types::Color &aOutput, const KIGFX::COLOR4D &aInput)
KICOMMON_API int UnpackDistance(const types::Distance &aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API KIGFX::COLOR4D UnpackColor(const types::Color &aInput)
KICOMMON_API VECTOR2I UnpackVector2(const types::Vector2 &aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API void PackDistance(types::Distance &aOutput, int aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API void PackVector2(types::Vector2 &aOutput, const VECTOR2I &aInput, const EDA_IU_SCALE &aScale)
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
Definition eda_angle.h:400
#define _HKI(x)
Definition page_info.cpp:40
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:71
@ SCH_TEXTBOX_T
Definition typeinfo.h:149
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:683