Engauge Digitizer 2
Loading...
Searching...
No Matches
DigitizeStateContext.cpp
1/******************************************************************************************************
2 * (C) 2014 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 "DigitizeStateAxis.h"
9#include "DigitizeStateColorPicker.h"
10#include "DigitizeStateContext.h"
11#include "DigitizeStateCurve.h"
12#include "DigitizeStateEmpty.h"
13#include "DigitizeStatePointMatch.h"
14#include "DigitizeStateSegment.h"
15#include "DigitizeStateSelect.h"
16#include "DocumentModelSegments.h"
17#include "EngaugeAssert.h"
18#include "GraphicsScene.h"
19#include "GraphicsView.h"
20#include "Logger.h"
21#include "MainWindow.h"
22#include <QApplication>
23#include <QCursor>
24#include <QGraphicsScene>
25#include <QGraphicsView>
26#include "QtToString.h"
27
29 QGraphicsView &view,
30 bool isGnuplot) :
31 m_mainWindow (mainWindow),
32 m_view (view),
33 m_imageIsLoaded (false),
34 m_isGnuplot (isGnuplot)
35{
36 // These states follow the same order as the DigitizeState enumeration
37 m_states.insert (DIGITIZE_STATE_AXIS , new DigitizeStateAxis (*this));
38 m_states.insert (DIGITIZE_STATE_COLOR_PICKER, new DigitizeStateColorPicker (*this));
39 m_states.insert (DIGITIZE_STATE_CURVE , new DigitizeStateCurve (*this));
40 m_states.insert (DIGITIZE_STATE_EMPTY , new DigitizeStateEmpty (*this));
41 m_states.insert (DIGITIZE_STATE_POINT_MATCH , new DigitizeStatePointMatch (*this));
42 m_states.insert (DIGITIZE_STATE_SEGMENT , new DigitizeStateSegment (*this));
43 m_states.insert (DIGITIZE_STATE_SELECT , new DigitizeStateSelect (*this));
44 ENGAUGE_ASSERT (m_states.size () == NUM_DIGITIZE_STATES);
45
46 m_currentState = NUM_DIGITIZE_STATES; // Value that forces a transition right away
48 DIGITIZE_STATE_EMPTY);
49}
50
51DigitizeStateContext::~DigitizeStateContext()
52{
53}
54
56{
57 return m_states [m_currentState]->activeCurve ();
58}
59
61 QUndoCommand *cmd)
62{
63 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateContext::appendNewCmd";
64
65 cmdMediator->push (cmd);
66}
67
68void DigitizeStateContext::completeRequestedStateTransitionIfExists (CmdMediator *cmdMediator)
69{
70 if (m_currentState != m_requestedState) {
71
72 // A transition is waiting so perform it
73
74 if (m_currentState != NUM_DIGITIZE_STATES) {
75
76 // This is not the first state so close the previous state
77 m_states [m_currentState]->end ();
78 }
79
80 // Start the new state
81 DigitizeState previousState = m_currentState;
82 m_currentState = m_requestedState;
83 m_states [m_requestedState]->begin (cmdMediator,
84 previousState);
85
86 // If transition was triggered from inside the state machine then MainWindow controls need to be set accordingly
87 // as if user had clicked on a digitize button
89 }
90}
91
93 const QString &pointIdentifier)
94{
95 m_states [m_currentState]->handleContextMenuEvent (cmdMediator,
96 pointIdentifier);
97}
98
100{
101 m_states [m_currentState]->handleCurveChange(cmdMediator);
102}
103
105 Qt::Key key,
106 bool atLeastOneSelectedItem)
107{
108 m_states [m_currentState]->handleKeyPress (cmdMediator,
109 key,
110 atLeastOneSelectedItem);
111
112 completeRequestedStateTransitionIfExists(cmdMediator);
113
114}
115
117{
118 m_states [m_currentState]->handleLeave (cmdMediator);
119
120 completeRequestedStateTransitionIfExists(cmdMediator);
121
122}
123
125 QPointF pos)
126{
127 m_states [m_currentState]->handleMouseMove (cmdMediator,
128 pos);
129
130 completeRequestedStateTransitionIfExists(cmdMediator);
131
132}
133
135 QPointF pos)
136{
137 m_states [m_currentState]->handleMousePress (cmdMediator,
138 pos);
139
140 completeRequestedStateTransitionIfExists(cmdMediator);
141
142}
143
145 QPointF pos)
146{
147 m_states [m_currentState]->handleMouseRelease (cmdMediator,
148 pos);
149
150 completeRequestedStateTransitionIfExists(cmdMediator);
151}
152
154 const QCursor &cursor)
155{
156 m_states [m_currentState]->handleSetOverrideCursor (cmdMediator,
157 cursor);
158}
159
161{
162 return m_isGnuplot;
163}
164
166{
167 return m_mainWindow;
168}
169
171{
172 return m_mainWindow;
173}
174
176{
177 m_requestedState = digitizeState;
178}
179
181 DigitizeState digitizeState)
182{
183 m_requestedState = digitizeState;
184 completeRequestedStateTransitionIfExists(cmdMediator);
185}
186
188{
189 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateContext::resetOnLoad";
190
191 // Reset current state. At this point, the current state is DIGITIZE_STATE_EMPTY when opening the first document
192 // so for consistency we always reset it so succeeding documents work the same way
193 if (m_currentState != DIGITIZE_STATE_EMPTY) {
194 m_requestedState = DIGITIZE_STATE_EMPTY;
195 completeRequestedStateTransitionIfExists(cmdMediator);
196 }
197}
198
200{
201 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateContext::setCursor";
202
203 ENGAUGE_ASSERT(m_currentState < m_states.count());
204
205 m_states [m_currentState]->setCursor (cmdMediator);
206}
207
208void DigitizeStateContext::setDragMode (QGraphicsView::DragMode dragMode)
209{
210 LOG4CPP_DEBUG_S ((*mainCat)) << "DigitizeStateContext::setDragMode";
211
212 if (m_imageIsLoaded) {
213 m_view.setDragMode (dragMode);
214 }
215}
216
218 bool imageIsLoaded)
219{
220 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateContext::setImageIsLoaded";
221
222 m_imageIsLoaded = imageIsLoaded;
223 setCursor (cmdMediator);
224}
225
227{
228 ENGAUGE_ASSERT (m_currentState != NUM_DIGITIZE_STATES);
229
230 return m_states [m_currentState]->state();
231}
232
234 const DocumentModelDigitizeCurve &modelDigitizeCurve)
235{
236 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateContext::updateModelDigitizeCurve";
237
238 ENGAUGE_ASSERT(m_currentState < m_states.count());
239
240 m_states [m_currentState]->updateModelDigitizeCurve (cmdMediator,
241 modelDigitizeCurve);
242}
243
245{
246 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateContext::updateModelSegments";
247
248 ENGAUGE_ASSERT(m_currentState < m_states.count());
249
250 m_states [m_currentState]->updateModelSegments (modelSegments);
251}
252
254{
255 return m_view;
256}
Command queue stack.
Definition CmdMediator.h:24
Digitizing state for digitizing one axis point at a time.
Digitizing state for selecting a color for DigitizeStateSegment.
QString state() const
State name for debugging.
bool isGnuplot() const
Get method for gnuplot flag.
void resetOnLoad(CmdMediator *cmdMediator)
Resetting makes re-initializes for documents after the first.
void handleMouseRelease(CmdMediator *cmdMediator, QPointF pos)
See DigitizeStateAbstractBase::handleMouseRelease.
DigitizeStateContext(MainWindow &mainWindow, QGraphicsView &view, bool isGnuplot)
Single constructor.
void handleContextMenuEvent(CmdMediator *cmdMediator, const QString &pointIdentifier)
See DigitizeStateAbstractBase::handleContextMenuEvent.
void handleMouseMove(CmdMediator *cmdMediator, QPointF pos)
See DigitizeStateAbstractBase::handleMouseMove.
void requestImmediateStateTransition(CmdMediator *cmdMediator, DigitizeState digitizeState)
Perform immediate state transition. Called from outside state machine.
void updateModelDigitizeCurve(CmdMediator *cmdMediator, const DocumentModelDigitizeCurve &modelDigitizeCurve)
Update the digitize curve settings.
void setDragMode(QGraphicsView::DragMode dragMode)
Set QGraphicsView drag mode (in m_view). Called from DigitizeStateAbstractBase subclasses.
void handleMousePress(CmdMediator *cmdMediator, QPointF pos)
See DigitizeStateAbstractBase::handleMousePress.
void appendNewCmd(CmdMediator *cmdMediator, QUndoCommand *cmd)
Append just-created QUndoCommand to command stack. This is called from DigitizeStateAbstractBase subc...
void setCursor(CmdMediator *cmdMediator)
Set cursor after asking state for the new cursor shape.
void handleSetOverrideCursor(CmdMediator *cmdMediator, const QCursor &cursor)
See DigitizeStateAbstractBase::handleSetOverrideCursor.
void setImageIsLoaded(CmdMediator *cmdMediator, bool imageIsLoaded)
Set the image so QGraphicsView cursor and drag mode are accessible.
QString activeCurve() const
Curve name for active Curve. This can include AXIS_CURVE_NAME, and empty string.
void handleKeyPress(CmdMediator *cmdMediator, Qt::Key key, bool atLeastOneSelectedItem)
See DigitizeStateAbstractBase::handleKeyPress.
void updateModelSegments(const DocumentModelSegments &modelSegments)
Update the segments given the new settings.
void requestDelayedStateTransition(DigitizeState digitizeState)
Initiate state transition to be performed later, when DigitizeState is off the stack.
QGraphicsView & view()
QGraphicsView for use by DigitizeStateAbstractBase subclasses.
void handleCurveChange(CmdMediator *cmdMediator)
See DigitizeStateAbstractBase::handleCurveChange.
MainWindow & mainWindow()
Reference to the MainWindow, without const.
void handleLeave(CmdMediator *cmdMediator)
See DigitizeStateAbstractBase::handleLeave.
Digitizing state for creating Curve Points, one at a time.
Digitizing state before a Document has been created. In this state, the cursor is Qt::ArrowCursor.
Digitizing state for matching Curve Points, one at a time.
Digitizing state for creating multiple Points along a highlighted segment.
Digitizing state for selecting one or more Points in the Document.
Model for DlgSettingsDigitizeCurve and CmdSettingsDigitizeCurve.
Model for DlgSettingsSegments and CmdSettingsSegments.
Main window consisting of menu, graphics scene, status bar and optional toolbars as a Single Document...
Definition MainWindow.h:78
CmdMediator * cmdMediator()
Accessor for commands to process the Document.
void updateDigitizeStateIfSoftwareTriggered(DigitizeState digitizeState)
After software-triggered state transition, this method manually triggers the action as if user had cl...