diff --git a/eeschema/tools/ee_selection_tool.cpp b/eeschema/tools/ee_selection_tool.cpp index 6a632fa211..d047d510a8 100644 --- a/eeschema/tools/ee_selection_tool.cpp +++ b/eeschema/tools/ee_selection_tool.cpp @@ -147,6 +147,12 @@ SELECTION_CONDITION EE_CONDITIONS::AllPins = []( const SELECTION& aSel ) }; +SELECTION_CONDITION EE_CONDITIONS::AllPinsOrSheetPins = []( const SELECTION& aSel ) +{ + return aSel.GetSize() >= 1 && aSel.OnlyContains( { SCH_PIN_T, SCH_SHEET_PIN_T } ); +}; + + #define HITTEST_THRESHOLD_PIXELS 5 @@ -368,6 +374,31 @@ int EE_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent ) KIID lastRolloverItem = niluuid; EE_GRID_HELPER grid( m_toolMgr ); + auto pinOrientation = + []( EDA_ITEM* aItem ) + { + SCH_PIN* pin = dynamic_cast( aItem ); + + if( pin ) + return pin->GetOrientation(); + + SCH_SHEET_PIN* sheetPin = dynamic_cast( aItem ); + + if( sheetPin ) + { + switch( sheetPin->GetSide() ) + { + default: + case SHEET_SIDE::LEFT: return PIN_ORIENTATION::PIN_RIGHT; + case SHEET_SIDE::RIGHT: return PIN_ORIENTATION::PIN_LEFT; + case SHEET_SIDE::TOP: return PIN_ORIENTATION::PIN_DOWN; + case SHEET_SIDE::BOTTOM: return PIN_ORIENTATION::PIN_UP; + } + } + + return PIN_ORIENTATION::PIN_LEFT; + }; + // Main loop: keep receiving events while( TOOL_EVENT* evt = Wait() ) { @@ -631,8 +662,11 @@ int EE_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent ) else if( *evt->GetCommandId() >= ID_POPUP_SCH_PIN_TRICKS_START && *evt->GetCommandId() <= ID_POPUP_SCH_PIN_TRICKS_END ) { - if( !m_selection.OnlyContains( { SCH_PIN_T } ) || m_selection.Empty() ) + if( !m_selection.OnlyContains( { SCH_PIN_T, SCH_SHEET_PIN_T } ) + || m_selection.Empty() ) + { return 0; + } // Keep track of new items so we make them the new selection at the end EDA_ITEMS newItems; @@ -642,8 +676,7 @@ int EE_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent ) { for( EDA_ITEM* item : m_selection ) { - SCH_PIN* pin = static_cast( item ); - SCH_NO_CONNECT* nc = new SCH_NO_CONNECT( pin->GetPosition() ); + SCH_NO_CONNECT* nc = new SCH_NO_CONNECT( item->GetPosition() ); commit.Add( nc, m_frame->GetScreen() ); newItems.push_back( nc ); } @@ -657,14 +690,13 @@ int EE_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent ) for( EDA_ITEM* item : m_selection ) { - SCH_PIN* pin = static_cast( item ); - SCH_LINE* wire = new SCH_LINE( pin->GetPosition(), LAYER_WIRE ); + SCH_LINE* wire = new SCH_LINE( item->GetPosition(), LAYER_WIRE ); // Add some length to the wire as nothing in our code base handles // 0 length wires very well, least of all the ortho drag algorithm VECTOR2I stub; - switch( pin->GetOrientation() ) + switch( pinOrientation( item ) ) { default: case PIN_ORIENTATION::PIN_RIGHT: @@ -681,7 +713,7 @@ int EE_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent ) break; } - wire->SetEndPoint( pin->GetPosition() + stub ); + wire->SetEndPoint( item->GetPosition() + stub ); m_frame->AddToScreen( wire, m_frame->GetScreen() ); commit.Added( wire, m_frame->GetScreen() ); @@ -713,24 +745,33 @@ int EE_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent ) // selected by the user for( EDA_ITEM* item : m_selection ) { - SCH_PIN* pin = static_cast( item ); + SCH_PIN* pin = dynamic_cast( item ); + SCH_SHEET_PIN* sheetPin = dynamic_cast( item ); + SCH_EDIT_FRAME* sf = dynamic_cast( m_frame ); SCH_LABEL_BASE* label = nullptr; + wxString labelText; + + if( pin ) + labelText = pin->GetShownName(); + else if( sheetPin && sf ) + labelText = sheetPin->GetShownText( &sf->GetCurrentSheet(), false ); + switch( *evt->GetCommandId() ) { case ID_POPUP_SCH_PIN_TRICKS_NET_LABEL: - label = new SCH_LABEL( pin->GetPosition(), pin->GetShownName() ); + label = new SCH_LABEL( item->GetPosition(), labelText ); break; case ID_POPUP_SCH_PIN_TRICKS_HIER_LABEL: - label = new SCH_HIERLABEL( pin->GetPosition(), pin->GetShownName() ); + label = new SCH_HIERLABEL( item->GetPosition(), labelText ); break; case ID_POPUP_SCH_PIN_TRICKS_GLOBAL_LABEL: - label = new SCH_GLOBALLABEL( pin->GetPosition(), pin->GetShownName() ); + label = new SCH_GLOBALLABEL( item->GetPosition(), labelText ); break; default: continue; } - switch( pin->GetOrientation() ) + switch( pinOrientation( item ) ) { default: case PIN_ORIENTATION::PIN_RIGHT: @@ -747,7 +788,25 @@ int EE_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent ) break; } - switch( pin->GetType() ) + ELECTRICAL_PINTYPE pinType = ELECTRICAL_PINTYPE::PT_UNSPECIFIED; + + if( pin ) + { + pinType = pin->GetType(); + } + else if( sheetPin ) + { + switch( sheetPin->GetLabelShape() ) + { + case LABEL_INPUT: pinType = ELECTRICAL_PINTYPE::PT_INPUT; break; + case LABEL_OUTPUT: pinType = ELECTRICAL_PINTYPE::PT_OUTPUT; break; + case LABEL_BIDI: pinType = ELECTRICAL_PINTYPE::PT_BIDI; break; + case LABEL_TRISTATE: pinType = ELECTRICAL_PINTYPE::PT_TRISTATE; break; + case LABEL_PASSIVE: pinType = ELECTRICAL_PINTYPE::PT_PASSIVE; break; + } + } + + switch( pinType ) { case ELECTRICAL_PINTYPE::PT_BIDI: label->SetShape( LABEL_FLAG_SHAPE::L_BIDI ); diff --git a/eeschema/tools/ee_selection_tool.h b/eeschema/tools/ee_selection_tool.h index efc9f4ee70..94ff5699c6 100644 --- a/eeschema/tools/ee_selection_tool.h +++ b/eeschema/tools/ee_selection_tool.h @@ -56,6 +56,7 @@ public: static SELECTION_CONDITION SingleNonExcludedMarker; static SELECTION_CONDITION MultipleSymbolsOrPower; static SELECTION_CONDITION AllPins; + static SELECTION_CONDITION AllPinsOrSheetPins; }; diff --git a/eeschema/tools/sch_edit_tool.cpp b/eeschema/tools/sch_edit_tool.cpp index 2c07731fdf..dcd48b8e65 100644 --- a/eeschema/tools/sch_edit_tool.cpp +++ b/eeschema/tools/sch_edit_tool.cpp @@ -194,10 +194,11 @@ private: EE_SELECTION_TOOL* selTool = getToolManager()->GetTool(); EE_SELECTION& selection = selTool->GetSelection(); SCH_PIN* pin = dynamic_cast( selection.Front() ); + SCH_SHEET_PIN* sheetPin = dynamic_cast( selection.Front() ); Clear(); - if( !pin ) + if( !pin && !sheetPin ) return; Add( _( "Wire" ), ID_POPUP_SCH_PIN_TRICKS_WIRE, BITMAPS::add_line ); @@ -586,7 +587,7 @@ bool SCH_EDIT_TOOL::Init() selToolMenu.AddMenu( makeSymbolUnitMenu( m_selectionTool ), E_C::SingleMultiUnitSymbol, 1 ); selToolMenu.AddMenu( makePinFunctionMenu( m_selectionTool ), E_C::SingleMultiFunctionPin, 1 ); - selToolMenu.AddMenu( makePinTricksMenu( m_selectionTool ), E_C::AllPins, 1 ); + selToolMenu.AddMenu( makePinTricksMenu( m_selectionTool ), E_C::AllPinsOrSheetPins, 1 ); selToolMenu.AddMenu( makeTransformMenu(), orientCondition, 200 ); selToolMenu.AddMenu( makeAttributesMenu(), E_C::HasType( SCH_SYMBOL_T ), 200 );