Browse Source

PNS router, context menu: replace "Track Corner Mode" by a sub menu.

The sub menu shows clearly the 4 available options, and the current option.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21832
master
jean-pierre charras 1 week ago
parent
commit
2fc0da0583
  1. 125
      pcbnew/router/router_tool.cpp
  2. 1
      pcbnew/router/router_tool.h

125
pcbnew/router/router_tool.cpp

@ -193,6 +193,7 @@ static const TOOL_ACTION ACT_SwitchPosture( TOOL_ACTION_ARGS()
.Tooltip( _( "Switches posture of the currently routed track." ) )
.Icon( BITMAPS::change_entry_orient ) );
#if 0 // Old track corner command replaced by a submenu
static const TOOL_ACTION ACT_SwitchCornerMode( TOOL_ACTION_ARGS()
.Name( "pcbnew.InteractiveRouter.SwitchRounding" )
.Scope( AS_CONTEXT )
@ -200,6 +201,35 @@ static const TOOL_ACTION ACT_SwitchCornerMode( TOOL_ACTION_ARGS()
.FriendlyName( _( "Track Corner Mode" ) )
.Tooltip( _( "Switches between sharp/rounded and 45°/90° corners when routing tracks." ) )
.Icon( BITMAPS::switch_corner_rounding_shape ) );
#endif
static const TOOL_ACTION ACT_SwitchCornerMode45( TOOL_ACTION_ARGS()
.Name( "pcbnew.InteractiveRouter.SwitchRounding45" )
.Scope( AS_CONTEXT )
.DefaultHotkey( 'W' )
.FriendlyName( _( "Track Corner Mode 45" ) )
.Tooltip( _( "Switch to 45° corner when routing tracks." ) ) );
static const TOOL_ACTION ACT_SwitchCornerMode90( TOOL_ACTION_ARGS()
.Name( "pcbnew.InteractiveRouter.SwitchRounding90" )
.Scope( AS_CONTEXT )
.DefaultHotkey( MD_SHIFT + 'W' )
.FriendlyName( _( "Track Corner Mode 90" ) )
.Tooltip( _( "Switch to 90° corner when routing tracks." ) ) );
static const TOOL_ACTION ACT_SwitchCornerModeArc45( TOOL_ACTION_ARGS()
.Name( "pcbnew.InteractiveRouter.SwitchRoundingArc45" )
.Scope( AS_CONTEXT )
.DefaultHotkey( MD_CTRL + 'W' )
.FriendlyName( _( "Track Corner Mode Arc 45" ) )
.Tooltip( _( "Switch to arc 45° corner when routing tracks." ) ) );
static const TOOL_ACTION ACT_SwitchCornerModeArc90( TOOL_ACTION_ARGS()
.Name( "pcbnew.InteractiveRouter.SwitchRoundingArc90" )
.Scope( AS_CONTEXT )
.DefaultHotkey( MD_ALT + 'W' )
.FriendlyName( _( "Track Corner Mode Arc 90" ) )
.Tooltip( _( "Switch to arc 90° corner when routing tracks." ) ) );
#undef _
#define _(s) wxGetTranslation((s))
@ -484,6 +514,8 @@ bool ROUTER_TOOL::Init()
m_diffPairMenu->SetTool( this );
m_menu->RegisterSubMenu( m_diffPairMenu );
ACTION_MANAGER* mgr = frame->GetToolManager()->GetActionManager();
auto haveHighlight =
[this]( const SELECTION& sel )
{
@ -541,9 +573,49 @@ bool ROUTER_TOOL::Init()
menu.AddItem( ACT_SelLayerAndPlaceBlindVia, SELECTION_CONDITIONS::ShowAlways );
menu.AddItem( ACT_SelLayerAndPlaceMicroVia, SELECTION_CONDITIONS::ShowAlways );
menu.AddItem( ACT_SwitchPosture, SELECTION_CONDITIONS::ShowAlways );
menu.AddItem( ACT_SwitchCornerMode, SELECTION_CONDITIONS::ShowAlways );
menu.AddSeparator();
// Add submenu for track corner mode handling
CONDITIONAL_MENU* submenuCornerMode = new CONDITIONAL_MENU( this );
submenuCornerMode->SetTitle( _( "Track Corner Mode" ) );
submenuCornerMode->SetIcon( BITMAPS::switch_corner_rounding_shape );
submenuCornerMode->AddCheckItem( ACT_SwitchCornerMode45, SELECTION_CONDITIONS::ShowAlways );
submenuCornerMode->AddCheckItem( ACT_SwitchCornerModeArc45, SELECTION_CONDITIONS::ShowAlways );
submenuCornerMode->AddCheckItem( ACT_SwitchCornerMode90, SELECTION_CONDITIONS::ShowAlways );
submenuCornerMode->AddCheckItem( ACT_SwitchCornerModeArc90, SELECTION_CONDITIONS::ShowAlways );
menu.AddMenu( submenuCornerMode );
// Manage check/uncheck marks in this submenu items
auto cornerMode45Cond =
[this]( const SELECTION& )
{
return m_router->Settings().GetCornerMode() == DIRECTION_45::CORNER_MODE::MITERED_45;
};
auto cornerMode90Cond =
[this]( const SELECTION& )
{
return m_router->Settings().GetCornerMode() == DIRECTION_45::CORNER_MODE::MITERED_90;
};
auto cornerModeArc45Cond =
[this]( const SELECTION& )
{
return m_router->Settings().GetCornerMode() == DIRECTION_45::CORNER_MODE::ROUNDED_45;
};
auto cornerModeArc90Cond =
[this]( const SELECTION& )
{
return m_router->Settings().GetCornerMode() == DIRECTION_45::CORNER_MODE::ROUNDED_90;
};
#define CHECK( x ) ACTION_CONDITIONS().Check( x )
mgr->SetConditions( ACT_SwitchCornerMode45, CHECK( cornerMode45Cond ) );
mgr->SetConditions( ACT_SwitchCornerMode90, CHECK( cornerMode90Cond ) );
mgr->SetConditions( ACT_SwitchCornerModeArc45, CHECK( cornerModeArc45Cond ) );
mgr->SetConditions( ACT_SwitchCornerModeArc90, CHECK( cornerModeArc90Cond ) );
auto diffPairCond =
[this]( const SELECTION& )
@ -551,6 +623,8 @@ bool ROUTER_TOOL::Init()
return m_router->Mode() == PNS::PNS_MODE_ROUTE_DIFF_PAIR;
};
menu.AddSeparator();
menu.AddMenu( m_trackViaMenu.get(), SELECTION_CONDITIONS::ShowAlways );
menu.AddMenu( m_diffPairMenu.get(), diffPairCond );
@ -681,6 +755,41 @@ void ROUTER_TOOL::handleCommonEvents( TOOL_EVENT& aEvent )
}
}
int ROUTER_TOOL::handlePnSCornerModeChange( const TOOL_EVENT& aEvent )
{
bool asChanged = false;
if( aEvent.IsAction( &ACT_SwitchCornerMode45 ) )
{
m_router->Settings().SetCornerMode( DIRECTION_45::CORNER_MODE::MITERED_45 );
asChanged = true;
}
else if( aEvent.IsAction( &ACT_SwitchCornerModeArc45 ) )
{
m_router->Settings().SetCornerMode( DIRECTION_45::CORNER_MODE::ROUNDED_45 );
asChanged = true;
}
else if( aEvent.IsAction( &ACT_SwitchCornerMode90 ) )
{
m_router->Settings().SetCornerMode( DIRECTION_45::CORNER_MODE::MITERED_90 );
asChanged = true;
}
else if( aEvent.IsAction( &ACT_SwitchCornerModeArc90 ) )
{
m_router->Settings().SetCornerMode( DIRECTION_45::CORNER_MODE::ROUNDED_90 );
asChanged = true;
}
if( asChanged )
{
UpdateMessagePanel();
updateEndItem( aEvent );
m_router->Move( m_endSnapPoint, m_endItem ); // refresh
}
return 0;
}
PCB_LAYER_ID ROUTER_TOOL::getStartLayer( const PNS::ITEM* aItem )
{
@ -1418,13 +1527,6 @@ void ROUTER_TOOL::performRouting( VECTOR2D aStartPosition )
m_router->Move( m_endSnapPoint, m_endItem );
m_startItem = nullptr;
}
else if( evt->IsAction( &ACT_SwitchCornerMode ) )
{
m_router->ToggleCornerMode();
UpdateMessagePanel();
updateEndItem( *evt );
m_router->Move( m_endSnapPoint, m_endItem ); // refresh
}
else if( evt->IsAction( &ACT_SwitchPosture ) )
{
m_router->FlipPosture();
@ -2900,4 +3002,9 @@ void ROUTER_TOOL::setTransitions()
Go( &ROUTER_TOOL::CustomTrackWidthDialog, ACT_CustomTrackWidth.MakeEvent() );
Go( &ROUTER_TOOL::onTrackViaSizeChanged, PCB_ACTIONS::trackViaSizeChanged.MakeEvent() );
Go( &ROUTER_TOOL::handlePnSCornerModeChange, ACT_SwitchCornerMode45.MakeEvent() );
Go( &ROUTER_TOOL::handlePnSCornerModeChange, ACT_SwitchCornerMode90.MakeEvent() );
Go( &ROUTER_TOOL::handlePnSCornerModeChange, ACT_SwitchCornerModeArc45.MakeEvent() );
Go( &ROUTER_TOOL::handlePnSCornerModeChange, ACT_SwitchCornerModeArc90.MakeEvent() );
}

1
pcbnew/router/router_tool.h

@ -77,6 +77,7 @@ private:
void handleCommonEvents( TOOL_EVENT& evt );
int handleLayerSwitch( const TOOL_EVENT& aEvent, bool aForceVia );
int handlePnSCornerModeChange( const TOOL_EVENT& aEvent );
// Returns the board layer ID for the start layer of the router
PCB_LAYER_ID getStartLayer( const PNS::ITEM* aItem );

Loading…
Cancel
Save