diff --git a/common/eda_text.cpp b/common/eda_text.cpp index 5be08f3dd8..74e1283148 100644 --- a/common/eda_text.cpp +++ b/common/eda_text.cpp @@ -270,10 +270,13 @@ void EDA_TEXT::SetKeepUpright( bool aKeepUpright ) } -void EDA_TEXT::SetAttributes( const EDA_TEXT& aSrc ) +void EDA_TEXT::SetAttributes( const EDA_TEXT& aSrc, bool aSetPosition ) { m_attributes = aSrc.m_attributes; - m_pos = aSrc.m_pos; + + if( aSetPosition ) + m_pos = aSrc.m_pos; + ClearRenderCache(); m_bounding_box_cache_valid = false; } diff --git a/eeschema/dialogs/dialog_global_edit_text_and_graphics.cpp b/eeschema/dialogs/dialog_global_edit_text_and_graphics.cpp index 9639fb0a29..c16c43b9ea 100644 --- a/eeschema/dialogs/dialog_global_edit_text_and_graphics.cpp +++ b/eeschema/dialogs/dialog_global_edit_text_and_graphics.cpp @@ -314,10 +314,10 @@ void DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS::processItem( SCH_COMMIT* aCommit, } } - if( SCH_TEXT* sch_text = dynamic_cast( aItem ) ) + if( SCH_LABEL_BASE* sch_label = dynamic_cast( aItem ) ) { if( m_orientation->GetStringSelection() != INDETERMINATE_ACTION ) - sch_text->SetTextSpinStyle( (TEXT_SPIN_STYLE::SPIN) m_orientation->GetSelection() ); + sch_label->SetSpinStyle( (SPIN_STYLE::SPIN) m_orientation->GetSelection() ); } if( SCH_FIELD* sch_field = dynamic_cast( aItem ) ) diff --git a/eeschema/dialogs/dialog_global_edit_text_and_graphics_base.cpp b/eeschema/dialogs/dialog_global_edit_text_and_graphics_base.cpp index a6ea73afa3..58c32eee64 100644 --- a/eeschema/dialogs/dialog_global_edit_text_and_graphics_base.cpp +++ b/eeschema/dialogs/dialog_global_edit_text_and_graphics_base.cpp @@ -214,6 +214,24 @@ DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS_BASE::DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS_ m_bold = new wxCheckBox( m_specifiedValues, wxID_ANY, _("Bold"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE|wxCHK_ALLOW_3RD_STATE_FOR_USER ); fgSizer1->Add( m_bold, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + m_italic = new wxCheckBox( m_specifiedValues, wxID_ANY, _("Italic"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE|wxCHK_ALLOW_3RD_STATE_FOR_USER ); + fgSizer1->Add( m_italic, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + + fgSizer1->Add( 0, 5, 1, wxEXPAND, 5 ); + + + fgSizer1->Add( 0, 0, 1, wxEXPAND, 5 ); + + + fgSizer1->Add( 0, 0, 1, wxEXPAND, 5 ); + + + fgSizer1->Add( 0, 0, 1, wxEXPAND, 5 ); + + + fgSizer1->Add( 0, 0, 1, wxEXPAND, 5 ); + fgSizer1->Add( 0, 0, 1, wxEXPAND, 5 ); @@ -227,14 +245,15 @@ DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS_BASE::DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS_ m_orientation->SetSelection( 4 ); fgSizer1->Add( m_orientation, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxBOTTOM, 4 ); - - fgSizer1->Add( 0, 0, 1, wxEXPAND, 5 ); + m_staticText16 = new wxStaticText( m_specifiedValues, wxID_ANY, _("(labels only)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText16->Wrap( -1 ); + fgSizer1->Add( m_staticText16, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); fgSizer1->Add( 0, 0, 0, wxEXPAND|wxRIGHT|wxLEFT, 25 ); - m_italic = new wxCheckBox( m_specifiedValues, wxID_ANY, _("Italic"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE|wxCHK_ALLOW_3RD_STATE_FOR_USER ); - fgSizer1->Add( m_italic, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + fgSizer1->Add( 0, 0, 1, wxEXPAND, 5 ); fgSizer1->Add( 0, 0, 1, wxEXPAND, 5 ); diff --git a/eeschema/dialogs/dialog_global_edit_text_and_graphics_base.fbp b/eeschema/dialogs/dialog_global_edit_text_and_graphics_base.fbp index 285f25a7fe..4b2cfcfb62 100644 --- a/eeschema/dialogs/dialog_global_edit_text_and_graphics_base.fbp +++ b/eeschema/dialogs/dialog_global_edit_text_and_graphics_base.fbp @@ -2389,6 +2389,120 @@ + + 5 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Italic + + 0 + + + 0 + + 1 + m_italic + 1 + + + protected + 1 + + Resizable + 1 + + wxCHK_3STATE|wxCHK_ALLOW_3RD_STATE_FOR_USER + ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxEXPAND + 1 + + 5 + protected + 0 + + + + 5 + wxEXPAND + 1 + + 0 + protected + 0 + + + + 5 + wxEXPAND + 1 + + 0 + protected + 0 + + + + 5 + wxEXPAND + 1 + + 0 + protected + 0 + + + + 5 + wxEXPAND + 1 + + 0 + protected + 0 + + 5 wxEXPAND @@ -2526,29 +2640,9 @@ 5 - wxEXPAND - 1 - - 0 - protected - 0 - - - - 25 - wxEXPAND|wxRIGHT|wxLEFT + wxLEFT|wxALIGN_CENTER_VERTICAL 0 - - 0 - protected - 0 - - - - 5 - wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT - 0 - + 1 1 1 @@ -2562,7 +2656,6 @@ 1 0 - 0 1 1 @@ -2577,7 +2670,8 @@ 0 0 wxID_ANY - Italic + (labels only) + 0 0 @@ -2585,7 +2679,7 @@ 0 1 - m_italic + m_staticText16 1 @@ -2595,17 +2689,34 @@ Resizable 1 - wxCHK_3STATE|wxCHK_ALLOW_3RD_STATE_FOR_USER - ; forward_declare + + ; ; forward_declare 0 - - wxFILTER_NONE - wxDefaultValidator - + -1 + + + + 25 + wxEXPAND|wxRIGHT|wxLEFT + 0 + + 0 + protected + 0 + + + + 5 + wxEXPAND + 1 + + 0 + protected + 0 diff --git a/eeschema/dialogs/dialog_global_edit_text_and_graphics_base.h b/eeschema/dialogs/dialog_global_edit_text_and_graphics_base.h index 70ad4367dd..c38cdee192 100644 --- a/eeschema/dialogs/dialog_global_edit_text_and_graphics_base.h +++ b/eeschema/dialogs/dialog_global_edit_text_and_graphics_base.h @@ -74,9 +74,10 @@ class DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS_BASE : public DIALOG_SHIM wxTextCtrl* m_textSizeCtrl; wxStaticText* m_textSizeUnits; wxCheckBox* m_bold; + wxCheckBox* m_italic; wxStaticText* orientationLabel; wxChoice* m_orientation; - wxCheckBox* m_italic; + wxStaticText* m_staticText16; wxStaticText* hAlignLabel; wxChoice* m_hAlign; wxStaticText* m_staticText14; diff --git a/eeschema/dialogs/dialog_label_properties.cpp b/eeschema/dialogs/dialog_label_properties.cpp index 29c7626d35..60a30c8f28 100644 --- a/eeschema/dialogs/dialog_label_properties.cpp +++ b/eeschema/dialogs/dialog_label_properties.cpp @@ -348,12 +348,12 @@ bool DIALOG_LABEL_PROPERTIES::TransferDataToWindow() m_italic->Check( m_currentLabel->IsItalic() ); m_textColorSwatch->SetSwatchColor( m_currentLabel->GetTextColor(), false ); - switch( m_currentLabel->GetTextSpinStyle() ) + switch( m_currentLabel->GetSpinStyle() ) { - case TEXT_SPIN_STYLE::RIGHT: m_spin0->Check( true ); break; - case TEXT_SPIN_STYLE::LEFT: m_spin1->Check( true ); break; - case TEXT_SPIN_STYLE::UP: m_spin2->Check( true ); break; - case TEXT_SPIN_STYLE::BOTTOM: m_spin3->Check( true ); break; + case SPIN_STYLE::RIGHT: m_spin0->Check( true ); break; + case SPIN_STYLE::LEFT: m_spin1->Check( true ); break; + case SPIN_STYLE::UP: m_spin2->Check( true ); break; + case SPIN_STYLE::BOTTOM: m_spin3->Check( true ); break; } if( m_currentLabel->AutoRotateOnPlacementSupported() ) @@ -553,12 +553,12 @@ bool DIALOG_LABEL_PROPERTIES::TransferDataFromWindow() m_currentLabel->SetTextColor( m_textColorSwatch->GetSwatchColor() ); - TEXT_SPIN_STYLE selectedSpinStyle= TEXT_SPIN_STYLE::LEFT; + SPIN_STYLE selectedSpinStyle= SPIN_STYLE::LEFT; - if( m_spin0->IsChecked() ) selectedSpinStyle = TEXT_SPIN_STYLE::RIGHT; - else if( m_spin1->IsChecked() ) selectedSpinStyle = TEXT_SPIN_STYLE::LEFT; - else if( m_spin2->IsChecked() ) selectedSpinStyle = TEXT_SPIN_STYLE::UP; - else if( m_spin3->IsChecked() ) selectedSpinStyle = TEXT_SPIN_STYLE::BOTTOM; + if( m_spin0->IsChecked() ) selectedSpinStyle = SPIN_STYLE::RIGHT; + else if( m_spin1->IsChecked() ) selectedSpinStyle = SPIN_STYLE::LEFT; + else if( m_spin2->IsChecked() ) selectedSpinStyle = SPIN_STYLE::UP; + else if( m_spin3->IsChecked() ) selectedSpinStyle = SPIN_STYLE::BOTTOM; if( m_currentLabel->AutoRotateOnPlacementSupported() ) { @@ -572,9 +572,9 @@ bool DIALOG_LABEL_PROPERTIES::TransferDataFromWindow() } if( !m_currentLabel->AutoRotateOnPlacement() - && m_currentLabel->GetTextSpinStyle() != selectedSpinStyle ) + && m_currentLabel->GetSpinStyle() != selectedSpinStyle ) { - m_currentLabel->SetTextSpinStyle( selectedSpinStyle ); + m_currentLabel->SetSpinStyle( selectedSpinStyle ); } if( doAutoplace ) diff --git a/eeschema/dialogs/dialog_lib_text_properties_base.cpp b/eeschema/dialogs/dialog_lib_text_properties_base.cpp index bb3113c055..85156d2fe8 100644 --- a/eeschema/dialogs/dialog_lib_text_properties_base.cpp +++ b/eeschema/dialogs/dialog_lib_text_properties_base.cpp @@ -67,7 +67,7 @@ DIALOG_LIB_TEXT_PROPERTIES_BASE::DIALOG_LIB_TEXT_PROPERTIES_BASE( wxWindow* pare m_fontLabel = new wxStaticText( this, wxID_ANY, _("Font:"), wxDefaultPosition, wxDefaultSize, 0 ); m_fontLabel->Wrap( -1 ); - gbSizer1->Add( m_fontLabel, wxGBPosition( 2, 0 ), wxGBSpan( 1, 1 ), wxRIGHT|wxLEFT, 5 ); + gbSizer1->Add( m_fontLabel, wxGBPosition( 2, 0 ), wxGBSpan( 1, 1 ), wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); wxString m_fontCtrlChoices[] = { _("Default Font"), _("KiCad Font") }; int m_fontCtrlNChoices = sizeof( m_fontCtrlChoices ) / sizeof( wxString ); diff --git a/eeschema/dialogs/dialog_lib_text_properties_base.fbp b/eeschema/dialogs/dialog_lib_text_properties_base.fbp index 2fab22e445..a746ddf47e 100644 --- a/eeschema/dialogs/dialog_lib_text_properties_base.fbp +++ b/eeschema/dialogs/dialog_lib_text_properties_base.fbp @@ -226,7 +226,7 @@ 5 1 0 - wxRIGHT|wxLEFT + wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL 2 1 diff --git a/eeschema/dialogs/dialog_text_properties.cpp b/eeschema/dialogs/dialog_text_properties.cpp index d3f5ab5689..65bbb14427 100644 --- a/eeschema/dialogs/dialog_text_properties.cpp +++ b/eeschema/dialogs/dialog_text_properties.cpp @@ -72,14 +72,12 @@ DIALOG_TEXT_PROPERTIES::DIALOG_TEXT_PROPERTIES( SCH_EDIT_FRAME* aParent, SCH_ITE } else { - m_hAlignCenter->Show( false ); m_separator3->Show( false ); m_vAlignTop->Show( false ); m_vAlignCenter->Show( false ); m_vAlignBottom->Show( false ); wxSizer* parentSizer = m_vAlignTop->GetContainingSizer(); - parentSizer->Detach( m_hAlignCenter ); parentSizer->Detach( m_separator3 ); parentSizer->Detach( m_vAlignTop ); parentSizer->Detach( m_vAlignCenter ); @@ -271,17 +269,22 @@ bool DIALOG_TEXT_PROPERTIES::TransferDataToWindow() m_bold->Check( m_currentText->IsBold() ); m_italic->Check( m_currentText->IsItalic() ); + switch( m_currentText->GetHorizJustify() ) + { + case GR_TEXT_H_ALIGN_LEFT: m_hAlignLeft->Check(); break; + case GR_TEXT_H_ALIGN_CENTER: m_hAlignCenter->Check(); break; + case GR_TEXT_H_ALIGN_RIGHT: m_hAlignRight->Check(); break; + } + + if( m_currentText->GetTextAngle() == ANGLE_VERTICAL ) + m_vertical->Check(); + else + m_horizontal->Check(); + if( m_currentItem->Type() == SCH_TEXTBOX_T ) { SCH_TEXTBOX* textBox = static_cast( m_currentItem ); - switch( m_currentText->GetHorizJustify() ) - { - case GR_TEXT_H_ALIGN_LEFT: m_hAlignLeft->Check(); break; - case GR_TEXT_H_ALIGN_CENTER: m_hAlignCenter->Check(); break; - case GR_TEXT_H_ALIGN_RIGHT: m_hAlignRight->Check(); break; - } - switch( m_currentText->GetVertJustify() ) { case GR_TEXT_V_ALIGN_TOP: m_vAlignTop->Check(); break; @@ -289,11 +292,6 @@ bool DIALOG_TEXT_PROPERTIES::TransferDataToWindow() case GR_TEXT_V_ALIGN_BOTTOM: m_vAlignBottom->Check(); break; } - if( m_currentText->GetTextAngle() == ANGLE_VERTICAL ) - m_vertical->Check(); - else - m_horizontal->Check(); - m_borderCheckbox->SetValue( textBox->GetWidth() >= 0 ); if( textBox->GetWidth() >= 0 ) @@ -322,28 +320,6 @@ bool DIALOG_TEXT_PROPERTIES::TransferDataToWindow() m_fillColorLabel->Enable( textBox->IsFilled() ); m_fillColorSwatch->Enable( textBox->IsFilled() ); } - else - { - switch( static_cast( m_currentItem )->GetTextSpinStyle() ) - { - case TEXT_SPIN_STYLE::RIGHT: - m_hAlignLeft->Check( true ); // Spin style to right means text aligned left - m_horizontal->Check( true ); - break; - case TEXT_SPIN_STYLE::LEFT: - m_hAlignRight->Check( true ); // Spin style to left means text aligned right - m_horizontal->Check( true ); - break; - case TEXT_SPIN_STYLE::UP: - m_hAlignLeft->Check( true ); // Spin style up means text aligned to bottom - m_vertical->Check( true ); - break; - case TEXT_SPIN_STYLE::BOTTOM: // Spin style down means text aligned to top - m_hAlignRight->Check( true ); - m_vertical->Check( true ); - break; - } - } return true; } @@ -522,36 +498,22 @@ bool DIALOG_TEXT_PROPERTIES::TransferDataFromWindow() m_currentText->SetItalic( m_italic->IsChecked() ); m_currentText->SetTextColor( m_textColorSwatch->GetSwatchColor() ); - if( m_currentItem->Type() == SCH_TEXT_T ) - { - SCH_TEXT* textItem = static_cast( m_currentItem ); - - if( m_hAlignRight->IsChecked() ) - { - if( m_vertical->IsChecked() ) - textItem->SetTextSpinStyle( TEXT_SPIN_STYLE::BOTTOM ); - else - textItem->SetTextSpinStyle( TEXT_SPIN_STYLE::LEFT ); - } - else - { - if( m_vertical->IsChecked() ) - textItem->SetTextSpinStyle( TEXT_SPIN_STYLE::UP ); - else - textItem->SetTextSpinStyle( TEXT_SPIN_STYLE::RIGHT ); - } - } + if( m_hAlignRight->IsChecked() ) + m_currentText->SetHorizJustify( GR_TEXT_H_ALIGN_RIGHT ); + else if( m_hAlignCenter->IsChecked() ) + m_currentText->SetHorizJustify( GR_TEXT_H_ALIGN_CENTER ); else + m_currentText->SetHorizJustify( GR_TEXT_H_ALIGN_LEFT ); + + if( m_vertical->IsChecked() ) + m_currentText->SetTextAngle( ANGLE_VERTICAL ); + else + m_currentText->SetTextAngle( ANGLE_HORIZONTAL ); + + if( m_currentItem->Type() == SCH_TEXTBOX_T ) { SCH_TEXTBOX* textBox = static_cast( m_currentItem ); - if( m_hAlignRight->IsChecked() ) - m_currentText->SetHorizJustify( GR_TEXT_H_ALIGN_RIGHT ); - else if( m_hAlignCenter->IsChecked() ) - m_currentText->SetHorizJustify( GR_TEXT_H_ALIGN_CENTER ); - else - m_currentText->SetHorizJustify( GR_TEXT_H_ALIGN_LEFT ); - if( m_vAlignBottom->IsChecked() ) m_currentText->SetVertJustify( GR_TEXT_V_ALIGN_BOTTOM ); else if( m_vAlignCenter->IsChecked() ) @@ -559,11 +521,6 @@ bool DIALOG_TEXT_PROPERTIES::TransferDataFromWindow() else m_currentText->SetVertJustify( GR_TEXT_V_ALIGN_TOP ); - if( m_vertical->IsChecked() ) - m_currentText->SetTextAngle( ANGLE_VERTICAL ); - else - m_currentText->SetTextAngle( ANGLE_HORIZONTAL ); - STROKE_PARAMS stroke = textBox->GetStroke(); if( m_borderCheckbox->GetValue() ) diff --git a/eeschema/dialogs/dialog_text_properties_base.cpp b/eeschema/dialogs/dialog_text_properties_base.cpp index 3a127d631e..ae3272af39 100644 --- a/eeschema/dialogs/dialog_text_properties_base.cpp +++ b/eeschema/dialogs/dialog_text_properties_base.cpp @@ -32,7 +32,7 @@ DIALOG_TEXT_PROPERTIES_BASE::DIALOG_TEXT_PROPERTIES_BASE( wxWindow* parent, wxWi m_textEntrySizer = new wxGridBagSizer( 2, 3 ); m_textEntrySizer->SetFlexibleDirection( wxBOTH ); m_textEntrySizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_textEntrySizer->SetEmptyCellSize( wxSize( 0,10 ) ); + m_textEntrySizer->SetEmptyCellSize( wxSize( 0,12 ) ); m_textLabel = new wxStaticText( this, wxID_ANY, _("Text:"), wxDefaultPosition, wxDefaultSize, 0 ); m_textLabel->Wrap( -1 ); @@ -84,17 +84,17 @@ DIALOG_TEXT_PROPERTIES_BASE::DIALOG_TEXT_PROPERTIES_BASE( wxWindow* parent, wxWi m_textEntrySizer->Add( bSizer41, wxGBPosition( 1, 5 ), wxGBSpan( 1, 1 ), wxEXPAND|wxALIGN_RIGHT|wxLEFT, 5 ); m_excludeFromSim = new wxCheckBox( this, wxID_ANY, _("Exclude from simulation"), wxDefaultPosition, wxDefaultSize, 0 ); - m_textEntrySizer->Add( m_excludeFromSim, wxGBPosition( 1, 0 ), wxGBSpan( 1, 2 ), wxTOP|wxBOTTOM, 10 ); + m_textEntrySizer->Add( m_excludeFromSim, wxGBPosition( 1, 0 ), wxGBSpan( 1, 2 ), wxTOP, 10 ); m_fontLabel = new wxStaticText( this, wxID_ANY, _("Font:"), wxDefaultPosition, wxDefaultSize, 0 ); m_fontLabel->Wrap( -1 ); - m_textEntrySizer->Add( m_fontLabel, wxGBPosition( 2, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxTOP, 5 ); + m_textEntrySizer->Add( m_fontLabel, wxGBPosition( 3, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); wxString m_fontCtrlChoices[] = { _("Default Font"), _("KiCad Font") }; int m_fontCtrlNChoices = sizeof( m_fontCtrlChoices ) / sizeof( wxString ); m_fontCtrl = new FONT_CHOICE( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_fontCtrlNChoices, m_fontCtrlChoices, 0 ); m_fontCtrl->SetSelection( 0 ); - m_textEntrySizer->Add( m_fontCtrl, wxGBPosition( 2, 1 ), wxGBSpan( 1, 2 ), wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP, 5 ); + m_textEntrySizer->Add( m_fontCtrl, wxGBPosition( 3, 1 ), wxGBSpan( 1, 2 ), wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); wxBoxSizer* bSizeCtrlSizer; bSizeCtrlSizer = new wxBoxSizer( wxHORIZONTAL ); @@ -175,11 +175,11 @@ DIALOG_TEXT_PROPERTIES_BASE::DIALOG_TEXT_PROPERTIES_BASE( wxWindow* parent, wxWi bSizeCtrlSizer->Add( m_separator5, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_textEntrySizer->Add( bSizeCtrlSizer, wxGBPosition( 2, 3 ), wxGBSpan( 1, 2 ), wxEXPAND|wxTOP, 5 ); + m_textEntrySizer->Add( bSizeCtrlSizer, wxGBPosition( 3, 3 ), wxGBSpan( 1, 2 ), wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); m_textSizeLabel = new wxStaticText( this, wxID_ANY, _("Text size:"), wxDefaultPosition, wxDefaultSize, 0 ); m_textSizeLabel->Wrap( -1 ); - m_textEntrySizer->Add( m_textSizeLabel, wxGBPosition( 3, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); + m_textEntrySizer->Add( m_textSizeLabel, wxGBPosition( 4, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); wxBoxSizer* bSizer71; bSizer71 = new wxBoxSizer( wxHORIZONTAL ); @@ -212,14 +212,14 @@ DIALOG_TEXT_PROPERTIES_BASE::DIALOG_TEXT_PROPERTIES_BASE( wxWindow* parent, wxWi bSizer71->Add( m_panelBorderColor1, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_textEntrySizer->Add( bSizer71, wxGBPosition( 3, 1 ), wxGBSpan( 1, 1 ), wxEXPAND, 5 ); + m_textEntrySizer->Add( bSizer71, wxGBPosition( 4, 1 ), wxGBSpan( 1, 1 ), wxEXPAND, 5 ); m_borderCheckbox = new wxCheckBox( this, wxID_ANY, _("Border"), wxDefaultPosition, wxDefaultSize, 0 ); - m_textEntrySizer->Add( m_borderCheckbox, wxGBPosition( 5, 0 ), wxGBSpan( 1, 2 ), wxBOTTOM, 2 ); + m_textEntrySizer->Add( m_borderCheckbox, wxGBPosition( 6, 0 ), wxGBSpan( 1, 2 ), wxBOTTOM, 2 ); m_borderWidthLabel = new wxStaticText( this, wxID_ANY, _("Width:"), wxDefaultPosition, wxDefaultSize, 0 ); m_borderWidthLabel->Wrap( -1 ); - m_textEntrySizer->Add( m_borderWidthLabel, wxGBPosition( 6, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); + m_textEntrySizer->Add( m_borderWidthLabel, wxGBPosition( 7, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); wxBoxSizer* bSizer7; bSizer7 = new wxBoxSizer( wxHORIZONTAL ); @@ -252,19 +252,19 @@ DIALOG_TEXT_PROPERTIES_BASE::DIALOG_TEXT_PROPERTIES_BASE( wxWindow* parent, wxWi bSizer7->Add( m_panelBorderColor, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_textEntrySizer->Add( bSizer7, wxGBPosition( 6, 1 ), wxGBSpan( 1, 2 ), wxEXPAND, 5 ); + m_textEntrySizer->Add( bSizer7, wxGBPosition( 7, 1 ), wxGBSpan( 1, 2 ), wxEXPAND, 5 ); m_borderStyleLabel = new wxStaticText( this, wxID_ANY, _("Style:"), wxDefaultPosition, wxDefaultSize, 0 ); m_borderStyleLabel->Wrap( -1 ); - m_textEntrySizer->Add( m_borderStyleLabel, wxGBPosition( 7, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); + m_textEntrySizer->Add( m_borderStyleLabel, wxGBPosition( 8, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); m_borderStyleCombo = new wxBitmapComboBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY ); m_borderStyleCombo->SetMinSize( wxSize( 240,-1 ) ); - m_textEntrySizer->Add( m_borderStyleCombo, wxGBPosition( 7, 1 ), wxGBSpan( 1, 2 ), wxEXPAND, 5 ); + m_textEntrySizer->Add( m_borderStyleCombo, wxGBPosition( 8, 1 ), wxGBSpan( 1, 2 ), wxEXPAND, 5 ); m_filledCtrl = new wxCheckBox( this, wxID_ANY, _("Background fill"), wxDefaultPosition, wxDefaultSize, 0 ); - m_textEntrySizer->Add( m_filledCtrl, wxGBPosition( 5, 4 ), wxGBSpan( 1, 2 ), wxRIGHT, 80 ); + m_textEntrySizer->Add( m_filledCtrl, wxGBPosition( 6, 4 ), wxGBSpan( 1, 2 ), wxRIGHT, 80 ); wxBoxSizer* bSizer8; bSizer8 = new wxBoxSizer( wxHORIZONTAL ); @@ -287,13 +287,13 @@ DIALOG_TEXT_PROPERTIES_BASE::DIALOG_TEXT_PROPERTIES_BASE( wxWindow* parent, wxWi bSizer8->Add( m_panelFillColor, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_textEntrySizer->Add( bSizer8, wxGBPosition( 6, 4 ), wxGBSpan( 1, 2 ), wxEXPAND, 5 ); + m_textEntrySizer->Add( bSizer8, wxGBPosition( 7, 4 ), wxGBSpan( 1, 2 ), wxEXPAND, 5 ); m_hyperlinkCb = new wxCheckBox( this, wxID_ANY, _("Link:"), wxDefaultPosition, wxDefaultSize, 0 ); m_hyperlinkCb->SetValue(true); m_hyperlinkCb->SetToolTip( _("Make this text item a clickable hyperlink") ); - m_textEntrySizer->Add( m_hyperlinkCb, wxGBPosition( 9, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); + m_textEntrySizer->Add( m_hyperlinkCb, wxGBPosition( 10, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); wxBoxSizer* bSizer11; bSizer11 = new wxBoxSizer( wxHORIZONTAL ); @@ -302,7 +302,7 @@ DIALOG_TEXT_PROPERTIES_BASE::DIALOG_TEXT_PROPERTIES_BASE( wxWindow* parent, wxWi bSizer11->Add( m_hyperlinkCombo, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_textEntrySizer->Add( bSizer11, wxGBPosition( 9, 1 ), wxGBSpan( 1, 6 ), wxEXPAND|wxBOTTOM|wxALIGN_CENTER_VERTICAL, 5 ); + m_textEntrySizer->Add( bSizer11, wxGBPosition( 10, 1 ), wxGBSpan( 1, 6 ), wxEXPAND|wxBOTTOM|wxALIGN_CENTER_VERTICAL, 5 ); m_textEntrySizer->AddGrowableCol( 3 ); diff --git a/eeschema/dialogs/dialog_text_properties_base.fbp b/eeschema/dialogs/dialog_text_properties_base.fbp index 0c248be170..b586a49215 100644 --- a/eeschema/dialogs/dialog_text_properties_base.fbp +++ b/eeschema/dialogs/dialog_text_properties_base.fbp @@ -126,7 +126,7 @@ wxEXPAND|wxTOP|wxRIGHT|wxLEFT 1 - 0,10 + 0,12 wxBOTH 3 @@ -353,7 +353,7 @@ 10 2 0 - wxTOP|wxBOTTOM + wxTOP 1 1 @@ -420,8 +420,8 @@ 5 1 0 - wxALIGN_CENTER_VERTICAL|wxTOP - 2 + wxALIGN_CENTER_VERTICAL + 3 1 1 @@ -484,8 +484,8 @@ 5 2 1 - wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP - 2 + wxALIGN_CENTER_VERTICAL|wxEXPAND + 3 1 1 @@ -551,8 +551,8 @@ 5 2 3 - wxEXPAND|wxTOP - 2 + wxEXPAND|wxALIGN_CENTER_VERTICAL + 3 1 @@ -1661,7 +1661,7 @@ 1 0 wxALIGN_CENTER_VERTICAL - 3 + 4 1 1 @@ -1725,7 +1725,7 @@ 1 1 wxEXPAND - 3 + 4 1 @@ -2060,7 +2060,7 @@ 2 0 wxBOTTOM - 5 + 6 1 1 @@ -2128,7 +2128,7 @@ 1 0 wxALIGN_CENTER_VERTICAL - 6 + 7 1 1 @@ -2192,7 +2192,7 @@ 2 1 wxEXPAND - 6 + 7 1 @@ -2527,7 +2527,7 @@ 1 0 wxALIGN_CENTER_VERTICAL - 7 + 8 1 1 @@ -2591,7 +2591,7 @@ 2 1 wxEXPAND - 7 + 8 1 1 @@ -2659,7 +2659,7 @@ 2 4 wxRIGHT - 5 + 6 1 1 @@ -2727,7 +2727,7 @@ 2 4 wxEXPAND - 6 + 7 1 @@ -2927,7 +2927,7 @@ 1 0 wxALIGN_CENTER_VERTICAL|wxBOTTOM - 9 + 10 1 1 @@ -2995,7 +2995,7 @@ 6 1 wxEXPAND|wxBOTTOM|wxALIGN_CENTER_VERTICAL - 9 + 10 1 diff --git a/eeschema/dialogs/panel_eeschema_color_settings.cpp b/eeschema/dialogs/panel_eeschema_color_settings.cpp index c1ed0e01c1..bbdee49c9a 100644 --- a/eeschema/dialogs/panel_eeschema_color_settings.cpp +++ b/eeschema/dialogs/panel_eeschema_color_settings.cpp @@ -321,26 +321,25 @@ void PANEL_EESCHEMA_COLOR_SETTINGS::createPreviewItems() addItem( e2 ); SCH_TEXT* t1 = new SCH_TEXT( MILS_POINT( 2850, 2250 ), wxT( "PLAIN TEXT" ) ); - t1->SetTextSpinStyle( TEXT_SPIN_STYLE::SPIN::LEFT ); addItem( t1 ); SCH_LABEL* t2 = new SCH_LABEL( MILS_POINT( 1975, 1500 ), wxT( "LABEL_{0}" ) ); - t2->SetTextSpinStyle( TEXT_SPIN_STYLE::SPIN::RIGHT ); + t2->SetSpinStyle( SPIN_STYLE::SPIN::RIGHT ); t2->SetIsDangling( false ); addItem( t2 ); SCH_LABEL* t3 = new SCH_LABEL( MILS_POINT( 1975, 2600 ), wxT( "LABEL_{1}" ) ); - t3->SetTextSpinStyle( TEXT_SPIN_STYLE::SPIN::RIGHT ); + t3->SetSpinStyle( SPIN_STYLE::SPIN::RIGHT ); t3->SetIsDangling( false ); addItem( t3 ); SCH_GLOBALLABEL* t4 = new SCH_GLOBALLABEL( MILS_POINT( 1750, 1400 ), wxT( "GLOBAL[0..3]" ) ); - t4->SetTextSpinStyle( TEXT_SPIN_STYLE::SPIN::LEFT ); + t4->SetSpinStyle( SPIN_STYLE::SPIN::LEFT ); t4->SetIsDangling( false ); addItem( t4 ); SCH_HIERLABEL* t5 = new SCH_HIERLABEL( MILS_POINT( 3250, 1600 ), wxT( "HIER_LABEL" ) ); - t5->SetTextSpinStyle( TEXT_SPIN_STYLE::SPIN::RIGHT ); + t5->SetSpinStyle( SPIN_STYLE::SPIN::RIGHT ); t5->SetIsDangling( false ); addItem( t5 ); diff --git a/eeschema/netlist_exporters/netlist_exporter_base.h b/eeschema/netlist_exporters/netlist_exporter_base.h index 71dc6ed2e7..80dffea370 100644 --- a/eeschema/netlist_exporters/netlist_exporter_base.h +++ b/eeschema/netlist_exporters/netlist_exporter_base.h @@ -3,7 +3,7 @@ * * Copyright (C) 1992-2013 jp.charras at wanadoo.fr * Copyright (C) 2013 SoftPLC Corporation, Dick Hollenbeck - * Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors. + * Copyright (C) 1992-2023 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -28,7 +28,7 @@ #include #include -#include +#include #include #include diff --git a/eeschema/sch_edit_frame.cpp b/eeschema/sch_edit_frame.cpp index db85d775b5..e5ea967068 100644 --- a/eeschema/sch_edit_frame.cpp +++ b/eeschema/sch_edit_frame.cpp @@ -1561,13 +1561,13 @@ void SCH_EDIT_FRAME::AutoRotateItem( SCH_SCREEN* aScreen, SCH_ITEM* aItem ) if( label->AutoRotateOnPlacement() ) { - TEXT_SPIN_STYLE spin = aScreen->GetLabelOrientationForPoint( label->GetPosition(), - label->GetTextSpinStyle(), - &GetCurrentSheet() ); + SPIN_STYLE spin = aScreen->GetLabelOrientationForPoint( label->GetPosition(), + label->GetSpinStyle(), + &GetCurrentSheet() ); - if( spin != label->GetTextSpinStyle() ) + if( spin != label->GetSpinStyle() ) { - label->SetTextSpinStyle( spin ); + label->SetSpinStyle( spin ); for( SCH_ITEM* item : aScreen->Items().OfType( SCH_GLOBAL_LABEL_T ) ) { diff --git a/eeschema/sch_label.cpp b/eeschema/sch_label.cpp index 76e5bd5936..fc8616dd8c 100644 --- a/eeschema/sch_label.cpp +++ b/eeschema/sch_label.cpp @@ -153,6 +153,54 @@ wxString getElectricalTypeLabel( LABEL_FLAG_SHAPE aType ) } +SPIN_STYLE SPIN_STYLE::RotateCCW() +{ + SPIN newSpin = m_spin; + + switch( m_spin ) + { + case SPIN_STYLE::LEFT: newSpin = SPIN_STYLE::BOTTOM; break; + case SPIN_STYLE::BOTTOM: newSpin = SPIN_STYLE::RIGHT; break; + case SPIN_STYLE::RIGHT: newSpin = SPIN_STYLE::UP; break; + case SPIN_STYLE::UP: newSpin = SPIN_STYLE::LEFT; break; + } + + return SPIN_STYLE( newSpin ); +} + + +SPIN_STYLE SPIN_STYLE::MirrorX() +{ + SPIN newSpin = m_spin; + + switch( m_spin ) + { + case SPIN_STYLE::UP: newSpin = SPIN_STYLE::BOTTOM; break; + case SPIN_STYLE::BOTTOM: newSpin = SPIN_STYLE::UP; break; + case SPIN_STYLE::LEFT: break; + case SPIN_STYLE::RIGHT: break; + } + + return SPIN_STYLE( newSpin ); +} + + +SPIN_STYLE SPIN_STYLE::MirrorY() +{ + SPIN newSpin = m_spin; + + switch( m_spin ) + { + case SPIN_STYLE::LEFT: newSpin = SPIN_STYLE::RIGHT; break; + case SPIN_STYLE::RIGHT: newSpin = SPIN_STYLE::LEFT; break; + case SPIN_STYLE::UP: break; + case SPIN_STYLE::BOTTOM: break; + } + + return SPIN_STYLE( newSpin ); +} + + SCH_LABEL_BASE::SCH_LABEL_BASE( const VECTOR2I& aPos, const wxString& aText, KICAD_T aType ) : SCH_TEXT( aPos, aText, aType ), m_shape( L_UNSPECIFIED ), @@ -286,6 +334,60 @@ COLOR4D SCH_LABEL_BASE::GetLabelColor() const } +void SCH_LABEL_BASE::SetSpinStyle( SPIN_STYLE aSpinStyle ) +{ + // Assume "Right" and Left" mean which side of the anchor the text will be on + // Thus we want to left justify text up against the anchor if we are on the right + switch( aSpinStyle ) + { + default: + wxFAIL_MSG( "Bad spin style" ); + KI_FALLTHROUGH; + + case SPIN_STYLE::RIGHT: // Horiz Normal Orientation + SetTextAngle( ANGLE_HORIZONTAL ); + SetHorizJustify( GR_TEXT_H_ALIGN_LEFT ); + break; + + case SPIN_STYLE::UP: // Vert Orientation UP + SetTextAngle( ANGLE_VERTICAL ); + SetHorizJustify( GR_TEXT_H_ALIGN_LEFT ); + break; + + case SPIN_STYLE::LEFT: // Horiz Orientation - Right justified + SetTextAngle( ANGLE_HORIZONTAL ); + SetHorizJustify( GR_TEXT_H_ALIGN_RIGHT ); + break; + + case SPIN_STYLE::BOTTOM: // Vert Orientation BOTTOM + SetTextAngle( ANGLE_VERTICAL ); + SetHorizJustify( GR_TEXT_H_ALIGN_RIGHT ); + break; + } + + SetVertJustify( GR_TEXT_V_ALIGN_BOTTOM ); +} + + +SPIN_STYLE SCH_LABEL_BASE::GetSpinStyle() const +{ + if( GetTextAngle() == ANGLE_VERTICAL ) + { + if( GetHorizJustify() == GR_TEXT_H_ALIGN_RIGHT ) + return SPIN_STYLE::BOTTOM; + else + return SPIN_STYLE::UP; + } + else + { + if( GetHorizJustify() == GR_TEXT_H_ALIGN_RIGHT ) + return SPIN_STYLE::LEFT; + else + return SPIN_STYLE::RIGHT; + } +} + + VECTOR2I SCH_LABEL_BASE::GetSchematicTextOffset( const RENDER_SETTINGS* aSettings ) const { VECTOR2I text_offset; @@ -293,13 +395,13 @@ VECTOR2I SCH_LABEL_BASE::GetSchematicTextOffset( const RENDER_SETTINGS* aSetting // add an offset to x (or y) position to aid readability of text on a wire or line int dist = GetTextOffset( aSettings ) + GetPenWidth(); - switch( GetTextSpinStyle() ) + switch( GetSpinStyle() ) { - case TEXT_SPIN_STYLE::UP: - case TEXT_SPIN_STYLE::BOTTOM: text_offset.x = -dist; break; // Vert Orientation + case SPIN_STYLE::UP: + case SPIN_STYLE::BOTTOM: text_offset.x = -dist; break; // Vert Orientation default: - case TEXT_SPIN_STYLE::LEFT: - case TEXT_SPIN_STYLE::RIGHT: text_offset.y = -dist; break; // Horiz Orientation + case SPIN_STYLE::LEFT: + case SPIN_STYLE::RIGHT: text_offset.y = -dist; break; // Horiz Orientation } return text_offset; @@ -490,10 +592,10 @@ void SCH_LABEL_BASE::AutoplaceFields( SCH_SCREEN* aScreen, bool aManual ) { VECTOR2I offset( 0, 0 ); - switch( GetTextSpinStyle() ) + switch( GetSpinStyle() ) { default: - case TEXT_SPIN_STYLE::LEFT: + case SPIN_STYLE::LEFT: field.SetTextAngle( ANGLE_HORIZONTAL ); field.SetHorizJustify( GR_TEXT_H_ALIGN_RIGHT ); @@ -504,7 +606,7 @@ void SCH_LABEL_BASE::AutoplaceFields( SCH_SCREEN* aScreen, bool aManual ) break; - case TEXT_SPIN_STYLE::UP: + case SPIN_STYLE::UP: field.SetTextAngle( ANGLE_VERTICAL ); field.SetHorizJustify( GR_TEXT_H_ALIGN_LEFT ); @@ -515,7 +617,7 @@ void SCH_LABEL_BASE::AutoplaceFields( SCH_SCREEN* aScreen, bool aManual ) break; - case TEXT_SPIN_STYLE::RIGHT: + case SPIN_STYLE::RIGHT: field.SetTextAngle( ANGLE_HORIZONTAL ); field.SetHorizJustify( GR_TEXT_H_ALIGN_LEFT ); @@ -526,7 +628,7 @@ void SCH_LABEL_BASE::AutoplaceFields( SCH_SCREEN* aScreen, bool aManual ) break; - case TEXT_SPIN_STYLE::BOTTOM: + case SPIN_STYLE::BOTTOM: field.SetTextAngle( ANGLE_VERTICAL ); field.SetHorizJustify( GR_TEXT_H_ALIGN_RIGHT ); @@ -1046,13 +1148,13 @@ void SCH_LABEL_BASE::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vectorMessageTextFromValue( GetTextWidth() ) ); - switch( GetTextSpinStyle() ) + switch( GetSpinStyle() ) { - case TEXT_SPIN_STYLE::LEFT: msg = _( "Align right" ); break; - case TEXT_SPIN_STYLE::UP: msg = _( "Align bottom" ); break; - case TEXT_SPIN_STYLE::RIGHT: msg = _( "Align left" ); break; - case TEXT_SPIN_STYLE::BOTTOM: msg = _( "Align top" ); break; - default: msg = wxT( "???" ); break; + case SPIN_STYLE::LEFT: msg = _( "Align right" ); break; + case SPIN_STYLE::UP: msg = _( "Align bottom" ); break; + case SPIN_STYLE::RIGHT: msg = _( "Align left" ); break; + case SPIN_STYLE::BOTTOM: msg = _( "Align top" ); break; + default: msg = wxT( "???" ); break; } aList.emplace_back( _( "Justification" ), msg ); @@ -1312,7 +1414,7 @@ void SCH_DIRECTIVE_LABEL::MirrorHorizontally( int aCenter ) // vertical shape (like a text reduced to only "I" letter). // So the mirroring is not exactly similar to a SCH_TEXT item // Text is NOT really mirrored; it is moved to a suitable horizontal position - SetTextSpinStyle( GetTextSpinStyle().MirrorX() ); + SetSpinStyle( GetSpinStyle().MirrorX() ); SetTextX( MIRRORVAL( GetTextPos().x, aCenter ) ); @@ -1348,7 +1450,7 @@ void SCH_DIRECTIVE_LABEL::MirrorVertically( int aCenter ) // vertical shape (like a text reduced to only "I" letter). // So the mirroring is not exactly similar to a SCH_TEXT item // Text is NOT really mirrored; it is moved to a suitable vertical position - SetTextSpinStyle( GetTextSpinStyle().MirrorY() ); + SetSpinStyle( GetSpinStyle().MirrorY() ); SetTextY( MIRRORVAL( GetTextPos().y, aCenter ) ); @@ -1418,13 +1520,13 @@ void SCH_DIRECTIVE_LABEL::CreateGraphicShape( const RENDER_SETTINGS* aRenderSett // Rotate outlines and move corners to real position for( VECTOR2I& aPoint : aPoints ) { - switch( GetTextSpinStyle() ) + switch( GetSpinStyle() ) { default: - case TEXT_SPIN_STYLE::LEFT: break; - case TEXT_SPIN_STYLE::UP: RotatePoint( aPoint, -ANGLE_90 ); break; - case TEXT_SPIN_STYLE::RIGHT: RotatePoint( aPoint, ANGLE_180 ); break; - case TEXT_SPIN_STYLE::BOTTOM: RotatePoint( aPoint, ANGLE_90 ); break; + case SPIN_STYLE::LEFT: break; + case SPIN_STYLE::UP: RotatePoint( aPoint, -ANGLE_90 ); break; + case SPIN_STYLE::RIGHT: RotatePoint( aPoint, ANGLE_180 ); break; + case SPIN_STYLE::BOTTOM: RotatePoint( aPoint, ANGLE_90 ); break; } aPoint += aPos; @@ -1448,25 +1550,25 @@ void SCH_DIRECTIVE_LABEL::AutoplaceFields( SCH_SCREEN* aScreen, bool aManual ) for( SCH_FIELD& field : m_fields ) { - switch( GetTextSpinStyle() ) + switch( GetSpinStyle() ) { default: - case TEXT_SPIN_STYLE::LEFT: + case SPIN_STYLE::LEFT: field.SetTextAngle( ANGLE_HORIZONTAL ); offset = { symbolWidth + margin, origin }; break; - case TEXT_SPIN_STYLE::UP: + case SPIN_STYLE::UP: field.SetTextAngle( ANGLE_VERTICAL ); offset = { -origin, -( symbolWidth + margin ) }; break; - case TEXT_SPIN_STYLE::RIGHT: + case SPIN_STYLE::RIGHT: field.SetTextAngle( ANGLE_HORIZONTAL ); offset = { symbolWidth + margin, -origin }; break; - case TEXT_SPIN_STYLE::BOTTOM: + case SPIN_STYLE::BOTTOM: field.SetTextAngle( ANGLE_VERTICAL ); offset = { origin, -( symbolWidth + margin ) }; break; @@ -1541,20 +1643,20 @@ VECTOR2I SCH_GLOBALLABEL::GetSchematicTextOffset( const RENDER_SETTINGS* aSettin break; } - switch( GetTextSpinStyle() ) + switch( GetSpinStyle() ) { default: - case TEXT_SPIN_STYLE::LEFT: return VECTOR2I( -horiz, vert ); - case TEXT_SPIN_STYLE::UP: return VECTOR2I( vert, -horiz ); - case TEXT_SPIN_STYLE::RIGHT: return VECTOR2I( horiz, vert ); - case TEXT_SPIN_STYLE::BOTTOM: return VECTOR2I( vert, horiz ); + case SPIN_STYLE::LEFT: return VECTOR2I( -horiz, vert ); + case SPIN_STYLE::UP: return VECTOR2I( vert, -horiz ); + case SPIN_STYLE::RIGHT: return VECTOR2I( horiz, vert ); + case SPIN_STYLE::BOTTOM: return VECTOR2I( vert, horiz ); } } -void SCH_GLOBALLABEL::SetTextSpinStyle( TEXT_SPIN_STYLE aSpinStyle ) +void SCH_GLOBALLABEL::SetSpinStyle( SPIN_STYLE aSpinStyle ) { - SCH_TEXT::SetTextSpinStyle( aSpinStyle ); + SCH_LABEL_BASE::SetSpinStyle( aSpinStyle ); SetVertJustify( GR_TEXT_V_ALIGN_CENTER ); } @@ -1675,13 +1777,13 @@ void SCH_GLOBALLABEL::CreateGraphicShape( const RENDER_SETTINGS* aRenderSettings { aPoint.x += x_offset; - switch( GetTextSpinStyle() ) + switch( GetSpinStyle() ) { default: - case TEXT_SPIN_STYLE::LEFT: break; - case TEXT_SPIN_STYLE::UP: RotatePoint( aPoint, -ANGLE_90 ); break; - case TEXT_SPIN_STYLE::RIGHT: RotatePoint( aPoint, ANGLE_180 ); break; - case TEXT_SPIN_STYLE::BOTTOM: RotatePoint( aPoint, ANGLE_90 ); break; + case SPIN_STYLE::LEFT: break; + case SPIN_STYLE::UP: RotatePoint( aPoint, -ANGLE_90 ); break; + case SPIN_STYLE::RIGHT: RotatePoint( aPoint, ANGLE_180 ); break; + case SPIN_STYLE::BOTTOM: RotatePoint( aPoint, ANGLE_90 ); break; } aPoint += aPos; @@ -1712,9 +1814,9 @@ SCH_HIERLABEL::SCH_HIERLABEL( const VECTOR2I& pos, const wxString& text, KICAD_T } -void SCH_HIERLABEL::SetTextSpinStyle( TEXT_SPIN_STYLE aSpinStyle ) +void SCH_HIERLABEL::SetSpinStyle( SPIN_STYLE aSpinStyle ) { - SCH_TEXT::SetTextSpinStyle( aSpinStyle ); + SCH_LABEL_BASE::SetSpinStyle( aSpinStyle ); SetVertJustify( GR_TEXT_V_ALIGN_CENTER ); } @@ -1730,7 +1832,7 @@ void SCH_HIERLABEL::CreateGraphicShape( const RENDER_SETTINGS* aSettings, std::vector& aPoints, const VECTOR2I& aPos, LABEL_FLAG_SHAPE aShape ) const { - int* Template = TemplateShape[static_cast( aShape )][static_cast( m_spin_style )]; + int* Template = TemplateShape[static_cast( aShape )][static_cast( GetSpinStyle() )]; int halfSize = GetTextHeight() / 2; int imax = *Template; Template++; @@ -1766,31 +1868,31 @@ const BOX2I SCH_HIERLABEL::GetBodyBoundingBox() const int dx, dy; - switch( GetTextSpinStyle() ) + switch( GetSpinStyle() ) { default: - case TEXT_SPIN_STYLE::LEFT: + case SPIN_STYLE::LEFT: dx = -length; dy = height; x += schIUScale.MilsToIU( DANGLING_SYMBOL_SIZE ); y -= height / 2; break; - case TEXT_SPIN_STYLE::UP: + case SPIN_STYLE::UP: dx = height; dy = -length; x -= height / 2; y += schIUScale.MilsToIU( DANGLING_SYMBOL_SIZE ); break; - case TEXT_SPIN_STYLE::RIGHT: + case SPIN_STYLE::RIGHT: dx = length; dy = height; x -= schIUScale.MilsToIU( DANGLING_SYMBOL_SIZE ); y -= height / 2; break; - case TEXT_SPIN_STYLE::BOTTOM: + case SPIN_STYLE::BOTTOM: dx = height; dy = length; x -= height / 2; @@ -1811,13 +1913,13 @@ VECTOR2I SCH_HIERLABEL::GetSchematicTextOffset( const RENDER_SETTINGS* aSettings dist += GetTextWidth(); - switch( GetTextSpinStyle() ) + switch( GetSpinStyle() ) { default: - case TEXT_SPIN_STYLE::LEFT: text_offset.x = -dist; break; // Orientation horiz normale - case TEXT_SPIN_STYLE::UP: text_offset.y = -dist; break; // Orientation vert UP - case TEXT_SPIN_STYLE::RIGHT: text_offset.x = dist; break; // Orientation horiz inverse - case TEXT_SPIN_STYLE::BOTTOM: text_offset.y = dist; break; // Orientation vert BOTTOM + case SPIN_STYLE::LEFT: text_offset.x = -dist; break; // Orientation horiz normale + case SPIN_STYLE::UP: text_offset.y = -dist; break; // Orientation vert UP + case SPIN_STYLE::RIGHT: text_offset.x = dist; break; // Orientation horiz inverse + case SPIN_STYLE::BOTTOM: text_offset.y = dist; break; // Orientation vert BOTTOM } return text_offset; diff --git a/eeschema/sch_label.h b/eeschema/sch_label.h index f87db329da..55f355c53f 100644 --- a/eeschema/sch_label.h +++ b/eeschema/sch_label.h @@ -31,6 +31,78 @@ #include // for CONNECTION_TYPE +/* + * Spin style for labels of all kinds on schematics + * Basically a higher level abstraction of rotation and justification of text + */ +class SPIN_STYLE +{ +public: + enum SPIN : int + { + LEFT = 0, + UP = 1, + RIGHT = 2, + BOTTOM = 3 + }; + + + SPIN_STYLE() = default; + constexpr SPIN_STYLE( SPIN aSpin ) : m_spin( aSpin ) + { + } + + constexpr bool operator==( SPIN a ) const + { + return m_spin == a; + } + + constexpr bool operator!=( SPIN a ) const + { + return m_spin != a; + } + + operator int() const + { + return static_cast( m_spin ); + } + + SPIN_STYLE RotateCCW(); + + /** + * Mirror the label spin style across the X axis or simply swaps up and bottom. + */ + SPIN_STYLE MirrorX(); + + /** + * Mirror the label spin style across the Y axis or simply swaps left and right. + */ + SPIN_STYLE MirrorY(); + +private: + SPIN m_spin; +}; + + +/* + * Label and flag shapes used with text objects. + */ +enum LABEL_FLAG_SHAPE +{ + L_INPUT, + L_OUTPUT, + L_BIDI, + L_TRISTATE, + L_UNSPECIFIED, + + F_FIRST, + F_DOT = F_FIRST, + F_ROUND, + F_DIAMOND, + F_RECTANGLE +}; + + class SCH_LABEL_BASE : public SCH_TEXT { public: @@ -72,11 +144,14 @@ public: } } - LABEL_FLAG_SHAPE GetShape() const override { return m_shape; } - void SetShape( LABEL_FLAG_SHAPE aShape ) override { m_shape = aShape; } + LABEL_FLAG_SHAPE GetShape() const { return m_shape; } + void SetShape( LABEL_FLAG_SHAPE aShape ) { m_shape = aShape; } COLOR4D GetLabelColor() const; + virtual void SetSpinStyle( SPIN_STYLE aSpinStyle ); + SPIN_STYLE GetSpinStyle() const; + void SetLastResolvedState( const SCH_ITEM* aItem ) override { const SCH_LABEL_BASE* aLabel = dynamic_cast( aItem ); @@ -382,7 +457,7 @@ public: int GetMandatoryFieldCount() override { return 1; } - void SetTextSpinStyle( TEXT_SPIN_STYLE aSpinStyle ) override; + void SetSpinStyle( SPIN_STYLE aSpinStyle ) override; VECTOR2I GetSchematicTextOffset( const RENDER_SETTINGS* aSettings ) const override; @@ -434,7 +509,7 @@ public: return wxT( "SCH_HIERLABEL" ); } - void SetTextSpinStyle( TEXT_SPIN_STYLE aSpinStyle ) override; + void SetSpinStyle( SPIN_STYLE aSpinStyle ) override; VECTOR2I GetSchematicTextOffset( const RENDER_SETTINGS* aSettings ) const override; diff --git a/eeschema/sch_plugins/altium/sch_altium_plugin.cpp b/eeschema/sch_plugins/altium/sch_altium_plugin.cpp index 55c6d228ae..c991992e4b 100644 --- a/eeschema/sch_plugins/altium/sch_altium_plugin.cpp +++ b/eeschema/sch_plugins/altium/sch_altium_plugin.cpp @@ -2403,22 +2403,22 @@ void SCH_ALTIUM_PLUGIN::ParseHarnessEntry( const std::map& a default: case ASCH_SHEET_ENTRY_SIDE::LEFT: sheetPin->SetPosition( { pos.x, pos.y + elem.DistanceFromTop } ); - sheetPin->SetTextSpinStyle( TEXT_SPIN_STYLE::LEFT ); + sheetPin->SetSpinStyle( SPIN_STYLE::LEFT ); sheetPin->SetSide( SHEET_SIDE::LEFT ); break; case ASCH_SHEET_ENTRY_SIDE::RIGHT: sheetPin->SetPosition( { pos.x + size.x, pos.y + elem.DistanceFromTop } ); - sheetPin->SetTextSpinStyle( TEXT_SPIN_STYLE::RIGHT ); + sheetPin->SetSpinStyle( SPIN_STYLE::RIGHT ); sheetPin->SetSide( SHEET_SIDE::RIGHT ); break; case ASCH_SHEET_ENTRY_SIDE::TOP: sheetPin->SetPosition( { pos.x + elem.DistanceFromTop, pos.y } ); - sheetPin->SetTextSpinStyle( TEXT_SPIN_STYLE::UP ); + sheetPin->SetSpinStyle( SPIN_STYLE::UP ); sheetPin->SetSide( SHEET_SIDE::TOP ); break; case ASCH_SHEET_ENTRY_SIDE::BOTTOM: sheetPin->SetPosition( { pos.x + elem.DistanceFromTop, pos.y + size.y } ); - sheetPin->SetTextSpinStyle( TEXT_SPIN_STYLE::BOTTOM ); + sheetPin->SetSpinStyle( SPIN_STYLE::BOTTOM ); sheetPin->SetSide( SHEET_SIDE::BOTTOM ); break; } @@ -2600,7 +2600,7 @@ void SCH_ALTIUM_PLUGIN::ParseSheetEntry( const std::map& aPr sheetPin->SetText( elem.name ); sheetPin->SetShape( LABEL_FLAG_SHAPE::L_UNSPECIFIED ); - //sheetPin->SetTextSpinStyle( getSpinStyle( term.OrientAngle, false ) ); + //sheetPin->SetSpinStyle( getSpinStyle( term.OrientAngle, false ) ); //sheetPin->SetPosition( getKiCadPoint( term.Position ) ); VECTOR2I pos = sheetIt->second->GetPosition(); @@ -2611,25 +2611,25 @@ void SCH_ALTIUM_PLUGIN::ParseSheetEntry( const std::map& aPr default: case ASCH_SHEET_ENTRY_SIDE::LEFT: sheetPin->SetPosition( { pos.x, pos.y + elem.distanceFromTop } ); - sheetPin->SetTextSpinStyle( TEXT_SPIN_STYLE::LEFT ); + sheetPin->SetSpinStyle( SPIN_STYLE::LEFT ); sheetPin->SetSide( SHEET_SIDE::LEFT ); break; case ASCH_SHEET_ENTRY_SIDE::RIGHT: sheetPin->SetPosition( { pos.x + size.x, pos.y + elem.distanceFromTop } ); - sheetPin->SetTextSpinStyle( TEXT_SPIN_STYLE::RIGHT ); + sheetPin->SetSpinStyle( SPIN_STYLE::RIGHT ); sheetPin->SetSide( SHEET_SIDE::RIGHT ); break; case ASCH_SHEET_ENTRY_SIDE::TOP: sheetPin->SetPosition( { pos.x + elem.distanceFromTop, pos.y } ); - sheetPin->SetTextSpinStyle( TEXT_SPIN_STYLE::UP ); + sheetPin->SetSpinStyle( SPIN_STYLE::UP ); sheetPin->SetSide( SHEET_SIDE::TOP ); break; case ASCH_SHEET_ENTRY_SIDE::BOTTOM: sheetPin->SetPosition( { pos.x + elem.distanceFromTop, pos.y + size.y } ); - sheetPin->SetTextSpinStyle( TEXT_SPIN_STYLE::BOTTOM ); + sheetPin->SetSpinStyle( SPIN_STYLE::BOTTOM ); sheetPin->SetSide( SHEET_SIDE::BOTTOM ); break; } @@ -3117,9 +3117,9 @@ void SCH_ALTIUM_PLUGIN::ParsePort( const ASCH_PORT& aElem ) case ASCH_PORT_STYLE::RIGHT: case ASCH_PORT_STYLE::LEFT_RIGHT: if( ( startIsWireTerminal || startIsBusTerminal ) ) - label->SetTextSpinStyle( TEXT_SPIN_STYLE::RIGHT ); + label->SetSpinStyle( SPIN_STYLE::RIGHT ); else - label->SetTextSpinStyle( TEXT_SPIN_STYLE::LEFT ); + label->SetSpinStyle( SPIN_STYLE::LEFT ); break; case ASCH_PORT_STYLE::NONE_VERTICAL: @@ -3127,9 +3127,9 @@ void SCH_ALTIUM_PLUGIN::ParsePort( const ASCH_PORT& aElem ) case ASCH_PORT_STYLE::BOTTOM: case ASCH_PORT_STYLE::TOP_BOTTOM: if( ( startIsWireTerminal || startIsBusTerminal ) ) - label->SetTextSpinStyle( TEXT_SPIN_STYLE::UP ); + label->SetSpinStyle( SPIN_STYLE::UP ); else - label->SetTextSpinStyle( TEXT_SPIN_STYLE::BOTTOM ); + label->SetSpinStyle( SPIN_STYLE::BOTTOM ); break; } diff --git a/eeschema/sch_plugins/cadstar/cadstar_sch_archive_loader.cpp b/eeschema/sch_plugins/cadstar/cadstar_sch_archive_loader.cpp index 4797796b02..f0c13a67b3 100644 --- a/eeschema/sch_plugins/cadstar/cadstar_sch_archive_loader.cpp +++ b/eeschema/sch_plugins/cadstar/cadstar_sch_archive_loader.cpp @@ -619,7 +619,7 @@ void CADSTAR_SCH_ARCHIVE_LOADER::loadHierarchicalSheetPins() sheetPin->SetText( name ); sheetPin->SetShape( LABEL_FLAG_SHAPE::L_UNSPECIFIED ); - sheetPin->SetTextSpinStyle( getSpinStyle( term.OrientAngle, false ) ); + sheetPin->SetSpinStyle( getSpinStyle( term.OrientAngle, false ) ); sheetPin->SetPosition( getKiCadPoint( term.Position ) ); if( sheetPin->Type() == SCH_SHEET_PIN_T ) @@ -946,7 +946,7 @@ void CADSTAR_SCH_ARCHIVE_LOADER::loadSchematicSymbolInstances() linkOrigin.Justification ); } - netLabel->SetTextSpinStyle( getSpinStyle( sym.OrientAngle, sym.Mirror ) ); + netLabel->SetSpinStyle( getSpinStyle( sym.OrientAngle, sym.Mirror ) ); if( libSymDef.Alternate.Lower().Contains( "in" ) ) netLabel->SetShape( LABEL_FLAG_SHAPE::L_INPUT ); @@ -1349,15 +1349,15 @@ void CADSTAR_SCH_ARCHIVE_LOADER::loadNets() auto fixNetLabelsAndSheetPins = [&]( const EDA_ANGLE& aWireAngle, NETELEMENT_ID& aNetEleID ) { - TEXT_SPIN_STYLE spin = getSpinStyle( aWireAngle ); + SPIN_STYLE spin = getSpinStyle( aWireAngle ); if( netlabels.find( aNetEleID ) != netlabels.end() ) - netlabels.at( aNetEleID )->SetTextSpinStyle( spin.MirrorY() ); + netlabels.at( aNetEleID )->SetSpinStyle( spin.MirrorY() ); SCH_HIERLABEL* sheetPin = getHierarchicalLabel( aNetEleID ); if( sheetPin ) - sheetPin->SetTextSpinStyle( spin.MirrorX() ); + sheetPin->SetSpinStyle( spin.MirrorX() ); }; // Now we can load the wires and fix the label orientations @@ -1419,9 +1419,10 @@ void CADSTAR_SCH_ARCHIVE_LOADER::loadNets() label->SetPosition( getKiCadPoint( junc.Location ) ); label->SetVisible( true ); - EDA_ANGLE labelAngle = getAngle( junc.NetLabel.OrientAngle ); - TEXT_SPIN_STYLE spin = getSpinStyle( labelAngle ); - label->SetTextSpinStyle( spin ); + EDA_ANGLE labelAngle = getAngle( junc.NetLabel.OrientAngle ); + SPIN_STYLE spin = getSpinStyle( labelAngle ); + + label->SetSpinStyle( spin ); m_sheetMap.at( junc.LayerID )->GetScreen()->Append( label ); } @@ -2876,11 +2877,11 @@ int CADSTAR_SCH_ARCHIVE_LOADER::getKiCadUnitNumberFromGate( const GATE_ID& aCads } -TEXT_SPIN_STYLE CADSTAR_SCH_ARCHIVE_LOADER::getSpinStyle( const long long& aCadstarOrientation, - bool aMirror ) +SPIN_STYLE CADSTAR_SCH_ARCHIVE_LOADER::getSpinStyle( const long long& aCadstarOrientation, + bool aMirror ) { - EDA_ANGLE orientation = getAngle( aCadstarOrientation ); - TEXT_SPIN_STYLE spinStyle = getSpinStyle( orientation ); + EDA_ANGLE orientation = getAngle( aCadstarOrientation ); + SPIN_STYLE spinStyle = getSpinStyle( orientation ); if( aMirror ) { @@ -2892,21 +2893,21 @@ TEXT_SPIN_STYLE CADSTAR_SCH_ARCHIVE_LOADER::getSpinStyle( const long long& aCads } -TEXT_SPIN_STYLE CADSTAR_SCH_ARCHIVE_LOADER::getSpinStyle( const EDA_ANGLE& aOrientation ) +SPIN_STYLE CADSTAR_SCH_ARCHIVE_LOADER::getSpinStyle( const EDA_ANGLE& aOrientation ) { - TEXT_SPIN_STYLE spinStyle = TEXT_SPIN_STYLE::LEFT; + SPIN_STYLE spinStyle = SPIN_STYLE::LEFT; EDA_ANGLE oDeg = aOrientation; oDeg.Normalize180(); if( oDeg >= -ANGLE_45 && oDeg <= ANGLE_45 ) - spinStyle = TEXT_SPIN_STYLE::RIGHT; // 0deg + spinStyle = SPIN_STYLE::RIGHT; // 0deg else if( oDeg >= ANGLE_45 && oDeg <= ANGLE_135 ) - spinStyle = TEXT_SPIN_STYLE::UP; // 90deg + spinStyle = SPIN_STYLE::UP; // 90deg else if( oDeg >= ANGLE_135 || oDeg <= -ANGLE_135 ) - spinStyle = TEXT_SPIN_STYLE::LEFT; // 180deg + spinStyle = SPIN_STYLE::LEFT; // 180deg else - spinStyle = TEXT_SPIN_STYLE::BOTTOM; // 270deg + spinStyle = SPIN_STYLE::BOTTOM; // 270deg return spinStyle; } @@ -3066,8 +3067,8 @@ void CADSTAR_SCH_ARCHIVE_LOADER::applyTextSettings( EDA_TEXT* aKiCadT } }; - TEXT_SPIN_STYLE spin = getSpinStyle( aCadstarOrientAngle, aMirrored ); - EDA_ITEM* textEdaItem = dynamic_cast( aKiCadTextItem ); + SPIN_STYLE spin = getSpinStyle( aCadstarOrientAngle, aMirrored ); + EDA_ITEM* textEdaItem = dynamic_cast( aKiCadTextItem ); wxCHECK( textEdaItem, /* void */ ); // ensure this is a EDA_ITEM switch( textEdaItem->Type() ) @@ -3124,10 +3125,10 @@ void CADSTAR_SCH_ARCHIVE_LOADER::applyTextSettings( EDA_TEXT* aKiCadT // And correct the error introduced by the text offsetting in KiCad switch( spin ) { - case TEXT_SPIN_STYLE::BOTTOM: pos = { bb.GetRight() - off, bb.GetTop() }; break; - case TEXT_SPIN_STYLE::UP: pos = { bb.GetRight() - off, bb.GetBottom() }; break; - case TEXT_SPIN_STYLE::LEFT: pos = { bb.GetRight() , bb.GetBottom() + off }; break; - case TEXT_SPIN_STYLE::RIGHT: pos = { bb.GetLeft() , bb.GetBottom() + off }; break; + case SPIN_STYLE::BOTTOM: pos = { bb.GetRight() - off, bb.GetTop() }; break; + case SPIN_STYLE::UP: pos = { bb.GetRight() - off, bb.GetBottom() }; break; + case SPIN_STYLE::LEFT: pos = { bb.GetRight() , bb.GetBottom() + off }; break; + case SPIN_STYLE::RIGHT: pos = { bb.GetLeft() , bb.GetBottom() + off }; break; } aKiCadTextItem->SetTextPos( pos ); @@ -3139,7 +3140,7 @@ void CADSTAR_SCH_ARCHIVE_LOADER::applyTextSettings( EDA_TEXT* aKiCadT case SCH_GLOBAL_LABEL_T: case SCH_HIER_LABEL_T: case SCH_SHEET_PIN_T: - static_cast( aKiCadTextItem )->SetTextSpinStyle( spin ); + static_cast( aKiCadTextItem )->SetSpinStyle( spin ); return; default: diff --git a/eeschema/sch_plugins/cadstar/cadstar_sch_archive_loader.h b/eeschema/sch_plugins/cadstar/cadstar_sch_archive_loader.h index a1be7dbde6..802d4955e8 100644 --- a/eeschema/sch_plugins/cadstar/cadstar_sch_archive_loader.h +++ b/eeschema/sch_plugins/cadstar/cadstar_sch_archive_loader.h @@ -41,7 +41,7 @@ struct CADSTAR_PART_ENTRY; class BUS_ALIAS; class EDA_TEXT; -class TEXT_SPIN_STYLE; +class SPIN_STYLE; class LIB_FIELD; class LIB_SYMBOL; class REPORTER; @@ -261,8 +261,8 @@ private: ELECTRICAL_PINTYPE getKiCadPinType( const CADSTAR_PIN_TYPE& aPinType ); int getKiCadUnitNumberFromGate( const GATE_ID& aCadstarGateID ); - TEXT_SPIN_STYLE getSpinStyle( const long long& aCadstarOrientation, bool aMirror ); - TEXT_SPIN_STYLE getSpinStyle( const EDA_ANGLE& aOrientation ); + SPIN_STYLE getSpinStyle( const long long& aCadstarOrientation, bool aMirror ); + SPIN_STYLE getSpinStyle( const EDA_ANGLE& aOrientation ); ALIGNMENT mirrorX( const ALIGNMENT& aCadstarAlignment ); ALIGNMENT rotate180( const ALIGNMENT& aCadstarAlignment ); diff --git a/eeschema/sch_plugins/eagle/sch_eagle_plugin.cpp b/eeschema/sch_plugins/eagle/sch_eagle_plugin.cpp index 49aa3d0ffe..ce19298251 100644 --- a/eeschema/sch_plugins/eagle/sch_eagle_plugin.cpp +++ b/eeschema/sch_plugins/eagle/sch_eagle_plugin.cpp @@ -1326,7 +1326,7 @@ void SCH_EAGLE_PLUGIN::loadSegments( wxXmlNode* aSegmentsNode, const wxString& n // feature of Eagle schematics. if( !labelled && firstWireFound ) { - std::unique_ptr label; + std::unique_ptr label; // Add a global label if the net appears on more than one Eagle sheet if( m_netCounts[netName.ToStdString()] > 1 ) @@ -1342,9 +1342,9 @@ void SCH_EAGLE_PLUGIN::loadSegments( wxXmlNode* aSegmentsNode, const wxString& n schIUScale.MilsToIU( 40 ) ) ); if( firstWire.B.x > firstWire.A.x ) - label->SetTextSpinStyle( TEXT_SPIN_STYLE::LEFT ); + label->SetSpinStyle( SPIN_STYLE::LEFT ); else - label->SetTextSpinStyle( TEXT_SPIN_STYLE::RIGHT ); + label->SetSpinStyle( SPIN_STYLE::RIGHT ); screen->Append( label.release() ); } @@ -1500,8 +1500,8 @@ SCH_TEXT* SCH_EAGLE_PLUGIN::loadLabel( wxXmlNode* aLabelNode, const wxString& aN // Determine if the label is local or global depending on // the number of sheets the net appears in - bool global = m_netCounts[aNetName] > 1; - std::unique_ptr label; + bool global = m_netCounts[aNetName] > 1; + std::unique_ptr label; VECTOR2I textSize = VECTOR2I( KiROUND( elabel.size.ToSchUnits() * 0.7 ), KiROUND( elabel.size.ToSchUnits() * 0.7 ) ); @@ -1514,7 +1514,7 @@ SCH_TEXT* SCH_EAGLE_PLUGIN::loadLabel( wxXmlNode* aLabelNode, const wxString& aN label->SetPosition( elabelpos ); label->SetText( escapeName( elabel.netname ) ); label->SetTextSize( textSize ); - label->SetTextSpinStyle( TEXT_SPIN_STYLE::RIGHT ); + label->SetSpinStyle( SPIN_STYLE::RIGHT ); if( elabel.rot ) { @@ -3391,10 +3391,10 @@ void SCH_EAGLE_PLUGIN::addImplicitConnections( SCH_SYMBOL* aSymbol, SCH_SCREEN* switch( pin->GetOrientation() ) { - case PIN_ORIENTATION::PIN_LEFT: netLabel->SetTextSpinStyle( TEXT_SPIN_STYLE::RIGHT ); break; - case PIN_ORIENTATION::PIN_RIGHT: netLabel->SetTextSpinStyle( TEXT_SPIN_STYLE::LEFT ); break; - case PIN_ORIENTATION::PIN_UP: netLabel->SetTextSpinStyle( TEXT_SPIN_STYLE::UP ); break; - case PIN_ORIENTATION::PIN_DOWN: netLabel->SetTextSpinStyle( TEXT_SPIN_STYLE::BOTTOM ); break; + case PIN_ORIENTATION::PIN_LEFT: netLabel->SetSpinStyle( SPIN_STYLE::RIGHT ); break; + case PIN_ORIENTATION::PIN_RIGHT: netLabel->SetSpinStyle( SPIN_STYLE::LEFT ); break; + case PIN_ORIENTATION::PIN_UP: netLabel->SetSpinStyle( SPIN_STYLE::UP ); break; + case PIN_ORIENTATION::PIN_DOWN: netLabel->SetSpinStyle( SPIN_STYLE::BOTTOM ); break; } aScreen->Append( netLabel ); diff --git a/eeschema/sch_plugins/kicad/sch_sexpr_parser.cpp b/eeschema/sch_plugins/kicad/sch_sexpr_parser.cpp index 254bad5685..6888c9ab3e 100644 --- a/eeschema/sch_plugins/kicad/sch_sexpr_parser.cpp +++ b/eeschema/sch_plugins/kicad/sch_sexpr_parser.cpp @@ -3831,17 +3831,18 @@ SCH_TEXT* SCH_SEXPR_PARSER::parseSchText() case T_at: text->SetPosition( parseXY() ); + text->SetTextAngle( EDA_ANGLE( parseDouble( "text angle" ), DEGREES_T ) ); - switch( static_cast( parseDouble( "text angle" ) ) ) + if( SCH_LABEL_BASE* label = dynamic_cast( text.get() ) ) { - case 0: text->SetTextSpinStyle( TEXT_SPIN_STYLE::RIGHT ); break; - case 90: text->SetTextSpinStyle( TEXT_SPIN_STYLE::UP ); break; - case 180: text->SetTextSpinStyle( TEXT_SPIN_STYLE::LEFT ); break; - case 270: text->SetTextSpinStyle( TEXT_SPIN_STYLE::BOTTOM ); break; - default: - wxFAIL; - text->SetTextSpinStyle( TEXT_SPIN_STYLE::RIGHT ); - break; + switch( static_cast( label->GetTextAngle().AsDegrees() ) ) + { + case 0: label->SetSpinStyle( SPIN_STYLE::RIGHT ); break; + case 90: label->SetSpinStyle( SPIN_STYLE::UP ); break; + case 180: label->SetSpinStyle( SPIN_STYLE::LEFT ); break; + case 270: label->SetSpinStyle( SPIN_STYLE::BOTTOM ); break; + default: wxFAIL; label->SetSpinStyle( SPIN_STYLE::RIGHT ); break; + } } NeedRIGHT(); @@ -3895,26 +3896,6 @@ SCH_TEXT* SCH_SEXPR_PARSER::parseSchText() case T_effects: parseEDA_TEXT( static_cast( text.get() ), true ); - - // Spin style is defined differently for graphical text (#SCH_TEXT) objects. - if( text->Type() == SCH_TEXT_T ) - { - if( text->GetHorizJustify() == GR_TEXT_H_ALIGN_RIGHT - && text->GetTextAngle().IsVertical() ) - { - // The vertically aligned text angle is always 90 (labels use 270 for the - // down direction) combined with the text justification flags. - text->SetTextSpinStyle( TEXT_SPIN_STYLE::BOTTOM ); - } - else if( text->GetHorizJustify() == GR_TEXT_H_ALIGN_RIGHT - && text->GetTextAngle().IsHorizontal() ) - { - // The horizontally aligned text angle is always 0 (labels use 180 for the - // left direction) combined with the text justification flags. - text->SetTextSpinStyle( TEXT_SPIN_STYLE::LEFT ); - } - } - break; case T_iref: // legacy format; current is a T_property (aka SCH_FIELD) diff --git a/eeschema/sch_plugins/kicad/sch_sexpr_plugin.cpp b/eeschema/sch_plugins/kicad/sch_sexpr_plugin.cpp index 432c2942a9..f10a4fb13c 100644 --- a/eeschema/sch_plugins/kicad/sch_sexpr_plugin.cpp +++ b/eeschema/sch_plugins/kicad/sch_sexpr_plugin.cpp @@ -1283,22 +1283,22 @@ void SCH_SEXPR_PLUGIN::saveText( SCH_TEXT* aText, int aNestLevel ) if( label ) { - if( aText->Type() == SCH_GLOBAL_LABEL_T - || aText->Type() == SCH_HIER_LABEL_T - || aText->Type() == SCH_DIRECTIVE_LABEL_T ) + if( label->Type() == SCH_GLOBAL_LABEL_T + || label->Type() == SCH_HIER_LABEL_T + || label->Type() == SCH_DIRECTIVE_LABEL_T ) { m_out->Print( 0, " (shape %s)", getSheetPinShapeToken( label->GetShape() ) ); } // The angle of the text is always 0 or 90 degrees for readibility reasons, // but the item itself can have more rotation (-90 and 180 deg) - switch( aText->GetTextSpinStyle() ) + switch( label->GetSpinStyle() ) { default: - case TEXT_SPIN_STYLE::LEFT: angle += ANGLE_180; break; - case TEXT_SPIN_STYLE::UP: break; - case TEXT_SPIN_STYLE::RIGHT: break; - case TEXT_SPIN_STYLE::BOTTOM: angle += ANGLE_180; break; + case SPIN_STYLE::LEFT: angle += ANGLE_180; break; + case SPIN_STYLE::UP: break; + case SPIN_STYLE::RIGHT: break; + case SPIN_STYLE::BOTTOM: angle += ANGLE_180; break; } } diff --git a/eeschema/sch_plugins/legacy/sch_legacy_plugin.cpp b/eeschema/sch_plugins/legacy/sch_legacy_plugin.cpp index 4c1becc090..0afbcaa453 100644 --- a/eeschema/sch_plugins/legacy/sch_legacy_plugin.cpp +++ b/eeschema/sch_plugins/legacy/sch_legacy_plugin.cpp @@ -990,42 +990,46 @@ SCH_TEXT* SCH_LEGACY_PLUGIN::loadText( LINE_READER& aReader ) } int spinStyle = parseInt( aReader, line, &line ); - - // Sadly we store the orientation of hierarchical and global labels using a different - // int encoding than that for local labels: - // Global Local - // Left justified 0 2 - // Up 1 3 - // Right justified 2 0 - // Down 3 1 - // So we must flip it as the enum is setup with the "global" numbering - if( text->Type() != SCH_GLOBAL_LABEL_T && text->Type() != SCH_HIER_LABEL_T ) - { - if( spinStyle == 0 ) - spinStyle = 2; - else if( spinStyle == 2 ) - spinStyle = 0; - } - - text->SetTextSpinStyle( static_cast( spinStyle ) ); - int size = schIUScale.MilsToIU( parseInt( aReader, line, &line ) ); text->SetTextSize( VECTOR2I( size, size ) ); - // Parse the global and hierarchical label type. - if( text->Type() == SCH_HIER_LABEL_T || text->Type() == SCH_GLOBAL_LABEL_T ) + if( textType == SCH_LABEL_T || textType == SCH_HIER_LABEL_T || textType == SCH_GLOBAL_LABEL_T ) { - auto resultIt = std::find_if( sheetLabelNames.begin(), sheetLabelNames.end(), - [ &line ]( const auto& it ) - { - return strCompare( it.second, line, &line ); - } ); + SCH_LABEL_BASE* label = static_cast( text.get() ); - if( resultIt != sheetLabelNames.end() ) - text->SetShape( resultIt->first ); - else - SCH_PARSE_ERROR( "invalid label type", aReader, line ); + // Sadly we store the orientation of hierarchical and global labels using a different + // int encoding than that for local labels: + // Global Local + // Left justified 0 2 + // Up 1 3 + // Right justified 2 0 + // Down 3 1 + // So we must flip it as the enum is setup with the "global" numbering + if( textType == SCH_LABEL_T ) + { + if( spinStyle == 0 ) + spinStyle = 2; + else if( spinStyle == 2 ) + spinStyle = 0; + } + + label->SetSpinStyle( static_cast( spinStyle ) ); + + // Parse the global and hierarchical label type. + if( textType == SCH_HIER_LABEL_T || textType == SCH_GLOBAL_LABEL_T ) + { + auto resultIt = std::find_if( sheetLabelNames.begin(), sheetLabelNames.end(), + [ &line ]( const auto& it ) + { + return strCompare( it.second, line, &line ); + } ); + + if( resultIt != sheetLabelNames.end() ) + label->SetShape( resultIt->first ); + else + SCH_PARSE_ERROR( "invalid label type", aReader, line ); + } } int penWidth = 0; @@ -1991,13 +1995,18 @@ void SCH_LEGACY_PLUGIN::saveText( SCH_TEXT* aText ) textType = "Label"; } - // Local labels must have their spin style inverted for left and right - int spinStyle = static_cast( aText->GetTextSpinStyle() ); + int spinStyle = 0; - if( spinStyle == 0 ) - spinStyle = 2; - else if( spinStyle == 2 ) - spinStyle = 0; + // Local labels must have their spin style inverted for left and right + if( SCH_LABEL_BASE* label = dynamic_cast( aText ) ) + { + spinStyle = static_cast( label->GetSpinStyle() ); + + if( spinStyle == 0 ) + spinStyle = 2; + else if( spinStyle == 2 ) + spinStyle = 0; + } m_out->Print( 0, "Text %s %-4d %-4d %-4d %-4d %s %d\n%s\n", textType, schIUScale.IUToMils( aText->GetPosition().x ), @@ -2010,13 +2019,14 @@ void SCH_LEGACY_PLUGIN::saveText( SCH_TEXT* aText ) { textType = ( layer == LAYER_GLOBLABEL ) ? "GLabel" : "HLabel"; - auto shapeLabelIt = sheetLabelNames.find( aText->GetShape() ); + SCH_LABEL_BASE* label = static_cast( aText ); + auto shapeLabelIt = sheetLabelNames.find( label->GetShape() ); wxCHECK_RET( shapeLabelIt != sheetLabelNames.end(), "Shape not found in names list" ); m_out->Print( 0, "Text %s %-4d %-4d %-4d %-4d %s %s %d\n%s\n", textType, schIUScale.IUToMils( aText->GetPosition().x ), schIUScale.IUToMils( aText->GetPosition().y ), - static_cast( aText->GetTextSpinStyle() ), + static_cast( label->GetSpinStyle() ), schIUScale.IUToMils( aText->GetTextWidth() ), shapeLabelIt->second, italics, diff --git a/eeschema/sch_plugins/ltspice/ltspice_sch_parser.cpp b/eeschema/sch_plugins/ltspice/ltspice_sch_parser.cpp index af2aa0473c..9880a2e63a 100644 --- a/eeschema/sch_plugins/ltspice/ltspice_sch_parser.cpp +++ b/eeschema/sch_plugins/ltspice/ltspice_sch_parser.cpp @@ -904,13 +904,13 @@ SCH_LABEL_BASE* LTSPICE_SCH_PARSER::CreateSCH_LABEL( KICAD_T aType, const VECTOR label->SetText( aValue ); label->SetTextSize( ToKicadFontSize( aFontSize ) ); - label->SetTextSpinStyle( TEXT_SPIN_STYLE::RIGHT ); + label->SetSpinStyle( SPIN_STYLE::RIGHT ); } else if( aType == SCH_DIRECTIVE_LABEL_T ) { label = new SCH_DIRECTIVE_LABEL(); - label->SetTextSpinStyle( TEXT_SPIN_STYLE::RIGHT ); + label->SetSpinStyle( SPIN_STYLE::RIGHT ); SCH_FIELD field( { 0, 0 }, -1, label, wxS( "DATAFLAG" ) ); field.SetText( aValue ); diff --git a/eeschema/sch_screen.cpp b/eeschema/sch_screen.cpp index 9d837bbe58..abef369e45 100644 --- a/eeschema/sch_screen.cpp +++ b/eeschema/sch_screen.cpp @@ -502,9 +502,9 @@ bool SCH_SCREEN::IsExplicitJunctionNeeded( const VECTOR2I& aPosition ) const return isJunction && !hasBusEntry && !hasExplicitJunction; } -TEXT_SPIN_STYLE SCH_SCREEN::GetLabelOrientationForPoint( const VECTOR2I& aPosition, - TEXT_SPIN_STYLE aDefaultOrientation, - const SCH_SHEET_PATH* aSheet ) const +SPIN_STYLE SCH_SCREEN::GetLabelOrientationForPoint( const VECTOR2I& aPosition, + SPIN_STYLE aDefaultOrientation, + const SCH_SHEET_PATH* aSheet ) const { auto ret = aDefaultOrientation; for( SCH_ITEM* item : Items().Overlapping( aPosition ) ) @@ -527,18 +527,18 @@ TEXT_SPIN_STYLE SCH_SCREEN::GetLabelOrientationForPoint( const VECTOR2I& a // bus is vertical -> label shall be horizontal and // shall be placed to the side where the bus entry is if( aPosition.x < bus->GetPosition().x ) - ret = TEXT_SPIN_STYLE::LEFT; + ret = SPIN_STYLE::LEFT; else if( aPosition.x > bus->GetPosition().x ) - ret = TEXT_SPIN_STYLE::RIGHT; + ret = SPIN_STYLE::RIGHT; } else if( bus->Angle().AsDegrees() == 0.0 ) { // bus is horizontal -> label shall be vertical and // shall be placed to the side where the bus entry is if( aPosition.y < bus->GetPosition().y ) - ret = TEXT_SPIN_STYLE::UP; + ret = SPIN_STYLE::UP; else if( aPosition.y > bus->GetPosition().y ) - ret = TEXT_SPIN_STYLE::BOTTOM; + ret = SPIN_STYLE::BOTTOM; } } } @@ -553,28 +553,16 @@ TEXT_SPIN_STYLE SCH_SCREEN::GetLabelOrientationForPoint( const VECTOR2I& a if( -45 < angle && angle <= 45 ) { if( line->GetStartPoint().x <= line->GetEndPoint().x ) - { - ret = line->GetEndPoint() == aPosition ? TEXT_SPIN_STYLE::RIGHT - : TEXT_SPIN_STYLE::LEFT; - } + ret = line->GetEndPoint() == aPosition ? SPIN_STYLE::RIGHT : SPIN_STYLE::LEFT; else - { - ret = line->GetEndPoint() == aPosition ? TEXT_SPIN_STYLE::LEFT - : TEXT_SPIN_STYLE::RIGHT; - } + ret = line->GetEndPoint() == aPosition ? SPIN_STYLE::LEFT : SPIN_STYLE::RIGHT; } else { if( line->GetStartPoint().y <= line->GetEndPoint().y ) - { - ret = line->GetEndPoint() == aPosition ? TEXT_SPIN_STYLE::BOTTOM - : TEXT_SPIN_STYLE::UP; - } + ret = line->GetEndPoint() == aPosition ? SPIN_STYLE::BOTTOM : SPIN_STYLE::UP; else - { - ret = line->GetEndPoint() == aPosition ? TEXT_SPIN_STYLE::UP - : TEXT_SPIN_STYLE::BOTTOM; - } + ret = line->GetEndPoint() == aPosition ? SPIN_STYLE::UP : SPIN_STYLE::BOTTOM; } } break; @@ -588,103 +576,95 @@ TEXT_SPIN_STYLE SCH_SCREEN::GetLabelOrientationForPoint( const VECTOR2I& a if( pin->GetPosition() == aPosition ) { if( pin->GetOrientation() == PIN_ORIENTATION::PIN_RIGHT ) - { - ret = TEXT_SPIN_STYLE::LEFT; - } + ret = SPIN_STYLE::LEFT; else if( pin->GetOrientation() == PIN_ORIENTATION::PIN_LEFT ) - { - ret = TEXT_SPIN_STYLE::RIGHT; - } + ret = SPIN_STYLE::RIGHT; else if( pin->GetOrientation() == PIN_ORIENTATION::PIN_UP ) - { - ret = TEXT_SPIN_STYLE::BOTTOM; - } + ret = SPIN_STYLE::BOTTOM; else if( pin->GetOrientation() == PIN_ORIENTATION::PIN_DOWN ) - { - ret = TEXT_SPIN_STYLE::UP; - } + ret = SPIN_STYLE::UP; switch( static_cast( symbol->GetOrientation() & ( ~( SYM_MIRROR_X | SYM_MIRROR_Y ) ) ) ) { case SYM_ROTATE_CLOCKWISE: case SYM_ORIENT_90: - if( ret == TEXT_SPIN_STYLE::UP ) - ret = TEXT_SPIN_STYLE::LEFT; - else if( ret == TEXT_SPIN_STYLE::BOTTOM ) - ret = TEXT_SPIN_STYLE::RIGHT; - else if( ret == TEXT_SPIN_STYLE::LEFT ) - ret = TEXT_SPIN_STYLE::BOTTOM; - else if( ret == TEXT_SPIN_STYLE::RIGHT ) - ret = TEXT_SPIN_STYLE::UP; + if( ret == SPIN_STYLE::UP ) + ret = SPIN_STYLE::LEFT; + else if( ret == SPIN_STYLE::BOTTOM ) + ret = SPIN_STYLE::RIGHT; + else if( ret == SPIN_STYLE::LEFT ) + ret = SPIN_STYLE::BOTTOM; + else if( ret == SPIN_STYLE::RIGHT ) + ret = SPIN_STYLE::UP; if( symbol->GetOrientation() & SYM_MIRROR_X ) { - if( ret == TEXT_SPIN_STYLE::UP ) - ret = TEXT_SPIN_STYLE::BOTTOM; - else if( ret == TEXT_SPIN_STYLE::BOTTOM ) - ret = TEXT_SPIN_STYLE::UP; + if( ret == SPIN_STYLE::UP ) + ret = SPIN_STYLE::BOTTOM; + else if( ret == SPIN_STYLE::BOTTOM ) + ret = SPIN_STYLE::UP; } if( symbol->GetOrientation() & SYM_MIRROR_Y ) { - if( ret == TEXT_SPIN_STYLE::LEFT ) - ret = TEXT_SPIN_STYLE::RIGHT; - else if( ret == TEXT_SPIN_STYLE::RIGHT ) - ret = TEXT_SPIN_STYLE::LEFT; + if( ret == SPIN_STYLE::LEFT ) + ret = SPIN_STYLE::RIGHT; + else if( ret == SPIN_STYLE::RIGHT ) + ret = SPIN_STYLE::LEFT; } break; case SYM_ROTATE_COUNTERCLOCKWISE: case SYM_ORIENT_270: - if( ret == TEXT_SPIN_STYLE::UP ) - ret = TEXT_SPIN_STYLE::RIGHT; - else if( ret == TEXT_SPIN_STYLE::BOTTOM ) - ret = TEXT_SPIN_STYLE::LEFT; - else if( ret == TEXT_SPIN_STYLE::LEFT ) - ret = TEXT_SPIN_STYLE::UP; - else if( ret == TEXT_SPIN_STYLE::RIGHT ) - ret = TEXT_SPIN_STYLE::BOTTOM; + if( ret == SPIN_STYLE::UP ) + ret = SPIN_STYLE::RIGHT; + else if( ret == SPIN_STYLE::BOTTOM ) + ret = SPIN_STYLE::LEFT; + else if( ret == SPIN_STYLE::LEFT ) + ret = SPIN_STYLE::UP; + else if( ret == SPIN_STYLE::RIGHT ) + ret = SPIN_STYLE::BOTTOM; if( symbol->GetOrientation() & SYM_MIRROR_X ) { - if( ret == TEXT_SPIN_STYLE::UP ) - ret = TEXT_SPIN_STYLE::BOTTOM; - else if( ret == TEXT_SPIN_STYLE::BOTTOM ) - ret = TEXT_SPIN_STYLE::UP; + if( ret == SPIN_STYLE::UP ) + ret = SPIN_STYLE::BOTTOM; + else if( ret == SPIN_STYLE::BOTTOM ) + ret = SPIN_STYLE::UP; } if( symbol->GetOrientation() & SYM_MIRROR_Y ) { - if( ret == TEXT_SPIN_STYLE::LEFT ) - ret = TEXT_SPIN_STYLE::RIGHT; - else if( ret == TEXT_SPIN_STYLE::RIGHT ) - ret = TEXT_SPIN_STYLE::LEFT; + if( ret == SPIN_STYLE::LEFT ) + ret = SPIN_STYLE::RIGHT; + else if( ret == SPIN_STYLE::RIGHT ) + ret = SPIN_STYLE::LEFT; } break; case SYM_ORIENT_180: - if( ret == TEXT_SPIN_STYLE::UP ) - ret = TEXT_SPIN_STYLE::BOTTOM; - else if( ret == TEXT_SPIN_STYLE::BOTTOM ) - ret = TEXT_SPIN_STYLE::UP; - else if( ret == TEXT_SPIN_STYLE::LEFT ) - ret = TEXT_SPIN_STYLE::RIGHT; - else if( ret == TEXT_SPIN_STYLE::RIGHT ) - ret = TEXT_SPIN_STYLE::LEFT; + if( ret == SPIN_STYLE::UP ) + ret = SPIN_STYLE::BOTTOM; + else if( ret == SPIN_STYLE::BOTTOM ) + ret = SPIN_STYLE::UP; + else if( ret == SPIN_STYLE::LEFT ) + ret = SPIN_STYLE::RIGHT; + else if( ret == SPIN_STYLE::RIGHT ) + ret = SPIN_STYLE::LEFT; if( symbol->GetOrientation() & SYM_MIRROR_X ) { - if( ret == TEXT_SPIN_STYLE::UP ) - ret = TEXT_SPIN_STYLE::BOTTOM; - else if( ret == TEXT_SPIN_STYLE::BOTTOM ) - ret = TEXT_SPIN_STYLE::UP; + if( ret == SPIN_STYLE::UP ) + ret = SPIN_STYLE::BOTTOM; + else if( ret == SPIN_STYLE::BOTTOM ) + ret = SPIN_STYLE::UP; } if( symbol->GetOrientation() & SYM_MIRROR_Y ) { - if( ret == TEXT_SPIN_STYLE::LEFT ) - ret = TEXT_SPIN_STYLE::RIGHT; - else if( ret == TEXT_SPIN_STYLE::RIGHT ) - ret = TEXT_SPIN_STYLE::LEFT; + if( ret == SPIN_STYLE::LEFT ) + ret = SPIN_STYLE::RIGHT; + else if( ret == SPIN_STYLE::RIGHT ) + ret = SPIN_STYLE::LEFT; } break; case SYM_ORIENT_0: @@ -692,18 +672,18 @@ TEXT_SPIN_STYLE SCH_SCREEN::GetLabelOrientationForPoint( const VECTOR2I& a default: if( symbol->GetOrientation() & SYM_MIRROR_X ) { - if( ret == TEXT_SPIN_STYLE::UP ) - ret = TEXT_SPIN_STYLE::BOTTOM; - else if( ret == TEXT_SPIN_STYLE::BOTTOM ) - ret = TEXT_SPIN_STYLE::UP; + if( ret == SPIN_STYLE::UP ) + ret = SPIN_STYLE::BOTTOM; + else if( ret == SPIN_STYLE::BOTTOM ) + ret = SPIN_STYLE::UP; } if( symbol->GetOrientation() & SYM_MIRROR_Y ) { - if( ret == TEXT_SPIN_STYLE::LEFT ) - ret = TEXT_SPIN_STYLE::RIGHT; - else if( ret == TEXT_SPIN_STYLE::RIGHT ) - ret = TEXT_SPIN_STYLE::LEFT; + if( ret == SPIN_STYLE::LEFT ) + ret = SPIN_STYLE::RIGHT; + else if( ret == SPIN_STYLE::RIGHT ) + ret = SPIN_STYLE::LEFT; } break; } diff --git a/eeschema/sch_screen.h b/eeschema/sch_screen.h index 430692d4af..e0a4db4b9c 100644 --- a/eeschema/sch_screen.h +++ b/eeschema/sch_screen.h @@ -49,7 +49,7 @@ #include #include #include -#include +#include #include class BUS_ALIAS; @@ -340,9 +340,9 @@ public: */ bool IsExplicitJunctionNeeded( const VECTOR2I& aPosition ) const; - TEXT_SPIN_STYLE GetLabelOrientationForPoint( const VECTOR2I& aPosition, - TEXT_SPIN_STYLE aDefaultOrientation, - const SCH_SHEET_PATH* aSheet ) const; + SPIN_STYLE GetLabelOrientationForPoint( const VECTOR2I& aPosition, + SPIN_STYLE aDefaultOrientation, + const SCH_SHEET_PATH* aSheet ) const; /** * Indicates that a juction dot may be placed at the given location. See IsJunctionNeeded * for more info. diff --git a/eeschema/sch_sheet_pin.cpp b/eeschema/sch_sheet_pin.cpp index 9fc9ef4d61..1dddb167f3 100644 --- a/eeschema/sch_sheet_pin.cpp +++ b/eeschema/sch_sheet_pin.cpp @@ -121,25 +121,25 @@ void SCH_SHEET_PIN::SetSide( SHEET_SIDE aEdge ) case SHEET_SIDE::LEFT: m_edge = aEdge; SetTextX( Sheet->m_pos.x ); - SetTextSpinStyle( TEXT_SPIN_STYLE::RIGHT ); // Orientation horiz inverse + SetSpinStyle( SPIN_STYLE::RIGHT ); // Orientation horiz inverse break; case SHEET_SIDE::RIGHT: m_edge = aEdge; SetTextX( Sheet->m_pos.x + Sheet->m_size.x ); - SetTextSpinStyle( TEXT_SPIN_STYLE::LEFT ); // Orientation horiz normal + SetSpinStyle( SPIN_STYLE::LEFT ); // Orientation horiz normal break; case SHEET_SIDE::TOP: m_edge = aEdge; SetTextY( Sheet->m_pos.y ); - SetTextSpinStyle( TEXT_SPIN_STYLE::BOTTOM ); // Orientation vert BOTTOM + SetSpinStyle( SPIN_STYLE::BOTTOM ); // Orientation vert BOTTOM break; case SHEET_SIDE::BOTTOM: m_edge = aEdge; SetTextY( Sheet->m_pos.y + Sheet->m_size.y ); - SetTextSpinStyle( TEXT_SPIN_STYLE::UP ); // Orientation vert UP + SetSpinStyle( SPIN_STYLE::UP ); // Orientation vert UP break; default: diff --git a/eeschema/sch_text.cpp b/eeschema/sch_text.cpp index f8c1f1a6bc..98e09b44d5 100644 --- a/eeschema/sch_text.cpp +++ b/eeschema/sch_text.cpp @@ -48,70 +48,6 @@ using KIGFX::SCH_RENDER_SETTINGS; -TEXT_SPIN_STYLE TEXT_SPIN_STYLE::RotateCW() -{ - SPIN newSpin = m_spin; - - switch( m_spin ) - { - case TEXT_SPIN_STYLE::LEFT: newSpin = TEXT_SPIN_STYLE::UP; break; - case TEXT_SPIN_STYLE::UP: newSpin = TEXT_SPIN_STYLE::RIGHT; break; - case TEXT_SPIN_STYLE::RIGHT: newSpin = TEXT_SPIN_STYLE::BOTTOM; break; - case TEXT_SPIN_STYLE::BOTTOM: newSpin = TEXT_SPIN_STYLE::LEFT; break; - } - - return TEXT_SPIN_STYLE( newSpin ); -} - - -TEXT_SPIN_STYLE TEXT_SPIN_STYLE::RotateCCW() -{ - SPIN newSpin = m_spin; - - switch( m_spin ) - { - case TEXT_SPIN_STYLE::LEFT: newSpin = TEXT_SPIN_STYLE::BOTTOM; break; - case TEXT_SPIN_STYLE::BOTTOM: newSpin = TEXT_SPIN_STYLE::RIGHT; break; - case TEXT_SPIN_STYLE::RIGHT: newSpin = TEXT_SPIN_STYLE::UP; break; - case TEXT_SPIN_STYLE::UP: newSpin = TEXT_SPIN_STYLE::LEFT; break; - } - - return TEXT_SPIN_STYLE( newSpin ); -} - - -TEXT_SPIN_STYLE TEXT_SPIN_STYLE::MirrorX() -{ - SPIN newSpin = m_spin; - - switch( m_spin ) - { - case TEXT_SPIN_STYLE::UP: newSpin = TEXT_SPIN_STYLE::BOTTOM; break; - case TEXT_SPIN_STYLE::BOTTOM: newSpin = TEXT_SPIN_STYLE::UP; break; - case TEXT_SPIN_STYLE::LEFT: break; - case TEXT_SPIN_STYLE::RIGHT: break; - } - - return TEXT_SPIN_STYLE( newSpin ); -} - - -TEXT_SPIN_STYLE TEXT_SPIN_STYLE::MirrorY() -{ - SPIN newSpin = m_spin; - - switch( m_spin ) - { - case TEXT_SPIN_STYLE::LEFT: newSpin = TEXT_SPIN_STYLE::RIGHT; break; - case TEXT_SPIN_STYLE::RIGHT: newSpin = TEXT_SPIN_STYLE::LEFT; break; - case TEXT_SPIN_STYLE::UP: break; - case TEXT_SPIN_STYLE::BOTTOM: break; - } - - return TEXT_SPIN_STYLE( newSpin ); -} - - SCH_TEXT::SCH_TEXT( const VECTOR2I& pos, const wxString& text, KICAD_T aType ) : SCH_ITEM( nullptr, aType ), EDA_TEXT( schIUScale, text ) @@ -119,7 +55,6 @@ SCH_TEXT::SCH_TEXT( const VECTOR2I& pos, const wxString& text, KICAD_T aType ) : m_layer = LAYER_NOTES; SetTextPos( pos ); - SetTextSpinStyle( TEXT_SPIN_STYLE::LEFT ); SetMultilineAllowed( true ); m_excludedFromSim = false; @@ -128,8 +63,7 @@ SCH_TEXT::SCH_TEXT( const VECTOR2I& pos, const wxString& text, KICAD_T aType ) : SCH_TEXT::SCH_TEXT( const SCH_TEXT& aText ) : SCH_ITEM( aText ), - EDA_TEXT( aText ), - m_spin_style( aText.m_spin_style ) + EDA_TEXT( aText ) { m_excludedFromSim = aText.m_excludedFromSim; } @@ -142,21 +76,36 @@ VECTOR2I SCH_TEXT::GetSchematicTextOffset( const RENDER_SETTINGS* aSettings ) co } +void SCH_TEXT::FlipHJustify() +{ + if( GetHorizJustify() == GR_TEXT_H_ALIGN_RIGHT ) + SetHorizJustify( GR_TEXT_H_ALIGN_RIGHT ); + else if( GetHorizJustify() == GR_TEXT_H_ALIGN_LEFT ) + SetHorizJustify( GR_TEXT_H_ALIGN_RIGHT ); +} + + void SCH_TEXT::MirrorHorizontally( int aCenter ) { - // Text is NOT really mirrored; it is moved to a suitable horizontal position - SetTextSpinStyle( GetTextSpinStyle().MirrorY() ); + if( GetTextAngle() == ANGLE_HORIZONTAL ) + { + FlipHJustify(); - SetTextX( MIRRORVAL( GetTextPos().x, aCenter ) ); + if( GetHorizJustify() == GR_TEXT_H_ALIGN_LEFT || GetHorizJustify() == GR_TEXT_H_ALIGN_RIGHT ) + SetTextX( MIRRORVAL( GetTextPos().x, aCenter ) ); + } } void SCH_TEXT::MirrorVertically( int aCenter ) { - // Text is NOT really mirrored; it is moved to a suitable vertical position - SetTextSpinStyle( GetTextSpinStyle().MirrorX() ); + if( GetTextAngle() == ANGLE_VERTICAL ) + { + FlipHJustify(); - SetTextY( MIRRORVAL( GetTextPos().y, aCenter ) ); + if( GetHorizJustify() == GR_TEXT_H_ALIGN_LEFT || GetHorizJustify() == GR_TEXT_H_ALIGN_RIGHT ) + SetTextY( MIRRORVAL( GetTextPos().y, aCenter ) ); + } } @@ -174,57 +123,23 @@ void SCH_TEXT::Rotate( const VECTOR2I& aCenter ) void SCH_TEXT::Rotate90( bool aClockwise ) { - if( aClockwise ) - SetTextSpinStyle( GetTextSpinStyle().RotateCW() ); - else - SetTextSpinStyle( GetTextSpinStyle().RotateCCW() ); + if( ( GetTextAngle() == ANGLE_HORIZONTAL && aClockwise ) + || ( GetTextAngle() == ANGLE_HORIZONTAL && !aClockwise ) ) + { + FlipHJustify(); + } + + SetTextAngle( GetTextAngle() == ANGLE_VERTICAL ? ANGLE_HORIZONTAL : ANGLE_VERTICAL ); } void SCH_TEXT::MirrorSpinStyle( bool aLeftRight ) { - if( aLeftRight ) - SetTextSpinStyle( GetTextSpinStyle().MirrorY() ); - else - SetTextSpinStyle( GetTextSpinStyle().MirrorX() ); -} - - -void SCH_TEXT::SetTextSpinStyle( TEXT_SPIN_STYLE aSpinStyle ) -{ - m_spin_style = aSpinStyle; - - // Assume "Right" and Left" mean which side of the anchor the text will be on - // Thus we want to left justify text up against the anchor if we are on the right - switch( aSpinStyle ) + if( ( GetTextAngle() == ANGLE_HORIZONTAL && aLeftRight ) + || ( GetTextAngle() == ANGLE_VERTICAL && !aLeftRight ) ) { - default: - wxFAIL_MSG( "Bad spin style" ); - m_spin_style = TEXT_SPIN_STYLE::RIGHT; // Handle the error spin style by resetting - KI_FALLTHROUGH; - - case TEXT_SPIN_STYLE::RIGHT: // Horiz Normal Orientation - SetTextAngle( ANGLE_HORIZONTAL ); - SetHorizJustify( GR_TEXT_H_ALIGN_LEFT ); - break; - - case TEXT_SPIN_STYLE::UP: // Vert Orientation UP - SetTextAngle( ANGLE_VERTICAL ); - SetHorizJustify( GR_TEXT_H_ALIGN_LEFT ); - break; - - case TEXT_SPIN_STYLE::LEFT: // Horiz Orientation - Right justified - SetTextAngle( ANGLE_HORIZONTAL ); - SetHorizJustify( GR_TEXT_H_ALIGN_RIGHT ); - break; - - case TEXT_SPIN_STYLE::BOTTOM: // Vert Orientation BOTTOM - SetTextAngle( ANGLE_VERTICAL ); - SetHorizJustify( GR_TEXT_H_ALIGN_RIGHT ); - break; + FlipHJustify(); } - - SetVertJustify( GR_TEXT_V_ALIGN_BOTTOM ); } @@ -235,7 +150,6 @@ void SCH_TEXT::SwapData( SCH_ITEM* aItem ) SCH_TEXT* item = static_cast( aItem ); std::swap( m_layer, item->m_layer ); - std::swap( m_spin_style, item->m_spin_style ); SwapText( *item ); SwapAttributes( *item ); @@ -514,13 +428,11 @@ void SCH_TEXT::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vectorMessageTextFromValue( GetTextWidth() ) ); - switch( GetTextSpinStyle() ) + switch( GetHorizJustify() ) { - case TEXT_SPIN_STYLE::LEFT: msg = _( "Align right" ); break; - case TEXT_SPIN_STYLE::UP: msg = _( "Align bottom" ); break; - case TEXT_SPIN_STYLE::RIGHT: msg = _( "Align left" ); break; - case TEXT_SPIN_STYLE::BOTTOM: msg = _( "Align top" ); break; - default: msg = wxT( "???" ); break; + case GR_TEXT_H_ALIGN_LEFT: msg = _( "Align left" ); break; + case GR_TEXT_H_ALIGN_CENTER: msg = _( "Align center" ); break; + case GR_TEXT_H_ALIGN_RIGHT: msg = _( "Align right" ); break; } aList.emplace_back( _( "Justification" ), msg ); diff --git a/eeschema/sch_text.h b/eeschema/sch_text.h index 5f319d98fc..f49e2c2381 100644 --- a/eeschema/sch_text.h +++ b/eeschema/sch_text.h @@ -34,80 +34,6 @@ class HTML_MESSAGE_BOX; -/* - * Spin style for text items of all kinds on schematics - * Basically a higher level abstraction of rotation and justification of text - */ -class TEXT_SPIN_STYLE -{ -public: - enum SPIN : int - { - LEFT = 0, - UP = 1, - RIGHT = 2, - BOTTOM = 3 - }; - - - TEXT_SPIN_STYLE() = default; - constexpr TEXT_SPIN_STYLE( SPIN aSpin ) : m_spin( aSpin ) - { - } - - constexpr bool operator==( SPIN a ) const - { - return m_spin == a; - } - - constexpr bool operator!=( SPIN a ) const - { - return m_spin != a; - } - - operator int() const - { - return static_cast( m_spin ); - } - - TEXT_SPIN_STYLE RotateCW(); - - TEXT_SPIN_STYLE RotateCCW(); - - /** - * Mirror the label spin style across the X axis or simply swaps up and bottom. - */ - TEXT_SPIN_STYLE MirrorX(); - - /** - * Mirror the label spin style across the Y axis or simply swaps left and right. - */ - TEXT_SPIN_STYLE MirrorY(); - -private: - SPIN m_spin; -}; - - -/* - * Label and flag shapes used with text objects. - */ -enum LABEL_FLAG_SHAPE -{ - L_INPUT, - L_OUTPUT, - L_BIDI, - L_TRISTATE, - L_UNSPECIFIED, - - F_FIRST, - F_DOT = F_FIRST, - F_ROUND, - F_DIAMOND, - F_RECTANGLE -}; - - class SCH_TEXT : public SCH_ITEM, public EDA_TEXT { public: @@ -146,19 +72,6 @@ public: void SetExcludedFromSim( bool aExclude ) override { m_excludedFromSim = aExclude; } bool GetExcludedFromSim() const override { return m_excludedFromSim; } - /** - * Set a spin or rotation angle, along with specific horizontal and vertical justification - * styles with each angle. - * - * @param aSpinStyle Spin style as per #TEXT_SPIN_STYLE storage class, may be the enum - * values or int value - */ - virtual void SetTextSpinStyle( TEXT_SPIN_STYLE aSpinStyle ); - TEXT_SPIN_STYLE GetTextSpinStyle() const { return m_spin_style; } - - virtual LABEL_FLAG_SHAPE GetShape() const { return L_UNSPECIFIED; } - virtual void SetShape( LABEL_FLAG_SHAPE aShape ) { } - /** * This offset depends on the orientation, the type of text, and the area required to * draw the associated graphic symbol or to put the text above a wire. @@ -184,6 +97,7 @@ public: EDA_TEXT::Offset( aMoveVector ); } + void FlipHJustify(); void MirrorHorizontally( int aCenter ) override; void MirrorVertically( int aCenter ) override; void Rotate( const VECTOR2I& aCenter ) override; @@ -236,18 +150,6 @@ protected: const KIFONT::METRICS& getFontMetrics() const override { return GetFontMetrics(); } protected: - /** - * The orientation of text and any associated drawing elements of derived objects. - * - 0 is the horizontal and left justified. - * - 1 is vertical and top justified. - * - 2 is horizontal and right justified. It is the equivalent of the mirrored 0 orientation. - * - 3 is vertical and bottom justified. It is the equivalent of the mirrored 1 orientation. - * - * This is a duplication of m_Orient, m_HJustified, and m_VJustified in #EDA_TEXT but is - * easier to handle than 3 parameters when editing and reading and saving files. - */ - TEXT_SPIN_STYLE m_spin_style; - bool m_excludedFromSim; }; diff --git a/eeschema/tools/backannotate.cpp b/eeschema/tools/backannotate.cpp index 19f8931d5b..1c033fa807 100644 --- a/eeschema/tools/backannotate.cpp +++ b/eeschema/tools/backannotate.cpp @@ -586,17 +586,17 @@ void BACK_ANNOTATE::applyChangelist() } -static TEXT_SPIN_STYLE orientLabel( SCH_PIN* aPin ) +static SPIN_STYLE orientLabel( SCH_PIN* aPin ) { - TEXT_SPIN_STYLE spin = TEXT_SPIN_STYLE::RIGHT; + SPIN_STYLE spin = SPIN_STYLE::RIGHT; // Initial orientation from the pin switch( aPin->GetLibPin()->GetOrientation() ) { - case PIN_ORIENTATION::PIN_UP: spin = TEXT_SPIN_STYLE::BOTTOM; break; - case PIN_ORIENTATION::PIN_DOWN: spin = TEXT_SPIN_STYLE::UP; break; - case PIN_ORIENTATION::PIN_LEFT: spin = TEXT_SPIN_STYLE::RIGHT; break; - case PIN_ORIENTATION::PIN_RIGHT: spin = TEXT_SPIN_STYLE::LEFT; break; + case PIN_ORIENTATION::PIN_UP: spin = SPIN_STYLE::BOTTOM; break; + case PIN_ORIENTATION::PIN_DOWN: spin = SPIN_STYLE::UP; break; + case PIN_ORIENTATION::PIN_LEFT: spin = SPIN_STYLE::RIGHT; break; + case PIN_ORIENTATION::PIN_RIGHT: spin = SPIN_STYLE::LEFT; break; } // Reorient based on the actual symbol orientation now @@ -717,8 +717,8 @@ void BACK_ANNOTATE::processNetNameChange( SCH_COMMIT* aCommit, const wxString& a case SCH_PIN_T: { - SCH_PIN* schPin = static_cast( driver ); - TEXT_SPIN_STYLE spin = orientLabel( schPin ); + SCH_PIN* schPin = static_cast( driver ); + SPIN_STYLE spin = orientLabel( schPin ); if( schPin->IsGlobalPower() ) { @@ -742,7 +742,7 @@ void BACK_ANNOTATE::processNetNameChange( SCH_COMMIT* aCommit, const wxString& a SCH_LABEL* label = new SCH_LABEL( driver->GetPosition(), aNewName ); label->SetParent( &m_frame->Schematic() ); label->SetTextSize( VECTOR2I( settings.m_DefaultTextSize, settings.m_DefaultTextSize ) ); - label->SetTextSpinStyle( spin ); + label->SetSpinStyle( spin ); label->SetFlags( IS_NEW ); SCH_SCREEN* screen = aConnection->Sheet().LastScreen(); diff --git a/eeschema/tools/sch_drawing_tools.cpp b/eeschema/tools/sch_drawing_tools.cpp index e1356e10ba..891cbafe50 100644 --- a/eeschema/tools/sch_drawing_tools.cpp +++ b/eeschema/tools/sch_drawing_tools.cpp @@ -30,7 +30,6 @@ #include #include #include -#include #include #include #include @@ -54,7 +53,6 @@ #include #include #include -#include #include #include #include @@ -64,7 +62,7 @@ SCH_DRAWING_TOOLS::SCH_DRAWING_TOOLS() : m_lastSheetPinType( LABEL_FLAG_SHAPE::L_INPUT ), m_lastGlobalLabelShape( LABEL_FLAG_SHAPE::L_INPUT ), m_lastNetClassFlagShape( LABEL_FLAG_SHAPE::F_ROUND ), - m_lastTextOrientation( TEXT_SPIN_STYLE::RIGHT ), + m_lastTextOrientation( SPIN_STYLE::RIGHT ), m_lastTextBold( false ), m_lastTextItalic( false ), m_lastTextAngle( ANGLE_0 ), @@ -1044,7 +1042,9 @@ SCH_TEXT* SCH_DRAWING_TOOLS::createNewText( const VECTOR2I& aPosition, int aType textItem->SetItalic( m_lastTextItalic ); } - textItem->SetTextSpinStyle( m_lastTextOrientation ); + if( labelItem ) + labelItem->SetSpinStyle( m_lastTextOrientation ); + textItem->SetTextSize( VECTOR2I( settings.m_DefaultTextSize, settings.m_DefaultTextSize ) ); textItem->SetFlags( IS_NEW | IS_MOVING ); @@ -1090,7 +1090,8 @@ SCH_TEXT* SCH_DRAWING_TOOLS::createNewText( const VECTOR2I& aPosition, int aType m_lastTextItalic = textItem->IsItalic(); } - m_lastTextOrientation = textItem->GetTextSpinStyle(); + if( labelItem ) + m_lastTextOrientation = labelItem->GetSpinStyle(); if( aType == LAYER_GLOBLABEL || aType == LAYER_HIERLABEL ) { diff --git a/eeschema/tools/sch_drawing_tools.h b/eeschema/tools/sch_drawing_tools.h index 45e1e595b9..7dc964529a 100644 --- a/eeschema/tools/sch_drawing_tools.h +++ b/eeschema/tools/sch_drawing_tools.h @@ -77,7 +77,7 @@ private: LABEL_FLAG_SHAPE m_lastSheetPinType; LABEL_FLAG_SHAPE m_lastGlobalLabelShape; LABEL_FLAG_SHAPE m_lastNetClassFlagShape; - TEXT_SPIN_STYLE m_lastTextOrientation; + SPIN_STYLE m_lastTextOrientation; bool m_lastTextBold; bool m_lastTextItalic; EDA_ANGLE m_lastTextAngle; diff --git a/eeschema/tools/sch_edit_tool.cpp b/eeschema/tools/sch_edit_tool.cpp index bc12ac111f..f1474f9e48 100644 --- a/eeschema/tools/sch_edit_tool.cpp +++ b/eeschema/tools/sch_edit_tool.cpp @@ -2108,12 +2108,13 @@ int SCH_EDIT_TOOL::ChangeTextType( const TOOL_EVENT& aEvent ) if( item && item->Type() != convertTo ) { + EDA_TEXT* sourceText = dynamic_cast( item ); bool selected = item->IsSelected(); SCH_ITEM* newtext = nullptr; VECTOR2I position = item->GetPosition(); wxString txt; wxString href; - TEXT_SPIN_STYLE orientation = TEXT_SPIN_STYLE::SPIN::RIGHT; + SPIN_STYLE spinStyle = SPIN_STYLE::SPIN::RIGHT; LABEL_FLAG_SHAPE shape = LABEL_FLAG_SHAPE::L_UNSPECIFIED; switch( item->Type() ) @@ -2122,10 +2123,10 @@ int SCH_EDIT_TOOL::ChangeTextType( const TOOL_EVENT& aEvent ) case SCH_GLOBAL_LABEL_T: case SCH_HIER_LABEL_T: { - SCH_TEXT* label = static_cast( item ); + SCH_LABEL_BASE* label = static_cast( item ); txt = UnescapeString( label->GetText() ); - orientation = label->GetTextSpinStyle(); + spinStyle = label->GetSpinStyle(); shape = label->GetShape(); href = label->GetHyperlink(); break; @@ -2138,7 +2139,7 @@ int SCH_EDIT_TOOL::ChangeTextType( const TOOL_EVENT& aEvent ) // a SCH_DIRECTIVE_LABEL has no text txt = _( "" ); - orientation = dirlabel->GetTextSpinStyle(); + spinStyle = dirlabel->GetSpinStyle(); href = dirlabel->GetHyperlink(); break; } @@ -2148,7 +2149,6 @@ int SCH_EDIT_TOOL::ChangeTextType( const TOOL_EVENT& aEvent ) SCH_TEXT* text = static_cast( item ); txt = text->GetText(); - orientation = text->GetTextSpinStyle(); href = text->GetHyperlink(); break; } @@ -2167,7 +2167,7 @@ int SCH_EDIT_TOOL::ChangeTextType( const TOOL_EVENT& aEvent ) EDA_TEXT* text = dynamic_cast( item ); wxCHECK( text, 0 ); int textSize = text->GetTextSize().y; - bbox.Inflate( item->Schematic()->Settings().m_LabelSizeRatio * textSize ); + bbox.Inflate( KiROUND( item->Schematic()->Settings().m_LabelSizeRatio * textSize ) ); } txt = textbox->GetText(); @@ -2176,12 +2176,12 @@ int SCH_EDIT_TOOL::ChangeTextType( const TOOL_EVENT& aEvent ) { if( textbox->GetHorizJustify() == GR_TEXT_H_ALIGN_RIGHT ) { - orientation = TEXT_SPIN_STYLE::SPIN::BOTTOM; + spinStyle = SPIN_STYLE::SPIN::BOTTOM; position = VECTOR2I( bbox.Centre().x, bbox.GetOrigin().y ); } else { - orientation = TEXT_SPIN_STYLE::SPIN::UP; + spinStyle = SPIN_STYLE::SPIN::UP; position = VECTOR2I( bbox.Centre().x, bbox.GetEnd().y ); } } @@ -2189,12 +2189,12 @@ int SCH_EDIT_TOOL::ChangeTextType( const TOOL_EVENT& aEvent ) { if( textbox->GetHorizJustify() == GR_TEXT_H_ALIGN_RIGHT ) { - orientation = TEXT_SPIN_STYLE::SPIN::LEFT; + spinStyle = SPIN_STYLE::SPIN::LEFT; position = VECTOR2I( bbox.GetEnd().x, bbox.Centre().y ); } else { - orientation = TEXT_SPIN_STYLE::SPIN::RIGHT; + spinStyle = SPIN_STYLE::SPIN::RIGHT; position = VECTOR2I( bbox.GetOrigin().x, bbox.Centre().y ); } } @@ -2237,7 +2237,8 @@ int SCH_EDIT_TOOL::ChangeTextType( const TOOL_EVENT& aEvent ) SCH_LABEL_BASE* new_label = new SCH_LABEL( position, getValidNetname( txt ) ); new_label->SetShape( shape ); - new_label->SetTextSpinStyle( orientation ); + new_label->SetAttributes( *sourceText, false ); + new_label->SetSpinStyle( spinStyle ); new_label->SetHyperlink( href ); newtext = new_label; break; @@ -2248,7 +2249,8 @@ int SCH_EDIT_TOOL::ChangeTextType( const TOOL_EVENT& aEvent ) SCH_LABEL_BASE* new_label = new SCH_GLOBALLABEL( position, getValidNetname( txt ) ); new_label->SetShape( shape ); - new_label->SetTextSpinStyle( orientation ); + new_label->SetAttributes( *sourceText, false ); + new_label->SetSpinStyle( spinStyle ); new_label->SetHyperlink( href ); newtext = new_label; break; @@ -2259,7 +2261,8 @@ int SCH_EDIT_TOOL::ChangeTextType( const TOOL_EVENT& aEvent ) SCH_LABEL_BASE* new_label = new SCH_HIERLABEL( position, getValidNetname( txt ) ); new_label->SetShape( shape ); - new_label->SetTextSpinStyle( orientation ); + new_label->SetAttributes( *sourceText, false ); + new_label->SetSpinStyle( spinStyle ); new_label->SetHyperlink( href ); newtext = new_label; break; @@ -2282,7 +2285,8 @@ int SCH_EDIT_TOOL::ChangeTextType( const TOOL_EVENT& aEvent ) } new_label->SetShape( LABEL_FLAG_SHAPE::F_ROUND ); - new_label->SetTextSpinStyle( orientation ); + new_label->SetAttributes( *sourceText, false ); + new_label->SetSpinStyle( spinStyle ); new_label->SetHyperlink( href ); newtext = new_label; break; @@ -2292,7 +2296,7 @@ int SCH_EDIT_TOOL::ChangeTextType( const TOOL_EVENT& aEvent ) { SCH_TEXT* new_text = new SCH_TEXT( position, txt ); - new_text->SetTextSpinStyle( orientation ); + new_text->SetAttributes( *sourceText, false ); new_text->SetHyperlink( href ); newtext = new_text; break; @@ -2306,44 +2310,34 @@ int SCH_EDIT_TOOL::ChangeTextType( const TOOL_EVENT& aEvent ) if( SCH_LABEL_BASE* label = dynamic_cast( item ) ) bbox.Inflate( -label->GetLabelBoxExpansion() ); - EDA_TEXT* textItem = dynamic_cast( item ); - wxCHECK(textItem, 0 ); - - // Careful: GetTextMargin() is dependent on font size... - new_textbox->SetTextSize( textItem->GetTextSize() ); + new_textbox->SetAttributes( *sourceText, false ); int margin = new_textbox->GetTextMargin(); bbox.Inflate( margin ); + VECTOR2I topLeft = bbox.GetPosition(); + VECTOR2I botRight = bbox.GetEnd(); + // Add 1/20 of the margin at the end to reduce line-breaking changes. int slop = margin / 20; - switch( orientation ) + if( sourceText->GetTextAngle() == ANGLE_VERTICAL ) { - case TEXT_SPIN_STYLE::SPIN::RIGHT: - new_textbox->SetPosition( bbox.GetPosition() ); - new_textbox->SetEnd( bbox.GetEnd() + VECTOR2I( slop, 0 ) ); - break; - - case TEXT_SPIN_STYLE::SPIN::LEFT: - new_textbox->SetHorizJustify( GR_TEXT_H_ALIGN_RIGHT ); - new_textbox->SetPosition( bbox.GetPosition() - VECTOR2I( slop, 0 ) ); - new_textbox->SetEnd( bbox.GetEnd() ); - break; - - case TEXT_SPIN_STYLE::SPIN::UP: - new_textbox->SetTextAngle( ANGLE_VERTICAL ); - new_textbox->SetPosition( bbox.GetPosition() - VECTOR2I( 0, slop ) ); - new_textbox->SetEnd( bbox.GetEnd() ); - break; - - case TEXT_SPIN_STYLE::SPIN::BOTTOM: - new_textbox->SetTextAngle( ANGLE_VERTICAL ); - new_textbox->SetHorizJustify( GR_TEXT_H_ALIGN_RIGHT ); - new_textbox->SetPosition( bbox.GetPosition() ); - new_textbox->SetEnd( bbox.GetEnd() + VECTOR2I( 0, slop ) ); - break; + if( sourceText->GetHorizJustify() == GR_TEXT_H_ALIGN_RIGHT ) + botRight.y += slop; + else + topLeft.y -= slop; } + else + { + if( sourceText->GetHorizJustify() == GR_TEXT_H_ALIGN_RIGHT ) + topLeft.x -= slop; + else + botRight.x += slop; + } + + new_textbox->SetPosition( topLeft ); + new_textbox->SetEnd( botRight ); new_textbox->SetHyperlink( href ); newtext = new_textbox; diff --git a/eeschema/tools/sch_editor_control.cpp b/eeschema/tools/sch_editor_control.cpp index bd7c362989..ae4b448f5f 100644 --- a/eeschema/tools/sch_editor_control.cpp +++ b/eeschema/tools/sch_editor_control.cpp @@ -1521,7 +1521,6 @@ int SCH_EDITOR_CONTROL::Paste( const TOOL_EVENT& aEvent ) { // If it wasn't content, then paste as text object. SCH_TEXT* text_item = new SCH_TEXT( VECTOR2I( 0, 0 ), content ); - text_item->SetTextSpinStyle( TEXT_SPIN_STYLE::RIGHT ); // Left alignment tempScreen->Append( text_item ); } diff --git a/eeschema/tools/sch_line_wire_bus_tool.cpp b/eeschema/tools/sch_line_wire_bus_tool.cpp index fdafd1712b..19055d0cd4 100644 --- a/eeschema/tools/sch_line_wire_bus_tool.cpp +++ b/eeschema/tools/sch_line_wire_bus_tool.cpp @@ -390,7 +390,7 @@ SCH_LINE* SCH_LINE_WIRE_BUS_TOOL::doUnfoldBus( const wxString& aNet, const VECTO m_busUnfold.label = new SCH_LABEL( m_busUnfold.entry->GetEnd(), aNet ); m_busUnfold.label->SetTextSize( VECTOR2I( cfg.m_DefaultTextSize, cfg.m_DefaultTextSize ) ); - m_busUnfold.label->SetTextSpinStyle( TEXT_SPIN_STYLE::RIGHT ); + m_busUnfold.label->SetSpinStyle( SPIN_STYLE::RIGHT ); m_busUnfold.label->SetParent( m_frame->GetScreen() ); m_busUnfold.label->SetFlags( IS_NEW | IS_MOVING ); diff --git a/include/eda_text.h b/include/eda_text.h index b305a60778..a03e37522c 100644 --- a/include/eda_text.h +++ b/include/eda_text.h @@ -168,7 +168,7 @@ public: /** * Set the text attributes from another instance. */ - void SetAttributes( const EDA_TEXT& aSrc ); + void SetAttributes( const EDA_TEXT& aSrc, bool aSetPosition = true ); /** * Swap the text attributes of the two involved instances.