KiCad PCB EDA Suite
TOOL_MANAGER Class Reference

Class TOOL_MANAGER. More...

#include <tool_manager.h>

Classes

struct  TOOL_STATE
 Struct describing the current execution state of a TOOL. More...
 

Public Types

typedef std::map< TOOL_BASE *, TOOL_STATE * > TOOL_STATE_MAP
 
typedef std::map< std::string, TOOL_STATE * > NAME_STATE_MAP
 
typedef std::map< TOOL_ID, TOOL_STATE * > ID_STATE_MAP
 
typedef std::list< TOOL_IDID_LIST
 

Public Member Functions

 TOOL_MANAGER ()
 
 ~TOOL_MANAGER ()
 
void RegisterTool (TOOL_BASE *aTool)
 Function RegisterTool() Adds a tool to the manager set and sets it up. More...
 
bool InvokeTool (TOOL_ID aToolId)
 Function InvokeTool() Calls a tool by sending a tool activation event to tool of given ID. More...
 
bool InvokeTool (const std::string &aToolName)
 Function InvokeTool() Calls a tool by sending a tool activation event to tool of given name. More...
 
void RegisterAction (TOOL_ACTION *aAction)
 Function RegisterAction() Registers an action that can be used to control tools (eg. More...
 
void UnregisterAction (TOOL_ACTION *aAction)
 Function UnregisterAction() Unregisters an action, so it is no longer active. More...
 
template<typename T >
bool RunAction (const std::string &aActionName, bool aNow=false, T aParam=NULL)
 Function RunAction() Runs the specified action. More...
 
bool RunAction (const std::string &aActionName, bool aNow, void *aParam)
 
bool RunAction (const std::string &aActionName, bool aNow=false)
 
template<typename T >
void RunAction (const TOOL_ACTION &aAction, bool aNow=false, T aParam=NULL)
 Function RunAction() Runs the specified action. More...
 
void RunAction (const TOOL_ACTION &aAction, bool aNow, void *aParam)
 
void RunAction (const TOOL_ACTION &aAction, bool aNow=false)
 
int GetHotKey (const TOOL_ACTION &aAction)
 > More...
 
void UpdateHotKeys ()
 > More...
 
TOOL_BASEFindTool (int aId) const
 Function FindTool() Searches for a tool with given ID. More...
 
TOOL_BASEFindTool (const std::string &aName) const
 Function FindTool() Searches for a tool with given name. More...
 
template<typename T >
T * GetTool ()
 
void DeactivateTool ()
 Function DeactivateTool() Deactivates the currently active tool. More...
 
bool IsToolActive (TOOL_ID aId) const
 Function IsToolActive() Returns true if a tool with given id is active (executing) More...
 
void ResetTools (TOOL_BASE::RESET_REASON aReason)
 Function ResetTools() Resets all tools (i.e. More...
 
void InitTools ()
 Function InitTools() Initializes all registered tools. More...
 
bool ProcessEvent (const TOOL_EVENT &aEvent)
 Propagates an event to tools that requested events of matching type(s). More...
 
void PostEvent (const TOOL_EVENT &aEvent)
 Puts an event to the event queue to be processed at the end of event processing cycle. More...
 
void SetEnvironment (EDA_ITEM *aModel, KIGFX::VIEW *aView, KIGFX::VIEW_CONTROLS *aViewControls, wxWindow *aFrame)
 Sets the work environment (model, view, view controls and the parent window). More...
 
KIGFX::VIEWGetView () const
 
KIGFX::VIEW_CONTROLSGetViewControls () const
 
EDA_ITEMGetModel () const
 
wxWindow * GetEditFrame () const
 
int GetCurrentToolId () const
 Returns id of the tool that is on the top of the active tools stack (was invoked the most recently). More...
 
TOOL_BASEGetCurrentTool () const
 Returns the tool that is on the top of the active tools stack (was invoked the most recently). More...
 
TOOL_STATEGetCurrentToolState () const
 Returns the TOOL_STATE object representing the state of the active tool. More...
 
int GetPriority (int aToolId) const
 Returns priority of a given tool. More...
 
void ScheduleNextState (TOOL_BASE *aTool, TOOL_STATE_FUNC &aHandler, const TOOL_EVENT_LIST &aConditions)
 Defines a state transition - the events that cause a given handler method in the tool to be called. More...
 
void ClearTransitions (TOOL_BASE *aTool)
 Clears the state transition map for a tool. More...
 
void RunMainStack (TOOL_BASE *aTool, std::function< void()> aFunc)
 
OPT< TOOL_EVENTScheduleWait (TOOL_BASE *aTool, const TOOL_EVENT_LIST &aConditions)
 Pauses execution of a given tool until one or more events matching aConditions arrives. More...
 
void ScheduleContextMenu (TOOL_BASE *aTool, CONTEXT_MENU *aMenu, CONTEXT_MENU_TRIGGER aTrigger)
 Sets behaviour of the tool's context popup menu. More...
 
void PassEvent ()
 Allows a tool to pass the already handled event to the next tool on the stack. More...
 
bool SaveClipboard (const std::string &aText)
 Stores an information to the system clipboard. More...
 
std::string GetClipboard () const
 Returns the information currently stored in the system clipboard. More...
 

Static Public Member Functions

static TOOL_ID MakeToolId (const std::string &aToolName)
 Generates a unique ID from for a tool with given name. More...
 

Private Types

typedef std::pair< TOOL_EVENT_LIST, TOOL_STATE_FUNCTRANSITION
 

Private Member Functions

void dispatchInternal (const TOOL_EVENT &aEvent)
 Function dispatchInternal Passes an event at first to the active tools, then to all others. More...
 
bool dispatchStandardEvents (const TOOL_EVENT &aEvent)
 Function dispatchStandardEvents() Handles specific events, that are intended for TOOL_MANAGER rather than tools. More...
 
bool dispatchActivation (const TOOL_EVENT &aEvent)
 Function dispatchActivation() Checks if it is a valid activation event and invokes a proper tool. More...
 
void dispatchContextMenu (const TOOL_EVENT &aEvent)
 Function dispatchContextMenu() Handles context menu related events. More...
 
bool invokeTool (TOOL_BASE *aTool)
 Function invokeTool() Invokes a tool by sending a proper event (in contrary to runTool, which makes the tool run for real). More...
 
bool runTool (TOOL_ID aToolId)
 Function runTool() Makes a tool active, so it can receive events and react to them. More...
 
bool runTool (const std::string &aName)
 Function runTool() Makes a tool active, so it can receive events and react to them. More...
 
bool runTool (TOOL_BASE *aTool)
 Function runTool() Makes a tool active, so it can receive events and react to them. More...
 
template<class Parameters >
void invokeTool (const std::string &aName, const Parameters &aToolParams)
 
ID_LIST::iterator finishTool (TOOL_STATE *aState)
 Function finishTool() Deactivates a tool and does the necessary clean up. More...
 
bool isRegistered (TOOL_BASE *aTool) const
 Function isRegistered() Returns information about a tool registration status. More...
 
bool isActive (TOOL_BASE *aTool)
 Function isActive() Returns information about a tool activation status. More...
 
void saveViewControls (TOOL_STATE *aState)
 Function saveViewControls() Saves the VIEW_CONTROLS settings to the tool state object. More...
 
void applyViewControls (TOOL_STATE *aState)
 Function applyViewControls() Applies VIEW_CONTROLS settings stored in a TOOL_STATE object. More...
 
bool processEvent (const TOOL_EVENT &aEvent)
 

Main function for event processing.

More...
 
void setActiveState (TOOL_STATE *aState)
 Saves the previous active state and sets a new one. More...
 

Private Attributes

TOOL_STATE_MAP m_toolState
 Index of registered tools current states, associated by tools' objects. More...
 
NAME_STATE_MAP m_toolNameIndex
 Index of the registered tools current states, associated by tools' names. More...
 
ID_STATE_MAP m_toolIdIndex
 Index of the registered tools current states, associated by tools' ID numbers. More...
 
std::map< const char *, TOOL_BASE * > m_toolTypes
 Index of the registered tools to easily lookup by their type. More...
 
ID_LIST m_activeTools
 Stack of the active tools. More...
 
ACTION_MANAGERm_actionMgr
 Instance of ACTION_MANAGER that handles TOOL_ACTIONs. More...
 
std::map< TOOL_ID, OPT< VECTOR2D > > m_cursorSettings
 Original cursor position, if overridden by the context menu handler. More...
 
EDA_ITEMm_model
 
KIGFX::VIEWm_view
 
KIGFX::VIEW_CONTROLSm_viewControls
 
wxWindow * m_editFrame
 
std::list< TOOL_EVENTm_eventQueue
 Queue that stores events to be processed at the end of the event processing cycle. More...
 
bool m_passEvent
 Flag saying if the currently processed event should be passed to other tools. More...
 
VECTOR2D m_menuCursor
 Right click context menu position. More...
 
bool m_menuActive
 Flag indicating whether a context menu is currently displayed. More...
 
TOOL_ID m_menuOwner
 Tool currently displaying a popup menu. It is negative when there is no menu displayed. More...
 
TOOL_STATEm_activeState
 Pointer to the state object corresponding to the currently executed tool. More...
 

Detailed Description

Class TOOL_MANAGER.

Master controller class:

  • registers editing tools
  • pumps UI events to tools requesting them
  • manages tool state machines (transitions and wait requests)

Definition at line 49 of file tool_manager.h.

Member Typedef Documentation

typedef std::list<TOOL_ID> TOOL_MANAGER::ID_LIST

Definition at line 63 of file tool_manager.h.

Definition at line 62 of file tool_manager.h.

typedef std::map<std::string, TOOL_STATE*> TOOL_MANAGER::NAME_STATE_MAP

Definition at line 61 of file tool_manager.h.

Definition at line 60 of file tool_manager.h.

Definition at line 370 of file tool_manager.h.

Constructor & Destructor Documentation

TOOL_MANAGER::TOOL_MANAGER ( )

Definition at line 192 of file tool_manager.cpp.

References m_actionMgr.

192  :
193  m_model( NULL ),
194  m_view( NULL ),
195  m_viewControls( NULL ),
196  m_editFrame( NULL ),
197  m_passEvent( false ),
198  m_menuActive( false ),
199  m_menuOwner( -1 ),
200  m_activeState( nullptr )
201 {
202  m_actionMgr = new ACTION_MANAGER( this );
203 }
bool m_menuActive
Flag indicating whether a context menu is currently displayed.
Definition: tool_manager.h:529
ACTION_MANAGER * m_actionMgr
Instance of ACTION_MANAGER that handles TOOL_ACTIONs.
Definition: tool_manager.h:509
Class ACTION_MANAGER.
bool m_passEvent
Flag saying if the currently processed event should be passed to other tools.
Definition: tool_manager.h:523
EDA_ITEM * m_model
Definition: tool_manager.h:514
TOOL_ID m_menuOwner
Tool currently displaying a popup menu. It is negative when there is no menu displayed.
Definition: tool_manager.h:532
wxWindow * m_editFrame
Definition: tool_manager.h:517
KIGFX::VIEW_CONTROLS * m_viewControls
Definition: tool_manager.h:516
KIGFX::VIEW * m_view
Definition: tool_manager.h:515
TOOL_STATE * m_activeState
Pointer to the state object corresponding to the currently executed tool.
Definition: tool_manager.h:535
TOOL_MANAGER::~TOOL_MANAGER ( )

Definition at line 206 of file tool_manager.cpp.

References m_actionMgr, and m_toolState.

207 {
208  std::map<TOOL_BASE*, TOOL_STATE*>::iterator it, it_end;
209 
210  for( it = m_toolState.begin(), it_end = m_toolState.end(); it != it_end; ++it )
211  {
212  delete it->second->cofunc; // delete cofunction
213  delete it->second; // delete TOOL_STATE
214  delete it->first; // delete the tool itself
215  }
216 
217  delete m_actionMgr;
218 }
ACTION_MANAGER * m_actionMgr
Instance of ACTION_MANAGER that handles TOOL_ACTIONs.
Definition: tool_manager.h:509
TOOL_STATE_MAP m_toolState
Index of registered tools current states, associated by tools&#39; objects.
Definition: tool_manager.h:494

Member Function Documentation

void TOOL_MANAGER::applyViewControls ( TOOL_STATE aState)
private

Function applyViewControls() Applies VIEW_CONTROLS settings stored in a TOOL_STATE object.

Definition at line 907 of file tool_manager.cpp.

References KIGFX::VIEW_CONTROLS::ApplySettings(), m_viewControls, and TOOL_MANAGER::TOOL_STATE::vcSettings.

Referenced by isRegistered(), and setActiveState().

908 {
909  m_viewControls->ApplySettings( aState->vcSettings );
910 }
void ApplySettings(const VC_SETTINGS &aSettings)
Applies VIEW_CONTROLS settings from an object
KIGFX::VIEW_CONTROLS * m_viewControls
Definition: tool_manager.h:516
void TOOL_MANAGER::ClearTransitions ( TOOL_BASE aTool)

Clears the state transition map for a tool.

Parameters
aToolis the tool that should have the transition map cleared.

Definition at line 494 of file tool_manager.cpp.

References m_toolState.

Referenced by TOOL_INTERACTIVE::resetTransitions().

495 {
496  m_toolState[aTool]->transitions.clear();
497 }
TOOL_STATE_MAP m_toolState
Index of registered tools current states, associated by tools&#39; objects.
Definition: tool_manager.h:494
void TOOL_MANAGER::DeactivateTool ( )

Function DeactivateTool() Deactivates the currently active tool.

Definition at line 415 of file tool_manager.cpp.

References processEvent(), TA_CANCEL_TOOL, and TC_COMMAND.

Referenced by GetTool(), GERBVIEW_FRAME::OnCloseWindow(), ResetTools(), and DRC::ShowDRCDialog().

416 {
417  // Deactivate the active tool, but do not run anything new
419  processEvent( evt );
420 }
bool processEvent(const TOOL_EVENT &aEvent)
Main function for event processing.
Class TOOL_EVENT.
Definition: tool_event.h:162
bool TOOL_MANAGER::dispatchActivation ( const TOOL_EVENT aEvent)
private

Function dispatchActivation() Checks if it is a valid activation event and invokes a proper tool.

Parameters
aEventis an event to be tested.
Returns
True if a tool was invoked, false otherwise.

Definition at line 635 of file tool_manager.cpp.

References TOOL_EVENT::GetCommandStr(), TOOL_EVENT::IsActivate(), m_toolNameIndex, and runTool().

Referenced by processEvent().

636 {
637  if( aEvent.IsActivate() )
638  {
639  std::map<std::string, TOOL_STATE*>::iterator tool = m_toolNameIndex.find( *aEvent.GetCommandStr() );
640 
641  if( tool != m_toolNameIndex.end() )
642  {
643  runTool( tool->second->theTool );
644  return true;
645  }
646  }
647 
648  return false;
649 }
bool runTool(TOOL_ID aToolId)
Function runTool() Makes a tool active, so it can receive events and react to them.
NAME_STATE_MAP m_toolNameIndex
Index of the registered tools current states, associated by tools&#39; names.
Definition: tool_manager.h:497
bool IsActivate() const
Definition: tool_event.h:300
OPT< std::string > GetCommandStr() const
Definition: tool_event.h:400
void TOOL_MANAGER::dispatchContextMenu ( const TOOL_EVENT aEvent)
private

Function dispatchContextMenu() Handles context menu related events.

Definition at line 651 of file tool_manager.cpp.

References BUT_RIGHT, CONTEXT_MENU::Clone(), CMENU_BUTTON, CMENU_NOW, CMENU_OFF, TOOL_MANAGER::TOOL_STATE::contextMenu, TOOL_MANAGER::TOOL_STATE::contextMenuTrigger, dispatchInternal(), KIGFX::VIEW_CONTROLS::ForceCursorPosition(), KIGFX::VIEW_CONTROLS::GetCursorPosition(), TOOL_EVENT::IsClick(), m_activeTools, m_cursorSettings, m_editFrame, KIGFX::VC_SETTINGS::m_forceCursorPosition, KIGFX::VC_SETTINGS::m_forcedPosition, m_menuActive, m_menuCursor, m_menuOwner, m_toolIdIndex, m_viewControls, NULLOPT, TOOL_MANAGER::TOOL_STATE::pendingWait, TOOL_EVENT::SetParameter(), TA_ANY, TA_CONTEXT_MENU_CHOICE, TA_CONTEXT_MENU_CLOSED, TC_ANY, TC_COMMAND, TOOL_MANAGER::TOOL_STATE::vcSettings, TOOL_MANAGER::TOOL_STATE::waitEvents, and KIGFX::VIEW_CONTROLS::WarpCursor().

Referenced by processEvent().

652 {
653  for( TOOL_ID toolId : m_activeTools )
654  {
655  TOOL_STATE* st = m_toolIdIndex[toolId];
656 
657  // the tool requested a context menu. The menu is activated on RMB click (CMENU_BUTTON mode)
658  // or immediately (CMENU_NOW) mode. The latter is used for clarification lists.
659  if( st->contextMenuTrigger == CMENU_OFF )
660  continue;
661 
662  if( st->contextMenuTrigger == CMENU_BUTTON && !aEvent.IsClick( BUT_RIGHT ) )
663  break;
664 
665  st->pendingWait = true;
666  st->waitEvents = TOOL_EVENT( TC_ANY, TA_ANY );
667 
668  // Store the menu pointer in case it is changed by the TOOL when handling menu events
669  CONTEXT_MENU* m = st->contextMenu;
670 
671  if( st->contextMenuTrigger == CMENU_NOW )
672  st->contextMenuTrigger = CMENU_OFF;
673 
674  // Store the cursor position, so the tools could execute actions
675  // using the point where the user has invoked a context menu
677 
678  // Save all tools cursor settings, as they will be overridden
679  for( auto idState : m_toolIdIndex )
680  {
681  TOOL_STATE* s = idState.second;
682  const auto& vc = s->vcSettings;
683 
684  if( vc.m_forceCursorPosition )
685  m_cursorSettings[idState.first] = vc.m_forcedPosition;
686  else
687  m_cursorSettings[idState.first] = NULLOPT;
688  }
689 
691 
692  // Display a copy of menu
693  std::unique_ptr<CONTEXT_MENU> menu( m->Clone() );
694 
695  // Run update handlers on the created copy
696  menu->UpdateAll();
697  m_menuOwner = toolId;
698  m_menuActive = true;
699 
700  auto frame = dynamic_cast<wxFrame*>( m_editFrame );
701 
702  if( frame )
703  frame->PopupMenu( menu.get() );
704 
705  // Warp the cursor as long as the menu wasn't clicked out of
706  if( menu->GetSelected() >= 0 )
707  m_viewControls->WarpCursor( m_menuCursor, true, false );
708  // Otherwise notify the tool of a cancelled menu
709  else
710  {
712  evt.SetParameter( m );
713  dispatchInternal( evt );
714  }
715 
716  // Notify the tools that menu has been closed
718  evt.SetParameter( m );
719  dispatchInternal( evt );
720 
721  m_menuActive = false;
722  m_menuOwner = -1;
723 
724  // Restore cursor settings
725  for( auto cursorSetting : m_cursorSettings )
726  {
727  auto it = m_toolIdIndex.find( cursorSetting.first );
728  wxASSERT( it != m_toolIdIndex.end() );
729 
730  if( it == m_toolIdIndex.end() )
731  continue;
732 
733  KIGFX::VC_SETTINGS& vc = it->second->vcSettings;
734  vc.m_forceCursorPosition = (bool) cursorSetting.second;
735  vc.m_forcedPosition = cursorSetting.second ? *cursorSetting.second : VECTOR2D( 0, 0 );
736  }
737 
738  m_cursorSettings.clear();
739  break;
740  }
741 }
bool m_menuActive
Flag indicating whether a context menu is currently displayed.
Definition: tool_manager.h:529
VECTOR2D m_menuCursor
Right click context menu position.
Definition: tool_manager.h:526
ID_STATE_MAP m_toolIdIndex
Index of the registered tools current states, associated by tools&#39; ID numbers.
Definition: tool_manager.h:500
Class CONTEXT_MENU.
Definition: context_menu.h:44
std::map< TOOL_ID, OPT< VECTOR2D > > m_cursorSettings
Original cursor position, if overridden by the context menu handler.
Definition: tool_manager.h:512
VECTOR2D m_forcedPosition
Forced cursor position (world coordinates)
Definition: view_controls.h:58
int TOOL_ID
Unique identifier for tools.
Definition: tool_base.h:57
virtual void WarpCursor(const VECTOR2D &aPosition, bool aWorldCoordinates=false, bool aWarpView=false)=0
Function WarpCursor() If enabled (.
CONTEXT_MENU * Clone() const
Creates a deep, recursive copy of this CONTEXT_MENU.
const auto NULLOPT
Definition: optional.h:9
bool m_forceCursorPosition
Is the forced cursor position enabled
Definition: view_controls.h:61
TOOL_ID m_menuOwner
Tool currently displaying a popup menu. It is negative when there is no menu displayed.
Definition: tool_manager.h:532
wxWindow * m_editFrame
Definition: tool_manager.h:517
VECTOR2D GetCursorPosition() const
Returns the current cursor position in world coordinates.
void dispatchInternal(const TOOL_EVENT &aEvent)
Function dispatchInternal Passes an event at first to the active tools, then to all others...
Class TOOL_EVENT.
Definition: tool_event.h:162
Structure to keep VIEW_CONTROLS settings for easy store/restore operations
Definition: view_controls.h:44
virtual void ForceCursorPosition(bool aEnabled, const VECTOR2D &aPosition=VECTOR2D(0, 0))
Function ForceCursorPosition() Places the cursor immediately at a given point.
KIGFX::VIEW_CONTROLS * m_viewControls
Definition: tool_manager.h:516
ID_LIST m_activeTools
Stack of the active tools.
Definition: tool_manager.h:506
bool IsClick(int aButtonMask=BUT_ANY) const
Definition: tool_event.h:268
void TOOL_MANAGER::dispatchInternal ( const TOOL_EVENT aEvent)
private

Function dispatchInternal Passes an event at first to the active tools, then to all others.

Definition at line 526 of file tool_manager.cpp.

References COROUTINE< ReturnType, ArgType >::Call(), TOOL_EVENT::Category(), TOOL_EVENT_LIST::clear(), TOOL_MANAGER::TOOL_STATE::cofunc, finishTool(), TOOL_MANAGER::TOOL_STATE::idle, TOOL_EVENT::IsMenu(), m_activeTools, m_menuOwner, m_passEvent, m_toolIdIndex, m_toolState, TOOL_EVENT_LIST::Matches(), TOOL_MANAGER::TOOL_STATE::pendingWait, TOOL_MANAGER::TOOL_STATE::Push(), COROUTINE< ReturnType, ArgType >::Resume(), COROUTINE< ReturnType, ArgType >::Running(), setActiveState(), TC_MESSAGE, TOOL_MANAGER::TOOL_STATE::transitions, TOOL_MANAGER::TOOL_STATE::vcSettings, TOOL_MANAGER::TOOL_STATE::waitEvents, and TOOL_MANAGER::TOOL_STATE::wakeupEvent.

Referenced by dispatchContextMenu(), and processEvent().

527 {
528  // iterate over all registered tools
529  for( auto it = m_activeTools.begin(); it != m_activeTools.end(); ++it )
530  {
531  TOOL_STATE* st = m_toolIdIndex[*it];
532 
533  // forward context menu events to the tool that created the menu
534  if( aEvent.IsMenu() )
535  {
536  if( *it != m_menuOwner )
537  continue;
538  }
539 
540  // the tool state handler is waiting for events (i.e. called Wait() method)
541  if( st->pendingWait )
542  {
543  if( st->waitEvents.Matches( aEvent ) )
544  {
545  // By default only messages are passed further
546  m_passEvent = ( aEvent.Category() == TC_MESSAGE );
547 
548  // got matching event? clear wait list and wake up the coroutine
549  st->wakeupEvent = aEvent;
550  st->pendingWait = false;
551  st->waitEvents.clear();
552 
553  if( st->cofunc )
554  {
555  setActiveState( st );
556  bool end = !st->cofunc->Resume();
557 
558  if( end )
559  it = finishTool( st );
560  }
561 
562  // If the tool did not request to propagate
563  // the event to other tools, we should stop it now
564  if( !m_passEvent )
565  break;
566  }
567  }
568  }
569 
570  for( auto& state : m_toolState )
571  {
572  TOOL_STATE* st = state.second;
573  bool finished = false;
574 
575  // no state handler in progress - check if there are any transitions (defined by
576  // Go() method that match the event.
577  if( !st->transitions.empty() )
578  {
579  for( TRANSITION& tr : st->transitions )
580  {
581  if( tr.first.Matches( aEvent ) )
582  {
583  auto func_copy = tr.second;
584 
585  // if there is already a context, then push it on the stack
586  // and transfer the previous view control settings to the new context
587  if( st->cofunc )
588  {
589  auto vc = st->vcSettings;
590  st->Push();
591  st->vcSettings = vc;
592  }
593 
594  st->cofunc = new COROUTINE<int, const TOOL_EVENT&>( std::move( func_copy ) );
595 
596  // as the state changes, the transition table has to be set up again
597  st->transitions.clear();
598 
599  // got match? Run the handler.
600  setActiveState( st );
601  st->idle = false;
602  st->cofunc->Call( aEvent );
603 
604  if( !st->cofunc->Running() )
605  finishTool( st ); // The couroutine has finished immediately?
606 
607  // if it is a message, continue processing
608  finished = !( aEvent.Category() == TC_MESSAGE );
609 
610  // there is no point in further checking, as transitions got cleared
611  break;
612  }
613  }
614  }
615 
616  if( finished )
617  break; // only the first tool gets the event
618  }
619 }
ID_STATE_MAP m_toolIdIndex
Index of the registered tools current states, associated by tools&#39; ID numbers.
Definition: tool_manager.h:500
ID_LIST::iterator finishTool(TOOL_STATE *aState)
Function finishTool() Deactivates a tool and does the necessary clean up.
bool m_passEvent
Flag saying if the currently processed event should be passed to other tools.
Definition: tool_manager.h:523
TOOL_ID m_menuOwner
Tool currently displaying a popup menu. It is negative when there is no menu displayed.
Definition: tool_manager.h:532
void setActiveState(TOOL_STATE *aState)
Saves the previous active state and sets a new one.
TOOL_EVENT_CATEGORY Category() const
Returns the category (eg. mouse/keyboard/action) of an event..
Definition: tool_event.h:228
bool IsMenu() const
Definition: tool_event.h:310
ID_LIST m_activeTools
Stack of the active tools.
Definition: tool_manager.h:506
TOOL_STATE_MAP m_toolState
Index of registered tools current states, associated by tools&#39; objects.
Definition: tool_manager.h:494
std::pair< TOOL_EVENT_LIST, TOOL_STATE_FUNC > TRANSITION
Definition: tool_manager.h:370
bool TOOL_MANAGER::dispatchStandardEvents ( const TOOL_EVENT aEvent)
private

Function dispatchStandardEvents() Handles specific events, that are intended for TOOL_MANAGER rather than tools.

Parameters
aEventis the event to be processed.
Returns
False if the event was processed and should not go any further.

Definition at line 622 of file tool_manager.cpp.

References TOOL_EVENT::Action(), TOOL_EVENT::KeyCode(), m_actionMgr, TOOL_EVENT::Modifier(), ACTION_MANAGER::RunHotKey(), and TA_KEY_PRESSED.

Referenced by processEvent().

623 {
624  if( aEvent.Action() == TA_KEY_PRESSED )
625  {
626  // Check if there is a hotkey associated
627  if( m_actionMgr->RunHotKey( aEvent.Modifier() | aEvent.KeyCode() ) )
628  return false; // hotkey event was handled so it does not go any further
629  }
630 
631  return true;
632 }
ACTION_MANAGER * m_actionMgr
Instance of ACTION_MANAGER that handles TOOL_ACTIONs.
Definition: tool_manager.h:509
int Modifier(int aMask=MD_MODIFIER_MASK) const
Returns information about key modifiers state (Ctrl, Alt, etc.)
Definition: tool_event.h:316
int KeyCode() const
Definition: tool_event.h:321
bool RunHotKey(int aHotKey) const
Function RunHotKey() Runs an action associated with a hotkey (if there is one available).
TOOL_ACTIONS Action() const
Returns more specific information about the type of an event.
Definition: tool_event.h:234
TOOL_BASE * TOOL_MANAGER::FindTool ( int  aId) const

Function FindTool() Searches for a tool with given ID.

Parameters
aIdis the ID number of the requested tool.
Returns
Pointer to the requested tool or NULL in case of failure.

Definition at line 393 of file tool_manager.cpp.

References m_toolIdIndex.

Referenced by GetCurrentTool(), ALIGN_DISTRIBUTE_TOOL::Init(), POINT_EDITOR::Init(), POSITION_RELATIVE_TOOL::Init(), EDIT_TOOL::Init(), EDIT_TOOL::invokeInlineRouter(), InvokeTool(), EDIT_TOOL::isInteractiveDragEnabled(), RunAction(), ACTION_MANAGER::RunHotKey(), and runTool().

394 {
395  std::map<TOOL_ID, TOOL_STATE*>::const_iterator it = m_toolIdIndex.find( aId );
396 
397  if( it != m_toolIdIndex.end() )
398  return it->second->theTool;
399 
400  return NULL;
401 }
ID_STATE_MAP m_toolIdIndex
Index of the registered tools current states, associated by tools&#39; ID numbers.
Definition: tool_manager.h:500
TOOL_BASE * TOOL_MANAGER::FindTool ( const std::string &  aName) const

Function FindTool() Searches for a tool with given name.

Parameters
aNameis the name of the requested tool.
Returns
Pointer to the requested tool or NULL in case of failure.

Definition at line 404 of file tool_manager.cpp.

References m_toolNameIndex.

405 {
406  std::map<std::string, TOOL_STATE*>::const_iterator it = m_toolNameIndex.find( aName );
407 
408  if( it != m_toolNameIndex.end() )
409  return it->second->theTool;
410 
411  return NULL;
412 }
NAME_STATE_MAP m_toolNameIndex
Index of the registered tools current states, associated by tools&#39; names.
Definition: tool_manager.h:497
TOOL_MANAGER::ID_LIST::iterator TOOL_MANAGER::finishTool ( TOOL_STATE aState)
private

Function finishTool() Deactivates a tool and does the necessary clean up.

Parameters
aStateis the state variable of the tool to be stopped.
Returns
m_activeTools iterator. If the tool has been completely deactivated, it points to the next active tool on the list. Otherwise it is an iterator pointing to aState.

Definition at line 744 of file tool_manager.cpp.

References TOOL_BASE::GetId(), TOOL_BASE::GetType(), TOOL_MANAGER::TOOL_STATE::idle, INTERACTIVE, m_activeState, m_activeTools, TOOL_MANAGER::TOOL_STATE::Pop(), setActiveState(), and TOOL_MANAGER::TOOL_STATE::theTool.

Referenced by dispatchInternal().

745 {
746  auto it = std::find( m_activeTools.begin(), m_activeTools.end(), aState->theTool->GetId() );
747 
748  if( !aState->Pop() )
749  {
750  // Deactivate the tool if there are no other contexts saved on the stack
751  if( it != m_activeTools.end() )
752  it = m_activeTools.erase( it );
753  }
754 
755  if( aState == m_activeState )
756  setActiveState( nullptr );
757 
758  // Set transitions to be ready for future TOOL_EVENTs
759  TOOL_BASE* tool = aState->theTool;
760 
761  if( tool->GetType() == INTERACTIVE )
762  static_cast<TOOL_INTERACTIVE*>( tool )->resetTransitions();
763 
764  aState->idle = true;
765 
766  return it;
767 }
Tool that interacts with the user
Definition: tool_base.h:50
void setActiveState(TOOL_STATE *aState)
Saves the previous active state and sets a new one.
TOOL_TYPE GetType() const
Function GetType() Returns the type of the tool.
Definition: tool_base.h:111
TOOL_STATE * m_activeState
Pointer to the state object corresponding to the currently executed tool.
Definition: tool_manager.h:535
Class TOOL_BASE.
Definition: tool_base.h:68
ID_LIST m_activeTools
Stack of the active tools.
Definition: tool_manager.h:506
std::string TOOL_MANAGER::GetClipboard ( ) const

Returns the information currently stored in the system clipboard.

If data stored in the clipboard is in non-text format, empty string is returned.

Definition at line 817 of file tool_manager.cpp.

Referenced by PassEvent().

818 {
819  std::string result;
820 
821  if( wxTheClipboard->Open() )
822  {
823  if( wxTheClipboard->IsSupported( wxDF_TEXT ) )
824  {
825  wxTextDataObject data;
826  wxTheClipboard->GetData( data );
827 
828  result = data.GetText().mb_str();
829  }
830 
831  wxTheClipboard->Close();
832  }
833 
834  return result;
835 }
TOOL_BASE* TOOL_MANAGER::GetCurrentTool ( ) const
inline

Returns the tool that is on the top of the active tools stack (was invoked the most recently).

Returns
Pointer to the currently used tool.

Definition at line 287 of file tool_manager.h.

References FindTool(), and GetCurrentToolId().

288  {
289  return FindTool( GetCurrentToolId() );
290  }
TOOL_BASE * FindTool(int aId) const
Function FindTool() Searches for a tool with given ID.
int GetCurrentToolId() const
Returns id of the tool that is on the top of the active tools stack (was invoked the most recently)...
Definition: tool_manager.h:277
int TOOL_MANAGER::GetCurrentToolId ( ) const
inline

Returns id of the tool that is on the top of the active tools stack (was invoked the most recently).

Returns
Id of the currently used tool.

Definition at line 277 of file tool_manager.h.

References m_activeTools.

Referenced by GetCurrentTool(), and GetCurrentToolState().

278  {
279  return m_activeTools.empty() ? -1 : m_activeTools.front();
280  }
ID_LIST m_activeTools
Stack of the active tools.
Definition: tool_manager.h:506
TOOL_STATE* TOOL_MANAGER::GetCurrentToolState ( ) const
inline

Returns the TOOL_STATE object representing the state of the active tool.

If there are no tools active, it returns nullptr.

Definition at line 296 of file tool_manager.h.

References GetCurrentToolId(), and m_toolIdIndex.

Referenced by invokeTool(), and ProcessEvent().

297  {
298  auto it = m_toolIdIndex.find( GetCurrentToolId() );
299  return ( it != m_toolIdIndex.end() ) ? it->second : nullptr;
300  }
int GetCurrentToolId() const
Returns id of the tool that is on the top of the active tools stack (was invoked the most recently)...
Definition: tool_manager.h:277
ID_STATE_MAP m_toolIdIndex
Index of the registered tools current states, associated by tools&#39; ID numbers.
Definition: tool_manager.h:500
wxWindow* TOOL_MANAGER::GetEditFrame ( ) const
inline
int TOOL_MANAGER::GetHotKey ( const TOOL_ACTION aAction)

>

Function GetHotKey() Returns the hot key associated with a given action or 0 if there is none.

Parameters
aActionis the queried action.

Definition at line 312 of file tool_manager.cpp.

References ACTION_MANAGER::GetHotKey(), and m_actionMgr.

Referenced by RunAction(), and CONTEXT_MENU::updateHotKeys().

313 {
314  return m_actionMgr->GetHotKey( aAction );
315 }
ACTION_MANAGER * m_actionMgr
Instance of ACTION_MANAGER that handles TOOL_ACTIONs.
Definition: tool_manager.h:509
int GetHotKey(const TOOL_ACTION &aAction) const
Function GetHotKey() Returns the hot key associated with a given action or 0 if there is none...
EDA_ITEM* TOOL_MANAGER::GetModel ( ) const
inline

Definition at line 262 of file tool_manager.h.

References m_model.

Referenced by TOOL_BASE::getModelInt(), and highlightNet().

263  {
264  return m_model;
265  }
EDA_ITEM * m_model
Definition: tool_manager.h:514
int TOOL_MANAGER::GetPriority ( int  aToolId) const

Returns priority of a given tool.

Higher number means that the tool is closer to the beginning of the active tools queue (i.e. receives events earlier, tools with lower priority receive events later).

Parameters
aToolIdis the id of queried tool.
Returns
The priority of a given tool. If returned number is negative, then it means that the tool id is invalid or the tool is not active.

Definition at line 469 of file tool_manager.cpp.

References m_activeTools.

Referenced by ACTION_MANAGER::RunHotKey().

470 {
471  int priority = 0;
472 
473  for( auto it = m_activeTools.begin(), itEnd = m_activeTools.end(); it != itEnd; ++it )
474  {
475  if( *it == aToolId )
476  return priority;
477 
478  ++priority;
479  }
480 
481  return -1;
482 }
ID_LIST m_activeTools
Stack of the active tools.
Definition: tool_manager.h:506
template<typename T >
T* TOOL_MANAGER::GetTool ( )
inline

Definition at line 189 of file tool_manager.h.

References DeactivateTool(), InitTools(), IsToolActive(), m_toolTypes, name, ProcessEvent(), and ResetTools().

Referenced by PAD_TOOL::applyPadSettings(), PCB_EDITOR_CONTROL::calculateSelectionRatsnest(), ROUTER_TOOL::CanInlineDrag(), PAD_TOOL::copyPadSettings(), MODULE_EDITOR_TOOLS::CreatePadFromShapes(), PCB_EDITOR_CONTROL::CrossProbePcbToSch(), deleteItem(), PCBNEW_CONTROL::DeleteItemCursor(), PCB_EDITOR_CONTROL::DrillOrigin(), MODULE_EDITOR_TOOLS::ExplodePadToShapes(), DRAWING_TOOL::getSourceZoneForAction(), PCBNEW_CONTROL::GridSetOrigin(), GERBVIEW_CONTROL::HighlightControl(), highlightNet(), PCB_EDITOR_CONTROL::HighlightNetCursor(), PICKER_TOOL::Init(), PAD_TOOL::Init(), PCB_EDITOR_CONTROL::Init(), ROUTER_TOOL::InlineDrag(), PCB_EDITOR_CONTROL::modifyLockSelected(), DIALOG_POSITION_RELATIVE::OnOkClick(), DIALOG_POSITION_RELATIVE::OnSelectItemClick(), EDIT_TOOL::pickCopyReferencePoint(), PCBNEW_CONTROL::placeBoardItems(), PCB_EDITOR_CONTROL::PlaceModule(), PCB_EDITOR_CONTROL::PlaceTarget(), DRAWING_TOOL::PlaceText(), PAD_TOOL::pushPadSettings(), PCB_TOOL::selection(), POSITION_RELATIVE_TOOL::SelectPositionRelativeItem(), selectPRitem(), FOOTPRINT_EDIT_FRAME::setupTools(), PCB_EDITOR_CONTROL::ShowLocalRatsnest(), showLocalRatsnest(), PAD_CONTEXT_MENU::update(), PCB_EDITOR_CONTROL::UpdateSelectionRatsnest(), PCB_EDITOR_CONTROL::ZoneDuplicate(), and PCB_EDITOR_CONTROL::ZoneMerge().

190  {
191  std::map<const char*, TOOL_BASE*>::iterator tool = m_toolTypes.find( typeid( T ).name() );
192 
193  if( tool != m_toolTypes.end() )
194  return static_cast<T*>( tool->second );
195 
196  return NULL;
197  }
const char * name
Definition: DXF_plotter.cpp:61
std::map< const char *, TOOL_BASE * > m_toolTypes
Index of the registered tools to easily lookup by their type.
Definition: tool_manager.h:503
KIGFX::VIEW_CONTROLS* TOOL_MANAGER::GetViewControls ( ) const
inline

Definition at line 257 of file tool_manager.h.

References m_viewControls.

Referenced by TOOL_DISPATCHER::DispatchWxEvent(), and TOOL_BASE::getViewControls().

258  {
259  return m_viewControls;
260  }
KIGFX::VIEW_CONTROLS * m_viewControls
Definition: tool_manager.h:516
void TOOL_MANAGER::InitTools ( )

Function InitTools() Initializes all registered tools.

If a tool fails during the initialization, it is deactivated and becomes unavailable for further use. Initialization should be done only once.

Definition at line 439 of file tool_manager.cpp.

References Format(), TOOL_BASE::GetId(), TOOL_BASE::GetName(), TOOL_BASE::Init(), m_toolIdIndex, m_toolNameIndex, m_toolState, m_toolTypes, ResetTools(), TOOL_BASE::RUN, and setActiveState().

Referenced by GetTool(), FOOTPRINT_EDIT_FRAME::setupTools(), and GERBVIEW_FRAME::setupTools().

440 {
441  for( auto it = m_toolState.begin(); it != m_toolState.end(); /* iteration in the loop */ )
442  {
443  TOOL_BASE* tool = it->first;
444  TOOL_STATE* state = it->second;
445  setActiveState( state );
446  ++it; // keep the iterator valid if the element is going to be erased
447 
448  if( !tool->Init() )
449  {
450  wxMessageBox(
451  wxString::Format( "Initialization of tool \"%s\" failed", tool->GetName() ) );
452 
453  // Unregister the tool
454  setActiveState( nullptr );
455  m_toolState.erase( tool );
456  m_toolNameIndex.erase( tool->GetName() );
457  m_toolIdIndex.erase( tool->GetId() );
458  m_toolTypes.erase( typeid( *tool ).name() );
459 
460  delete state;
461  delete tool;
462  }
463  }
464 
466 }
virtual bool Init()
Function Init() Init() is called once upon a registration of the tool.
Definition: tool_base.h:93
ID_STATE_MAP m_toolIdIndex
Index of the registered tools current states, associated by tools&#39; ID numbers.
Definition: tool_manager.h:500
Tool is invoked after being inactive.
Definition: tool_base.h:82
NAME_STATE_MAP m_toolNameIndex
Index of the registered tools current states, associated by tools&#39; names.
Definition: tool_manager.h:497
void setActiveState(TOOL_STATE *aState)
Saves the previous active state and sets a new one.
void ResetTools(TOOL_BASE::RESET_REASON aReason)
Function ResetTools() Resets all tools (i.e.
TOOL_ID GetId() const
Function GetId() Returns the unique identifier of the tool.
Definition: tool_base.h:122
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
Class TOOL_BASE.
Definition: tool_base.h:68
const std::string & GetName() const
Function GetName() Returns the name of the tool.
Definition: tool_base.h:133
TOOL_STATE_MAP m_toolState
Index of registered tools current states, associated by tools&#39; objects.
Definition: tool_manager.h:494
std::map< const char *, TOOL_BASE * > m_toolTypes
Index of the registered tools to easily lookup by their type.
Definition: tool_manager.h:503
bool TOOL_MANAGER::InvokeTool ( TOOL_ID  aToolId)

Function InvokeTool() Calls a tool by sending a tool activation event to tool of given ID.

Parameters
aToolIdis the ID number of the requested tool.
Returns
True if the requested tool was invoked successfully.

Definition at line 241 of file tool_manager.cpp.

References FindTool(), TOOL_BASE::GetType(), INTERACTIVE, and invokeTool().

Referenced by TOOL_INTERACTIVE::Activate(), SELECTION_TOOL::findMove(), SELECTION_TOOL::Main(), DIALOG_UPDATE_PCB::PerformUpdate(), FOOTPRINT_EDIT_FRAME::setupTools(), and GERBVIEW_FRAME::setupTools().

242 {
243  TOOL_BASE* tool = FindTool( aToolId );
244 
245  if( tool && tool->GetType() == INTERACTIVE )
246  return invokeTool( tool );
247 
248  return false; // there is no tool with the given id
249 }
TOOL_BASE * FindTool(int aId) const
Function FindTool() Searches for a tool with given ID.
Tool that interacts with the user
Definition: tool_base.h:50
TOOL_TYPE GetType() const
Function GetType() Returns the type of the tool.
Definition: tool_base.h:111
Class TOOL_BASE.
Definition: tool_base.h:68
bool invokeTool(TOOL_BASE *aTool)
Function invokeTool() Invokes a tool by sending a proper event (in contrary to runTool, which makes the tool run for real).
bool TOOL_MANAGER::InvokeTool ( const std::string &  aToolName)

Function InvokeTool() Calls a tool by sending a tool activation event to tool of given name.

Parameters
aToolNameis the name of the requested tool.
Returns
True if the requested tool was invoked successfully.

Definition at line 252 of file tool_manager.cpp.

References FindTool(), TOOL_BASE::GetType(), INTERACTIVE, and invokeTool().

253 {
254  TOOL_BASE* tool = FindTool( aToolName );
255 
256  if( tool && tool->GetType() == INTERACTIVE )
257  return invokeTool( tool );
258 
259  return false; // there is no tool with the given name
260 }
TOOL_BASE * FindTool(int aId) const
Function FindTool() Searches for a tool with given ID.
Tool that interacts with the user
Definition: tool_base.h:50
TOOL_TYPE GetType() const
Function GetType() Returns the type of the tool.
Definition: tool_base.h:111
Class TOOL_BASE.
Definition: tool_base.h:68
bool invokeTool(TOOL_BASE *aTool)
Function invokeTool() Invokes a tool by sending a proper event (in contrary to runTool, which makes the tool run for real).
bool TOOL_MANAGER::invokeTool ( TOOL_BASE aTool)
private

Function invokeTool() Invokes a tool by sending a proper event (in contrary to runTool, which makes the tool run for real).

Parameters
aToolis the tool to be invoked.

Definition at line 324 of file tool_manager.cpp.

References GetCurrentToolState(), TOOL_BASE::GetName(), processEvent(), setActiveState(), TA_ACTIVATE, and TC_COMMAND.

Referenced by InvokeTool().

325 {
326  wxASSERT( aTool != NULL );
327 
328  TOOL_EVENT evt( TC_COMMAND, TA_ACTIVATE, aTool->GetName() );
329  processEvent( evt );
330 
331  if( TOOL_STATE* active = GetCurrentToolState() )
332  setActiveState( active );
333 
334  return true;
335 }
bool processEvent(const TOOL_EVENT &aEvent)
Main function for event processing.
void setActiveState(TOOL_STATE *aState)
Saves the previous active state and sets a new one.
Class TOOL_EVENT.
Definition: tool_event.h:162
TOOL_STATE * GetCurrentToolState() const
Returns the TOOL_STATE object representing the state of the active tool.
Definition: tool_manager.h:296
const std::string & GetName() const
Function GetName() Returns the name of the tool.
Definition: tool_base.h:133
template<class Parameters >
void TOOL_MANAGER::invokeTool ( const std::string &  aName,
const Parameters &  aToolParams 
)
private
bool TOOL_MANAGER::isActive ( TOOL_BASE aTool)
private

Function isActive() Returns information about a tool activation status.

Parameters
aToolis the tool to be checked.
Returns
True if the tool is on the active tools stack, false otherwise.

Definition at line 857 of file tool_manager.cpp.

References TOOL_BASE::GetId(), isRegistered(), and m_activeTools.

Referenced by isRegistered(), and runTool().

858 {
859  if( !isRegistered( aTool ) )
860  return false;
861 
862  // Just check if the tool is on the active tools stack
863  return std::find( m_activeTools.begin(), m_activeTools.end(), aTool->GetId() ) != m_activeTools.end();
864 }
TOOL_ID GetId() const
Function GetId() Returns the unique identifier of the tool.
Definition: tool_base.h:122
bool isRegistered(TOOL_BASE *aTool) const
Function isRegistered() Returns information about a tool registration status.
Definition: tool_manager.h:455
ID_LIST m_activeTools
Stack of the active tools.
Definition: tool_manager.h:506
bool TOOL_MANAGER::isRegistered ( TOOL_BASE aTool) const
inlineprivate

Function isRegistered() Returns information about a tool registration status.

Parameters
aToolis the tool to be checked.
Returns
true if the tool is in the registered tools list, false otherwise.

Definition at line 455 of file tool_manager.h.

References applyViewControls(), isActive(), m_toolState, processEvent(), saveViewControls(), and setActiveState().

Referenced by isActive(), and runTool().

456  {
457  return m_toolState.count( aTool ) > 0;
458  }
TOOL_STATE_MAP m_toolState
Index of registered tools current states, associated by tools&#39; objects.
Definition: tool_manager.h:494
bool TOOL_MANAGER::IsToolActive ( TOOL_ID  aId) const

Function IsToolActive() Returns true if a tool with given id is active (executing)

Definition at line 947 of file tool_manager.cpp.

References m_toolIdIndex.

Referenced by GetTool(), and TOOL_BASE::IsToolActive().

948 {
949  auto it = m_toolIdIndex.find( aId );
950  return !it->second->idle;
951 }
ID_STATE_MAP m_toolIdIndex
Index of the registered tools current states, associated by tools&#39; ID numbers.
Definition: tool_manager.h:500
TOOL_ID TOOL_MANAGER::MakeToolId ( const std::string &  aToolName)
static

Generates a unique ID from for a tool with given name.

Definition at line 838 of file tool_manager.cpp.

839 {
840  static int currentId;
841 
842  return currentId++;
843 }
void TOOL_MANAGER::PassEvent ( )
inline

Allows a tool to pass the already handled event to the next tool on the stack.

Definition at line 351 of file tool_manager.h.

References GetClipboard(), m_passEvent, and SaveClipboard().

Referenced by MODULE_EDITOR_TOOLS::EnumeratePads(), ZOOM_TOOL::Main(), PICKER_TOOL::Main(), EDIT_TOOL::MeasureTool(), and POINT_EDITOR::OnSelectionChange().

352  {
353  m_passEvent = true;
354  }
bool m_passEvent
Flag saying if the currently processed event should be passed to other tools.
Definition: tool_manager.h:523
void TOOL_MANAGER::PostEvent ( const TOOL_EVENT aEvent)
inline

Puts an event to the event queue to be processed at the end of event processing cycle.

Parameters
aEventis the event to be put into the queue.

Definition at line 238 of file tool_manager.h.

References m_eventQueue, and SetEnvironment().

Referenced by RunAction().

239  {
240  m_eventQueue.push_back( aEvent );
241  }
std::list< TOOL_EVENT > m_eventQueue
Queue that stores events to be processed at the end of the event processing cycle.
Definition: tool_manager.h:520
bool TOOL_MANAGER::ProcessEvent ( const TOOL_EVENT aEvent)

Propagates an event to tools that requested events of matching type(s).

Parameters
aEventis the event to be processed.
Returns
true if the event is a managed hotkey

Definition at line 770 of file tool_manager.cpp.

References GetCurrentToolState(), GetEditFrame(), EDA_DRAW_FRAME::GetGalCanvas(), KIGFX::VIEW::IsDirty(), m_view, processEvent(), EDA_DRAW_PANEL_GAL::Refresh(), and setActiveState().

Referenced by GERBVIEW_SELECTION_TOOL::clearSelection(), SELECTION_TOOL::clearSelection(), PCBNEW_CONTROL::CursorControl(), TOOL_DISPATCHER::DispatchWxCommand(), TOOL_DISPATCHER::DispatchWxEvent(), SELECTION_TOOL::expandSelectedConnection(), SELECTION_TOOL::findCallback(), GetTool(), TOOL_DISPATCHER::handleMouseButton(), CONTEXT_MENU::onMenuEvent(), PCBNEW_CONTROL::placeBoardItems(), SELECTION_TOOL::SanitizeSelection(), SELECTION_TOOL::selectCopper(), GERBVIEW_SELECTION_TOOL::SelectItem(), SELECTION_TOOL::SelectItem(), GERBVIEW_SELECTION_TOOL::SelectItems(), SELECTION_TOOL::SelectItems(), GERBVIEW_SELECTION_TOOL::selectMultiple(), SELECTION_TOOL::selectMultiple(), SELECTION_TOOL::selectNet(), SELECTION_TOOL::selectOnSheetFromEeschema(), SELECTION_TOOL::selectSameSheet(), GERBVIEW_SELECTION_TOOL::toggleSelection(), SELECTION_TOOL::toggleSelection(), DIALOG_SET_GRID::TransferDataFromWindow(), DIALOG_DESIGN_RULES::TransferDataFromWindow(), GERBVIEW_SELECTION_TOOL::UnselectItem(), SELECTION_TOOL::UnselectItem(), GERBVIEW_SELECTION_TOOL::UnselectItems(), and SELECTION_TOOL::UnselectItems().

771 {
772  bool hotkey_handled = processEvent( aEvent );
773 
774  if( TOOL_STATE* active = GetCurrentToolState() )
775  setActiveState( active );
776 
777  if( m_view->IsDirty() )
778  {
779  auto f = dynamic_cast<EDA_DRAW_FRAME*>( GetEditFrame() );
780 
781  if( f )
782  f->GetGalCanvas()->Refresh(); // fixme: ugly hack, provide a method in TOOL_DISPATCHER.
783 
784 #if defined( __WXMAC__ ) || defined( __WINDOWS__ )
785  wxTheApp->ProcessPendingEvents(); // required for updating brightening behind a popup menu
786 #endif
787  }
788 
789  return hotkey_handled;
790 }
bool processEvent(const TOOL_EVENT &aEvent)
Main function for event processing.
wxWindow * GetEditFrame() const
Definition: tool_manager.h:267
Class EDA_DRAW_FRAME is the base class for create windows for drawing purpose.
Definition: draw_frame.h:55
bool IsDirty() const
Function IsDirty() Returns true if any of the VIEW layers needs to be refreshened.
Definition: view.h:548
void setActiveState(TOOL_STATE *aState)
Saves the previous active state and sets a new one.
TOOL_STATE * GetCurrentToolState() const
Returns the TOOL_STATE object representing the state of the active tool.
Definition: tool_manager.h:296
KIGFX::VIEW * m_view
Definition: tool_manager.h:515
void Refresh(bool aEraseBackground=true, const wxRect *aRect=NULL) override
Update the board display after modifying it bu a python script (note: it is automatically called by a...
EDA_DRAW_PANEL_GAL * GetGalCanvas() const
Function GetGalCanvas returns a pointer to GAL-based canvas of given EDA draw frame.
Definition: draw_frame.h:895
bool TOOL_MANAGER::processEvent ( const TOOL_EVENT aEvent)
private

Main function for event processing.

Returns
true if a hotkey was handled

Definition at line 913 of file tool_manager.cpp.

References dispatchActivation(), dispatchContextMenu(), dispatchInternal(), dispatchStandardEvents(), and m_eventQueue.

Referenced by DeactivateTool(), invokeTool(), isRegistered(), ProcessEvent(), and RunAction().

914 {
915  // Early dispatch of events destined for the TOOL_MANAGER
916  if( !dispatchStandardEvents( aEvent ) )
917  return true;
918 
919  dispatchInternal( aEvent );
920  dispatchActivation( aEvent );
921  dispatchContextMenu( aEvent );
922 
923  // Dispatch queue
924  while( !m_eventQueue.empty() )
925  {
926  TOOL_EVENT event = m_eventQueue.front();
927  m_eventQueue.pop_front();
928  processEvent( event );
929  }
930 
931  return false;
932 }
bool processEvent(const TOOL_EVENT &aEvent)
Main function for event processing.
bool dispatchStandardEvents(const TOOL_EVENT &aEvent)
Function dispatchStandardEvents() Handles specific events, that are intended for TOOL_MANAGER rather ...
bool dispatchActivation(const TOOL_EVENT &aEvent)
Function dispatchActivation() Checks if it is a valid activation event and invokes a proper tool...
void dispatchContextMenu(const TOOL_EVENT &aEvent)
Function dispatchContextMenu() Handles context menu related events.
void dispatchInternal(const TOOL_EVENT &aEvent)
Function dispatchInternal Passes an event at first to the active tools, then to all others...
Class TOOL_EVENT.
Definition: tool_event.h:162
std::list< TOOL_EVENT > m_eventQueue
Queue that stores events to be processed at the end of the event processing cycle.
Definition: tool_manager.h:520
void TOOL_MANAGER::RegisterAction ( TOOL_ACTION aAction)

Function RegisterAction() Registers an action that can be used to control tools (eg.

invoke, trigger specific behaviours).

Parameters
aActionis the action to be registered.

Definition at line 263 of file tool_manager.cpp.

References m_actionMgr, and ACTION_MANAGER::RegisterAction().

264 {
265  m_actionMgr->RegisterAction( aAction );
266 }
ACTION_MANAGER * m_actionMgr
Instance of ACTION_MANAGER that handles TOOL_ACTIONs.
Definition: tool_manager.h:509
void RegisterAction(TOOL_ACTION *aAction)
Function RegisterAction() Adds a tool action to the manager and sets it up.
void TOOL_MANAGER::RegisterTool ( TOOL_BASE aTool)

Function RegisterTool() Adds a tool to the manager set and sets it up.

Called once for each tool during application initialization.

Parameters
aTooltool to be added. Ownership is transferred.

Definition at line 221 of file tool_manager.cpp.

References TOOL_BASE::attachManager(), TOOL_BASE::GetId(), TOOL_BASE::GetName(), m_toolIdIndex, m_toolNameIndex, m_toolState, and m_toolTypes.

Referenced by GERBVIEW_ACTIONS::RegisterAllTools(), PCB_ACTIONS::RegisterAllTools(), and FOOTPRINT_EDIT_FRAME::setupTools().

222 {
223  wxASSERT_MSG( m_toolNameIndex.find( aTool->GetName() ) == m_toolNameIndex.end(),
224  wxT( "Adding two tools with the same name may result in unexpected behaviour.") );
225  wxASSERT_MSG( m_toolIdIndex.find( aTool->GetId() ) == m_toolIdIndex.end(),
226  wxT( "Adding two tools with the same ID may result in unexpected behaviour.") );
227  wxASSERT_MSG( m_toolTypes.find( typeid( *aTool ).name() ) == m_toolTypes.end(),
228  wxT( "Adding two tools of the same type may result in unexpected behaviour.") );
229 
230  TOOL_STATE* st = new TOOL_STATE( aTool );
231 
232  m_toolState[aTool] = st;
233  m_toolNameIndex[aTool->GetName()] = st;
234  m_toolIdIndex[aTool->GetId()] = st;
235  m_toolTypes[typeid( *aTool ).name()] = st->theTool;
236 
237  aTool->attachManager( this );
238 }
ID_STATE_MAP m_toolIdIndex
Index of the registered tools current states, associated by tools&#39; ID numbers.
Definition: tool_manager.h:500
void attachManager(TOOL_MANAGER *aManager)
Function attachManager()
Definition: tool_base.cpp:59
NAME_STATE_MAP m_toolNameIndex
Index of the registered tools current states, associated by tools&#39; names.
Definition: tool_manager.h:497
TOOL_ID GetId() const
Function GetId() Returns the unique identifier of the tool.
Definition: tool_base.h:122
const std::string & GetName() const
Function GetName() Returns the name of the tool.
Definition: tool_base.h:133
TOOL_STATE_MAP m_toolState
Index of registered tools current states, associated by tools&#39; objects.
Definition: tool_manager.h:494
std::map< const char *, TOOL_BASE * > m_toolTypes
Index of the registered tools to easily lookup by their type.
Definition: tool_manager.h:503
void TOOL_MANAGER::ResetTools ( TOOL_BASE::RESET_REASON  aReason)

Function ResetTools() Resets all tools (i.e.

calls their Reset() method).

Definition at line 423 of file tool_manager.cpp.

References DeactivateTool(), TOOL_BASE::GetType(), INTERACTIVE, m_toolState, TOOL_BASE::Reset(), and setActiveState().

Referenced by GERBVIEW_FRAME::Clear_DrawLayers(), GERBVIEW_FRAME::Erase_Current_DrawLayer(), GetTool(), InitTools(), PCB_BASE_EDIT_FRAME::SetBoard(), FOOTPRINT_VIEWER_FRAME::updateView(), FOOTPRINT_EDIT_FRAME::updateView(), PCB_BASE_FRAME::UseGalCanvas(), and GERBVIEW_FRAME::UseGalCanvas().

424 {
425  DeactivateTool();
426 
427  for( auto& state : m_toolState )
428  {
429  TOOL_BASE* tool = state.first;
430  setActiveState( state.second );
431  tool->Reset( aReason );
432 
433  if( tool->GetType() == INTERACTIVE )
434  static_cast<TOOL_INTERACTIVE*>( tool )->resetTransitions();
435  }
436 }
void DeactivateTool()
Function DeactivateTool() Deactivates the currently active tool.
virtual void Reset(RESET_REASON aReason)=0
Function Reset() Brings the tool to a known, initial state.
Tool that interacts with the user
Definition: tool_base.h:50
void setActiveState(TOOL_STATE *aState)
Saves the previous active state and sets a new one.
TOOL_TYPE GetType() const
Function GetType() Returns the type of the tool.
Definition: tool_base.h:111
Class TOOL_BASE.
Definition: tool_base.h:68
TOOL_STATE_MAP m_toolState
Index of registered tools current states, associated by tools&#39; objects.
Definition: tool_manager.h:494
template<typename T >
bool TOOL_MANAGER::RunAction ( const std::string &  aActionName,
bool  aNow = false,
aParam = NULL 
)
inline

Function RunAction() Runs the specified action.

The common format for action names is "application.ToolName.Action".

Parameters
aActionNameis the name of action to be invoked.
aNowdecides if the action has to be run immediately or after the current coroutine is preemptied.
aParamis an optional parameter that might be used by the invoked action. Its meaning depends on the action.
Returns
False if the action was not found.

Definition at line 125 of file tool_manager.h.

Referenced by DIALOG_GLOBAL_DELETION::AcceptPcbDelete(), PAD_TOOL::applyPadSettings(), ROUTER_TOOL::CanInlineDrag(), MODULE_EDITOR_TOOLS::CreatePadFromShapes(), PCB_EDITOR_CONTROL::CrossProbeSchToPcb(), ROUTER_TOOL::CustomTrackWidthDialog(), deleteItem(), PCB_TOOL::doInteractiveItemPlacement(), DRAWING_TOOL::drawArc(), DRAWING_TOOL::DrawDimension(), DRAWING_TOOL::drawSegment(), DRAWING_TOOL::drawZone(), EDIT_TOOL::Duplicate(), EDIT_TOOL::editFootprintInFpEditor(), MODULE_EDITOR_TOOLS::EnumeratePads(), EDIT_TOOL::ExchangeFootprints(), PCB_EDIT_FRAME::ExecuteRemoteCommand(), MODULE_EDITOR_TOOLS::ExplodePadToShapes(), EDIT_TOOL::Flip(), DRAWING_TOOL::getSourceZoneForAction(), ROUTER_TOOL::InlineDrag(), EDIT_TOOL::invokeInlineRouter(), EDIT_TOOL::Main(), SELECTION_TOOL::Main(), LENGTH_TUNER_TOOL::mainLoop(), ROUTER_TOOL::mainLoop(), EDIT_TOOL::Mirror(), PCB_EDITOR_CONTROL::modifyLockSelected(), EDIT_TOOL::MoveExact(), EDA_DRAW_FRAME::OnSelectGrid(), DIALOG_POSITION_RELATIVE::OnSelectItemClick(), EDA_DRAW_FRAME::OnSelectZoom(), DIALOG_UPDATE_PCB::PerformUpdate(), PCBNEW_CONTROL::placeBoardItems(), DRAWING_TOOL::PlaceDXF(), PCB_EDITOR_CONTROL::PlaceModule(), PCB_EDITOR_CONTROL::PlaceTarget(), DRAWING_TOOL::PlaceText(), FOOTPRINT_EDIT_FRAME::Process_Special_Functions(), EDIT_TOOL::Properties(), PAD_TOOL::pushPadSettings(), POSITION_RELATIVE_TOOL::RelativeItemSelectionMove(), EDIT_TOOL::Remove(), POINT_EDITOR::removeCorner(), GERBVIEW_SELECTION_TOOL::RequestSelection(), SELECTION_TOOL::RequestSelection(), EDIT_TOOL::Rotate(), RunAction(), ACTION_MANAGER::RunHotKey(), selectPRitem(), GERBVIEW_FRAME::SetActiveLayer(), DRC::ShowDRCDialog(), showLocalRatsnest(), PCB_EDITOR_CONTROL::TrackWidthDec(), PCB_EDITOR_CONTROL::TrackWidthInc(), DIALOG_SET_GRID::TransferDataFromWindow(), FOOTPRINT_VIEWER_FRAME::updateView(), FOOTPRINT_EDIT_FRAME::updateView(), PCB_EDITOR_CONTROL::ViaSizeDec(), PCB_EDITOR_CONTROL::ViaSizeInc(), PCB_EDITOR_CONTROL::ZoneMerge(), and EDA_DRAW_FRAME::Zoom_Automatique().

126  {
127  return RunAction( aActionName, aNow, reinterpret_cast<void*>( aParam ) );
128  }
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Function RunAction() Runs the specified action.
Definition: tool_manager.h:125
bool TOOL_MANAGER::RunAction ( const std::string &  aActionName,
bool  aNow,
void *  aParam 
)

Definition at line 275 of file tool_manager.cpp.

References ACTION_MANAGER::FindAction(), Format(), m_actionMgr, and RunAction().

276 {
277  TOOL_ACTION* action = m_actionMgr->FindAction( aActionName );
278 
279  if( !action )
280  {
281  wxASSERT_MSG( false, wxString::Format( wxT( "Could not find action %s." ), aActionName ) );
282  return false;
283  }
284 
285  RunAction( *action, aNow, aParam );
286 
287  return false;
288 }
ACTION_MANAGER * m_actionMgr
Instance of ACTION_MANAGER that handles TOOL_ACTIONs.
Definition: tool_manager.h:509
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Function RunAction() Runs the specified action.
Definition: tool_manager.h:125
TOOL_ACTION * FindAction(const std::string &aActionName) const
Function FindAction() Finds an action with a given name (if there is one available).
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
Class TOOL_ACTION.
Definition: tool_action.h:46
bool TOOL_MANAGER::RunAction ( const std::string &  aActionName,
bool  aNow = false 
)
inline

Definition at line 132 of file tool_manager.h.

References RunAction().

133  {
134  return RunAction( aActionName, aNow, (void*) NULL );
135  }
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Function RunAction() Runs the specified action.
Definition: tool_manager.h:125
template<typename T >
void TOOL_MANAGER::RunAction ( const TOOL_ACTION aAction,
bool  aNow = false,
aParam = NULL 
)
inline

Function RunAction() Runs the specified action.

Parameters
aActionis the action to be invoked.
aNowdecides if the action has to be run immediately or after the current coroutine is preemptied.
aParamis an optional parameter that might be used by the invoked action. Its meaning depends on the action.

Definition at line 148 of file tool_manager.h.

References RunAction().

149  {
150  RunAction( aAction, aNow, reinterpret_cast<void*>( aParam ) );
151  }
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Function RunAction() Runs the specified action.
Definition: tool_manager.h:125
void TOOL_MANAGER::RunAction ( const TOOL_ACTION aAction,
bool  aNow,
void *  aParam 
)

Definition at line 291 of file tool_manager.cpp.

References m_activeState, TOOL_ACTION::MakeEvent(), PostEvent(), processEvent(), setActiveState(), and TOOL_EVENT::SetParameter().

292 {
293  TOOL_EVENT event = aAction.MakeEvent();
294 
295  // Allow to override the action parameter
296  if( aParam )
297  event.SetParameter( aParam );
298 
299  if( aNow )
300  {
301  TOOL_STATE* current = m_activeState;
302  processEvent( event );
303  setActiveState( current );
304  }
305  else
306  {
307  PostEvent( event );
308  }
309 }
bool processEvent(const TOOL_EVENT &aEvent)
Main function for event processing.
void SetParameter(T aParam)
Function SetParameter() Sets a non-standard parameter assigned to the event.
Definition: tool_event.h:390
void setActiveState(TOOL_STATE *aState)
Saves the previous active state and sets a new one.
Class TOOL_EVENT.
Definition: tool_event.h:162
TOOL_EVENT MakeEvent() const
Function HasHotKey() Checks if the action has a hot key assigned.
Definition: tool_action.h:104
TOOL_STATE * m_activeState
Pointer to the state object corresponding to the currently executed tool.
Definition: tool_manager.h:535
void PostEvent(const TOOL_EVENT &aEvent)
Puts an event to the event queue to be processed at the end of event processing cycle.
Definition: tool_manager.h:238
void TOOL_MANAGER::RunAction ( const TOOL_ACTION aAction,
bool  aNow = false 
)
inline

Definition at line 155 of file tool_manager.h.

References FindTool(), GetHotKey(), RunAction(), and UpdateHotKeys().

156  {
157  RunAction( aAction, aNow, (void*) NULL );
158  }
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Function RunAction() Runs the specified action.
Definition: tool_manager.h:125
void TOOL_MANAGER::RunMainStack ( TOOL_BASE aTool,
std::function< void()>  aFunc 
)

Definition at line 500 of file tool_manager.cpp.

References TOOL_MANAGER::TOOL_STATE::cofunc, m_toolState, COROUTINE< ReturnType, ArgType >::RunMainStack(), and setActiveState().

Referenced by TOOL_INTERACTIVE::RunMainStack().

501 {
502  TOOL_STATE* st = m_toolState[aTool];
503  setActiveState( st );
504  st->cofunc->RunMainStack( std::move( aFunc ) );
505 }
void setActiveState(TOOL_STATE *aState)
Saves the previous active state and sets a new one.
TOOL_STATE_MAP m_toolState
Index of registered tools current states, associated by tools&#39; objects.
Definition: tool_manager.h:494
bool TOOL_MANAGER::runTool ( TOOL_ID  aToolId)
private

Function runTool() Makes a tool active, so it can receive events and react to them.

Activated tool is pushed on the active tools stack, so the last activated tool receives events first.

Parameters
aToolIdis the ID number of tool to be run.

Definition at line 338 of file tool_manager.cpp.

References FindTool(), TOOL_BASE::GetType(), and INTERACTIVE.

Referenced by dispatchActivation(), and runTool().

339 {
340  TOOL_BASE* tool = FindTool( aToolId );
341 
342  if( tool && tool->GetType() == INTERACTIVE )
343  return runTool( tool );
344 
345  return false; // there is no tool with the given id
346 }
TOOL_BASE * FindTool(int aId) const
Function FindTool() Searches for a tool with given ID.
bool runTool(TOOL_ID aToolId)
Function runTool() Makes a tool active, so it can receive events and react to them.
Tool that interacts with the user
Definition: tool_base.h:50
TOOL_TYPE GetType() const
Function GetType() Returns the type of the tool.
Definition: tool_base.h:111
Class TOOL_BASE.
Definition: tool_base.h:68
bool TOOL_MANAGER::runTool ( const std::string &  aName)
private

Function runTool() Makes a tool active, so it can receive events and react to them.

Activated tool is pushed on the active tools stack, so the last activated tool receives events first.

Parameters
aNameis the name of tool to be run.

Definition at line 349 of file tool_manager.cpp.

References FindTool(), TOOL_BASE::GetType(), INTERACTIVE, and runTool().

350 {
351  TOOL_BASE* tool = FindTool( aToolName );
352 
353  if( tool && tool->GetType() == INTERACTIVE )
354  return runTool( tool );
355 
356  return false; // there is no tool with the given name
357 }
TOOL_BASE * FindTool(int aId) const
Function FindTool() Searches for a tool with given ID.
bool runTool(TOOL_ID aToolId)
Function runTool() Makes a tool active, so it can receive events and react to them.
Tool that interacts with the user
Definition: tool_base.h:50
TOOL_TYPE GetType() const
Function GetType() Returns the type of the tool.
Definition: tool_base.h:111
Class TOOL_BASE.
Definition: tool_base.h:68
bool TOOL_MANAGER::runTool ( TOOL_BASE aTool)
private

Function runTool() Makes a tool active, so it can receive events and react to them.

Activated tool is pushed on the active tools stack, so the last activated tool receives events first.

Parameters
aToolis the tool to be run.

Definition at line 360 of file tool_manager.cpp.

References TOOL_BASE::GetId(), TOOL_BASE::GetType(), INTERACTIVE, isActive(), isRegistered(), m_activeTools, m_toolIdIndex, TOOL_BASE::Reset(), TOOL_BASE::RUN, and setActiveState().

361 {
362  wxASSERT( aTool != NULL );
363 
364  if( !isRegistered( aTool ) )
365  {
366  wxASSERT_MSG( false, wxT( "You cannot run unregistered tools" ) );
367  return false;
368  }
369 
370  TOOL_ID id = aTool->GetId();
371 
372  if( aTool->GetType() == INTERACTIVE )
373  static_cast<TOOL_INTERACTIVE*>( aTool )->resetTransitions();
374 
375  // If the tool is already active, bring it to the top of the active tools stack
376  if( isActive( aTool ) )
377  {
378  m_activeTools.erase( std::find( m_activeTools.begin(), m_activeTools.end(), id ) );
379  m_activeTools.push_front( id );
380  return false;
381  }
382 
384  aTool->Reset( TOOL_INTERACTIVE::RUN );
385 
386  // Add the tool on the front of the processing queue (it gets events first)
387  m_activeTools.push_front( id );
388 
389  return true;
390 }
ID_STATE_MAP m_toolIdIndex
Index of the registered tools current states, associated by tools&#39; ID numbers.
Definition: tool_manager.h:500
Tool is invoked after being inactive.
Definition: tool_base.h:82
virtual void Reset(RESET_REASON aReason)=0
Function Reset() Brings the tool to a known, initial state.
int TOOL_ID
Unique identifier for tools.
Definition: tool_base.h:57
Tool that interacts with the user
Definition: tool_base.h:50
void setActiveState(TOOL_STATE *aState)
Saves the previous active state and sets a new one.
TOOL_ID GetId() const
Function GetId() Returns the unique identifier of the tool.
Definition: tool_base.h:122
bool isActive(TOOL_BASE *aTool)
Function isActive() Returns information about a tool activation status.
TOOL_TYPE GetType() const
Function GetType() Returns the type of the tool.
Definition: tool_base.h:111
bool isRegistered(TOOL_BASE *aTool) const
Function isRegistered() Returns information about a tool registration status.
Definition: tool_manager.h:455
ID_LIST m_activeTools
Stack of the active tools.
Definition: tool_manager.h:506
bool TOOL_MANAGER::SaveClipboard ( const std::string &  aText)

Stores an information to the system clipboard.

Parameters
aTextis the information to be stored.
Returns
False if error occurred.

Definition at line 803 of file tool_manager.cpp.

Referenced by PassEvent().

804 {
805  if( wxTheClipboard->Open() )
806  {
807  wxTheClipboard->SetData( new wxTextDataObject( wxString( aText.c_str(), wxConvUTF8 ) ) );
808  wxTheClipboard->Close();
809 
810  return true;
811  }
812 
813  return false;
814 }
void TOOL_MANAGER::saveViewControls ( TOOL_STATE aState)
private

Function saveViewControls() Saves the VIEW_CONTROLS settings to the tool state object.

If VIEW_CONTROLS settings are affected by TOOL_MANAGER, the original settings are saved.

Definition at line 867 of file tool_manager.cpp.

References TOOL_BASE::GetId(), KIGFX::VIEW_CONTROLS::GetSettings(), m_cursorSettings, KIGFX::VC_SETTINGS::m_forceCursorPosition, KIGFX::VC_SETTINGS::m_forcedPosition, m_menuActive, m_menuCursor, m_viewControls, NULLOPT, TOOL_MANAGER::TOOL_STATE::theTool, and TOOL_MANAGER::TOOL_STATE::vcSettings.

Referenced by isRegistered(), and setActiveState().

868 {
869  aState->vcSettings = m_viewControls->GetSettings();
870 
871  if( m_menuActive )
872  {
873  // Context menu is active, so the cursor settings are overridden (see dispatchContextMenu())
874  auto it = m_cursorSettings.find( aState->theTool->GetId() );
875 
876  if( it != m_cursorSettings.end() )
877  {
879 
880  // Tool has overridden the cursor position, so store the new settings
882  {
883  if( !curr.m_forceCursorPosition )
884  it->second = NULLOPT;
885  else
886  it->second = curr.m_forcedPosition;
887  }
888  else
889  {
890  OPT<VECTOR2D> cursor = it->second;
891 
892  if( cursor )
893  {
894  aState->vcSettings.m_forceCursorPosition = true;
895  aState->vcSettings.m_forcedPosition = *cursor;
896  }
897  else
898  {
899  aState->vcSettings.m_forceCursorPosition = false;
900  }
901  }
902  }
903  }
904 }
bool m_menuActive
Flag indicating whether a context menu is currently displayed.
Definition: tool_manager.h:529
VECTOR2D m_menuCursor
Right click context menu position.
Definition: tool_manager.h:526
std::map< TOOL_ID, OPT< VECTOR2D > > m_cursorSettings
Original cursor position, if overridden by the context menu handler.
Definition: tool_manager.h:512
VECTOR2D m_forcedPosition
Forced cursor position (world coordinates)
Definition: view_controls.h:58
const auto NULLOPT
Definition: optional.h:9
bool m_forceCursorPosition
Is the forced cursor position enabled
Definition: view_controls.h:61
Structure to keep VIEW_CONTROLS settings for easy store/restore operations
Definition: view_controls.h:44
KIGFX::VIEW_CONTROLS * m_viewControls
Definition: tool_manager.h:516
const VC_SETTINGS & GetSettings() const
Returns the current VIEW_CONTROLS settings
boost::optional< T > OPT
Definition: optional.h:7
void TOOL_MANAGER::ScheduleContextMenu ( TOOL_BASE aTool,
CONTEXT_MENU aMenu,
CONTEXT_MENU_TRIGGER  aTrigger 
)

Sets behaviour of the tool's context popup menu.

Parameters
aTool- the parent tool
aMenu- the menu structure, defined by the tool
aTrigger- when the menu is activated: CMENU_NOW: opens the menu right now CMENU_BUTTON: opens the menu when RMB is pressed CMENU_OFF: menu is disabled. May be called from a coroutine context.

Definition at line 793 of file tool_manager.cpp.

References TOOL_MANAGER::TOOL_STATE::contextMenu, TOOL_MANAGER::TOOL_STATE::contextMenuTrigger, and m_toolState.

Referenced by TOOL_INTERACTIVE::SetContextMenu().

795 {
796  TOOL_STATE* st = m_toolState[aTool];
797 
798  st->contextMenu = aMenu;
799  st->contextMenuTrigger = aTrigger;
800 }
TOOL_STATE_MAP m_toolState
Index of registered tools current states, associated by tools&#39; objects.
Definition: tool_manager.h:494
void TOOL_MANAGER::ScheduleNextState ( TOOL_BASE aTool,
TOOL_STATE_FUNC aHandler,
const TOOL_EVENT_LIST aConditions 
)

Defines a state transition - the events that cause a given handler method in the tool to be called.

Called by TOOL_INTERACTIVE::Go(). May be called from a coroutine context.

Definition at line 485 of file tool_manager.cpp.

References m_toolState, and TOOL_MANAGER::TOOL_STATE::transitions.

Referenced by TOOL_INTERACTIVE::goInternal().

487 {
488  TOOL_STATE* st = m_toolState[aTool];
489 
490  st->transitions.push_back( TRANSITION( aConditions, aHandler ) );
491 }
TOOL_STATE_MAP m_toolState
Index of registered tools current states, associated by tools&#39; objects.
Definition: tool_manager.h:494
std::pair< TOOL_EVENT_LIST, TOOL_STATE_FUNC > TRANSITION
Definition: tool_manager.h:370
OPT< TOOL_EVENT > TOOL_MANAGER::ScheduleWait ( TOOL_BASE aTool,
const TOOL_EVENT_LIST aConditions 
)

Pauses execution of a given tool until one or more events matching aConditions arrives.

The pause/resume operation is done through COROUTINE object. Called only from coroutines.

Definition at line 508 of file tool_manager.cpp.

References TOOL_MANAGER::TOOL_STATE::cofunc, COROUTINE< ReturnType, ArgType >::KiYield(), m_toolState, TOOL_MANAGER::TOOL_STATE::pendingWait, TOOL_MANAGER::TOOL_STATE::waitEvents, and TOOL_MANAGER::TOOL_STATE::wakeupEvent.

Referenced by TOOL_INTERACTIVE::Wait().

509 {
510  TOOL_STATE* st = m_toolState[aTool];
511 
512  assert( !st->pendingWait ); // everything collapses on two KiYield() in a row
513 
514  // indicate to the manager that we are going to sleep and we shall be
515  // woken up when an event matching aConditions arrive
516  st->pendingWait = true;
517  st->waitEvents = aConditions;
518 
519  // switch context back to event dispatcher loop
520  st->cofunc->KiYield();
521 
522  return st->wakeupEvent;
523 }
TOOL_STATE_MAP m_toolState
Index of registered tools current states, associated by tools&#39; objects.
Definition: tool_manager.h:494
void TOOL_MANAGER::setActiveState ( TOOL_STATE aState)
private

Saves the previous active state and sets a new one.

Parameters
aStateis the new active state. Might be null to indicate there is no new active state.

Definition at line 935 of file tool_manager.cpp.

References applyViewControls(), m_activeState, and saveViewControls().

Referenced by dispatchInternal(), finishTool(), InitTools(), invokeTool(), isRegistered(), ProcessEvent(), ResetTools(), RunAction(), RunMainStack(), and runTool().

936 {
937  if( m_activeState )
939 
940  m_activeState = aState;
941 
942  if( m_activeState )
943  applyViewControls( aState );
944 }
void applyViewControls(TOOL_STATE *aState)
Function applyViewControls() Applies VIEW_CONTROLS settings stored in a TOOL_STATE object...
TOOL_STATE * m_activeState
Pointer to the state object corresponding to the currently executed tool.
Definition: tool_manager.h:535
void saveViewControls(TOOL_STATE *aState)
Function saveViewControls() Saves the VIEW_CONTROLS settings to the tool state object.
void TOOL_MANAGER::SetEnvironment ( EDA_ITEM aModel,
KIGFX::VIEW aView,
KIGFX::VIEW_CONTROLS aViewControls,
wxWindow *  aFrame 
)

Sets the work environment (model, view, view controls and the parent window).

These are made available to the tool. Called by the parent frame (PCB_EDIT_FRAME) when the board is set up.

Definition at line 846 of file tool_manager.cpp.

References m_actionMgr, m_editFrame, m_model, m_view, m_viewControls, and ACTION_MANAGER::UpdateHotKeys().

Referenced by EVT_TOOL(), PostEvent(), PCB_BASE_EDIT_FRAME::SetBoard(), PCB_EDIT_FRAME::setupTools(), FOOTPRINT_EDIT_FRAME::setupTools(), GERBVIEW_FRAME::setupTools(), PCB_BASE_FRAME::UseGalCanvas(), and GERBVIEW_FRAME::UseGalCanvas().

848 {
849  m_model = aModel;
850  m_view = aView;
851  m_viewControls = aViewControls;
852  m_editFrame = aFrame;
854 }
ACTION_MANAGER * m_actionMgr
Instance of ACTION_MANAGER that handles TOOL_ACTIONs.
Definition: tool_manager.h:509
void UpdateHotKeys()
Function UpdateHotKeys() Updates TOOL_ACTIONs hot key assignment according to the current frame&#39;s Hot...
EDA_ITEM * m_model
Definition: tool_manager.h:514
wxWindow * m_editFrame
Definition: tool_manager.h:517
KIGFX::VIEW_CONTROLS * m_viewControls
Definition: tool_manager.h:516
KIGFX::VIEW * m_view
Definition: tool_manager.h:515
void TOOL_MANAGER::UnregisterAction ( TOOL_ACTION aAction)

Function UnregisterAction() Unregisters an action, so it is no longer active.

Parameters
aActionis the action to be unregistered.

Definition at line 269 of file tool_manager.cpp.

References m_actionMgr, and ACTION_MANAGER::UnregisterAction().

270 {
271  m_actionMgr->UnregisterAction( aAction );
272 }
ACTION_MANAGER * m_actionMgr
Instance of ACTION_MANAGER that handles TOOL_ACTIONs.
Definition: tool_manager.h:509
void UnregisterAction(TOOL_ACTION *aAction)
Function UnregisterAction() Removes a tool action from the manager and makes it unavailable for furth...
void TOOL_MANAGER::UpdateHotKeys ( )

>

Function UpdateHotKeys() Updates TOOL_ACTIONs hot key assignment according to the current frame's Hot Key Editor settings.

Definition at line 318 of file tool_manager.cpp.

References m_actionMgr, and ACTION_MANAGER::UpdateHotKeys().

Referenced by RunAction(), and EDA_DRAW_FRAME::WriteHotkeyConfig().

319 {
321 }
ACTION_MANAGER * m_actionMgr
Instance of ACTION_MANAGER that handles TOOL_ACTIONs.
Definition: tool_manager.h:509
void UpdateHotKeys()
Function UpdateHotKeys() Updates TOOL_ACTIONs hot key assignment according to the current frame&#39;s Hot...

Member Data Documentation

ACTION_MANAGER* TOOL_MANAGER::m_actionMgr
private
TOOL_STATE* TOOL_MANAGER::m_activeState
private

Pointer to the state object corresponding to the currently executed tool.

Definition at line 535 of file tool_manager.h.

Referenced by finishTool(), RunAction(), and setActiveState().

ID_LIST TOOL_MANAGER::m_activeTools
private

Stack of the active tools.

Definition at line 506 of file tool_manager.h.

Referenced by dispatchContextMenu(), dispatchInternal(), finishTool(), GetCurrentToolId(), GetPriority(), isActive(), and runTool().

std::map<TOOL_ID, OPT<VECTOR2D> > TOOL_MANAGER::m_cursorSettings
private

Original cursor position, if overridden by the context menu handler.

Definition at line 512 of file tool_manager.h.

Referenced by dispatchContextMenu(), and saveViewControls().

wxWindow* TOOL_MANAGER::m_editFrame
private

Definition at line 517 of file tool_manager.h.

Referenced by dispatchContextMenu(), GetEditFrame(), and SetEnvironment().

std::list<TOOL_EVENT> TOOL_MANAGER::m_eventQueue
private

Queue that stores events to be processed at the end of the event processing cycle.

Definition at line 520 of file tool_manager.h.

Referenced by PostEvent(), and processEvent().

bool TOOL_MANAGER::m_menuActive
private

Flag indicating whether a context menu is currently displayed.

Definition at line 529 of file tool_manager.h.

Referenced by dispatchContextMenu(), and saveViewControls().

VECTOR2D TOOL_MANAGER::m_menuCursor
private

Right click context menu position.

Definition at line 526 of file tool_manager.h.

Referenced by dispatchContextMenu(), and saveViewControls().

TOOL_ID TOOL_MANAGER::m_menuOwner
private

Tool currently displaying a popup menu. It is negative when there is no menu displayed.

Definition at line 532 of file tool_manager.h.

Referenced by dispatchContextMenu(), and dispatchInternal().

EDA_ITEM* TOOL_MANAGER::m_model
private

Definition at line 514 of file tool_manager.h.

Referenced by GetModel(), and SetEnvironment().

bool TOOL_MANAGER::m_passEvent
private

Flag saying if the currently processed event should be passed to other tools.

Definition at line 523 of file tool_manager.h.

Referenced by dispatchInternal(), and PassEvent().

ID_STATE_MAP TOOL_MANAGER::m_toolIdIndex
private

Index of the registered tools current states, associated by tools' ID numbers.

Definition at line 500 of file tool_manager.h.

Referenced by dispatchContextMenu(), dispatchInternal(), FindTool(), GetCurrentToolState(), InitTools(), IsToolActive(), RegisterTool(), and runTool().

NAME_STATE_MAP TOOL_MANAGER::m_toolNameIndex
private

Index of the registered tools current states, associated by tools' names.

Definition at line 497 of file tool_manager.h.

Referenced by dispatchActivation(), FindTool(), InitTools(), and RegisterTool().

TOOL_STATE_MAP TOOL_MANAGER::m_toolState
private

Index of registered tools current states, associated by tools' objects.

Definition at line 494 of file tool_manager.h.

Referenced by ClearTransitions(), dispatchInternal(), InitTools(), isRegistered(), RegisterTool(), ResetTools(), RunMainStack(), ScheduleContextMenu(), ScheduleNextState(), ScheduleWait(), and ~TOOL_MANAGER().

std::map<const char*, TOOL_BASE*> TOOL_MANAGER::m_toolTypes
private

Index of the registered tools to easily lookup by their type.

Definition at line 503 of file tool_manager.h.

Referenced by GetTool(), InitTools(), and RegisterTool().

KIGFX::VIEW* TOOL_MANAGER::m_view
private

Definition at line 515 of file tool_manager.h.

Referenced by GetView(), ProcessEvent(), and SetEnvironment().

KIGFX::VIEW_CONTROLS* TOOL_MANAGER::m_viewControls
private

The documentation for this class was generated from the following files: