Engauge Digitizer  2
BackgroundStateContext.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 "BackgroundStateContext.h"
8 #include "BackgroundStateCurve.h"
9 #include "BackgroundStateNone.h"
10 #include "BackgroundStateOriginal.h"
11 #include "BackgroundStateUnloaded.h"
12 #include "DocumentModelColorFilter.h"
13 #include "DocumentModelGridRemoval.h"
14 #include "EngaugeAssert.h"
15 #include "GraphicsView.h"
16 #include "Logger.h"
17 #include "MainWindow.h"
18 #include <QGraphicsPixmapItem>
19 #include "Transformation.h"
20 
22  m_mainWindow (mainWindow)
23 {
24  LOG4CPP_INFO_S ((*mainCat)) << "BackgroundStateContext::BackgroundStateContext";
25 
26  // These states follow the same order as the BackgroundState enumeration
27  m_states.insert (BACKGROUND_STATE_CURVE , new BackgroundStateCurve (*this, mainWindow.scene()));
28  m_states.insert (BACKGROUND_STATE_NONE , new BackgroundStateNone (*this, mainWindow.scene()));
29  m_states.insert (BACKGROUND_STATE_ORIGINAL, new BackgroundStateOriginal (*this, mainWindow.scene()));
30  m_states.insert (BACKGROUND_STATE_UNLOADED, new BackgroundStateUnloaded (*this, mainWindow.scene()));
31  ENGAUGE_ASSERT (m_states.size () == NUM_BACKGROUND_STATES);
32 
33  m_currentState = NUM_BACKGROUND_STATES; // Value that forces a transition right away
34  requestStateTransition (BACKGROUND_STATE_UNLOADED);
35  completeRequestedStateTransitionIfExists();
36 }
37 
39 {
40  LOG4CPP_INFO_S ((*mainCat)) << "BackgroundStateContext::close";
41 
42  // It is safe to transition to the new state immediately since no BackgroundState classes are on the stack
43  requestStateTransition (BACKGROUND_STATE_UNLOADED);
44  completeRequestedStateTransitionIfExists ();
45 }
46 
47 void BackgroundStateContext::completeRequestedStateTransitionIfExists()
48 {
49  LOG4CPP_INFO_S ((*mainCat)) << "BackgroundStateContext::completeRequestedStateTransitionIfExists";
50 
51  if (m_currentState != m_requestedState) {
52 
53  // A transition is waiting so perform it
54 
55  if (m_currentState != NUM_BACKGROUND_STATES) {
56 
57  // This is not the first state so close the previous state
58  m_states [m_currentState]->end ();
59  }
60 
61  // Start the new state
62  m_currentState = m_requestedState;
63  m_states [m_requestedState]->begin ();
64  }
65 }
66 
68 {
69  LOG4CPP_INFO_S ((*mainCat)) << "BackgroundStateContext::fitInView";
70 
71  // After initialization, we should be in unloaded state or some other equally valid state
72  ENGAUGE_ASSERT (m_currentState != NUM_BACKGROUND_STATES);
73 
74  const QGraphicsPixmapItem *imageItem = &m_states [BACKGROUND_STATE_CURVE]->imageItem ();
75 
76  double width = imageItem->boundingRect().width();
77  double height = imageItem->boundingRect().height();
78 
79  LOG4CPP_INFO_S ((*mainCat)) << "BackgroundStateContext::fitInView"
80  << " state=" << m_states [m_currentState]->state ().toLatin1().data()
81  << " boundingRect=(" << width << "x" << height << ")";
82 
83  // Get the image from a state that is guaranteed to have an image
84  view.fitInView (imageItem);
85 
86 }
87 
89 {
90  return m_states [BACKGROUND_STATE_CURVE]->image();
91 }
92 
93 void BackgroundStateContext::requestStateTransition (BackgroundState backgroundState)
94 {
95  LOG4CPP_INFO_S ((*mainCat)) << "BackgroundStateContext::requestStateTransition";
96 
97  m_requestedState = backgroundState;
98 }
99 
100 void BackgroundStateContext::setBackgroundImage (BackgroundImage backgroundImage)
101 {
102  LOG4CPP_INFO_S ((*mainCat)) << "BackgroundStateContext::setBackgroundImage"
103  << " background=" << backgroundImageToString (backgroundImage).toLatin1().data();
104 
105  BackgroundState backgroundState;
106  switch (backgroundImage) {
107  case BACKGROUND_IMAGE_FILTERED:
108  backgroundState = BACKGROUND_STATE_CURVE;
109  break;
110 
111  case BACKGROUND_IMAGE_NONE:
112  backgroundState = BACKGROUND_STATE_NONE;
113  break;
114 
115  case BACKGROUND_IMAGE_ORIGINAL:
116  backgroundState = BACKGROUND_STATE_ORIGINAL;
117  break;
118 
119  default:
120  LOG4CPP_ERROR_S ((*mainCat)) << "BackgroundStateContext::selectBackgroundImage";
121  exit (-1);
122  }
123 
124  // It is safe to transition to the new state immediately since no BackgroundState classes are on the stack
125  requestStateTransition (backgroundState);
126  completeRequestedStateTransitionIfExists ();
127 }
128 
130  const DocumentModelGridRemoval &modelGridRemoval,
131  const DocumentModelColorFilter &modelColorFilter,
132  const QString &curveSelected)
133 {
134  LOG4CPP_INFO_S ((*mainCat)) << "BackgroundStateContext::setCurveSelected"
135  << " curve=" << curveSelected.toLatin1().data();
136 
137  for (int backgroundState = 0; backgroundState < NUM_BACKGROUND_STATES; backgroundState++) {
138 
139  m_states [backgroundState]->setCurveSelected (transformation,
140  modelGridRemoval,
141  modelColorFilter,
142  curveSelected);
143  }
144 }
145 
147  const DocumentModelGridRemoval &modelGridRemoval,
148  const DocumentModelColorFilter &modelColorFilter,
149  const QPixmap &pixmapOriginal,
150  const QString &curveSelected)
151 {
152  LOG4CPP_INFO_S ((*mainCat)) << "BackgroundStateContext::setPixmap"
153  << " image=" << pixmapOriginal.width() << "x" << pixmapOriginal.height()
154  << " currentState=" << m_states [m_currentState]->state().toLatin1().data();
155 
156  for (int backgroundState = 0; backgroundState < NUM_BACKGROUND_STATES; backgroundState++) {
157 
158  m_states [backgroundState]->setPixmap (transformation,
159  modelGridRemoval,
160  modelColorFilter,
161  pixmapOriginal,
162  curveSelected);
163  }
164 }
165 
167  const DocumentModelGridRemoval &modelGridRemoval,
168  const DocumentModelColorFilter &modelColorFilter,
169  const QString &curveSelected)
170 {
171  LOG4CPP_INFO_S ((*mainCat)) << "BackgroundStateContext::updateColorFilter";
172 
173  for (int backgroundState = 0; backgroundState < NUM_BACKGROUND_STATES; backgroundState++) {
174 
175  m_states [backgroundState]->updateColorFilter (transformation,
176  modelGridRemoval,
177  modelColorFilter,
178  curveSelected);
179  }
180 }
void setPixmap(const Transformation &transformation, const DocumentModelGridRemoval &modelGridRemoval, const DocumentModelColorFilter &modelColorFilter, const QPixmap &pixmapOriginal, const QString &curveSelected)
Update the images of all states, rather than just the current state.
void updateColorFilter(const Transformation &transformation, const DocumentModelGridRemoval &modelGridRemoval, const DocumentModelColorFilter &colorFilter, const QString &curveSelected)
Apply color filter settings.
void fitInView(GraphicsView &view)
Zoom so background fills the window.
Background image state for interval between startup and loading of the image.
Background image state for showing filter image from current curve.
void requestStateTransition(BackgroundState backgroundState)
Initiate state transition to be performed later, when BackgroundState is off the stack.
Background image state for showing no image.
Affine transformation between screen and graph coordinates, based on digitized axis points...
void setBackgroundImage(BackgroundImage backgroundImage)
Transition to the specified state. This method is used by classes outside of the state machine to tri...
Model for DlgSettingsColorFilter and CmdSettingsColorFilter.
GraphicsScene & scene()
Scene container for the QImage and QGraphicsItems.
QGraphicsView class with event handling added. Typically the events are sent to the active digitizing...
Definition: GraphicsView.h:20
void close()
Open Document is being closed so remove the background.
void setCurveSelected(const Transformation &transformation, const DocumentModelGridRemoval &modelGridRemoval, const DocumentModelColorFilter &modelColorFilter, const QString &curveSelected)
Update the selected curve.
Background image state for showing original (=unfiltered) image.
BackgroundStateContext(MainWindow &mainWindow)
Single constructor.
QImage imageForCurveState() const
Image for the Curve state, even if the current state is different.
Model for DlgSettingsGridRemoval and CmdSettingsGridRemoval. The settings are unstable until the user...
Main window consisting of menu, graphics scene, status bar and optional toolbars as a Single Document...
Definition: MainWindow.h:89