KiCad PCB EDA Suite
tool_interactive.h
Go to the documentation of this file.
1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2013 CERN
5  * Copyright (C) 2016-2020 KiCad Developers, see AUTHORS.txt for contributors.
6  *
7  * @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License
11  * as published by the Free Software Foundation; either version 2
12  * of the License, or (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, you may find one here:
21  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
22  * or you may search the http://www.gnu.org website for the version 2 license,
23  * or you may write to the Free Software Foundation, Inc.,
24  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
25  */
26 
27 #ifndef __TOOL_INTERACTIVE_H
28 #define __TOOL_INTERACTIVE_H
29 
30 #include <string>
31 #include <tool/tool_menu.h>
32 #include <tool/tool_event.h> // Needed for CONTEXT_MENU_TRIGGER
33 #include <tool/tool_base.h>
34 
35 class ACTION_MENU;
36 
37 
39 {
40  REENTRANCY_GUARD( bool* aFlag ) :
41  m_flag( aFlag )
42  {
43  *m_flag = true;
44  }
45 
47  {
48  *m_flag = false;
49  }
50 
51 private:
52  bool* m_flag;
53 };
54 
55 
57 {
58 public:
62  TOOL_INTERACTIVE( TOOL_ID aId, const std::string& aName );
63 
67  TOOL_INTERACTIVE( const std::string& aName );
68  virtual ~TOOL_INTERACTIVE();
69 
75  void Activate();
76 
77  TOOL_MENU& GetToolMenu() { return m_menu; }
78 
86 
92  void RunMainStack( std::function<void()> aFunc );
93 
99  template <class T>
100  void Go( int (T::* aStateFunc)( const TOOL_EVENT& ),
101  const TOOL_EVENT_LIST& aConditions = TOOL_EVENT( TC_ANY, TA_ANY ) );
102 
108  TOOL_EVENT* Wait( const TOOL_EVENT_LIST& aEventList = TOOL_EVENT( TC_ANY, TA_ANY ) );
109 
113  /*template <class Parameters, class ReturnValue>
114  bool InvokeTool( const std::string& aToolName, const Parameters& parameters,
115  ReturnValue& returnValue );
116 
117  template <class Parameters, class ReturnValue>
118  bool InvokeWindow( const std::string& aWindowName, const Parameters& parameters,
119  ReturnValue& returnValue );
120 
121  template <class T>
122  void Yield( const T& returnValue );*/
123 
124 protected:
126 
127 private:
133  virtual void setTransitions() = 0;
134 
138  void resetTransitions();
139 
140  void goInternal( TOOL_STATE_FUNC& aState, const TOOL_EVENT_LIST& aConditions );
141 
142  friend class TOOL_MANAGER;
143 };
144 
145 // hide TOOL_MANAGER implementation
146 template <class T>
147 void TOOL_INTERACTIVE::Go( int (T::* aStateFunc)( const TOOL_EVENT& ),
148  const TOOL_EVENT_LIST& aConditions )
149 {
150  TOOL_STATE_FUNC sptr = std::bind( aStateFunc, static_cast<T*>( this ), std::placeholders::_1 );
151 
152  goInternal( sptr, aConditions );
153 }
154 
155 #endif
TOOL_MENU m_menu
The functions below are not yet implemented - their interface may change.
TOOL_EVENT * Wait(const TOOL_EVENT_LIST &aEventList=TOOL_EVENT(TC_ANY, TA_ANY))
Suspend execution of the tool until an event specified in aEventList arrives.
Defines the structure of a menu based on ACTIONs.
Definition: action_menu.h:48
void RunMainStack(std::function< void()> aFunc)
Call a function using the main stack.
Manage a CONDITIONAL_MENU and some number of CONTEXT_MENUs as sub-menus.
Definition: tool_menu.h:42
TOOL_INTERACTIVE(TOOL_ID aId, const std::string &aName)
Create a tool with given id & name.
TOOL_MENU & GetToolMenu()
void SetContextMenu(ACTION_MENU *aMenu, CONTEXT_MENU_TRIGGER aTrigger=CMENU_BUTTON)
Assign a context menu and tells when it should be activated.
void Go(int(T::*aStateFunc)(const TOOL_EVENT &), const TOOL_EVENT_LIST &aConditions=TOOL_EVENT(TC_ANY, TA_ANY))
Define which state (aStateFunc) to go when a certain event arrives (aConditions).
REENTRANCY_GUARD(bool *aFlag)
Master controller class:
Definition: tool_manager.h:54
int TOOL_ID
Unique identifier for tools.
Definition: tool_base.h:56
void resetTransitions()
Clear the current transition map and restores the default one created by setTransitions().
A list of TOOL_EVENTs, with overloaded || operators allowing for concatenating TOOL_EVENTs with littl...
Definition: tool_event.h:554
CONTEXT_MENU_TRIGGER
Defines when a context menu is opened.
Definition: tool_event.h:142
Generic, UI-independent tool event.
Definition: tool_event.h:152
virtual ~TOOL_INTERACTIVE()
std::function< int(const TOOL_EVENT &)> TOOL_STATE_FUNC
Definition: tool_base.h:58
virtual void setTransitions()=0
This method is meant to be overridden in order to specify handlers for events.
Base abstract interface for all kinds of tools.
Definition: tool_base.h:65
void goInternal(TOOL_STATE_FUNC &aState, const TOOL_EVENT_LIST &aConditions)
void Activate()
Run the tool.