From 4ca0f4da1025c39bf968586dac26ca692e7fe79d Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Thu, 2 May 2019 00:35:05 +0100 Subject: [PATCH] Fixes to the context menu logic around wire/bus drawing. --- eeschema/tools/sch_drawing_tool.cpp | 2 +- eeschema/tools/sch_edit_tool.cpp | 41 ++++++++++++++++++--------- eeschema/tools/sch_selection_tool.cpp | 13 +++++++-- 3 files changed, 40 insertions(+), 16 deletions(-) diff --git a/eeschema/tools/sch_drawing_tool.cpp b/eeschema/tools/sch_drawing_tool.cpp index ad1bb3df00..d5ca0bb953 100644 --- a/eeschema/tools/sch_drawing_tool.cpp +++ b/eeschema/tools/sch_drawing_tool.cpp @@ -246,7 +246,7 @@ bool SCH_DRAWING_TOOL::Init() auto drawingSegmentsCondition = [] ( const SELECTION& aSel ) { SCH_ITEM* item = (SCH_ITEM*) aSel.Front(); - return ( item && item->Type() == SCH_LINE_T && item->GetEditFlags() ); + return ( item && item->Type() == SCH_LINE_T && item->IsNew() ); }; auto singleSheetCondition = SELECTION_CONDITIONS::Count( 1 ) diff --git a/eeschema/tools/sch_edit_tool.cpp b/eeschema/tools/sch_edit_tool.cpp index eed3ee0710..40619da154 100644 --- a/eeschema/tools/sch_edit_tool.cpp +++ b/eeschema/tools/sch_edit_tool.cpp @@ -208,14 +208,24 @@ bool SCH_EDIT_TOOL::Init() return ( m_frame->GetToolId() == ID_NO_TOOL_SELECTED ); }; - auto orientatableCondition = [] ( const SELECTION& aSel ) { + auto orientatableCondition = [ this ] ( const SELECTION& aSel ) { if( aSel.Empty() ) return false; + SCH_ITEM* item = (SCH_ITEM*) aSel.Front(); + if( aSel.GetSize() > 1 ) + { + // In general a group is orientatable, except when we're drawing wires/busses + if( m_frame->GetToolId() == ID_WIRE_BUTT || m_frame->GetToolId() == ID_BUS_BUTT ) + { + if( item->Type() == SCH_LINE_T && item->IsNew() ) + return false; + } return true; + } - switch( static_cast( aSel.Front() )->Type() ) + switch( item->Type() ) { case SCH_MARKER_T: case SCH_JUNCTION_T: @@ -314,16 +324,23 @@ bool SCH_EDIT_TOOL::Init() }; auto wireTool = [ this ] ( const SELECTION& aSel ) { - return ( m_frame->GetToolId() == ID_WIRE_BUTT - || m_frame->GetToolId() == ID_JUNCTION_BUTT ); + return ( m_frame->GetToolId() == ID_WIRE_BUTT ); }; auto busTool = [ this ] ( const SELECTION& aSel ) { - return ( m_frame->GetToolId() == ID_BUS_BUTT - || m_frame->GetToolId() == ID_JUNCTION_BUTT ); + return ( m_frame->GetToolId() == ID_BUS_BUTT ); + }; + + auto junctionTool = [ this ] ( const SELECTION& aSel ) { + return ( m_frame->GetToolId() == ID_JUNCTION_BUTT ); }; - auto wireOrBusTool = wireTool || busTool; + auto idleCondition = [] ( const SELECTION& aSel ) { + SCH_ITEM* item = (SCH_ITEM*) aSel.Front(); + return ( !item || !item->GetEditFlags() ); + }; + + auto idleWireOrBusTool = ( wireTool || busTool || junctionTool ) && idleCondition; auto wireSelectionCondition = SELECTION_CONDITIONS::MoreThan( 0 ) && SELECTION_CONDITIONS::OnlyType( SCH_LINE_LOCATE_WIRE_T ); @@ -331,8 +348,6 @@ bool SCH_EDIT_TOOL::Init() auto busSelectionCondition = SELECTION_CONDITIONS::MoreThan( 0 ) && SELECTION_CONDITIONS::OnlyType( SCH_LINE_LOCATE_BUS_T ); - auto wireOrBusSelectionCondition = wireSelectionCondition || busSelectionCondition; - // Build the edit tool menu (shown when moving or dragging) // CONDITIONAL_MENU& ctxMenu = m_menu.GetMenu(); @@ -383,10 +398,10 @@ bool SCH_EDIT_TOOL::Init() drawingMenu.AddItem( SCH_ACTIONS::toHLabel, toHLabelCondition, 200 ); drawingMenu.AddItem( SCH_ACTIONS::toGLabel, toGLabelCondition, 200 ); drawingMenu.AddItem( SCH_ACTIONS::toText, toTextlCondition, 200 ); - drawingMenu.AddItem( SCH_ACTIONS::selectNode, wireOrBusTool, 200 ); - drawingMenu.AddItem( SCH_ACTIONS::selectConnection, wireOrBusTool, 200 ); - drawingMenu.AddItem( SCH_ACTIONS::breakWire, wireTool, 200 ); - drawingMenu.AddItem( SCH_ACTIONS::breakBus, busTool, 200 ); + drawingMenu.AddItem( SCH_ACTIONS::selectNode, idleWireOrBusTool, 200 ); + drawingMenu.AddItem( SCH_ACTIONS::selectConnection, idleWireOrBusTool, 200 ); + drawingMenu.AddItem( SCH_ACTIONS::breakWire, idleWireOrBusTool, 200 ); + drawingMenu.AddItem( SCH_ACTIONS::breakBus, idleWireOrBusTool, 200 ); // Add editing actions to the selection tool menu // diff --git a/eeschema/tools/sch_selection_tool.cpp b/eeschema/tools/sch_selection_tool.cpp index 63560f4805..ef446d4caa 100644 --- a/eeschema/tools/sch_selection_tool.cpp +++ b/eeschema/tools/sch_selection_tool.cpp @@ -99,8 +99,17 @@ bool SCH_SELECTION_TOOL::Init() m_frame = getEditFrame(); - auto wireOrBusSelectionCondition = SELECTION_CONDITIONS::MoreThan( 0 ) - && SELECTION_CONDITIONS::OnlyTypes( wireOrBusTypes ); + auto wireOrBusSelectionCondition = [] ( const SELECTION& aSel ) { + for( unsigned i = 0; i < aSel.GetSize(); ++i ) + { + SCH_ITEM* item = (SCH_ITEM*) aSel.GetItem( i ); + + if( !item->IsType( wireOrBusTypes ) || item->IsNew() ) + return false; + } + + return aSel.GetSize() >= 1; + }; auto& ctxMenu = m_menu.GetMenu();