Process properties command locally within drawing tools.

Fixes https://gitlab.com/kicad/code/kicad/issues/5612

Fixes https://gitlab.com/kicad/code/kicad/issues/5615
This commit is contained in:
Jeff Young 2020-09-17 22:29:40 +01:00
parent 4d24c9d610
commit 8dd725469f
3 changed files with 66 additions and 30 deletions

View File

@ -701,8 +701,7 @@ bool TOOL_MANAGER::dispatchInternal( const TOOL_EVENT& aEvent )
"TOOL_MANAGER::dispatchInternal - %s stopped passing event: %s",
st->theTool->GetName(), aEvent.Format() );
handled = true;
break;
return true;
}
}
}

View File

@ -416,8 +416,6 @@ int DRAWING_TOOL::PlaceText( const TOOL_EVENT& aEvent )
m_frame->PushTool( tool );
Activate();
bool reselect = false;
// Prime the pump
if( aEvent.HasPosition() )
m_toolMgr->RunAction( ACTIONS::cursorClick );
@ -428,18 +426,16 @@ int DRAWING_TOOL::PlaceText( const TOOL_EVENT& aEvent )
m_frame->GetCanvas()->SetCurrentCursor( text ? wxCURSOR_ARROW : wxCURSOR_PENCIL );
VECTOR2I cursorPos = m_controls->GetCursorPosition();
if( reselect && text )
m_toolMgr->RunAction( PCB_ACTIONS::selectItem, true, text );
auto cleanup = [&] () {
m_toolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
m_controls->ForceCursorPosition( false );
m_controls->ShowCursor( true );
m_controls->SetAutoPan( false );
m_controls->CaptureCursor( false );
delete text;
text = NULL;
};
auto cleanup = [&]()
{
m_toolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
m_controls->ForceCursorPosition( false );
m_controls->ShowCursor( true );
m_controls->SetAutoPan( false );
m_controls->CaptureCursor( false );
delete text;
text = NULL;
};
if( evt->IsCancelInteractive() )
{
@ -575,13 +571,15 @@ int DRAWING_TOOL::PlaceText( const TOOL_EVENT& aEvent )
selection().SetReferencePoint( cursorPos );
m_view->Update( &selection() );
}
else if( text && evt->IsAction( &PCB_ACTIONS::properties ) )
else if( evt->IsAction( &PCB_ACTIONS::properties ) )
{
// Calling 'Properties' action clears the selection, so we need to restore it
reselect = true;
if( text )
{
frame()->OnEditItemRequest( text );
m_view->Update( &selection() );
frame()->SetMsgPanel( text );
}
}
else
evt->SetPassEvent();
}
@ -653,17 +651,18 @@ int DRAWING_TOOL::DrawDimension( const TOOL_EVENT& aEvent )
evt->IsPrime() ? evt->Position() : m_controls->GetMousePosition(), nullptr );
m_controls->ForceCursorPosition( true, cursorPos );
auto cleanup = [&] () {
m_controls->SetAutoPan( false );
m_controls->CaptureCursor( false );
auto cleanup = [&]()
{
m_controls->SetAutoPan( false );
m_controls->CaptureCursor( false );
preview.Clear();
m_view->Update( &preview );
preview.Clear();
m_view->Update( &preview );
delete dimension;
dimension = nullptr;
step = SET_ORIGIN;
};
delete dimension;
dimension = nullptr;
step = SET_ORIGIN;
};
if( evt->IsCancelInteractive() )
{
@ -880,6 +879,15 @@ int DRAWING_TOOL::DrawDimension( const TOOL_EVENT& aEvent )
// Show a preview of the item
m_view->Update( &preview );
}
else if( evt->IsAction( &PCB_ACTIONS::properties ) )
{
if( step != SET_ORIGIN )
{
frame()->OnEditItemRequest( dimension );
dimension->Update();
frame()->SetMsgPanel( dimension );
}
}
else
evt->SetPassEvent();
}
@ -1242,6 +1250,15 @@ bool DRAWING_TOOL::drawSegment( const std::string& aTool, int aShape, DRAWSEGMEN
m_view->Update( &preview );
frame()->SetMsgPanel( graphic );
}
else if( evt->IsAction( &PCB_ACTIONS::properties ) )
{
if( started )
{
frame()->OnEditItemRequest( graphic );
m_view->Update( &preview );
frame()->SetMsgPanel( graphic );
}
}
else if( evt->IsClick( BUT_RIGHT ) )
{
m_menu.ShowContextMenu( selection() );
@ -1516,6 +1533,15 @@ bool DRAWING_TOOL::drawArc( const std::string& aTool, DRAWSEGMENT** aGraphic, bo
m_view->Update( &preview );
frame()->SetMsgPanel( graphic );
}
else if( evt->IsAction( &PCB_ACTIONS::properties ) )
{
if( firstPoint )
{
frame()->OnEditItemRequest( graphic );
m_view->Update( &preview );
frame()->SetMsgPanel( graphic );
}
}
else if( evt->IsClick( BUT_RIGHT ) )
{
m_menu.ShowContextMenu( selection() );
@ -1791,6 +1817,15 @@ int DRAWING_TOOL::DrawZone( const TOOL_EVENT& aEvent )
status.Hide();
}
}
else if( evt->IsAction( &PCB_ACTIONS::properties ) )
{
if( started )
{
frame()->OnEditItemRequest( zoneTool.GetZone() );
zoneTool.OnGeometryChange( polyGeomMgr );
frame()->SetMsgPanel( zoneTool.GetZone() );
}
}
else
evt->SetPassEvent();

View File

@ -73,6 +73,8 @@ public:
virtual ~ZONE_CREATE_HELPER();
ZONE_CONTAINER* GetZone() const { return m_zone.get(); }
/*
* Interface for receiving POLYGON_GEOM_MANAGER update
*/