USGS

Isis 3.0 Object Programmers' Reference

Home

HistoryTreeWidget.cpp
1 #include "HistoryTreeWidget.h"
2 
3 #include <QDateTime>
4 #include <QDebug>
5 
6 #include "ProgressBar.h"
7 #include "Project.h"
8 #include "WorkOrder.h"
9 
10 namespace Isis {
18  m_project = project;
19 
20  QStringList headers;
21  headers.append("Operation");
22  headers.append("Progress");
23  headers.append("Time Executed");
24 
25  setHeaderLabels(headers);
26 
27  connect(m_project, SIGNAL(workOrderStarting(WorkOrder *)),
28  this, SLOT(addToHistory(WorkOrder *)));
29  connect(m_project, SIGNAL(projectLoaded(Project *)),
30  this, SLOT(showHistory()));
31  connect(m_project->undoStack(), SIGNAL(indexChanged(int)),
32  this, SLOT(handleUndoIndexChanged(int)));
33 
34  showHistory();
35 
36  refit();
37  }
38 
39 
40 
45  m_project = NULL;
46  }
47 
48 
58  int HistoryTreeWidget::sizeHintForColumn(int column) const {
59  int result = -1;
60 
61  QFontMetrics metrics(invisibleRootItem()->font(1));
62  int dateTimeColumnWidth = qRound(metrics.width(QDateTime::currentDateTime().toString()) * 1.10);
63 
64  int progressBarColumnWidth = 200;
65 
66  // The -12 is a guesstimate for not having a horizontal scroll bar. I'm not sure how to
67  // calculate this number correctly. Consequences of it being wrong are minimal. -SL
68  int operationColumnWidth = width() - dateTimeColumnWidth - progressBarColumnWidth - 12;
69 
70  if (operationColumnWidth > 0) {
71  if (column == 0)
72  result = operationColumnWidth;
73  else if (column == 1)
74  result = progressBarColumnWidth;
75  else if (column == 2)
76  result = dateTimeColumnWidth;
77  }
78 
79  return result;
80  }
81 
82 
88  resizeColumnToContents(0);
89  resizeColumnToContents(1);
90  resizeColumnToContents(2);
91  }
92 
93 
94  void HistoryTreeWidget::updateStatus(QTreeWidgetItem *treeItem) {
95  WorkOrder *workOrder = treeItem->data(0, Qt::UserRole).value<WorkOrder *>();
96 
97  if (workOrder)
98  updateStatus(workOrder);
99  }
100 
101 
109  QString data = workOrder->bestText();
110 
111  connect(workOrder, SIGNAL(destroyed(QObject *)),
112  this, SLOT(removeFromHistory(QObject *)));
113 
114  QStringList columnData;
115  columnData.append(data);
116  columnData.append("");
117  columnData.append(workOrder->executionTime().toString());
118 
119  QTreeWidgetItem *newItem = new QTreeWidgetItem(columnData);
120  newItem->setData(0, Qt::UserRole, qVariantFromValue(workOrder));
121 
122  // Do font for save work orders
123  if (workOrder->createsCleanState()) {
124  QFont saveFont = newItem->font(0);
125  saveFont.setBold(true);
126  saveFont.setItalic(true);
127  newItem->setFont(0, saveFont);
128  newItem->setForeground(0, Qt::gray);
129  }
130 
131  // Do font for progress text
132  QFont progressFont = newItem->font(1);
133  progressFont.setItalic(true);
134  newItem->setFont(1, progressFont);
135  newItem->setForeground(1, Qt::gray);
136 
137  invisibleRootItem()->addChild(newItem);
138 
139  connect(workOrder, SIGNAL(statusChanged(WorkOrder *)),
140  this, SLOT(updateStatus(WorkOrder *)));
141  connect(workOrder, SIGNAL(creatingProgress(WorkOrder *)),
142  this, SLOT(updateProgressWidgets()));
143  connect(workOrder, SIGNAL(deletingProgress(WorkOrder *)),
144  this, SLOT(updateProgressWidgets()));
145 
146  if (workOrder->progressBar()) {
147  setItemWidget(newItem, 1, workOrder->progressBar());
148  }
149 
150  scrollToItem(newItem);
151  refit();
152  }
153 
154 
164  for (int i = 0; i < invisibleRootItem()->childCount(); i++) {
165  QTreeWidgetItem *item = invisibleRootItem()->child(i);
166  WorkOrder *workOrder = item->data(0, Qt::UserRole).value<WorkOrder *>();
167 
168  if (workOrder && itemWidget(item, 1) != workOrder->progressBar()) {
169  setItemWidget(item, 1, workOrder->progressBar());
170  }
171  }
172  }
173 
174 
182  if (treeItem) {
183  treeItem->setForeground(0, Qt::black);
184  updateStatus(treeItem);
185  }
186  }
187 
188 
196  if (treeItem) {
197  treeItem->setForeground(0, Qt::gray);
198  updateStatus(treeItem);
199  }
200  }
201 
202 
208  m_project->undoStack()->command(newIndex - 1));
209  markNotUndone(prevItem);
210 
211  QTreeWidgetItem *curItem = undoCommandToTreeItem(m_project->undoStack()->command(newIndex));
212  markUndone(curItem);
213 
214  markUndone(undoCommandToTreeItem(m_project->undoStack()->command(newIndex + 1)));
215 
216  scrollToItem(prevItem);
217  scrollToItem(curItem);
218  }
219 
220 
225  QTreeWidgetItem *itemToRemove = undoCommandToTreeItem(
226  (QUndoCommand *)((WorkOrder *)deletedObject));
227 
228  if (itemToRemove) {
229  int indexToDelete = invisibleRootItem()->indexOfChild(itemToRemove);
230 
231  if (indexToDelete < invisibleRootItem()->childCount()) {
232  // Clear progress bar widget
233  setItemWidget(invisibleRootItem()->child(indexToDelete), 1, NULL);
234 
235  // Take & delete the tree item
236  delete invisibleRootItem()->takeChild(indexToDelete);
237  }
238  }
239  }
240 
241 
250  QTreeWidgetItem *result = NULL;
251 
252  if (undoCommand) {
253  for (int i = invisibleRootItem()->childCount() - 1; !result && i >= 0; i--) {
254  QTreeWidgetItem *item = invisibleRootItem()->child(i);
255  WorkOrder *workOrder = item->data(0, Qt::UserRole).value<WorkOrder *>();
256 
257  if (undoCommand == workOrder)
258  result = item;
259  }
260  }
261 
262  return result;
263  }
264 
265 
273  foreach (QTreeWidgetItem *item, invisibleRootItem()->takeChildren()) {
274  delete item;
275  }
276 
277  foreach (WorkOrder *workOrder, m_project->workOrderHistory()) {
278  addToHistory(workOrder);
279  }
280  }
281 
282 
283  void HistoryTreeWidget::updateStatus(WorkOrder *workOrder) {
284  undoCommandToTreeItem(workOrder)->setText(1, workOrder->statusText());
285  }
286 }