Engauge Digitizer 2
Loading...
Searching...
No Matches
GuidelineStateContext.cpp
Go to the documentation of this file.
1/******************************************************************************************************
2 * (C) 2019 markummitchell@github.com. This file is part of Engauge Digitizer, which is released *
3 * under GNU General Public License version 2 (GPLv2) or (at your option) any later version. See file *
4 * LICENSE or go to gnu.org/licenses for details. Distribution requires prior written permission. *
5 ******************************************************************************************************/
6
7#include "CmdMediator.h"
8#include "EngaugeAssert.h"
9#include "GuidelineAbstract.h"
10#include "Guidelines.h"
50#include "MainWindow.h"
51#include <QGraphicsScene>
52#include "Transformation.h"
53
55 MainWindow &mainWindow,
56 Guidelines &guidelines,
57 GuidelineState guidelineStateInitial) :
58 m_guideline (guideline),
59 m_guidelines (guidelines),
60 m_mainWindow (mainWindow)
61{
94 m_states.insert (GUIDELINE_STATE_DISCARDED , new GuidelineStateDiscarded (*this));
95 m_states.insert (GUIDELINE_STATE_HANDLE_R , new GuidelineStateHandleR (*this));
96 m_states.insert (GUIDELINE_STATE_HANDLE_T , new GuidelineStateHandleT (*this));
97 m_states.insert (GUIDELINE_STATE_HANDLE_X , new GuidelineStateHandleX (*this));
98 m_states.insert (GUIDELINE_STATE_HANDLE_Y , new GuidelineStateHandleY (*this));
99 ENGAUGE_ASSERT (m_states.size () == NUM_GUIDELINE_STATES);
100
101 m_currentState = NUM_GUIDELINE_STATES; // Value that forces a transition right away
102 m_nextState = guidelineStateInitial;
103
104 transitionIfRequested ();
105}
106
110
112{
113 return m_guidelines.coordsType () == COORDS_TYPE_CARTESIAN;
114}
115
117{
118 return m_guidelines.color ();
119}
120
122{
123 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
124
125 return m_states[m_currentState]->convertGraphCoordinateToScreenPoint (valueGraph);
126}
127
129{
130 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
131
132 return m_states[m_currentState]->convertScreenPointToGraphCoordinate (posScreen);
133}
134
136 GuidelineState stateInitial) const
137{
138 return m_guidelines.createGuideline (identifier,
139 stateInitial);
140}
141
143{
144 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
145
146 return m_states[m_currentState]->doPaint ();
147}
148
154
156{
157 return m_guideline;
158}
159
161{
162 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
163
164 m_states[m_currentState]->handleActiveChange (active);
165 transitionIfRequested ();
166}
168{
169 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
170
171 m_states[m_currentState]->handleHoverEnterEvent ();
172 transitionIfRequested ();
173}
174
176{
177 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
178
179 m_states[m_currentState]->handleHoverLeaveEvent ();
180 transitionIfRequested ();
181}
182
183void GuidelineStateContext::handleMousePress (const QPointF &posScene)
184{
185 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
186
187 m_states[m_currentState]->handleMousePress (posScene);
188 transitionIfRequested ();
189}
190
191void GuidelineStateContext::handleMouseRelease (const QPointF &posScene)
192{
193 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
194
195 m_states[m_currentState]->handleMouseRelease (posScene);
196 transitionIfRequested ();
197}
198
200 bool locked)
201{
202 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
203
204 m_states[m_currentState]->handleGuidelineMode (visible,
205 locked);
206 transitionIfRequested ();
207}
208
210{
211 return m_mainWindow.cmdMediator ()->document ().modelGuideline ();
212}
213
215{
216 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
217
218 return m_states[m_currentState]->pointToEllipse (posScreen);
219}
220
221QLineF GuidelineStateContext::pointToLine (const QPointF &posScreen) const
222{
223 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
224
225 return m_states[m_currentState]->pointToLine (posScreen);
226}
227
229{
230 return m_posCursorGraph;
231}
232
234{
235 ENGAUGE_ASSERT (guidelineState != NUM_GUIDELINE_STATES);
236
237 m_nextState = guidelineState;
238}
239
240void GuidelineStateContext::setPosCursorGraph (const QPointF &posGraph)
241{
242 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
243
244 m_posCursorGraph = posGraph;
245}
246
248{
249 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
250
251 m_states[m_currentState]->handleTimeout ();
252 transitionIfRequested ();
253}
254
256{
257 return m_guidelines.stateDump ();
258}
259
261{
262 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
263
264 return m_states[m_currentState]->stateName();
265}
266
268{
269 return m_guidelines.transformation ();
270}
271
272void GuidelineStateContext::transitionIfRequested ()
273{
274 if (m_currentState != m_nextState) {
275
276 // End the current state if there is one
277 if (m_currentState != NUM_GUIDELINE_STATES) {
278 m_states[m_currentState]->end ();
279 }
280
281 m_currentState = m_nextState;
282
283 // Start the requested state
284 m_states[m_currentState]->begin();
285 }
286}
287
289{
290 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
291
292 m_states[m_currentState]->updateWithLatestTransformation();
293 transitionIfRequested ();
294}
ColorPalette
@ COORDS_TYPE_CARTESIAN
Definition CoordsType.h:13
#define ENGAUGE_ASSERT(cond)
Drop in replacement for Q_ASSERT.
GuidelineState
Set of possible Guideline states. See class Guideline for more information.
@ GUIDELINE_STATE_HANDLE_Y
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_T_SELECT_EDIT_HOVER
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_X_SELECT_HIDE
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_Y_UNSELECT_LOCK
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_Y_SELECT_LOCK
@ GUIDELINE_STATE_DISCARDED
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_X_SELECT_EDIT_APPEARING
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_T_UNSELECT_EDIT
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_Y_UNSELECT_EDIT
@ GUIDELINE_STATE_HANDLE_R
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_T_SELECT_EDIT
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_T_UNSELECT_LOCK
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_Y_SELECT_HIDE
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_X_UNSELECT_EDIT
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_T_SELECT_LOCK
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_Y_UNSELECT_HIDE
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_Y_SELECT_EDIT_APPEARING
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_R_SELECT_EDIT_APPEARING
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_X_UNSELECT_HIDE
@ GUIDELINE_STATE_HANDLE_X
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_Y_SELECT_EDIT
@ NUM_GUIDELINE_STATES
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_R_SELECT_EDIT
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_R_SELECT_EDIT_HOVER
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_X_SELECT_LOCK
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_R_UNSELECT_LOCK
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_R_SELECT_HIDE
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_X_UNSELECT_LOCK
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_T_SELECT_EDIT_APPEARING
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_R_SELECT_LOCK
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_X_SELECT_EDIT_HOVER
@ GUIDELINE_STATE_HANDLE_T
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_R_UNSELECT_HIDE
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_T_UNSELECT_HIDE
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_Y_SELECT_EDIT_HOVER
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_R_UNSELECT_EDIT
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_X_SELECT_EDIT
@ GUIDELINE_STATE_DEPLOYED_CONSTANT_T_SELECT_HIDE
Model for managing the coordinate values corresponding Guidelines.
Parameters that define an ellipse about the specified center, at the specified angle from alignment w...
This class is a special case of the standard QGraphicsLineItem for guidelines, and serves as the base...
QPointF convertGraphCoordinateToScreenPoint(double valueGraph) const
Convert single graph coordinate into screen point pair.
bool doPaint() const
Allow/skip painting of the owner Guideline.
Transformation transformation() const
Return copy of transformation owned by MainWindow.
void draggedOffScreen()
Guideline has been dragged off screen so remove it.
QString stateDump() const
Dump state for debugging only.
void handleActiveChange(bool active)
DigitizeState change so active status may (or may not) be toggled.
QPointF posCursorGraph() const
Get method for current cursor coordinate when object was last created/dragged.
void handleHoverLeaveEvent()
If previously transparent before hover enter then make transparent again.
bool cartesian() const
True/false if coordinates are cartesian/polar.
GuidelineAbstract & guideline()
Guideline that owns this context class.
ColorPalette color() const
Color to be used for guidelines.
void setPosCursorGraph(const QPointF &posGraph)
Pass the current cursor coordinate to the state so it can save the relevant coordinate for later adju...
QLineF pointToLine(const QPointF &posScreen) const
Return line parallel to an axis line, that passes through the specified point.
GuidelineStateContext(GuidelineAbstract &guideline, MainWindow &mainWindow, Guidelines &guidelines, GuidelineState guidelineStateInitial)
Single constructor.
double convertScreenPointToGraphCoordinate(const QPointF &posScreen) const
Convert screen point pair into single graph coordinate.
QString stateName() const
State as a string for debugging only.
void requestStateTransition(GuidelineState guidelineState)
Request a state transition.
EllipseParameters pointToEllipse(const QPointF &posScreen) const
Return ellipse representing constant range, that passes through the specified point.
void handleMousePress(const QPointF &posScene)
At the start of dragging, convert the original Guideline into an invisible handle and visible slaved ...
void handleHoverEnterEvent()
If transparent then make visible when hover starts.
void handleGuidelineMode(bool visibile, bool locked)
User toggled Guideline visibility and/or locked mode.
DocumentModelGuideline modelGuideline() const
Up-to-date guideline settings.
void updateWithLatestTransformation()
Update given Transformation in GuidelineStateContext.
void handleMouseRelease(const QPointF &posScene)
At the end of dragging, clone the Guideline that owns the state machine where these states live.
GuidelineAbstract * createGuideline(const QString &identifier, GuidelineState stateInitial) const
Factory method for creating a new Guideline.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_R_SELECT_EDIT_APPEARING.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_R_SELECT_EDIT_HOVER.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_R_SELECT_EDIT.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_R_SELECT_HIDE.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_R_SELECT_LOCK.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_R_UNSELECT_EDIT.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_R_UNSELECT_HIDE.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_R_UNSELECT_LOCK.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_T_SELECT_EDIT_APPEARING.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_T_SELECT_EDIT_HOVER.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_T_SELECT_EDIT.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_T_SELECT_HIDE.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_T_SELECT_LOCK.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_T_UNSELECT_EDIT.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_T_UNSELECT_HIDE.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_T_UNSELECT_LOCK.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_X_SELECT_EDITAPPEARING.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_X_SELECT_EDIT_HOVER.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_X_SELECT_EDIT.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_X_SELECT_HIDE.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_X_SELECT_LOCK.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_X_UNSELECT_EDIT.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_X_UNSELECT_HIDE.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_X_UNSELECT_LOCK.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_Y_APPEARING.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_Y_SELECT_EDIT_HOVER.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_Y_SELECT_EDIT.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_Y_SELECT_HIDE.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_Y_SELECT_LOCK.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_Y_UNSELECT_EDIT.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_Y_UNSELECT_HIDE.
Implements guideline behavior for GUIDELINE_STATE_DEPLOYED_CONSTANT_Y_UNSELECT_LOCK.
Implements guideline behavior for GUIDELINE_STATE_DISCARDED.
GuidelineStateHandleAbstract instantiated for radius R guideline.
GuidelineStateHandleAbstract instantiated for theta R guideline.
GuidelineStateHandleAbstract instantiated for coordinate X guideline.
GuidelineStateHandleAbstract instantiated for coordinate Y guideline.
This class contains all Guideline objects.
Definition Guidelines.h:28
Main window consisting of menu, graphics scene, status bar and optional toolbars as a Single Document...
Definition MainWindow.h:95
Affine transformation between screen and graph coordinates, based on digitized axis points.