From 832c689345f3760f628281c06839e3acd85e28b2 Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Sun, 12 Jun 2022 18:15:38 +0100 Subject: [PATCH] Labels can connect directly to symbols, other labels, etc. Fixes https://gitlab.com/kicad/code/kicad/issues/11768 (cherry picked from commit c6604e3576e611569189a003f2a552b577c81ce2) --- eeschema/sch_text.h | 66 +++++++++++++++++++++++++++++--- eeschema/tools/sch_move_tool.cpp | 11 +++--- 2 files changed, 65 insertions(+), 12 deletions(-) diff --git a/eeschema/sch_text.h b/eeschema/sch_text.h index 8dde35ebdb..e874e2786d 100644 --- a/eeschema/sch_text.h +++ b/eeschema/sch_text.h @@ -306,8 +306,26 @@ public: bool CanConnect( const SCH_ITEM* aItem ) const override { - return aItem->Type() == SCH_LINE_T && - ( aItem->GetLayer() == LAYER_WIRE || aItem->GetLayer() == LAYER_BUS ); + switch( aItem->Type() ) + { + case SCH_LINE_T: + return aItem->GetLayer() == LAYER_WIRE || aItem->GetLayer() == LAYER_BUS; + + case SCH_BUS_WIRE_ENTRY_T: + return true; + + case SCH_SYMBOL_T: + return true; + + case SCH_LABEL_T: + case SCH_GLOBAL_LABEL_T: + case SCH_HIER_LABEL_T: + case SCH_SHEET_PIN_T: + return true; + + default: + return false; + } } wxString GetSelectMenuText( EDA_UNITS aUnits ) const override; @@ -400,8 +418,26 @@ public: bool CanConnect( const SCH_ITEM* aItem ) const override { - return aItem->Type() == SCH_LINE_T && - ( aItem->GetLayer() == LAYER_WIRE || aItem->GetLayer() == LAYER_BUS ); + switch( aItem->Type() ) + { + case SCH_LINE_T: + return aItem->GetLayer() == LAYER_WIRE || aItem->GetLayer() == LAYER_BUS; + + case SCH_BUS_WIRE_ENTRY_T: + return true; + + case SCH_SYMBOL_T: + return true; + + case SCH_LABEL_T: + case SCH_GLOBAL_LABEL_T: + case SCH_HIER_LABEL_T: + case SCH_SHEET_PIN_T: + return true; + + default: + return false; + } } wxString GetSelectMenuText( EDA_UNITS aUnits ) const override; @@ -473,8 +509,26 @@ public: bool CanConnect( const SCH_ITEM* aItem ) const override { - return aItem->Type() == SCH_LINE_T && - ( aItem->GetLayer() == LAYER_WIRE || aItem->GetLayer() == LAYER_BUS ); + switch( aItem->Type() ) + { + case SCH_LINE_T: + return aItem->GetLayer() == LAYER_WIRE || aItem->GetLayer() == LAYER_BUS; + + case SCH_BUS_WIRE_ENTRY_T: + return true; + + case SCH_SYMBOL_T: + return true; + + case SCH_LABEL_T: + case SCH_GLOBAL_LABEL_T: + case SCH_HIER_LABEL_T: + case SCH_SHEET_PIN_T: + return true; + + default: + return false; + } } wxString GetSelectMenuText( EDA_UNITS aUnits ) const override; diff --git a/eeschema/tools/sch_move_tool.cpp b/eeschema/tools/sch_move_tool.cpp index 3551114437..9189052f36 100644 --- a/eeschema/tools/sch_move_tool.cpp +++ b/eeschema/tools/sch_move_tool.cpp @@ -544,6 +544,7 @@ void SCH_MOVE_TOOL::getConnectedDragItems( SCH_ITEM* aOriginalItem, const wxPoin EE_RTREE& items = m_frame->GetScreen()->Items(); EE_RTREE::EE_TYPE itemsOverlapping = items.Overlapping( aOriginalItem->GetBoundingBox() ); bool ptHasUnselectedJunction = false; + SCH_LINE* newWire = nullptr; for( SCH_ITEM* item : itemsOverlapping ) { @@ -625,14 +626,12 @@ void SCH_MOVE_TOOL::getConnectedDragItems( SCH_ITEM* aOriginalItem, const wxPoin case SCH_SHEET_T: case SCH_SYMBOL_T: case SCH_JUNCTION_T: - if( test->IsConnected( aPoint ) ) + if( test->IsConnected( aPoint ) && !newWire ) { // Add a new wire between the symbol or junction and the selected item so // the selected item can be dragged. - SCH_LINE* newWire = nullptr; - - if( test->GetLayer() == LAYER_BUS_JUNCTION || - aOriginalItem->GetLayer() == LAYER_BUS ) + if( test->GetLayer() == LAYER_BUS_JUNCTION + || aOriginalItem->GetLayer() == LAYER_BUS ) { newWire = new SCH_LINE( aPoint, LAYER_BUS ); } @@ -704,7 +703,7 @@ void SCH_MOVE_TOOL::getConnectedDragItems( SCH_ITEM* aOriginalItem, const wxPoin newWire->SetFlags( IS_NEW ); m_frame->AddToScreen( newWire, m_frame->GetScreen() ); - newWire->SetFlags( SELECTED_BY_DRAG | STARTPOINT ); + newWire->SetFlags( TEMP_SELECTED | STARTPOINT ); aList.push_back( newWire ); }