USGS

Isis 3.0 Object Programmers' Reference

Home

WorkOrder.h
Go to the documentation of this file.
1 #ifndef WorkOrder_H
2 #define WorkOrder_H
3 
26 #include <QAction>
27 #include <QDateTime>
28 #include <QUndoCommand>
29 
30 #include <QPointer>
31 
32 // This is needed for the QVariant macro
33 #include <QMetaType>
34 
35 #include "XmlStackedHandler.h"
36 
37 template<typename T> class QFutureWatcher;
38 class QMutex;
39 class QXmlStreamWriter;
40 
41 namespace Isis {
42  class Control;
43  class Directory;
44  class ImageList;
45  class ProgressBar;
46  class Project;
47  class XmlStackedHandlerReader;
48 
88  class WorkOrder : public QAction, public QUndoCommand {
89  Q_OBJECT
90  public:
92  WorkOrderUnknownStatus = 0,
93  WorkOrderNotStarted,
94  WorkOrderRedoing,
95  WorkOrderRedone,
96  WorkOrderUndoing,
97  WorkOrderUndone,
102  WorkOrderLastStatus = WorkOrderFinished
103  };
104 
105 
106  enum Context {
107  NoContext,
108  ProjectContext
109  };
110 
111  WorkOrder(Project *project);
112  virtual ~WorkOrder();
113 
114  virtual WorkOrder *clone() const = 0;
115  virtual bool isExecutable(Context);
116  virtual bool isExecutable(QList<Control *> controls);
117  virtual bool isExecutable(ImageList *images);
118  void read(XmlStackedHandlerReader *xmlReader);
119  void save(QXmlStreamWriter &stream) const;
120  virtual void setData(Context);
121  virtual void setData(ImageList *images);
122  virtual void setData(QList<Control *> controls);
123  void setNext(WorkOrder *nextWorkOrder);
124  void setPrevious(WorkOrder *previousWorkOrder);
125 
126  QString bestText() const;
127  bool createsCleanState() const;
128  QDateTime executionTime() const;
129  bool isFinished() const;
130  bool isRedoing() const;
131  bool isRedone() const;
132  bool isUndoing() const;
133  bool isUndone() const;
134  bool modifiesDiskState() const;
135  WorkOrder *next() const;
136  WorkOrder *previous() const;
137  QString statusText() const;
138 
139  ProgressBar *progressBar();
140 
141  static WorkOrderStatus fromStatusString(QString);
142  static QString toString(WorkOrderStatus);
143 
144  signals:
145  void creatingProgress(WorkOrder *);
146  // This is necessary because QTreeWidget doesn't support us just deleting the progress bar..
147  // HistoryWidget relies on this signal.
148  void deletingProgress(WorkOrder *);
149  void finished(WorkOrder *);
150  void statusChanged(WorkOrder *);
151 
152  public slots:
176  virtual bool execute();
177 
178  virtual void redo();
179  virtual void undo();
180 
181  protected:
182  WorkOrder(const WorkOrder &other);
183 
184  ImageList *imageList();
185  const ImageList *imageList() const;
186 
187  QList<Control *> controlList();
188 
189  virtual bool dependsOn(WorkOrder *other) const;
190 
191  Directory *directory() const;
192  Project *project() const;
193 
194  void setCreatesCleanState(bool createsCleanState);
195  void setModifiesDiskState(bool changesProjectOnDisk);
196  void setInternalData(QStringList data);
197 
198  int progressMin() const;
199  int progressMax() const;
200  int progressValue() const;
201  void setProgressRange(int, int);
202  void setProgressValue(int);
203 
204  QStringList internalData() const;
205  virtual void syncRedo();
206  virtual void asyncRedo();
207  virtual void postSyncRedo();
208  virtual void syncUndo();
209  virtual void asyncUndo();
210  virtual void postSyncUndo();
211 
212  protected slots:
213  void addCloneToProject();
214 
215  private:
216  bool isInStableState() const;
217  void listenForImageDestruction();
218  void resetProgressBar();
219  void setProgressToFinalText();
220 
221  private slots:
222  void attemptQueuedAction();
223  void asyncFinished();
224  void clearImageList();
225  void deleteProgress();
226  void updateProgress();
227  void startRedo();
228 
229  private:
230  enum QueuedWorkOrderAction {
231  NoQueuedAction,
232  RedoQueuedAction,
233  UndoQueuedAction
234  };
235 
241  class XmlHandler : public XmlStackedHandler {
242  public:
243  XmlHandler(WorkOrder *workOrder);
244 
245  virtual bool startElement(const QString &namespaceURI, const QString &localName,
246  const QString &qName, const QXmlAttributes &atts);
247 
248  private:
249  Q_DISABLE_COPY(XmlHandler);
250 
251  WorkOrder *m_workOrder;
252  };
253 
254 
255  private:
256  WorkOrder &operator=(const WorkOrder &rhs);
257 
264 
271 
272  WorkOrderStatus m_status;
273  QueuedWorkOrderAction m_queuedAction;
274 
275  int m_progressRangeMinValue;
276  int m_progressRangeMaxValue;
277  int m_progressValue;
278 
279  Context m_context;
280  QStringList m_imageIds;
281  QPointer<ImageList> m_images;
282  QList<Control *> m_controls;
283  QStringList m_internalData;
284  QPointer<WorkOrder> m_nextWorkOrder;
285  QPointer<WorkOrder> m_previousWorkOrder;
286  QPointer<Project> m_project;
287 
288  QMutex *m_transparentConstMutex;
289 
293  QDateTime m_executionTime;
294 
295  QPointer< QFutureWatcher<void> > m_futureWatcher;
296 
297  QPointer<ProgressBar> m_progressBar;
298 
299  QPointer<QTimer> m_progressBarUpdateTimer;
300  QPointer<QTimer> m_progressBarDeletionTimer;
301 
302  QTime *m_elapsedTimer;
303  double m_secondsElapsed;
304  };
305 }
306 
309 
310 #endif