42 if( action->m_id == -1 )
46 std::string groupName =
"none";
48 std::optional<TOOL_ACTION_GROUP>
group = action->GetActionGroup();
50 if(
group.has_value() )
52 groupID =
group.value().GetGroupID();
53 groupName =
group.value().GetName();
57 "ACTION_MANAGER::ACTION_MANAGER: Registering action %s with ID %d, UI ID %d, "
58 "group %s(%d), toolbar state %s",
59 action->m_name, action->m_id, action->GetUIId(), groupName, groupID,
60 action->m_toolbarState.to_string() );
76 wxASSERT( aAction->
GetName().find(
'.', 0 ) != std::string::npos );
80 wxString::Format(
"Action '%s' already registered", aAction->
m_name ) );
95 m_toolMgr->GetToolHolder()->UnregisterUIUpdateHandler( aAction );
100 wxS(
"ACTION_MANAGER::SetConditions: Registering conditions for ID %d - %s" ),
105 m_toolMgr->GetToolHolder()->RegisterUIUpdateHandler( aAction, aConditions );
123 static int currentActionId = 1;
125 return currentActionId++;
131 std::map<std::string, TOOL_ACTION*>::const_iterator it =
m_actionNameIndex.find( aActionName );
145 if( key >=
'a' && key <=
'z' )
146 key = std::toupper( key );
151 int matchedHotKey = key | mod;
152 HOTKEY_LIST::const_iterator it =
m_actionHotKeys.find( matchedHotKey );
161 matchedHotKey = key | ( mod &
~MD_SHIFT );
163 wxLogTrace(
kicadTraceToolStack, wxS(
"ACTION_MANAGER::RunHotKey No actions found, searching with key: %s" ),
173 const std::list<TOOL_ACTION*>& actions = it->second;
177 int highestPriority = -1, priority = -1;
179 std::vector<const TOOL_ACTION*> global;
187 global.emplace_back( action );
199 if( priority >= 0 && priority > highestPriority )
201 highestPriority = priority;
207 if( !context && global.size() > 1 )
218 bool runAction =
true;
221 runAction = aCond->enableCondition( sel );
224 wxS(
"ACTION_MANAGER::RunHotKey %s context action: %s for hotkey %s" ),
225 runAction ? wxS(
"Running" ) : wxS(
"Not running" ),
232 else if( !global.empty() )
236 bool runAction =
true;
239 runAction = aCond->enableCondition( sel );
242 wxS(
"ACTION_MANAGER::RunHotKey %s global action: %s for hotkey %s" ),
243 runAction ? wxS(
"Running" ) : wxS(
"Not running" ),
247 if( runAction &&
m_toolMgr->RunAction( *act ) )
253 wxS(
"ACTION_MANAGER::RunHotKey No action found for key %s" ),
287 if( framePrefix.empty() )
290 auto userBoundInFrame = [&](
const TOOL_ACTION* aAction )
292 return aAction->GetName().starts_with( framePrefix ) && aAction->IsHotKeyUserBound( aMatchedHotKey );
295 if( std::any_of( aGlobalActions.begin(), aGlobalActions.end(), userBoundInFrame ) )
296 std::stable_partition( aGlobalActions.begin(), aGlobalActions.end(), userBoundInFrame );
321 std::map<int, int>::const_iterator it =
m_hotkeys.find( aAction.
GetId() );
332 static std::map<std::string, int> legacyHotKeyMap;
333 static std::map<std::string, std::pair<int, int>> userHotKeyMap;
334 static bool mapsInitialized =
false;
339 if(
m_toolMgr->GetToolHolder() && ( aFullUpdate || !mapsInitialized ) )
343 mapsInitialized =
true;
370 const std::map<std::string, int>& aLegacyMap,
371 const std::map<std::string, std::pair<int, int>>& aHotKeyMap )
378 if( aHotKeyMap.count( aAction->
m_name ) )
380 std::pair<int, int> keys = aHotKeyMap.at( aAction->
m_name );
381 aAction->
SetHotKey( keys.first, keys.second );
~ACTION_MANAGER()
Unregister every registered action.
HOTKEY_LIST m_actionHotKeys
Quick action<->hot key lookup.
const ACTION_CONDITIONS * GetCondition(const TOOL_ACTION &aAction) const
Get the conditions to use for a specific tool action.
std::map< int, TOOL_ACTION * > m_customUIIdIndex
Map for indexing actions by their hotkeys.
TOOL_MANAGER * m_toolMgr
Map for indexing actions by their names.
void processHotKey(TOOL_ACTION *aAction, const std::map< std::string, int > &aLegacyMap, const std::map< std::string, std::pair< int, int > > &aHotKeyMap)
Tool manager needed to run actions.
const std::map< std::string, TOOL_ACTION * > & GetActions() const
Get a list of currently-registered actions mapped by their name.
std::map< std::string, TOOL_ACTION * > m_actionNameIndex
Map for recording actions that have custom UI IDs.
std::map< int, int > m_hotkeys
bool RunHotKey(int aHotKey) const
Run an action associated with a hotkey (if there is one available).
void SetConditions(const TOOL_ACTION &aAction, const ACTION_CONDITIONS &aConditions)
Set the conditions the UI elements for activating a specific tool action should use for determining t...
void RegisterAction(TOOL_ACTION *aAction)
Add a tool action to the manager and sets it up.
TOOL_ACTION * FindAction(const std::string &aActionName) const
Find an action with a given name (if there is one available).
static void PromoteUserBoundFrameAction(std::vector< const TOOL_ACTION * > &aGlobalActions, FRAME_T aFrameType, int aMatchedHotKey)
Reorder global actions sharing a hotkey so that one native to the given frame is tried first when the...
static std::list< TOOL_ACTION * > & GetActionList()
Return list of TOOL_ACTIONs.
bool IsActionUIId(int aId) const
Test if a UI ID corresponds to an action ID in our system.
int GetHotKey(const TOOL_ACTION &aAction) const
Return the hot key associated with a given action or 0 if there is none.
static int MakeActionId(const std::string &aActionName)
Generate an unique ID from for an action with given name.
std::map< int, ACTION_CONDITIONS > m_uiConditions
Map the command ID that wx uses for the action to the UI conditions for the menu/toolbar items.
void UpdateHotKeys(bool aFullUpdate)
Optionally read the hotkey config files and then rebuilds the internal hotkey maps.
ACTION_MANAGER(TOOL_MANAGER *aToolManager)
static std::string FrameNamespacePrefix(FRAME_T aFrameType)
Return the action-name namespace prefix (e.g.
The base frame for deriving all KiCad main window classes.
FRAME_T
The set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
@ FRAME_SCH_SYMBOL_EDITOR
const wxChar *const kicadTraceToolStack
Flag to enable tracing of the tool handling stack.
void ReadHotKeyConfig(const wxString &aFileName, std::map< std::string, std::pair< int, int > > &aHotKeys)
Read a hotkey config file into a map.
int ReadLegacyHotkeyConfig(const wxString &aAppname, std::map< std::string, int > &aMap)
Read configuration data and fill the current hotkey list with hotkeys.
wxString KeyNameFromKeyCode(int aKeycode, bool *aIsFound)
Return the key name from the key code.
Functors that can be used to figure out how the action controls should be displayed in the UI and if ...
wxLogTrace helper definitions.