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 "EngaugeAssert.h"
8#include "GuidelineAbstract.h"
9#include "Guidelines.h"
49#include <QGraphicsScene>
50#include "Transformation.h"
51
53 Guidelines &guidelines,
55 m_guideline (guideline),
56 m_guidelines (guidelines)
57{
90 m_states.insert (GUIDELINE_STATE_DISCARDED , new GuidelineStateDiscarded (*this));
91 m_states.insert (GUIDELINE_STATE_HANDLE_R , new GuidelineStateHandleR (*this));
92 m_states.insert (GUIDELINE_STATE_HANDLE_T , new GuidelineStateHandleT (*this));
93 m_states.insert (GUIDELINE_STATE_HANDLE_X , new GuidelineStateHandleX (*this));
94 m_states.insert (GUIDELINE_STATE_HANDLE_Y , new GuidelineStateHandleY (*this));
95 ENGAUGE_ASSERT (m_states.size () == NUM_GUIDELINE_STATES);
96
97 m_currentState = NUM_GUIDELINE_STATES; // Value that forces a transition right away
98 m_nextState = guidelineStateInitial;
99
100 transitionIfRequested ();
101}
102
106
108{
109 return m_guidelines.coordsType () == COORDS_TYPE_CARTESIAN;
110}
111
113{
114 return m_guidelines.color ();
115}
116
118{
119 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
120
121 return m_states[m_currentState]->convertGraphCoordinateToScreenPoint (valueGraph);
122}
123
125{
126 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
127
128 return m_states[m_currentState]->convertScreenPointToGraphCoordinate (posScreen);
129}
130
133{
134 return m_guidelines.createGuideline (identifier,
136}
137
139{
140 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
141
142 return m_states[m_currentState]->doPaint ();
143}
144
150
152{
153 return m_guideline;
154}
155
157{
158 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
159
160 m_states[m_currentState]->handleActiveChange (active);
161 transitionIfRequested ();
162}
164{
165 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
166
167 m_states[m_currentState]->handleHoverEnterEvent ();
168 transitionIfRequested ();
169}
170
172{
173 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
174
175 m_states[m_currentState]->handleHoverLeaveEvent ();
176 transitionIfRequested ();
177}
178
180{
181 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
182
183 m_states[m_currentState]->handleMousePress (posScene);
184 transitionIfRequested ();
185}
186
188{
189 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
190
191 m_states[m_currentState]->handleMouseRelease (posScene);
192 transitionIfRequested ();
193}
194
196 bool locked)
197{
198 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
199
200 m_states[m_currentState]->handleGuidelineMode (visible,
201 locked);
202 transitionIfRequested ();
203}
204
206{
207 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
208
209 return m_states[m_currentState]->pointToEllipse (posScreen);
210}
211
213{
214 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
215
216 return m_states[m_currentState]->pointToLine (posScreen);
217}
218
220{
221 return m_posCursorGraph;
222}
223
230
232{
233 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
234
235 m_posCursorGraph = posGraph;
236}
237
239{
240 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
241
242 m_states[m_currentState]->handleTimeout ();
243 transitionIfRequested ();
244}
245
247{
248 return m_guidelines.stateDump ();
249}
250
252{
253 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
254
255 return m_states[m_currentState]->stateName();
256}
257
259{
260 return m_guidelines.transformation ();
261}
262
263void GuidelineStateContext::transitionIfRequested ()
264{
265 if (m_currentState != m_nextState) {
266
267 // End the current state if there is one
268 if (m_currentState != NUM_GUIDELINE_STATES) {
269 m_states[m_currentState]->end ();
270 }
271
272 m_currentState = m_nextState;
273
274 // Start the requested state
275 m_states[m_currentState]->begin();
276 }
277}
278
280{
281 ENGAUGE_ASSERT (m_currentState != NUM_GUIDELINE_STATES);
282
283 m_states[m_currentState]->updateWithLatestTransformation();
284 transitionIfRequested ();
285}
ColorPalette
@ COORDS_TYPE_CARTESIAN
Definition CoordsType.h:13
const int INNER_RADIUS_MIN
#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
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.
GuidelineStateContext(GuidelineAbstract &guideline, Guidelines &guidelines, GuidelineState guidelineStateInitial)
Single constructor.
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.
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.
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.
This class contains all Guideline objects.
Definition Guidelines.h:28
CoordsType coordsType() const
Return cartesian or polar.
GuidelineAbstract * createGuideline(const QString &identifier, GuidelineState stateInitial)
Factory method for creating a new Guideline.
ColorPalette color() const
Color to be used for guidelines.
Transformation transformation() const
Return copy of transformation owned by MainWindow.
QString stateDump() const
States listed as a string for debugging only.
Affine transformation between screen and graph coordinates, based on digitized axis points.