Re-implement direct layer switching in the router tool

Also add a new framework to allow grouping actions that are similar into
a single context that can then be used for mass comparisons.
This commit is contained in:
Ian McInerney 2023-10-05 13:34:25 +01:00
parent fb3bfc3c57
commit 0876fb0985
8 changed files with 152 additions and 22 deletions

View File

@ -44,9 +44,20 @@ ACTION_MANAGER::ACTION_MANAGER( TOOL_MANAGER* aToolManager ) :
if( action->m_id == -1 )
action->m_id = MakeActionId( action->m_name );
int groupID = 0;
std::string groupName = "none";
std::optional<TOOL_ACTION_GROUP> group = action->GetActionGroup();
if( group.has_value() )
{
groupID = group.value().GetGroupID();
groupName = group.value().GetName();
}
wxLogTrace( kicadTraceToolStack,
"ACTION_MANAGER::ACTION_MANAGER: Registering action %s with ID %d and UI ID %d",
action->m_name, action->m_id, action->GetUIId() );
"ACTION_MANAGER::ACTION_MANAGER: Registering action %s with ID %d, UI ID %d, and group %s(%d)",
action->m_name, action->m_id, action->GetUIId(), groupName, groupID );
RegisterAction( action );
}

View File

@ -41,6 +41,7 @@ TOOL_ACTION::TOOL_ACTION( const std::string& aName, TOOL_ACTION_SCOPE aScope,
BITMAPS aIcon, TOOL_ACTION_FLAGS aFlags ) :
m_name( aName ),
m_scope( aScope ),
m_group( std::nullopt ),
m_defaultHotKey( aDefaultHotKey ),
m_defaultHotKeyAlt( 0 ),
m_legacyName( aLegacyHotKeyName ),
@ -57,6 +58,7 @@ TOOL_ACTION::TOOL_ACTION( const std::string& aName, TOOL_ACTION_SCOPE aScope,
TOOL_ACTION::TOOL_ACTION() :
m_scope( AS_GLOBAL ),
m_group( std::nullopt ),
m_defaultHotKey( 0 ),
m_defaultHotKeyAlt( 0 ),
m_icon( BITMAPS::INVALID_BITMAP ),
@ -94,6 +96,9 @@ TOOL_ACTION::TOOL_ACTION( const TOOL_ACTION_ARGS& aArgs ) :
if( aArgs.m_description.has_value() )
m_description = TowxString( aArgs.m_description.value() );
if( aArgs.m_group.has_value() )
m_group = aArgs.m_group;
ACTION_MANAGER::GetActionList().push_back( this );
}
@ -115,6 +120,9 @@ TOOL_EVENT TOOL_ACTION::MakeEvent() const
else
evt = TOOL_EVENT( TC_COMMAND, TA_ACTION, m_name, m_scope );
if( m_group.has_value() )
evt.SetActionGroup( m_group.value() );
if( m_param.has_value() )
evt.SetParameter( m_param );

View File

@ -84,6 +84,15 @@ bool TOOL_EVENT::IsAction( const TOOL_ACTION* aAction ) const
}
bool TOOL_EVENT::IsActionInGroup( const TOOL_ACTION_GROUP& aGroup ) const
{
if( m_actionGroup.has_value() )
return m_actionGroup.value() == aGroup;
return false;
}
const std::string TOOL_EVENT::Format() const
{
std::string ev;
@ -142,32 +151,31 @@ const std::string TOOL_EVENT::Format() const
{ 0, "" }
};
ev = "category: ";
ev += flag2string( m_category, categories );
ev += " action: ";
ev += flag2string( m_actions, actions );
ev = "category: " + flag2string( m_category, categories ) + " ";
ev += "action: " + flag2string( m_actions, actions ) + " ";
ev += "action-group: ";
if( m_actionGroup.has_value() )
{
ev += m_actionGroup.value().GetName()
+ "(" + std::to_string( m_actionGroup.value().GetGroupID() ) + ")" + " ";
}
else
{
ev += "none";
}
if( m_actions & TA_MOUSE )
{
ev += " btns: ";
ev += flag2string( m_mouseButtons, buttons );
}
ev += "btns: " + flag2string( m_mouseButtons, buttons ) + " ";
if( m_actions & TA_KEYBOARD )
{
ev += "key: " + std::to_string( m_keyCode );
}
ev += "key: " + std::to_string( m_keyCode ) + " ";
if( m_actions & ( TA_MOUSE | TA_KEYBOARD ) )
{
ev += " mods: ";
ev += flag2string( m_modifiers, modifiers );
}
ev += "mods: " + flag2string( m_modifiers, modifiers ) + " ";
if( m_commandId )
{
ev += "cmd-id: " + std::to_string( *m_commandId );
}
ev += "cmd-id: " + std::to_string( *m_commandId ) + " ";
ev += "cmd-str: " + m_commandStr;

