Engauge Digitizer  2
 All Classes Files Functions Variables Enumerations Enumerator Friends Pages
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 
51 DigitizeStateContext::~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 
68 void 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 
175 void DigitizeStateContext::requestDelayedStateTransition (DigitizeState digitizeState)
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 
208 void 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 }
void requestDelayedStateTransition(DigitizeState digitizeState)
Initiate state transition to be performed later, when DigitizeState is off the stack.
void resetOnLoad(CmdMediator *cmdMediator)
Resetting makes re-initializes for documents after the first.
void updateDigitizeStateIfSoftwareTriggered(DigitizeState digitizeState)
After software-triggered state transition, this method manually triggers the action as if user had cl...
void setDragMode(QGraphicsView::DragMode dragMode)
Set QGraphicsView drag mode (in m_view). Called from DigitizeStateAbstractBase subclasses.
void updateModelDigitizeCurve(CmdMediator *cmdMediator, const DocumentModelDigitizeCurve &modelDigitizeCurve)
Update the digitize curve settings.
QString activeCurve() const
Curve name for active Curve. This can include AXIS_CURVE_NAME, and empty string.
void setCursor(CmdMediator *cmdMediator)
Set cursor after asking state for the new cursor shape.
Digitizing state for selecting a color for DigitizeStateSegment.
void handleCurveChange(CmdMediator *cmdMediator)
See DigitizeStateAbstractBase::handleCurveChange.
Digitizing state before a Document has been created. In this state, the cursor is Qt::ArrowCursor...
CmdMediator * cmdMediator()
Accessor for commands to process the Document.
Definition: MainWindow.cpp:265
void handleKeyPress(CmdMediator *cmdMediator, Qt::Key key, bool atLeastOneSelectedItem)
See DigitizeStateAbstractBase::handleKeyPress.
MainWindow & mainWindow()
Reference to the MainWindow, without const.
void setImageIsLoaded(CmdMediator *cmdMediator, bool imageIsLoaded)
Set the image so QGraphicsView cursor and drag mode are accessible.
Digitizing state for matching Curve Points, one at a time.
Model for DlgSettingsDigitizeCurve and CmdSettingsDigitizeCurve.
Digitizing state for selecting one or more Points in the Document.
void appendNewCmd(CmdMediator *cmdMediator, QUndoCommand *cmd)
Append just-created QUndoCommand to command stack. This is called from DigitizeStateAbstractBase subc...
DigitizeStateContext(MainWindow &mainWindow, QGraphicsView &view, bool isGnuplot)
Single constructor.
void updateModelSegments(const DocumentModelSegments &modelSegments)
Update the segments given the new settings.
QString state() const
State name for debugging.
void handleMouseMove(CmdMediator *cmdMediator, QPointF pos)
See DigitizeStateAbstractBase::handleMouseMove.
void handleMouseRelease(CmdMediator *cmdMediator, QPointF pos)
See DigitizeStateAbstractBase::handleMouseRelease.
Command queue stack.
Definition: CmdMediator.h:23
Model for DlgSettingsSegments and CmdSettingsSegments.
bool isGnuplot() const
Get method for gnuplot flag.
Digitizing state for creating Curve Points, one at a time.
QGraphicsView & view()
QGraphicsView for use by DigitizeStateAbstractBase subclasses.
void handleMousePress(CmdMediator *cmdMediator, QPointF pos)
See DigitizeStateAbstractBase::handleMousePress.
Digitizing state for creating multiple Points along a highlighted segment.
void handleSetOverrideCursor(CmdMediator *cmdMediator, const QCursor &cursor)
See DigitizeStateAbstractBase::handleSetOverrideCursor.
void handleContextMenuEvent(CmdMediator *cmdMediator, const QString &pointIdentifier)
See DigitizeStateAbstractBase::handleContextMenuEvent.
Main window consisting of menu, graphics scene, status bar and optional toolbars as a Single Document...
Definition: MainWindow.h:82
void handleLeave(CmdMediator *cmdMediator)
See DigitizeStateAbstractBase::handleLeave.
Digitizing state for digitizing one axis point at a time.
void requestImmediateStateTransition(CmdMediator *cmdMediator, DigitizeState digitizeState)
Perform immediate state transition. Called from outside state machine.