KiCad PCB EDA Suite
picker_tool.cpp
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) 2019 CERN
5 * Copyright (C) 2019 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25#include <tool/actions.h>
26#include <tool/picker_tool.h>
27#include <view/view_controls.h>
28#include <eda_draw_frame.h>
29
30
32{
34 m_snap = true;
35
36 m_picked = std::nullopt;
37 m_clickHandler = std::nullopt;
38 m_motionHandler = std::nullopt;
39 m_cancelHandler = std::nullopt;
40 m_finalizeHandler = std::nullopt;
41}
42
43
44PICKER_TOOL::PICKER_TOOL( const std::string& aName ) :
45 TOOL_INTERACTIVE( aName ),
47{
48}
49
50
52 TOOL_INTERACTIVE( "common.InteractivePicker" ),
54{
55}
56
57
59{
60 m_frame = getEditFrame<EDA_DRAW_FRAME>();
61
62 auto& ctxMenu = m_menu.GetMenu();
63
64 // cancel current tool goes in main context menu at the top if present
66 ctxMenu.AddSeparator( 1 );
67
68 // Finally, add the standard zoom/grid items
70
71 return true;
72}
73
74
75int PICKER_TOOL::Main( const TOOL_EVENT& aEvent )
76{
78 int finalize_state = WAIT_CANCEL;
79
80 m_frame->PushTool( aEvent );
81 Activate();
82
84
85 auto setCursor =
86 [&]()
87 {
89 };
90
91 // Set initial cursor
92 setCursor();
93
94 while( TOOL_EVENT* evt = Wait() )
95 {
96 setCursor();
97 VECTOR2D cursorPos = controls->GetCursorPosition( m_snap && m_frame->IsGridVisible() );
98
99 if( evt->IsCancelInteractive() || evt->IsActivate() )
100 {
101 if( m_cancelHandler )
102 {
103 try
104 {
105 (*m_cancelHandler)();
106 }
107 catch( std::exception& )
108 {
109 }
110 }
111
112 // Activating a new tool may have alternate finalization from canceling the current
113 // tool
114 if( evt->IsActivate() )
115 {
116 finalize_state = END_ACTIVATE;
117 }
118 else
119 {
120 evt->SetPassEvent( false );
121 finalize_state = EVT_CANCEL;
122 }
123
124 break;
125 }
126
127 else if( evt->IsClick( BUT_LEFT ) )
128 {
129 bool getNext = false;
130
131 m_picked = cursorPos;
132
133 if( m_clickHandler )
134 {
135 try
136 {
137 getNext = (*m_clickHandler)( *m_picked );
138 }
139 catch( std::exception& )
140 {
141 finalize_state = EXCEPTION_CANCEL;
142 break;
143 }
144 }
145
146 if( !getNext )
147 {
148 finalize_state = CLICK_CANCEL;
149 break;
150 }
151 else
152 setControls();
153 }
154
155 else if( evt->IsMotion() )
156 {
157 if( m_motionHandler )
158 {
159 try
160 {
161 (*m_motionHandler)( cursorPos );
162 }
163 catch( std::exception& )
164 {
165 }
166 }
167 }
168
169 else if( evt->IsDblClick( BUT_LEFT ) || evt->IsDrag( BUT_LEFT ) )
170 {
171 // Not currently used, but we don't want to pass them either
172 }
173
174 else if( evt->IsClick( BUT_RIGHT ) )
175 {
177 }
178
179 else
180 evt->SetPassEvent();
181 }
182
184 {
185 try
186 {
187 (*m_finalizeHandler)( finalize_state );
188 }
189 catch( std::exception& )
190 {
191 }
192 }
193
194 reset();
195 controls->ForceCursorPosition( false );
196 m_frame->PopTool( aEvent );
197 return 0;
198}
199
200
202{
204}
205
206
208{
210
211 controls->CaptureCursor( false );
212 controls->SetAutoPan( false );
213}
static TOOL_ACTION cancelInteractive
Definition: actions.h:63
static TOOL_ACTION pickerTool
Definition: actions.h:158
void AddItem(const TOOL_ACTION &aAction, const SELECTION_CONDITION &aCondition, int aOrder=ANY_ORDER)
Add a menu entry to run a TOOL_ACTION on selected items.
void AddStandardSubMenus(TOOL_MENU &aMenu)
Construct a "basic" menu for a tool, containing only items that apply to all tools (e....
virtual EDA_DRAW_PANEL_GAL * GetCanvas() const
Return a pointer to GAL-based canvas of given EDA draw frame.
bool IsGridVisible() const
void SetCurrentCursor(KICURSOR aCursor)
Set the current cursor shape for this panel.
An interface for classes handling user events controlling the view behavior such as zooming,...
virtual void CaptureCursor(bool aEnabled)
Force the cursor to stay within the drawing panel area.
virtual void ForceCursorPosition(bool aEnabled, const VECTOR2D &aPosition=VECTOR2D(0, 0))
Place the cursor immediately at a given point.
VECTOR2D GetCursorPosition() const
Return the current cursor position in world coordinates.
virtual void SetAutoPan(bool aEnabled)
Turn on/off auto panning (this feature is used when there is a tool active (eg.
std::optional< VECTOR2D > m_picked
Definition: picker_tool.h:121
std::optional< FINALIZE_HANDLER > m_finalizeHandler
Definition: picker_tool.h:119
EDA_DRAW_FRAME * m_frame
Definition: picker_tool.h:112
std::optional< MOTION_HANDLER > m_motionHandler
Definition: picker_tool.h:117
std::optional< CLICK_HANDLER > m_clickHandler
Definition: picker_tool.h:116
std::optional< CANCEL_HANDLER > m_cancelHandler
Definition: picker_tool.h:118
KICURSOR m_cursor
Definition: picker_tool.h:113
virtual void reset()
< Reinitializes tool to its initial state.
Definition: picker_tool.cpp:31
void setControls()
< Applies the requested VIEW_CONTROLS settings.
bool Init() override
Init() is called once upon a registration of the tool.
Definition: picker_tool.cpp:58
int Main(const TOOL_EVENT &aEvent)
Definition: picker_tool.cpp:75
void setTransitions() override
This method is meant to be overridden in order to specify handlers for events.
static bool ShowAlways(const SELECTION &aSelection)
The default condition function (always returns true).
virtual void PopTool(const TOOL_EVENT &aEvent)
Pops a tool from the stack.
virtual void PushTool(const TOOL_EVENT &aEvent)
NB: the definition of "tool" is different at the user level.
KIGFX::VIEW_CONTROLS * getViewControls() const
Return the instance of VIEW_CONTROLS object used in the application.
Definition: tool_base.cpp:42
Generic, UI-independent tool event.
Definition: tool_event.h:156
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).
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.
void Activate()
Run the tool.
CONDITIONAL_MENU & GetMenu()
Definition: tool_menu.cpp:44
void ShowContextMenu(SELECTION &aSelection)
Helper function to set and immediately show a CONDITIONAL_MENU in concert with the given SELECTION.
Definition: tool_menu.cpp:57
@ BUT_LEFT
Definition: tool_event.h:127
@ BUT_RIGHT
Definition: tool_event.h:128