Isis 3.0 Programmer Reference
Back | Home
TableView.cpp
1 #include "IsisDebug.h"
2 
3 #include "TableView.h"
4 
5 #include <iostream>
6 
7 #include <QLabel>
8 #include <QMargins>
9 #include <QSettings>
10 #include <QVBoxLayout>
11 
12 #include "AbstractTableModel.h"
13 #include "IException.h"
14 #include "TableViewHeader.h"
15 #include "TableViewContent.h"
16 #include "TableColumn.h"
17 #include "TableColumnList.h"
18 
19 
20 namespace Isis {
21  namespace CnetViz {
22  TableView::TableView(AbstractTableModel *someModel,
23  QString pathForSettings,
24  QString objName) {
25  nullify();
26 
27  m_settingsPath = new QString(pathForSettings);
28  setObjectName(objName);
29 
30  m_warningLabel = new QLabel;
31 
32  m_model = someModel;
33  connect(m_model, SIGNAL(filterCountsChanged(int, int)),
34  this, SIGNAL(filterCountsChanged(int, int)));
35  connect(m_model, SIGNAL(userWarning(AbstractTableModel::Warning)),
36  this, SLOT(displayWarning(AbstractTableModel::Warning)));
37 
38  m_columns = m_model->getColumns();
39 
40  // Add a column for row numbers and global selection.
41  m_columns->prepend(new TableColumn("", true, false));
42 
43  QSettings settings(*m_settingsPath, QSettings::NativeFormat);
44  QString key;
45  for (int i = 0; i < m_columns->size(); i++) {
46  TableColumn *const &col = (*m_columns)[i];
47  QString colTitle = col->getTitle();
48  int defaultWidth = QFontMetrics(font()).width(colTitle) + 40;
49  if (colTitle.size()) {
50  key = objectName() + " " + colTitle + " width";
51  key.replace(" ", "_");
52  col->setWidth(settings.value(key, defaultWidth).toInt());
53 
54  key = objectName() + " " + colTitle + " ascending";
55  key.replace(" ", "_");
56  col->setSortAscending(settings.value(key, true).toBool());
57  }
58  else {
59  col->setWidth(defaultWidth);
60 
61  // no need to set sort order since it is already ascending by default
62  }
63  }
64 
65  key = objectName() + " sorting order";
66  key.replace(" ", "_");
67  try {
68  m_columns->setSortingOrder(
69  settings.value(key, QStringList()).toStringList());
70  }
71  catch (IException &) {
72  }
73 
74  m_header = new TableViewHeader(m_model);
75  connect(m_header, SIGNAL(requestedGlobalSelection(bool)),
76  this, SLOT(handleModelSelectionChanged()));
77  connect(m_header, SIGNAL(requestedGlobalSelection(bool)),
78  this, SIGNAL(selectionChanged()));
79 
80  m_content = new TableViewContent(m_model);
81  connect(m_content, SIGNAL(tableSelectionChanged()),
82  this, SIGNAL(selectionChanged()));
83  connect(m_content,
84  SIGNAL(rebuildModels(QList< CnetViz::AbstractTreeItem * >)),
85  this,
86  SIGNAL(rebuildModels(QList< CnetViz::AbstractTreeItem * >)));
87  connect(m_content, SIGNAL(horizontalScrollBarValueChanged(int)),
88  m_header, SLOT(updateHeaderOffset(int)));
89  connect(m_content, SIGNAL(modelDataChanged()),
90  this, SIGNAL(modelDataChanged()));
91  connect(m_content, SIGNAL(tableSelectionChanged(QList<AbstractTreeItem *>)),
92  this, SIGNAL(tableSelectionChanged(QList<AbstractTreeItem *>)));
93 
94  connect(m_header, SIGNAL(columnResized(bool)),
95  m_content, SLOT(updateHorizontalScrollBar(bool)));
96 
97  QVBoxLayout *layout = new QVBoxLayout;
98  layout->addWidget(m_header);
99  layout->addWidget(m_content);
100  layout->addWidget(m_warningLabel);
101  layout->setContentsMargins(0, 0, 0, 0);
102  layout->setSpacing(0);
103 
104  setLayout(layout);
105  }
106 
107 
108  TableView::~TableView() {
109  // save column widths
110  ASSERT(objectName().size());
111  if (m_settingsPath->size() && objectName().size()) {
112  QSettings settings(*m_settingsPath, QSettings::NativeFormat);
113  QString key;
114  for (int i = 0; i < m_columns->size(); i++) {
115  TableColumn *const &col = (*m_columns)[i];
116  QString colTitle = col->getTitle();
117  if (colTitle.size()) {
118  key = objectName() + " " + colTitle + " width";
119  key.replace(" ", "_");
120  settings.setValue(key, col->getWidth());
121 
122  key = objectName() + " " + colTitle + " ascending";
123  key.replace(" ", "_");
124  settings.setValue(key, col->sortAscending());
125  }
126  }
127 
128  key = objectName() + " sorting order";
129  key.replace(" ", "_");
130  settings.setValue(key, m_columns->getSortingOrderAsStrings());
131  }
132 
133  delete m_model;
134  m_model = NULL;
135 
136  m_columns = NULL;
137  }
138 
139 
140  TableViewHeader *TableView::getHorizontalHeader() {
141  return m_header;
142  }
143 
144 
145  void TableView::setColumnVisible(QString column, bool visible) {
146  for (int i = 0; i < m_columns->size(); i++) {
147  TableColumn *col = (*m_columns)[i];
148  if (col->getTitle() == column)
149  col->setVisible(visible);
150  }
151  }
152 
153 
154  AbstractTableModel *TableView::getModel() {
155  return m_content->getModel();
156  }
157 
158 
159  // void TableView::setModel(AbstractTableModel * newModel)
160  // {
161  // ASSERT(m_content);
162  //
163  // if (newModel)
164  // {
165  // ASSERT(m_header);
166  // connect(newModel, SIGNAL(filterProgressChanged(int)),
167  // m_header, SLOT(updateFilterProgress(int)));
168  // connect(newModel, SIGNAL(rebuildProgressChanged(int)),
169  // m_header, SLOT(updateRebuildProgress(int)));
170  // connect(newModel, SIGNAL(filterProgressRangeChanged(int, int)),
171  // m_header, SLOT(updateFilterProgressRange(int, int)));
172  // connect(newModel, SIGNAL(rebuildProgressRangeChanged(int, int)),
173  // m_header, SLOT(updateRebuildProgressRange(int, int)));
174  // connect(newModel, SIGNAL(filterCountsChanged(int, int)),
175  // m_header, SLOT(handleFilterCountsChanged(int, int)));
176  // connect(m_header, SIGNAL(requestedGlobalSelection(bool)),
177  // newModel, SLOT(setGlobalSelection(bool)));
178  // connect(m_header, SIGNAL(requestedGlobalSelection(bool)),
179  // this, SLOT(onModelSelectionChanged()));
180  // connect(m_header, SIGNAL(requestedGlobalSelection(bool)),
181  // this, SIGNAL(selectionChanged()));
182  //
183  // m_columns = newModel->getColumns();
184  //
185  // // Add a column for row numbers and global selection.
186  // m_columns->prepend(new TableColumn("", true, false));
187  //
188  // for (int i = 0; i < m_columns->size(); i++)
189  // {
190  // TableColumn * column = (*m_columns)[i];
191  //
192  // column->setWidth(QFontMetrics(font()).width(column->getTitle()) + 25);
193  // connect(column, SIGNAL(visibilityChanged()), m_header, SLOT(update()));
194  // connect(column, SIGNAL(visibilityChanged()), m_content, SLOT(refresh()));
195  // connect(column, SIGNAL(visibilityChanged()),
196  // m_content, SLOT(updateHorizontalScrollBar()));
197  // connect(column, SIGNAL(widthChanged()), m_content, SLOT(refresh()));
198  // }
199  //
200  // m_header->setColumns(m_columns);
201  // m_content->setModel(newModel);
202  // m_header->update();
203  // }
204  // }
205 
206 
207  void TableView::displayWarning(AbstractTableModel::Warning warning) {
208  switch (warning) {
209  case AbstractTableModel::SortingDisabled:
210  m_warningLabel->setText(tr("<font color='red'>Sorting disabled</font>"));
211  m_warningLabel->setVisible(true);
212  break;
213 
214  case AbstractTableModel::SortingTableSizeLimitReached:
215  m_warningLabel->setText(
216  tr("<font color='red'>Sorting disabled - table row count (%L1) > table size limit"
217  " (%L2)</font>")
218  .arg(m_content->getModel()->getVisibleRowCount())
219  .arg(m_content->getModel()->sortLimit()));
220  m_warningLabel->setVisible(true);
221  break;
222 
223  case AbstractTableModel::None:
224  m_warningLabel->setText(tr(""));
225  m_warningLabel->setVisible(false);
226  break;
227  }
228  }
229 
230 
231  void TableView::handleModelSelectionChanged() {
232  m_content->refresh();
233  }
234 
235 
236  void TableView::handleModelSelectionChanged(
237  QList< AbstractTreeItem * > newlySelectedItems) {
238  m_content->refresh();
239  m_content->scrollTo(newlySelectedItems);
240  }
241 
242 
243  void TableView::nullify() {
244  m_header = NULL;
245  m_content = NULL;
246  m_columns = NULL;
247  m_model = NULL;
248  m_settingsPath = NULL;
249  }
250  }
251 }

U.S. Department of the Interior | U.S. Geological Survey
ISIS | Privacy & Disclaimers | Astrogeology Research Program
To contact us, please post comments and questions on the ISIS Support Center
File Modified: 07/12/2023 23:30:28