From b6f6fc3d65b1dadfd0b7d4f1b0877ea5aa14e2fc Mon Sep 17 00:00:00 2001 From: Ian McInerney Date: Mon, 5 Aug 2019 14:19:44 +0200 Subject: [PATCH] Return handled status for actions run from hotkeys --- common/tool/action_manager.cpp | 6 ++---- common/tool/tool_manager.cpp | 39 ++++++++++++++++++++-------------- include/tool/tool_manager.h | 21 +++++++++++------- 3 files changed, 38 insertions(+), 28 deletions(-) diff --git a/common/tool/action_manager.cpp b/common/tool/action_manager.cpp index 9e26c49b43..96e1eabd04 100644 --- a/common/tool/action_manager.cpp +++ b/common/tool/action_manager.cpp @@ -152,8 +152,7 @@ bool ACTION_MANAGER::RunHotKey( int aHotKey ) const "ACTION_MANAGER::RunHotKey Running action %s for hotkey %s", context->GetName(), KeyNameFromKeyCode( aHotKey ) ); - m_toolMgr->RunAction( *context, true ); - return true; + return m_toolMgr->RunAction( *context, true ); } else if( global ) { @@ -161,8 +160,7 @@ bool ACTION_MANAGER::RunHotKey( int aHotKey ) const "ACTION_MANAGER::RunHotKey Running action: %s for hotkey %s", global->GetName(), KeyNameFromKeyCode( aHotKey ) ); - m_toolMgr->RunAction( *global, true ); - return true; + return m_toolMgr->RunAction( *global, true ); } wxLogTrace( kicadTraceToolStack, "ACTION_MANAGER::RunHotKey No action found for key %s", diff --git a/common/tool/tool_manager.cpp b/common/tool/tool_manager.cpp index 71870b267c..f56f6ce372 100644 --- a/common/tool/tool_manager.cpp +++ b/common/tool/tool_manager.cpp @@ -278,8 +278,9 @@ bool TOOL_MANAGER::RunAction( const std::string& aActionName, bool aNow, void* a } -void TOOL_MANAGER::RunAction( const TOOL_ACTION& aAction, bool aNow, void* aParam ) +bool TOOL_MANAGER::RunAction( const TOOL_ACTION& aAction, bool aNow, void* aParam ) { + bool handled = false; TOOL_EVENT event = aAction.MakeEvent(); // Allow to override the action parameter @@ -289,7 +290,7 @@ void TOOL_MANAGER::RunAction( const TOOL_ACTION& aAction, bool aNow, void* aPara if( aNow ) { TOOL_STATE* current = m_activeState; - processEvent( event ); + handled = processEvent( event ); setActiveState( current ); UpdateUI( event ); } @@ -297,6 +298,8 @@ void TOOL_MANAGER::RunAction( const TOOL_ACTION& aAction, bool aNow, void* aPara { PostEvent( event ); } + + return handled; } @@ -956,22 +959,26 @@ bool TOOL_MANAGER::processEvent( const TOOL_EVENT& aEvent ) { wxLogTrace( kicadTraceToolStack, "TOOL_MANAGER::processEvent %s", aEvent.Format() ); - if( dispatchHotKey( aEvent ) ) - return true; + // First try to dispatch the action associated with the event if it is a key press event + bool handled = dispatchHotKey( aEvent ); - bool handled = false; - - handled |= dispatchInternal( aEvent ); - handled |= dispatchActivation( aEvent ); - - DispatchContextMenu( aEvent ); - - // Dispatch queue - while( !m_eventQueue.empty() ) + if( !handled ) { - TOOL_EVENT event = m_eventQueue.front(); - m_eventQueue.pop_front(); - processEvent( event ); + // If the event is not handled through a hotkey activation, pass it to the currently + // running tool loops + handled |= dispatchInternal( aEvent ); + handled |= dispatchActivation( aEvent ); + + // Open the context menu if requested by a tool + DispatchContextMenu( aEvent ); + + // Dispatch any remaining events in the event queue + while( !m_eventQueue.empty() ) + { + TOOL_EVENT event = m_eventQueue.front(); + m_eventQueue.pop_front(); + processEvent( event ); + } } wxLogTrace( kicadTraceToolStack, "TOOL_MANAGER::processEvent handled: %s %s", diff --git a/include/tool/tool_manager.h b/include/tool/tool_manager.h index d1056bdbae..14622d994c 100644 --- a/include/tool/tool_manager.h +++ b/include/tool/tool_manager.h @@ -122,30 +122,35 @@ public: * Function RunAction() * Runs the specified action. * + * This function will only return if the action has been handled when the action is run + * immediately (aNow = true), otherwise it will always return false. + * * @param aAction is the action to be invoked. * @param aNow decides if the action has to be run immediately or after the current coroutine * is preemptied. * @param aParam is an optional parameter that might be used by the invoked action. Its meaning * depends on the action. + * + * @return True if the action was handled immediately */ - template - void RunAction( const TOOL_ACTION& aAction, bool aNow = false, T aParam = NULL ) + template + bool RunAction( const TOOL_ACTION& aAction, bool aNow = false, T aParam = NULL ) { - RunAction( aAction, aNow, reinterpret_cast( aParam ) ); + return RunAction( aAction, aNow, reinterpret_cast( aParam ) ); } - void RunAction( const TOOL_ACTION& aAction, bool aNow, void* aParam ); + bool RunAction( const TOOL_ACTION& aAction, bool aNow, void* aParam ); - void RunAction( const TOOL_ACTION& aAction, bool aNow = false ) + bool RunAction( const TOOL_ACTION& aAction, bool aNow = false ) { - RunAction( aAction, aNow, (void*) NULL ); + return RunAction( aAction, aNow, (void*) NULL ); } const std::map& GetActions(); - + ///> @copydoc ACTION_MANAGER::GetHotKey() int GetHotKey( const TOOL_ACTION& aAction ); - + ACTION_MANAGER* GetActionManager() { return m_actionMgr; } /**