Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
I/Qmitk/QmitkMapPropertyDelegate.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 
13 #ifndef NOMINMAX
14 #define NOMINMAX
15 #endif
16 
18 
19 #include <QmitkCustomVariants.h>
20 
21 #include <mitkRenderingManager.h>
22 
23 #include <QApplication>
24 #include <QCheckBox>
25 #include <QColorDialog>
26 #include <QComboBox>
27 #include <QDoubleSpinBox>
28 #include <QLabel>
29 #include <QMessageBox>
30 #include <QPainter>
31 #include <QPen>
32 #include <QPushButton>
33 #include <QStringList>
34 #include <bitset>
35 
37 {
38 }
39 
40 void QmitkMapPropertyDelegate::paint(QPainter *painter,
41  const QStyleOptionViewItem &option,
42  const QModelIndex &index) const
43 {
44  QVariant data = index.data(Qt::DisplayRole);
45 
46  QString name = data.value<QString>();
47 
48  QStyledItemDelegate::paint(painter, option, index);
49 }
50 
51 QWidget *QmitkMapPropertyDelegate::createEditor(QWidget *parent,
52  const QStyleOptionViewItem &option,
53  const QModelIndex &index) const
54 {
55  QVariant data = index.data(Qt::EditRole);
56  QVariant displayData = index.data(Qt::DisplayRole);
57  QString name = index.model()->data(index.model()->index(index.row(), index.column() - 1)).value<QString>();
58 
59  if (data.isValid())
60  {
61  QWidget *editorWidget = nullptr;
62 
63  if (data.type() == QVariant::Int)
64  {
65  QSpinBox *spinBox = new QSpinBox(parent);
66  spinBox->setSingleStep(1);
67  spinBox->setMinimum(std::numeric_limits<int>::min());
68  spinBox->setMaximum(std::numeric_limits<int>::max());
69  editorWidget = spinBox;
70  }
71  // see qt documentation. cast is correct, it would be obsolete if we
72  // store doubles
73  else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::Float)
74  {
75  QDoubleSpinBox *spinBox = new QDoubleSpinBox(parent);
76  spinBox->setDecimals(5);
77  spinBox->setSingleStep(0.1);
78  spinBox->setMinimum(std::numeric_limits<float>::min());
79  spinBox->setMaximum(std::numeric_limits<float>::max());
80 
81  editorWidget = spinBox;
82  }
83  else if (data.type() == QVariant::StringList)
84  {
85  QStringList entries = data.value<QStringList>();
86  QComboBox *comboBox = new QComboBox(parent);
87  comboBox->setEditable(false);
88  comboBox->addItems(entries);
89 
90  editorWidget = comboBox;
91  }
92  else
93  {
94  editorWidget = QStyledItemDelegate::createEditor(parent, option, index);
95  }
96 
97  if (editorWidget)
98  {
99  // install event filter
100  editorWidget->installEventFilter(const_cast<QmitkMapPropertyDelegate *>(this));
101  }
102 
103  return editorWidget;
104  }
105  else
106  return new QLabel(displayData.toString(), parent);
107 }
108 
109 void QmitkMapPropertyDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
110 {
111  QVariant data = index.data(Qt::EditRole);
112  QVariant displayData = index.data(Qt::DisplayRole);
113 
114  std::cout << "Set EDITOR DATA : " << data.toDouble() << std::endl;
115 
116  if (data.isValid())
117  {
118  if (data.type() == QVariant::Int)
119  {
120  QSpinBox *spinBox = qobject_cast<QSpinBox *>(editor);
121  spinBox->setValue(data.toInt());
122  }
123  // see qt documentation. cast is correct, it would be obsolete if we
124  // store doubles
125  else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::Float)
126  {
127  QDoubleSpinBox *spinBox = qobject_cast<QDoubleSpinBox *>(editor);
128  spinBox->setValue(data.toDouble());
129 
130  std::cout << "Set EDITOR DATA : " << spinBox->value() << std::endl;
131  }
132 
133  else if (data.type() == QVariant::StringList)
134  {
135  QComboBox *comboBox = qobject_cast<QComboBox *>(editor);
136  QString displayString = displayData.value<QString>();
137  comboBox->setCurrentIndex(comboBox->findData(displayString));
138  }
139 
140  else
141  return QStyledItemDelegate::setEditorData(editor, index);
142  }
143 }
144 
145 void QmitkMapPropertyDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
146 {
147  QVariant data = index.data(Qt::EditRole);
148  QVariant displayData = index.data(Qt::DisplayRole);
149 
150  if (data.isValid())
151  {
152  if (data.type() == QVariant::Color)
153  {
154  QWidget *colorBtn = qobject_cast<QWidget *>(editor);
155  QVariant colorVariant;
156  colorVariant.setValue<QColor>(colorBtn->palette().color(QPalette::Button));
157  model->setData(index, colorVariant);
158  }
159 
160  else if (data.type() == QVariant::Int)
161  {
162  QSpinBox *spinBox = qobject_cast<QSpinBox *>(editor);
163  int intValue = spinBox->value();
164 
165  QVariant intValueVariant;
166  intValueVariant.setValue<float>(static_cast<float>(intValue));
167  model->setData(index, intValueVariant);
168  }
169 
170  else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::Float)
171  {
172  QDoubleSpinBox *spinBox = qobject_cast<QDoubleSpinBox *>(editor);
173  double doubleValue = spinBox->value();
174 
175  std::cout << "SET MODEL DATA << FLOAT : " << doubleValue << std::endl;
176 
177  QVariant doubleValueVariant;
178  doubleValueVariant.setValue<float>(static_cast<float>(doubleValue));
179  std::cout << "SET MODEL DATA << Variant : " << doubleValue << std::endl;
180  model->setData(index, doubleValueVariant);
181  }
182 
183  else if (data.type() == QVariant::StringList)
184  {
185  QString displayData = data.value<QString>();
186 
187  QComboBox *comboBox = qobject_cast<QComboBox *>(editor);
188  QString comboBoxValue = comboBox->currentText();
189 
190  QVariant comboBoxValueVariant;
191  comboBoxValueVariant.setValue<QString>(comboBoxValue);
192  model->setData(index, comboBoxValueVariant);
193  }
194 
195  else
196  QStyledItemDelegate::setModelData(editor, model, index);
197  }
198 }
199 
200 void QmitkMapPropertyDelegate::commitAndCloseEditor()
201 {
202  QWidget *editor = nullptr;
203  if (QPushButton *pushBtn = qobject_cast<QPushButton *>(sender()))
204  {
205  editor = pushBtn;
206  }
207 
208  if (editor)
209  {
210  emit commitData(editor);
211  emit closeEditor(editor);
212  }
213 }
214 
216  const QStyleOptionViewItem &option,
217  const QModelIndex & /*index*/) const
218 {
219  editor->setGeometry(option.rect);
220 }
221 
222 void QmitkMapPropertyDelegate::ComboBoxCurrentIndexChanged(int /*index*/)
223 {
224  if (QComboBox *comboBox = qobject_cast<QComboBox *>(sender()))
225  {
226  emit commitData(comboBox);
227  emit closeEditor(comboBox);
228  }
229 }
230 
231 void QmitkMapPropertyDelegate::SpinBoxValueChanged(const QString & /*value*/)
232 {
233  QAbstractSpinBox *spinBox = nullptr;
234  if ((spinBox = qobject_cast<QSpinBox *>(sender())) || (spinBox = qobject_cast<QDoubleSpinBox *>(sender())))
235  {
236  emit commitData(spinBox);
237  emit closeEditor(spinBox);
238  }
239 }
240 
241 void QmitkMapPropertyDelegate::showColorDialog()
242 {
243 }
244 
245 bool QmitkMapPropertyDelegate::eventFilter(QObject *o, QEvent *e)
246 {
247  // filter all kind of events on our editor widgets
248  // when certain events occur, repaint all render windows, because rendering relevant properties might have changed
249  switch (e->type())
250  {
251  case QEvent::KeyRelease:
252  case QEvent::MouseButtonRelease:
253  case QEvent::MouseButtonDblClick:
254  case QEvent::Wheel:
255  case QEvent::FocusIn:
256  {
257  if (QWidget *editor = dynamic_cast<QWidget *>(o))
258  {
259  emit commitData(editor);
260  }
261  break;
262  }
263  default:
264  {
265  break;
266  }
267  }
268 
269  return false;
270 }
signed integer value
Definition: jsoncpp.h:348
bool eventFilter(QObject *o, QEvent *e)
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
static T max(T x, T y)
Definition: svm.cpp:56
int Int
Definition: jsoncpp.h:158
std::vector< std::string > StringList
itk::RGBPixel< float > Color
Color Standard RGB color typedef (float)
static T min(T x, T y)
Definition: svm.cpp:53
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
Fit an editor to some geometry (overwritten from QItemDelegate)
void setEditorData(QWidget *editor, const QModelIndex &index) const