View File

@ -56,6 +56,41 @@ enum TOOL_ACTION_FLAGS
AF_NOTIFY = 2 ///< Action is a notification (it is by default passed to all tools)
};
/**
* Define a group that can be used to group actions (and their events) of similar operations.
*/
class TOOL_ACTION_GROUP
{
public:
TOOL_ACTION_GROUP( std::string aName ) :
m_name( aName )
{
// Assign a unique group ID to each group
static int groupIDs = 0;
m_groupID = ++groupIDs;
};
TOOL_ACTION_GROUP( const TOOL_ACTION_GROUP& aOther )
{
// Ensure a copy of a group is exactly the same as this one to get
// proper comparisons
m_name = aOther.GetName();
m_groupID = aOther.GetGroupID();
}
int GetGroupID() const { return m_groupID; }
const std::string& GetName() const { return m_name; }
bool operator==( const TOOL_ACTION_GROUP& aOther ) const
{
return m_groupID == aOther.m_groupID;
}
private:
int m_groupID;
std::string m_name;
};
/**
* Build up the properties of a TOOL_ACTION in an incremental manner that is static-construction
* safe.
@ -181,6 +216,12 @@ public:
return *this;
}
TOOL_ACTION_ARGS& Group( const TOOL_ACTION_GROUP& aGroup )
{
m_group = aGroup;
return *this;
}
protected:
// Let the TOOL_ACTION constructor have direct access to the members here
friend class TOOL_ACTION;
@ -201,6 +242,8 @@ protected:
std::optional<BITMAPS> m_icon;
std::optional<TOOL_ACTION_GROUP> m_group;
std::any m_param;
};
@ -333,6 +376,7 @@ public:
return param;
}
const std::optional<TOOL_ACTION_GROUP> GetActionGroup() const { return m_group; }
/**
* Return name of the tool associated with the action. It is basically the action name
@ -379,6 +423,8 @@ protected:
std::string m_name;
TOOL_ACTION_SCOPE m_scope;
std::optional<TOOL_ACTION_GROUP> m_group; // Optional group for the action to belong to
const int m_defaultHotKey; // Default hot key
const int m_defaultHotKeyAlt; // Default hot key alternate
int m_hotKey; // The current hotkey (post-user-settings-application)

View File

@ -525,6 +525,13 @@ public:
m_mousePos = aP;
}
void SetActionGroup( const TOOL_ACTION_GROUP& aGroup )
{
m_actionGroup = aGroup;
}
bool IsActionInGroup( const TOOL_ACTION_GROUP& aGroup ) const;
private:
friend class TOOL_DISPATCHER;
friend class TOOL_MANAGER;
@ -575,6 +582,10 @@ private:
bool m_hasPosition;
bool m_forceImmediate;
///< Optional group that the parent action for the event belongs to
std::optional<TOOL_ACTION_GROUP> m_actionGroup;
///< True when the tool is being re-activated from the stack
bool m_reactivate;

View File

@ -937,9 +937,13 @@ int ROUTER_TOOL::handleLayerSwitch( const TOOL_EVENT& aEvent, bool aForceVia )
return 0;
}
}
else
else if( aEvent.IsActionInGroup( PCB_ACTIONS::layerDirectSwitchActions() ) )
{
targetLayer = UNDEFINED_LAYER;
targetLayer = aEvent.Parameter<PCB_LAYER_ID>();
if( !enabledLayers.test( targetLayer ) )
return 0;
}
if( targetLayer != UNDEFINED_LAYER )

View File

@ -1443,10 +1443,18 @@ TOOL_ACTION* PCB_ACTIONS::LayerIDToAction( PCB_LAYER_ID aLayer )
}
}
// Implemented as an accessor + static variable to ensure it is initialized when used
// in static action constructors
TOOL_ACTION_GROUP PCB_ACTIONS::layerDirectSwitchActions()
{
static TOOL_ACTION_GROUP group( "pcbnew.Control.DirectLayerActions" );
return group;
}
TOOL_ACTION PCB_ACTIONS::layerTop( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerTop" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.DefaultHotkey( WXK_PAGEUP )
.LegacyHotkeyName( "Switch to Component (F.Cu) layer" )
.MenuText( _( "Switch to Component (F.Cu) layer" ) )
@ -1457,6 +1465,7 @@ TOOL_ACTION PCB_ACTIONS::layerTop( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner1( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner1" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.LegacyHotkeyName( "Switch to Inner layer 1" )
.MenuText( _( "Switch to Inner layer 1" ) )
.Tooltip( _( "Switch to Inner layer 1" ) )
@ -1466,6 +1475,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner1( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner2( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner2" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.LegacyHotkeyName( "Switch to Inner layer 2" )
.MenuText( _( "Switch to Inner layer 2" ) )
.Tooltip( _( "Switch to Inner layer 2" ) )
@ -1475,6 +1485,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner2( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner3( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner3" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.LegacyHotkeyName( "Switch to Inner layer 3" )
.MenuText( _( "Switch to Inner layer 3" ) )
.Tooltip( _( "Switch to Inner layer 3" ) )
@ -1484,6 +1495,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner3( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner4( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner4" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.LegacyHotkeyName( "Switch to Inner layer 4" )
.MenuText( _( "Switch to Inner layer 4" ) )
.Tooltip( _( "Switch to Inner layer 4" ) )
@ -1493,6 +1505,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner4( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner5( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner5" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.LegacyHotkeyName( "Switch to Inner layer 5" )
.MenuText( _( "Switch to Inner layer 5" ) )
.Tooltip( _( "Switch to Inner layer 5" ) )
@ -1502,6 +1515,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner5( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner6( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner6" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.LegacyHotkeyName( "Switch to Inner layer 6" )
.MenuText( _( "Switch to Inner layer 6" ) )
.Tooltip( _( "Switch to Inner layer 6" ) )
@ -1511,6 +1525,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner6( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner7( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner7" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.MenuText( _( "Switch to Inner layer 7" ) )
.Tooltip( _( "Switch to Inner layer 7" ) )
.Flags( AF_NOTIFY )
@ -1519,6 +1534,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner7( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner8( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner8" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.MenuText( _( "Switch to Inner layer 8" ) )
.Tooltip( _( "Switch to Inner layer 8" ) )
.Flags( AF_NOTIFY )
@ -1527,6 +1543,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner8( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner9( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner9" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.MenuText( _( "Switch to Inner layer 9" ) )
.Tooltip( _( "Switch to Inner layer 9" ) )
.Flags( AF_NOTIFY )
@ -1535,6 +1552,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner9( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner10( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner10" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.MenuText( _( "Switch to Inner layer 10" ) )
.Tooltip( _( "Switch to Inner layer 10" ) )
.Flags( AF_NOTIFY )
@ -1543,6 +1561,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner10( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner11( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner11" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.MenuText( _( "Switch to Inner layer 11" ) )
.Tooltip( _( "Switch to Inner layer 11" ) )
.Flags( AF_NOTIFY )
@ -1551,6 +1570,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner11( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner12( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner12" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.MenuText( _( "Switch to Inner layer 12" ) )
.Tooltip( _( "Switch to Inner layer 12" ) )
.Flags( AF_NOTIFY )
@ -1559,6 +1579,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner12( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner13( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner13" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.MenuText( _( "Switch to Inner layer 13" ) )
.Tooltip( _( "Switch to Inner layer 13" ) )
.Flags( AF_NOTIFY )
@ -1567,6 +1588,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner13( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner14( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner14" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.MenuText( _( "Switch to Inner layer 14" ) )
.Tooltip( _( "Switch to Inner layer 14" ) )
.Flags( AF_NOTIFY )
@ -1575,6 +1597,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner14( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner15( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner15" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.MenuText( _( "Switch to Inner layer 15" ) )
.Tooltip( _( "Switch to Inner layer 15" ) )
.Flags( AF_NOTIFY )
@ -1583,6 +1606,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner15( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner16( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner16" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.MenuText( _( "Switch to Inner layer 16" ) )
.Tooltip( _( "Switch to Inner layer 16" ) )
.Flags( AF_NOTIFY )
@ -1591,6 +1615,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner16( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner17( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner17" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.MenuText( _( "Switch to Inner layer 17" ) )
.Tooltip( _( "Switch to Inner layer 17" ) )
.Flags( AF_NOTIFY )
@ -1599,6 +1624,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner17( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner18( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner18" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.MenuText( _( "Switch to Inner layer 18" ) )
.Tooltip( _( "Switch to Inner layer 18" ) )
.Flags( AF_NOTIFY )
@ -1607,6 +1633,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner18( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner19( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner19" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.MenuText( _( "Switch to Inner layer 19" ) )
.Tooltip( _( "Switch to Inner layer 19" ) )
.Flags( AF_NOTIFY )
@ -1615,6 +1642,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner19( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner20( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner20" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.MenuText( _( "Switch to Inner layer 20" ) )
.Tooltip( _( "Switch to Inner layer 20" ) )
.Flags( AF_NOTIFY )
@ -1623,6 +1651,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner20( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner21( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner21" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.MenuText( _( "Switch to Inner layer 21" ) )
.Tooltip( _( "Switch to Inner layer 21" ) )
.Flags( AF_NOTIFY )
@ -1631,6 +1660,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner21( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner22( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner22" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.MenuText( _( "Switch to Inner layer 22" ) )
.Tooltip( _( "Switch to Inner layer 22" ) )
.Flags( AF_NOTIFY )
@ -1639,6 +1669,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner22( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner23( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner23" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.MenuText( _( "Switch to Inner layer 23" ) )
.Tooltip( _( "Switch to Inner layer 23" ) )
.Flags( AF_NOTIFY )
@ -1647,6 +1678,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner23( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner24( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner24" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.MenuText( _( "Switch to Inner layer 24" ) )
.Tooltip( _( "Switch to Inner layer 24" ) )
.Flags( AF_NOTIFY )
@ -1655,6 +1687,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner24( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner25( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner25" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.MenuText( _( "Switch to Inner layer 25" ) )
.Tooltip( _( "Switch to Inner layer 25" ) )
.Flags( AF_NOTIFY )
@ -1663,6 +1696,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner25( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner26( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner26" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.MenuText( _( "Switch to Inner layer 26" ) )
.Tooltip( _( "Switch to Inner layer 26" ) )
.Flags( AF_NOTIFY )
@ -1671,6 +1705,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner26( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner27( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner27" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.MenuText( _( "Switch to Inner layer 27" ) )
.Tooltip( _( "Switch to Inner layer 27" ) )
.Flags( AF_NOTIFY )
@ -1679,6 +1714,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner27( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner28( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner28" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.MenuText( _( "Switch to Inner layer 28" ) )
.Tooltip( _( "Switch to Inner layer 28" ) )
.Flags( AF_NOTIFY )
@ -1687,6 +1723,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner28( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner29( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner29" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.MenuText( _( "Switch to Inner layer 29" ) )
.Tooltip( _( "Switch to Inner layer 29" ) )
.Flags( AF_NOTIFY )
@ -1695,6 +1732,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner29( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerInner30( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerInner30" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.MenuText( _( "Switch to Inner layer 30" ) )
.Tooltip( _( "Switch to Inner layer 30" ) )
.Flags( AF_NOTIFY )
@ -1703,6 +1741,7 @@ TOOL_ACTION PCB_ACTIONS::layerInner30( TOOL_ACTION_ARGS()
TOOL_ACTION PCB_ACTIONS::layerBottom( TOOL_ACTION_ARGS()
.Name( "pcbnew.Control.layerBottom" )
.Scope( AS_GLOBAL )
.Group( PCB_ACTIONS::layerDirectSwitchActions() )
.DefaultHotkey( WXK_PAGEDOWN )
.LegacyHotkeyName( "Switch to Copper (B.Cu) layer" )
.MenuText( _( "Switch to Copper (B.Cu) layer" ) )

View File

@ -355,6 +355,9 @@ public:
static TOOL_ACTION layerAlphaDec;
static TOOL_ACTION layerToggle;
// Group to link all actions that directly select layers
static TOOL_ACTION_GROUP layerDirectSwitchActions();
static TOOL_ACTION layerChanged; // notification
static TOOL_ACTION flipBoard;