pcbnew: Zone tool follows active layer
Refactor the polygon event loop into its parent function to allow access to the params structure. Active layer now updates the drawing layer for add/cutout zones. Fixes: lp:1797483 * https://bugs.launchpad.net/kicad/+bug/1797483
This commit is contained in:
parent
92758ea4ef
commit
915d2ed374
|
@ -1361,117 +1361,6 @@ bool DRAWING_TOOL::getSourceZoneForAction( ZONE_MODE aMode, ZONE_CONTAINER*& aZo
|
|||
return true;
|
||||
}
|
||||
|
||||
|
||||
void DRAWING_TOOL::runPolygonEventLoop( POLYGON_GEOM_MANAGER& polyGeomMgr )
|
||||
{
|
||||
auto& controls = *getViewControls();
|
||||
bool started = false;
|
||||
|
||||
GRID_HELPER grid( m_frame );
|
||||
STATUS_TEXT_POPUP status( m_frame );
|
||||
status.SetTextColor( wxColour( 255, 0, 0 ) );
|
||||
status.SetText( _( "Self-intersecting polygons are not allowed" ) );
|
||||
m_controls->SetSnapping( true );
|
||||
|
||||
while( OPT_TOOL_EVENT evt = Wait() )
|
||||
{
|
||||
LSET layers( m_frame->GetActiveLayer() );
|
||||
grid.SetSnap( !evt->Modifier( MD_SHIFT ) );
|
||||
grid.SetUseGrid( !evt->Modifier( MD_ALT ) );
|
||||
m_controls->SetSnapping( !evt->Modifier( MD_ALT ) );
|
||||
VECTOR2I cursorPos = grid.BestSnapAnchor( m_controls->GetMousePosition(), layers );
|
||||
|
||||
if( TOOL_EVT_UTILS::IsCancelInteractive( *evt ) )
|
||||
{
|
||||
// pre-empted by another tool, give up
|
||||
// cancelled without an inprogress polygon, give up
|
||||
if( !polyGeomMgr.IsPolygonInProgress() || evt->IsActivate() )
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
polyGeomMgr.Reset();
|
||||
// start again
|
||||
started = false;
|
||||
|
||||
controls.SetAutoPan( false );
|
||||
controls.CaptureCursor( false );
|
||||
}
|
||||
else if( evt->IsClick( BUT_RIGHT ) )
|
||||
{
|
||||
m_menu.ShowContextMenu();
|
||||
}
|
||||
// events that lock in nodes
|
||||
else if( evt->IsClick( BUT_LEFT )
|
||||
|| evt->IsDblClick( BUT_LEFT )
|
||||
|| evt->IsAction( &closeZoneOutline ) )
|
||||
{
|
||||
// Check if it is double click / closing line (so we have to finish the zone)
|
||||
const bool endPolygon = evt->IsDblClick( BUT_LEFT )
|
||||
|| evt->IsAction( &closeZoneOutline )
|
||||
|| polyGeomMgr.NewPointClosesOutline( cursorPos );
|
||||
|
||||
if( endPolygon )
|
||||
{
|
||||
polyGeomMgr.SetFinished();
|
||||
polyGeomMgr.Reset();
|
||||
|
||||
// ready to start again
|
||||
started = false;
|
||||
controls.SetAutoPan( false );
|
||||
controls.CaptureCursor( false );
|
||||
}
|
||||
|
||||
// adding a corner
|
||||
else if( polyGeomMgr.AddPoint( cursorPos ) )
|
||||
{
|
||||
if( !started )
|
||||
{
|
||||
started = true;
|
||||
controls.SetAutoPan( true );
|
||||
controls.CaptureCursor( true );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
else if( evt->IsAction( &deleteLastPoint ) )
|
||||
{
|
||||
polyGeomMgr.DeleteLastCorner();
|
||||
|
||||
if( !polyGeomMgr.IsPolygonInProgress() )
|
||||
{
|
||||
// report finished as an empty shape
|
||||
polyGeomMgr.SetFinished();
|
||||
|
||||
// start again
|
||||
started = false;
|
||||
controls.SetAutoPan( false );
|
||||
controls.CaptureCursor( false );
|
||||
}
|
||||
}
|
||||
else if( polyGeomMgr.IsPolygonInProgress()
|
||||
&& ( evt->IsMotion() || evt->IsDrag( BUT_LEFT ) ) )
|
||||
{
|
||||
polyGeomMgr.SetCursorPosition( cursorPos, evt->Modifier( MD_CTRL )
|
||||
? POLYGON_GEOM_MANAGER::LEADER_MODE::DEG45
|
||||
: POLYGON_GEOM_MANAGER::LEADER_MODE::DIRECT );
|
||||
|
||||
if( polyGeomMgr.IsSelfIntersecting( true ) )
|
||||
{
|
||||
wxPoint p = wxGetMousePosition() + wxPoint( 20, 20 );
|
||||
status.Move( p );
|
||||
status.Popup( m_frame );
|
||||
status.Expire( 1500 );
|
||||
}
|
||||
else
|
||||
{
|
||||
status.Hide();
|
||||
}
|
||||
}
|
||||
} // end while
|
||||
}
|
||||
|
||||
|
||||
int DRAWING_TOOL::drawZone( bool aKeepout, ZONE_MODE aMode )
|
||||
{
|
||||
// get a source zone, if we need one. We need it for:
|
||||
|
@ -1506,12 +1395,118 @@ int DRAWING_TOOL::drawZone( bool aKeepout, ZONE_MODE aMode )
|
|||
|
||||
Activate(); // register for events
|
||||
|
||||
auto& controls = *getViewControls();
|
||||
m_controls->ShowCursor( true );
|
||||
m_controls->SetSnapping( true );
|
||||
|
||||
controls.ShowCursor( true );
|
||||
controls.SetSnapping( true );
|
||||
bool started = false;
|
||||
GRID_HELPER grid( m_frame );
|
||||
STATUS_TEXT_POPUP status( m_frame );
|
||||
status.SetTextColor( wxColour( 255, 0, 0 ) );
|
||||
status.SetText( _( "Self-intersecting polygons are not allowed" ) );
|
||||
|
||||
runPolygonEventLoop( polyGeomMgr );
|
||||
while( OPT_TOOL_EVENT evt = Wait() )
|
||||
{
|
||||
LSET layers( m_frame->GetActiveLayer() );
|
||||
grid.SetSnap( !evt->Modifier( MD_SHIFT ) );
|
||||
grid.SetUseGrid( !evt->Modifier( MD_ALT ) );
|
||||
m_controls->SetSnapping( !evt->Modifier( MD_ALT ) );
|
||||
VECTOR2I cursorPos = grid.BestSnapAnchor( m_controls->GetMousePosition(), layers );
|
||||
|
||||
if( TOOL_EVT_UTILS::IsCancelInteractive( *evt ) )
|
||||
{
|
||||
// pre-empted by another tool, give up
|
||||
// cancelled without an inprogress polygon, give up
|
||||
if( !polyGeomMgr.IsPolygonInProgress() || evt->IsActivate() )
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
polyGeomMgr.Reset();
|
||||
// start again
|
||||
started = false;
|
||||
|
||||
m_controls->SetAutoPan( false );
|
||||
m_controls->CaptureCursor( false );
|
||||
}
|
||||
else if( evt->IsAction( &PCB_ACTIONS::layerChanged ) )
|
||||
{
|
||||
if( aMode == ZONE_MODE::GRAPHIC_POLYGON )
|
||||
params.m_layer = getDrawingLayer();
|
||||
else if( aMode == ZONE_MODE::ADD || aMode == ZONE_MODE::CUTOUT )
|
||||
params.m_layer = frame()->GetActiveLayer();
|
||||
}
|
||||
else if( evt->IsClick( BUT_RIGHT ) )
|
||||
{
|
||||
m_menu.ShowContextMenu();
|
||||
}
|
||||
// events that lock in nodes
|
||||
else if( evt->IsClick( BUT_LEFT )
|
||||
|| evt->IsDblClick( BUT_LEFT )
|
||||
|| evt->IsAction( &closeZoneOutline ) )
|
||||
{
|
||||
// Check if it is double click / closing line (so we have to finish the zone)
|
||||
const bool endPolygon = evt->IsDblClick( BUT_LEFT )
|
||||
|| evt->IsAction( &closeZoneOutline )
|
||||
|| polyGeomMgr.NewPointClosesOutline( cursorPos );
|
||||
|
||||
if( endPolygon )
|
||||
{
|
||||
polyGeomMgr.SetFinished();
|
||||
polyGeomMgr.Reset();
|
||||
|
||||
// ready to start again
|
||||
started = false;
|
||||
m_controls->SetAutoPan( false );
|
||||
m_controls->CaptureCursor( false );
|
||||
}
|
||||
|
||||
// adding a corner
|
||||
else if( polyGeomMgr.AddPoint( cursorPos ) )
|
||||
{
|
||||
if( !started )
|
||||
{
|
||||
started = true;
|
||||
m_controls->SetAutoPan( true );
|
||||
m_controls->CaptureCursor( true );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
else if( evt->IsAction( &deleteLastPoint ) )
|
||||
{
|
||||
polyGeomMgr.DeleteLastCorner();
|
||||
|
||||
if( !polyGeomMgr.IsPolygonInProgress() )
|
||||
{
|
||||
// report finished as an empty shape
|
||||
polyGeomMgr.SetFinished();
|
||||
|
||||
// start again
|
||||
started = false;
|
||||
m_controls->SetAutoPan( false );
|
||||
m_controls->CaptureCursor( false );
|
||||
}
|
||||
}
|
||||
else if( polyGeomMgr.IsPolygonInProgress()
|
||||
&& ( evt->IsMotion() || evt->IsDrag( BUT_LEFT ) ) )
|
||||
{
|
||||
polyGeomMgr.SetCursorPosition( cursorPos, evt->Modifier( MD_CTRL )
|
||||
? POLYGON_GEOM_MANAGER::LEADER_MODE::DEG45
|
||||
: POLYGON_GEOM_MANAGER::LEADER_MODE::DIRECT );
|
||||
|
||||
if( polyGeomMgr.IsSelfIntersecting( true ) )
|
||||
{
|
||||
wxPoint p = wxGetMousePosition() + wxPoint( 20, 20 );
|
||||
status.Move( p );
|
||||
status.Popup( m_frame );
|
||||
status.Expire( 1500 );
|
||||
}
|
||||
else
|
||||
{
|
||||
status.Hide();
|
||||
}
|
||||
}
|
||||
} // end while
|
||||
|
||||
m_toolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
|
||||
m_frame->SetNoToolSelected();
|
||||
|
|
Loading…
Reference in New Issue