Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
QmitkLevelWindowPresetDefinitionDialog.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
14 
15 #include <QHeaderView>
16 #include <QMessageBox>
17 #include <QTableWidgetItem>
18 
20  : QDialog(parent, f), m_TableModel(nullptr), m_SortModel(this)
21 {
22  this->setupUi(this);
23 
24  QObject::connect(addButton, SIGNAL(clicked()), this, SLOT(addPreset()));
25  QObject::connect(removeButton, SIGNAL(clicked()), this, SLOT(removePreset()));
26  QObject::connect(changeButton, SIGNAL(clicked()), this, SLOT(changePreset()));
27 
28  QObject::connect(presetView->horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(sortPresets(int)));
29 
30  presetView->verticalHeader()->setVisible(false);
31  presetView->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
32 
33  presetView->setModel(&m_SortModel);
34 }
35 
37 {
38  delete m_TableModel;
39 }
40 
42 {
43  static Qt::SortOrder order[3] = {Qt::AscendingOrder};
44 
45  presetView->sortByColumn(index, order[index]);
46  if (order[index] == Qt::AscendingOrder)
47  order[index] = Qt::DescendingOrder;
48  else
49  order[index] = Qt::AscendingOrder;
50 }
51 
53 {
54  QDialog::resizeEvent(event);
55 
56  this->resizeColumns();
57 }
58 
60 {
61  this->resizeColumns();
62 
63  QDialog::showEvent(event);
64 }
65 
67 {
68  int width = presetView->viewport()->size().width() - presetView->columnWidth(1) - presetView->columnWidth(2);
69  if (width < 50)
70  width = 50;
71 
72  presetView->setColumnWidth(0, width);
73 }
74 
76 {
77  std::string name(presetnameLineEdit->text().toStdString());
78  if (m_TableModel->contains(name))
79  {
80  QMessageBox::critical(this,
81  "Preset definition",
82  "Presetname already exists.\n"
83  "You have to enter another one.");
84  }
85  else if (presetnameLineEdit->text() == "")
86  {
87  QMessageBox::critical(this,
88  "Preset definition",
89  "Presetname has to be set.\n"
90  "You have to enter a Presetname.");
91  }
92  else
93  {
94  m_TableModel->addPreset(name, levelSpinBox->value(), windowSpinBox->value());
95  }
96 }
97 
99 {
100  QModelIndex index(m_SortModel.mapToSource(presetView->selectionModel()->currentIndex()));
101 
102  if (!index.isValid())
103  return;
104 
105  m_TableModel->removePreset(index);
106 }
107 
109 {
110  QModelIndex index(m_SortModel.mapToSource(presetView->selectionModel()->currentIndex()));
111 
112  if (!index.isValid())
113  return;
114 
115  std::string name(presetnameLineEdit->text().toStdString());
116  if (name == "")
117  {
118  QMessageBox::critical(this,
119  "Preset definition",
120  "Presetname has to be set.\n"
121  "You have to enter a Presetname.");
122  }
123  else if (m_TableModel->contains(name) &&
124  (m_TableModel->getPreset(index).name != name))
125  {
126  QMessageBox::critical(this,
127  "Preset definition",
128  "Presetname already exists.\n"
129  "You have to enter another one.");
130  }
131  else
132  {
133  m_TableModel->changePreset(index.row(), name, levelSpinBox->value(), windowSpinBox->value());
134  }
135 }
136 
137 void QmitkLevelWindowPresetDefinitionDialog::setPresets(std::map<std::string, double> &level,
138  std::map<std::string, double> &window,
139  QString initLevel,
140  QString initWindow)
141 {
142  levelSpinBox->setValue(initLevel.toInt());
143  windowSpinBox->setValue(initWindow.toInt());
144 
145  delete m_TableModel;
146  m_TableModel = new PresetTableModel(level, window, this);
147 
148  m_SortModel.setSourceModel(m_TableModel);
149 
150  QObject::connect(presetView->selectionModel(),
151  SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)),
152  this,
153  SLOT(ListViewSelectionChanged(const QItemSelection &, const QItemSelection &)));
154 
155  this->sortPresets(0);
156 
157  presetView->resizeColumnsToContents();
158 }
159 
161 {
162  std::map<std::string, double> levels;
163  m_TableModel->getLevels(levels);
164  return levels;
165 }
166 
168 {
169  std::map<std::string, double> windows;
170  m_TableModel->getWindows(windows);
171  return windows;
172 }
173 
175  const QItemSelection & /*deselected*/)
176 {
177  QModelIndexList indexes(selected.indexes());
178  if (indexes.empty())
179  {
180  presetnameLineEdit->setText("");
181  levelSpinBox->setValue(0);
182  windowSpinBox->setValue(0);
183  }
184  else
185  {
186  // use the sorted index to get the entry
187  PresetTableModel::Entry entry(m_TableModel->getPreset((m_SortModel.mapToSource(indexes.first()))));
188  presetnameLineEdit->setText(QString(entry.name.c_str()));
189  levelSpinBox->setValue((int)entry.level);
190  windowSpinBox->setValue((int)entry.window);
191  }
192 }
193 
195  std::map<std::string, double> &windows,
196  QObject *parent)
197  : QAbstractTableModel(parent)
198 {
199  for (auto iter = levels.begin(); iter != levels.end(); ++iter)
200  {
201  m_Entries.push_back(Entry(iter->first, iter->second, windows[iter->first]));
202  }
203 }
204 
206 {
207  for (auto iter = m_Entries.begin(); iter != m_Entries.end(); ++iter)
208  {
209  levels[iter->name] = iter->level;
210  }
211 }
212 
214 {
215  for (auto iter = m_Entries.begin(); iter != m_Entries.end(); ++iter)
216  {
217  windows[iter->name] = iter->window;
218  }
219 }
220 
221 void QmitkLevelWindowPresetDefinitionDialog::PresetTableModel::addPreset(std::string &name, double level, double window)
222 {
223  this->beginInsertRows(QModelIndex(), (int)m_Entries.size(), (int)m_Entries.size());
224 
225  m_Entries.push_back(Entry(name, level, window));
226 
227  this->endInsertRows();
228 }
229 
231 {
232  for (auto iter = m_Entries.begin(); iter != m_Entries.end(); ++iter)
233  {
234  if (iter->name == name)
235  return true;
236  }
237 
238  return false;
239 }
240 
242 {
243  int row = index.row();
244 
245  this->beginRemoveRows(QModelIndex(), row, row);
246 
247  m_Entries.erase(m_Entries.begin() + row);
248 
249  this->endRemoveRows();
250 }
251 
253  std::string &name,
254  double level,
255  double window)
256 {
257  m_Entries[row].name = name;
258  m_Entries[row].level = level;
259  m_Entries[row].window = window;
260 
261  this->dataChanged(index(row, 0), index(row, 2));
262 }
263 
266 {
267  int row = index.row();
268 
269  if (row < 0 || (unsigned int)row >= m_Entries.size())
270  return Entry("", 0, 0);
271 
272  return m_Entries[row];
273 }
274 
276 {
277  return (int)m_Entries.size();
278 }
279 
281 {
282  return 3;
283 }
284 
285 QVariant QmitkLevelWindowPresetDefinitionDialog::PresetTableModel::data(const QModelIndex &index, int role) const
286 {
287  if (role == Qt::DisplayRole)
288  {
289  switch (index.column())
290  {
291  case 0:
292  return QVariant(QString(m_Entries[index.row()].name.c_str()));
293  case 1:
294  {
295  return QVariant(m_Entries[index.row()].level);
296  }
297  case 2:
298  return QVariant(m_Entries[index.row()].window);
299  }
300  }
301 
302  return QVariant();
303 }
304 
306  Qt::Orientation orientation,
307  int role) const
308 {
309  if (role == Qt::DisplayRole && orientation == Qt::Horizontal)
310  {
311  switch (section)
312  {
313  case 0:
314  return QVariant("Preset");
315  case 1:
316  return QVariant("Level");
317  case 2:
318  return QVariant("Window");
319  }
320  }
321 
322  return QVariant();
323 }
PresetTableModel(std::map< std::string, double > &levels, std::map< std::string, double > &windows, QObject *parent=nullptr)
void ListViewSelectionChanged(const QItemSelection &, const QItemSelection &)
void setPresets(std::map< std::string, double > &level, std::map< std::string, double > &window, QString initLevel, QString initWindow)
QmitkLevelWindowPresetDefinitionDialog(QWidget *parent=nullptr, Qt::WindowFlags f=nullptr)
void changePreset(int row, std::string &name, double level, double window)
QVariant headerData(int section, Qt::Orientation orientation, int) const override