diff --git a/common/tool/tool_manager.cpp b/common/tool/tool_manager.cpp index e27d0b1ea6..b819620260 100644 --- a/common/tool/tool_manager.cpp +++ b/common/tool/tool_manager.cpp @@ -637,6 +637,8 @@ bool TOOL_MANAGER::dispatchActivation( const TOOL_EVENT& aEvent ) { if( aEvent.IsActivate() ) { + wxString cmdStr( *aEvent.GetCommandStr() ); + std::map::iterator tool = m_toolNameIndex.find( *aEvent.GetCommandStr() ); if( tool != m_toolNameIndex.end() ) diff --git a/eeschema/CMakeLists.txt b/eeschema/CMakeLists.txt index 17a661d921..731c604a86 100644 --- a/eeschema/CMakeLists.txt +++ b/eeschema/CMakeLists.txt @@ -240,7 +240,7 @@ set( EESCHEMA_SRCS tools/sch_edit_tool.cpp tools/sch_editor_control.cpp tools/sch_inspection_tool.cpp - tools/sch_line_drawing_tool.cpp + tools/sch_wire_bus_tool.cpp tools/sch_move_tool.cpp tools/sch_picker_tool.cpp tools/sch_selection_tool.cpp diff --git a/eeschema/hotkeys.h b/eeschema/hotkeys.h index 0a8987fe66..d07ae0a81c 100644 --- a/eeschema/hotkeys.h +++ b/eeschema/hotkeys.h @@ -63,6 +63,7 @@ enum hotkey_id_command { HK_ADD_NEW_POWER, HK_BEGIN_WIRE, HK_BEGIN_BUS, + HK_UNFOLD_BUS, HK_END_CURR_LINEWIREBUS, HK_ADD_WIRE_ENTRY, HK_ADD_BUS_ENTRY, @@ -81,7 +82,6 @@ enum hotkey_id_command { HK_AUTOPLACE_FIELDS, HK_UPDATE_PCB_FROM_SCH, HK_SELECT_ITEMS_ON_PCB, - HK_UNFOLD_BUS, HK_CANVAS_OPENGL, HK_CANVAS_CAIRO, }; diff --git a/eeschema/sch_edit_frame.cpp b/eeschema/sch_edit_frame.cpp index 0c28557b9b..baf677c92e 100644 --- a/eeschema/sch_edit_frame.cpp +++ b/eeschema/sch_edit_frame.cpp @@ -62,7 +62,7 @@ #include #include #include -#include +#include #include #include #include @@ -430,7 +430,7 @@ void SCH_EDIT_FRAME::setupTools() m_toolManager->RegisterTool( new SCH_SELECTION_TOOL ); m_toolManager->RegisterTool( new SCH_PICKER_TOOL ); m_toolManager->RegisterTool( new SCH_DRAWING_TOOL ); - m_toolManager->RegisterTool( new SCH_LINE_DRAWING_TOOL ); + m_toolManager->RegisterTool( new SCH_WIRE_BUS_TOOL ); m_toolManager->RegisterTool( new SCH_MOVE_TOOL ); m_toolManager->RegisterTool( new SCH_EDIT_TOOL ); m_toolManager->RegisterTool( new SCH_INSPECTION_TOOL ); diff --git a/eeschema/tools/sch_actions.cpp b/eeschema/tools/sch_actions.cpp index 827e8865f8..5ef50051e3 100644 --- a/eeschema/tools/sch_actions.cpp +++ b/eeschema/tools/sch_actions.cpp @@ -201,6 +201,9 @@ OPT SCH_ACTIONS::TranslateLegacyId( int aId ) case ID_HOTKEY_SELECT_CONNECTION: return SCH_ACTIONS::selectConnection.MakeEvent(); + + case ID_SCH_UNFOLD_BUS: + return SCH_ACTIONS::unfoldBus.MakeEvent(); } return OPT(); diff --git a/eeschema/tools/sch_edit_tool.cpp b/eeschema/tools/sch_edit_tool.cpp index a4ce7172ef..26a78ab651 100644 --- a/eeschema/tools/sch_edit_tool.cpp +++ b/eeschema/tools/sch_edit_tool.cpp @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include #include #include @@ -260,7 +260,7 @@ bool SCH_EDIT_TOOL::Init() }; auto duplicateCondition = [] ( const SELECTION& aSel ) { - if( SCH_LINE_DRAWING_TOOL::IsDrawingLineWireOrBus( aSel ) ) + if( SCH_WIRE_BUS_TOOL::IsDrawingLineWireOrBus( aSel ) ) return false; return true; @@ -270,7 +270,7 @@ bool SCH_EDIT_TOOL::Init() if( aSel.Empty() ) return false; - if( SCH_LINE_DRAWING_TOOL::IsDrawingLineWireOrBus( aSel ) ) + if( SCH_WIRE_BUS_TOOL::IsDrawingLineWireOrBus( aSel ) ) return false; SCH_ITEM* item = (SCH_ITEM*) aSel.Front(); diff --git a/eeschema/tools/sch_editor_control.cpp b/eeschema/tools/sch_editor_control.cpp index 23ceeb0059..7e4e4a0f2e 100644 --- a/eeschema/tools/sch_editor_control.cpp +++ b/eeschema/tools/sch_editor_control.cpp @@ -48,7 +48,7 @@ #include #include #include -#include "sch_line_drawing_tool.h" +#include "sch_wire_bus_tool.h" TOOL_ACTION SCH_ACTIONS::refreshPreview( "eeschema.EditorControl.refreshPreview", AS_GLOBAL, 0, "", "" ); diff --git a/eeschema/tools/sch_move_tool.cpp b/eeschema/tools/sch_move_tool.cpp index ab5ca54e9b..afd90d011d 100644 --- a/eeschema/tools/sch_move_tool.cpp +++ b/eeschema/tools/sch_move_tool.cpp @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include #include #include @@ -86,7 +86,7 @@ bool SCH_MOVE_TOOL::Init() if( aSel.Empty() ) return false; - if( SCH_LINE_DRAWING_TOOL::IsDrawingLineWireOrBus( aSel ) ) + if( SCH_WIRE_BUS_TOOL::IsDrawingLineWireOrBus( aSel ) ) return false; return true; diff --git a/eeschema/tools/sch_selection_tool.cpp b/eeschema/tools/sch_selection_tool.cpp index e404e83de0..0f8472a2f4 100644 --- a/eeschema/tools/sch_selection_tool.cpp +++ b/eeschema/tools/sch_selection_tool.cpp @@ -37,7 +37,7 @@ #include #include #include -#include +#include #include #include #include @@ -187,8 +187,6 @@ bool SCH_SELECTION_TOOL::Init() auto& menu = m_menu.GetMenu(); - // TODO(JE): add menu access to unfold bus on busSelectionCondition... - menu.AddItem( SCH_ACTIONS::enterSheet, sheetSelection && SCH_CONDITIONS::Idle, 1 ); menu.AddItem( SCH_ACTIONS::explicitCrossProbe, sheetSelection && SCH_CONDITIONS::Idle, 1 ); menu.AddItem( SCH_ACTIONS::resizeSheet, sheetSelection && SCH_CONDITIONS::Idle, 1 ); @@ -198,11 +196,11 @@ bool SCH_SELECTION_TOOL::Init() menu.AddItem( SCH_ACTIONS::startWire, SCH_CONDITIONS::Empty, 100 ); menu.AddItem( SCH_ACTIONS::startBus, SCH_CONDITIONS::Empty, 100 ); - menu.AddSeparator( SCH_LINE_DRAWING_TOOL::IsDrawingWire, 100 ); - menu.AddItem( SCH_ACTIONS::finishWire, SCH_LINE_DRAWING_TOOL::IsDrawingWire, 100 ); + menu.AddSeparator( SCH_WIRE_BUS_TOOL::IsDrawingWire, 100 ); + menu.AddItem( SCH_ACTIONS::finishWire, SCH_WIRE_BUS_TOOL::IsDrawingWire, 100 ); - menu.AddSeparator( SCH_LINE_DRAWING_TOOL::IsDrawingBus, 100 ); - menu.AddItem( SCH_ACTIONS::finishBus, SCH_LINE_DRAWING_TOOL::IsDrawingBus, 100 ); + menu.AddSeparator( SCH_WIRE_BUS_TOOL::IsDrawingBus, 100 ); + menu.AddItem( SCH_ACTIONS::finishBus, SCH_WIRE_BUS_TOOL::IsDrawingBus, 100 ); menu.AddSeparator( SCH_CONDITIONS::NotEmpty, 200 ); menu.AddItem( SCH_ACTIONS::selectConnection, wireOrBusSelection && SCH_CONDITIONS::Idle, 200 ); @@ -333,7 +331,7 @@ int SCH_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent ) } } - // symbol unit selection menu? Adjust the unit if a symbol is selected + // context sub-menu selection? Handle unit selection or bus unfolding else if( evt->Category() == TC_COMMAND && evt->Action() == TA_CONTEXT_MENU_CHOICE ) { if( evt->GetCommandId().get() >= ID_POPUP_SCH_SELECT_UNIT_CMP @@ -345,6 +343,13 @@ int SCH_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent ) if( component ) static_cast( m_frame )->SelectUnit( component, unit ); } + else if( evt->GetCommandId().get() >= ID_POPUP_SCH_UNFOLD_BUS + && evt->GetCommandId().get() <= ID_POPUP_SCH_UNFOLD_BUS_END ) + { + wxString* net = new wxString( *evt->Parameter() ); + m_toolMgr->RunAction( SCH_ACTIONS::unfoldBus, true, net ); + } + } else if( evt->IsCancel() || evt->Action() == TA_UNDO_REDO_PRE ) diff --git a/eeschema/tools/sch_line_drawing_tool.cpp b/eeschema/tools/sch_wire_bus_tool.cpp similarity index 84% rename from eeschema/tools/sch_line_drawing_tool.cpp rename to eeschema/tools/sch_wire_bus_tool.cpp index a9cab25877..a29dea12f8 100644 --- a/eeschema/tools/sch_line_drawing_tool.cpp +++ b/eeschema/tools/sch_wire_bus_tool.cpp @@ -22,7 +22,7 @@ */ #include -#include +#include #include #include #include @@ -43,52 +43,54 @@ #include #include -TOOL_ACTION SCH_ACTIONS::startWire( "eeschema.InteractiveLineDrawing.startWire", +TOOL_ACTION SCH_ACTIONS::startWire( "eeschema.WireBusDrawing.startWire", AS_GLOBAL, 0, _( "Start Wire" ), _( "Start drawing a wire" ), add_line_xpm, AF_ACTIVATE ); -TOOL_ACTION SCH_ACTIONS::drawWire( "eeschema.InteractiveLineDrawing.drawWire", +TOOL_ACTION SCH_ACTIONS::drawWire( "eeschema.WireBusDrawing.drawWire", AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_BEGIN_WIRE ), _( "Add Wire" ), _( "Add a wire" ), add_line_xpm, AF_ACTIVATE ); -TOOL_ACTION SCH_ACTIONS::startBus( "eeschema.InteractiveLineDrawing.startBus", +TOOL_ACTION SCH_ACTIONS::startBus( "eeschema.WireBusDrawing.startBus", AS_GLOBAL, 0, _( "Start Bus" ), _( "Start drawing a bus" ), add_bus_xpm, AF_ACTIVATE ); -TOOL_ACTION SCH_ACTIONS::drawBus( "eeschema.InteractiveLineDrawing.drawBus", +TOOL_ACTION SCH_ACTIONS::drawBus( "eeschema.WireBusDrawing.drawBus", AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_BEGIN_BUS ), _( "Add Bus" ), _( "Add a bus" ), add_bus_xpm, AF_ACTIVATE ); -TOOL_ACTION SCH_ACTIONS::unfoldBus( "eeschema.InteractiveLineDrawing.unfoldBus", - AS_GLOBAL, 0, "", "", nullptr, AF_ACTIVATE ); +TOOL_ACTION SCH_ACTIONS::unfoldBus( "eeschema.WireBusDrawing.unfoldBus", + AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_UNFOLD_BUS ), + _( "Unfold Bus" ), _( "Break a wire out of a bus" ), + nullptr, AF_ACTIVATE ); -TOOL_ACTION SCH_ACTIONS::startLines( "eeschema.InteractiveLineDrawing.startLines", +TOOL_ACTION SCH_ACTIONS::startLines( "eeschema.WireBusDrawing.startLines", AS_GLOBAL, 0, _( "Begin Lines" ), _( "Start drawing connected graphic lines" ), add_line_xpm, AF_ACTIVATE ); -TOOL_ACTION SCH_ACTIONS::drawLines( "eeschema.InteractiveLineDrawing.drawLines", +TOOL_ACTION SCH_ACTIONS::drawLines( "eeschema.WireBusDrawing.drawLines", AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_ADD_GRAPHIC_POLYLINE ), _( "Add Lines" ), _( "Add connected graphic lines" ), add_graphical_segments_xpm, AF_ACTIVATE ); -TOOL_ACTION SCH_ACTIONS::finishLineWireOrBus( "eeschema.InteractiveLineDrawing.finishLineWireOrBus", +TOOL_ACTION SCH_ACTIONS::finishLineWireOrBus( "eeschema.WireBusDrawing.finishLineWireOrBus", AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_END_CURR_LINEWIREBUS ), _( "Finish Wire or Bus" ), _( "Complete drawing at current segment" ), checked_ok_xpm, AF_NONE ); -TOOL_ACTION SCH_ACTIONS::finishWire( "eeschema.InteractiveLineDrawing.finishWire", +TOOL_ACTION SCH_ACTIONS::finishWire( "eeschema.WireBusDrawing.finishWire", AS_GLOBAL, 0, _( "Finish Wire" ), _( "Complete wire with current segment" ), checked_ok_xpm, AF_NONE ); -TOOL_ACTION SCH_ACTIONS::finishBus( "eeschema.InteractiveLineDrawing.finishBus", +TOOL_ACTION SCH_ACTIONS::finishBus( "eeschema.WireBusDrawing.finishBus", AS_GLOBAL, 0, _( "Finish Bus" ), _( "Complete bus with current segment" ), checked_ok_xpm, AF_NONE ); -TOOL_ACTION SCH_ACTIONS::finishLine( "eeschema.InteractiveLineDrawing.finishLine", +TOOL_ACTION SCH_ACTIONS::finishLine( "eeschema.WireBusDrawing.finishLine", AS_GLOBAL, 0, _( "Finish Lines" ), _( "Complete connected lines with current segment" ), checked_ok_xpm, AF_NONE ); @@ -96,12 +98,18 @@ TOOL_ACTION SCH_ACTIONS::finishLine( "eeschema.InteractiveLineDrawing.finishLine class BUS_UNFOLD_MENU : public CONTEXT_MENU { public: - BUS_UNFOLD_MENU() + BUS_UNFOLD_MENU() : + m_showTitle( false ) { SetIcon( add_line2bus_xpm ); SetTitle( _( "Unfold Bus" ) ); } + void SetShowTitle() + { + m_showTitle = true; + } + protected: CONTEXT_MENU* create() const override @@ -145,6 +153,12 @@ private: int idx = 0; + if( m_showTitle ) + { + Append( ID_POPUP_SCH_UNFOLD_BUS, _( "Unfold from Bus" ), wxEmptyString ); + Enable( ID_POPUP_SCH_UNFOLD_BUS, false ); + } + for( const auto& member : connection->Members() ) { int id = ID_POPUP_SCH_UNFOLD_BUS + ( idx++ ); @@ -167,12 +181,13 @@ private: } } } + + bool m_showTitle; }; - -SCH_LINE_DRAWING_TOOL::SCH_LINE_DRAWING_TOOL() : - TOOL_INTERACTIVE( "eeschema.InteractiveLineDrawing" ), +SCH_WIRE_BUS_TOOL::SCH_WIRE_BUS_TOOL() : + TOOL_INTERACTIVE( "eeschema.WireBusDrawing" ), m_selectionTool( nullptr ), m_view( nullptr ), m_controls( nullptr ), @@ -180,15 +195,15 @@ SCH_LINE_DRAWING_TOOL::SCH_LINE_DRAWING_TOOL() : m_menu( *this ) { m_busUnfold = {}; -}; +} -SCH_LINE_DRAWING_TOOL::~SCH_LINE_DRAWING_TOOL() +SCH_WIRE_BUS_TOOL::~SCH_WIRE_BUS_TOOL() { } -bool SCH_LINE_DRAWING_TOOL::Init() +bool SCH_WIRE_BUS_TOOL::Init() { m_frame = getEditFrame(); m_selectionTool = m_toolMgr->GetTool(); @@ -209,6 +224,9 @@ bool SCH_LINE_DRAWING_TOOL::Init() return g_CurrentSheet->Last() != g_RootSheet; }; + auto busSelection = SCH_CONDITIONS::MoreThan( 0 ) + && SCH_CONDITIONS::OnlyType( SCH_LINE_LOCATE_BUS_T ); + auto& ctxMenu = m_menu.GetMenu(); // @@ -245,11 +263,21 @@ bool SCH_LINE_DRAWING_TOOL::Init() ctxMenu.AddSeparator( activeTool, 1000 ); m_menu.AddStandardSubMenus( m_frame ); + // + // Add bus unfolding to the selection tool + // + CONDITIONAL_MENU& selToolMenu = m_selectionTool->GetToolMenu().GetMenu(); + + std::shared_ptr selBusUnfoldMenu = std::make_shared(); + selBusUnfoldMenu->SetTool( m_selectionTool ); + m_selectionTool->GetToolMenu().AddSubMenu( selBusUnfoldMenu ); + selToolMenu.AddMenu( selBusUnfoldMenu.get(), false, busSelection && SCH_CONDITIONS::Idle, 100 ); + return true; } -void SCH_LINE_DRAWING_TOOL::Reset( RESET_REASON aReason ) +void SCH_WIRE_BUS_TOOL::Reset( RESET_REASON aReason ) { // Init variables used by every drawing tool m_view = static_cast( getView() ); @@ -264,28 +292,28 @@ static bool isNewSegment( SCH_ITEM* aItem ) } -bool SCH_LINE_DRAWING_TOOL::IsDrawingLine( const SELECTION& aSelection ) +bool SCH_WIRE_BUS_TOOL::IsDrawingLine( const SELECTION& aSelection ) { static KICAD_T wireOrBusTypes[] = { SCH_LINE_LOCATE_WIRE_T, SCH_LINE_LOCATE_BUS_T, EOT }; return IsDrawingLineWireOrBus( aSelection ) && !aSelection.Front()->IsType( wireOrBusTypes ); } -bool SCH_LINE_DRAWING_TOOL::IsDrawingWire( const SELECTION& aSelection ) +bool SCH_WIRE_BUS_TOOL::IsDrawingWire( const SELECTION& aSelection ) { static KICAD_T wireType[] = { SCH_LINE_LOCATE_WIRE_T, EOT }; return IsDrawingLineWireOrBus( aSelection ) && aSelection.Front()->IsType( wireType ); } -bool SCH_LINE_DRAWING_TOOL::IsDrawingBus( const SELECTION& aSelection ) +bool SCH_WIRE_BUS_TOOL::IsDrawingBus( const SELECTION& aSelection ) { static KICAD_T busType[] = { SCH_LINE_LOCATE_BUS_T, EOT }; return IsDrawingLineWireOrBus( aSelection ) && aSelection.Front()->IsType( busType ); } -bool SCH_LINE_DRAWING_TOOL::IsDrawingLineWireOrBus( const SELECTION& aSelection ) +bool SCH_WIRE_BUS_TOOL::IsDrawingLineWireOrBus( const SELECTION& aSelection ) { // NOTE: for immediate hotkeys, it is NOT required that the line, wire or bus tool // be selected @@ -294,17 +322,19 @@ bool SCH_LINE_DRAWING_TOOL::IsDrawingLineWireOrBus( const SELECTION& aSelection } -int SCH_LINE_DRAWING_TOOL::StartWire( const TOOL_EVENT& aEvent ) +int SCH_WIRE_BUS_TOOL::StartWire( const TOOL_EVENT& aEvent ) { m_toolMgr->RunAction( SCH_ACTIONS::clearSelection, true ); + Activate(); + m_frame->GetCanvas()->MoveCursorToCrossHair(); SCH_LINE* segment = startSegments( LAYER_WIRE, m_frame->GetCrossHairPosition() ); return doDrawSegments( LAYER_WIRE, segment ); } -int SCH_LINE_DRAWING_TOOL::DrawWire( const TOOL_EVENT& aEvent ) +int SCH_WIRE_BUS_TOOL::DrawWire( const TOOL_EVENT& aEvent ) { if( m_frame->GetToolId() == ID_WIRE_BUTT ) return StartWire( aEvent ); @@ -318,17 +348,19 @@ int SCH_LINE_DRAWING_TOOL::DrawWire( const TOOL_EVENT& aEvent ) } -int SCH_LINE_DRAWING_TOOL::StartBus( const TOOL_EVENT& aEvent ) +int SCH_WIRE_BUS_TOOL::StartBus( const TOOL_EVENT& aEvent ) { m_toolMgr->RunAction( SCH_ACTIONS::clearSelection, true ); + Activate(); + m_frame->GetCanvas()->MoveCursorToCrossHair(); SCH_LINE* segment = startSegments( LAYER_BUS, m_frame->GetCrossHairPosition() ); return doDrawSegments( LAYER_BUS, segment ); } -int SCH_LINE_DRAWING_TOOL::DrawBus( const TOOL_EVENT& aEvent ) +int SCH_WIRE_BUS_TOOL::DrawBus( const TOOL_EVENT& aEvent ) { if( m_frame->GetToolId() == ID_BUS_BUTT ) return StartBus( aEvent ); @@ -342,7 +374,60 @@ int SCH_LINE_DRAWING_TOOL::DrawBus( const TOOL_EVENT& aEvent ) } -SCH_LINE* SCH_LINE_DRAWING_TOOL::unfoldBus( const wxString& aNet ) +int SCH_WIRE_BUS_TOOL::UnfoldBus( const TOOL_EVENT& aEvent ) +{ + wxString* netPtr = aEvent.Parameter(); + wxString net; + SCH_LINE* segment = nullptr; + + Activate(); + + if( netPtr ) + { + net = *netPtr; + delete netPtr; + } + else + { + BUS_UNFOLD_MENU unfoldMenu; + unfoldMenu.SetTool( this ); + unfoldMenu.SetShowTitle(); + unfoldMenu.UpdateAll(); + + SetContextMenu( &unfoldMenu, CMENU_NOW ); + + while( OPT_TOOL_EVENT evt = Wait() ) + { + if( evt->Action() == TA_CONTEXT_MENU_CHOICE ) + { + OPT id = evt->GetCommandId(); + + if( id && ( *id > 0 ) ) + { + net = *evt->Parameter(); + break; + } + } + } + } + + if( !net.IsEmpty() ) + { + // Break a wire for the given net out of the bus + segment = doUnfoldBus( net ); + } + + if( segment ) + { + // Continue drawing with the unfolded wire + doDrawSegments( LAYER_WIRE, segment ); + } + + return 0; +} + + +SCH_LINE* SCH_WIRE_BUS_TOOL::doUnfoldBus( const wxString& aNet ) { wxPoint pos = m_frame->GetCrossHairPosition(); @@ -367,7 +452,7 @@ SCH_LINE* SCH_LINE_DRAWING_TOOL::unfoldBus( const wxString& aNet ) } -int SCH_LINE_DRAWING_TOOL::StartLines( const TOOL_EVENT& aEvent) +int SCH_WIRE_BUS_TOOL::StartLines( const TOOL_EVENT& aEvent) { m_toolMgr->RunAction( SCH_ACTIONS::clearSelection, true ); @@ -377,7 +462,7 @@ int SCH_LINE_DRAWING_TOOL::StartLines( const TOOL_EVENT& aEvent) } -int SCH_LINE_DRAWING_TOOL::DrawLines( const TOOL_EVENT& aEvent) +int SCH_WIRE_BUS_TOOL::DrawLines( const TOOL_EVENT& aEvent) { if( m_frame->GetToolId() == ID_LINE_COMMENT_BUTT ) return StartLines( aEvent ); @@ -483,14 +568,15 @@ static void computeBreakPoint( SCH_SCREEN* aScreen, SCH_LINE* aSegment, wxPoint& } -int SCH_LINE_DRAWING_TOOL::doDrawSegments( int aType, SCH_LINE* aSegment ) +int SCH_WIRE_BUS_TOOL::doDrawSegments( int aType, SCH_LINE* aSegment ) { bool forceHV = m_frame->GetForceHVLines(); SCH_SCREEN* screen = m_frame->GetScreen(); m_controls->ShowCursor( true ); - Activate(); + if( aSegment == nullptr ) + Activate(); // Main loop: keep receiving events while( OPT_TOOL_EVENT evt = Wait() ) @@ -681,7 +767,7 @@ int SCH_LINE_DRAWING_TOOL::doDrawSegments( int aType, SCH_LINE* aSegment ) wxASSERT_MSG( !aSegment, "Bus unfold event recieved when already drawing!" ); wxString net = *evt->Parameter(); - aSegment = unfoldBus( net ); + aSegment = doUnfoldBus( net ); } } @@ -694,7 +780,7 @@ int SCH_LINE_DRAWING_TOOL::doDrawSegments( int aType, SCH_LINE* aSegment ) } -SCH_LINE* SCH_LINE_DRAWING_TOOL::startSegments( int aType, const wxPoint& aPos ) +SCH_LINE* SCH_WIRE_BUS_TOOL::startSegments( int aType, const wxPoint& aPos ) { SCH_LINE* segment = nullptr; bool forceHV = m_frame->GetForceHVLines(); @@ -789,7 +875,7 @@ static void removeBacktracks( DLIST& aWires ) } -void SCH_LINE_DRAWING_TOOL::finishSegments() +void SCH_WIRE_BUS_TOOL::finishSegments() { // Clear selection when done so that a new wire can be started. // NOTE: this must be done before RemoveBacktracks is called or we might end up with @@ -884,13 +970,15 @@ void SCH_LINE_DRAWING_TOOL::finishSegments() } -void SCH_LINE_DRAWING_TOOL::setTransitions() +void SCH_WIRE_BUS_TOOL::setTransitions() { - Go( &SCH_LINE_DRAWING_TOOL::DrawWire, SCH_ACTIONS::drawWire.MakeEvent() ); - Go( &SCH_LINE_DRAWING_TOOL::DrawBus, SCH_ACTIONS::drawBus.MakeEvent() ); - Go( &SCH_LINE_DRAWING_TOOL::DrawLines, SCH_ACTIONS::drawLines.MakeEvent() ); + Go( &SCH_WIRE_BUS_TOOL::DrawWire, SCH_ACTIONS::drawWire.MakeEvent() ); + Go( &SCH_WIRE_BUS_TOOL::DrawBus, SCH_ACTIONS::drawBus.MakeEvent() ); + Go( &SCH_WIRE_BUS_TOOL::DrawLines, SCH_ACTIONS::drawLines.MakeEvent() ); - Go( &SCH_LINE_DRAWING_TOOL::StartWire, SCH_ACTIONS::startWire.MakeEvent() ); - Go( &SCH_LINE_DRAWING_TOOL::StartBus, SCH_ACTIONS::startBus.MakeEvent() ); - Go( &SCH_LINE_DRAWING_TOOL::StartLines, SCH_ACTIONS::startLines.MakeEvent() ); + Go( &SCH_WIRE_BUS_TOOL::StartWire, SCH_ACTIONS::startWire.MakeEvent() ); + Go( &SCH_WIRE_BUS_TOOL::StartBus, SCH_ACTIONS::startBus.MakeEvent() ); + Go( &SCH_WIRE_BUS_TOOL::StartLines, SCH_ACTIONS::startLines.MakeEvent() ); + + Go( &SCH_WIRE_BUS_TOOL::UnfoldBus, SCH_ACTIONS::unfoldBus.MakeEvent() ); } diff --git a/eeschema/tools/sch_line_drawing_tool.h b/eeschema/tools/sch_wire_bus_tool.h similarity index 94% rename from eeschema/tools/sch_line_drawing_tool.h rename to eeschema/tools/sch_wire_bus_tool.h index f555241530..ecc4617d2d 100644 --- a/eeschema/tools/sch_line_drawing_tool.h +++ b/eeschema/tools/sch_wire_bus_tool.h @@ -30,10 +30,8 @@ #include -class SCH_COMPONENT; class SCH_BUS_WIRE_ENTRY; class SCH_LABEL; -class SCHLIB_FILTER; class SCH_EDIT_FRAME; class SCH_SELECTION_TOOL; @@ -59,11 +57,11 @@ struct BUS_UNFOLDING_T * Tool responsible for drawing/placing items (symbols, wires, busses, labels, etc.) */ -class SCH_LINE_DRAWING_TOOL : public TOOL_INTERACTIVE +class SCH_WIRE_BUS_TOOL : public TOOL_INTERACTIVE { public: - SCH_LINE_DRAWING_TOOL(); - ~SCH_LINE_DRAWING_TOOL(); + SCH_WIRE_BUS_TOOL(); + ~SCH_WIRE_BUS_TOOL(); /// @copydoc TOOL_INTERACTIVE::Init() bool Init() override; @@ -82,6 +80,8 @@ public: int DrawBus( const TOOL_EVENT& aEvent ); int DrawLines( const TOOL_EVENT& aEvent ); + int UnfoldBus( const TOOL_EVENT& aEvent ); + // SELECTION_CONDITIONs: static bool IsDrawingLine( const SELECTION& aSelection ); static bool IsDrawingWire( const SELECTION& aSelection ); @@ -92,7 +92,7 @@ private: int doDrawSegments( int aType, SCH_LINE* aSegment ); SCH_LINE* startSegments( int aType, const wxPoint& aPos ); - SCH_LINE* unfoldBus( const wxString& aNet ); + SCH_LINE* doUnfoldBus( const wxString& aNet ); void finishSegments(); ///> Sets up handlers for various events.