Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
QmitkNDIToolDelegate.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 
14 #include "QmitkNDIToolDelegate.h"
15 #include <QStringList>
16 #include <QComboBox>
17 #include <QLabel>
18 #include <QFileDialog>
19 
20 #include "QmitkEnums.h"
22 #include "QmitkCustomVariants.h"
23 #include "mitkDataStorage.h"
24 #include "mitkNodePredicateBase.h"
26 #include "mitkNDIPassiveTool.h"
27 
28 Q_DECLARE_METATYPE(mitk::NDIPassiveTool*)
29 
30 
31 QmitkNDIToolDelegate::QmitkNDIToolDelegate(QObject * parent) : QStyledItemDelegate(parent),
32 m_Types(), m_DataStorage(nullptr), m_Predicate(nullptr), m_TagProperty(nullptr), m_TagPropertyName()
33 {
34 }
35 
36 
37 QWidget* QmitkNDIToolDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
38 {
39  if (index.isValid() == false)
40  return QStyledItemDelegate::createEditor(parent, option, index);
41 
42  switch (index.column())
43  {
44  case SROMCol:
45  {
46  return new QLabel("", parent);
47  }
48  case TypeCol:
49  {
50  auto c = new QComboBox(parent);
51  c->addItems(m_Types);
52  return c;
53  }
54  case NodeCol:
55  {
56  return new QmitkDataStorageComboBox(m_DataStorage, m_Predicate, parent);
57  }
58  case IndexCol:
59  case NameCol:
60  case StatusCol:
61  default:
62  return QStyledItemDelegate::createEditor(parent, option, index);
63  }
64 }
65 
66 
67 void QmitkNDIToolDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
68 {
69  if (index.isValid() == false)
70  return;
71 
72  switch (index.column())
73  {
74  case SROMCol:
75  {
76  QLabel* l = qobject_cast<QLabel*>(editor);
77  if (l->text().isEmpty())
78  {
79  QString fileName = index.data(/*mitk::FileNameRole*/).value<QString>();
80  fileName = QFileDialog::getOpenFileName(editor, "Open SROM file", fileName, "SROM files (*.rom)");
81  QLabel* l = qobject_cast<QLabel*>(editor);
82  l->setText(fileName);
83  }
84  return;
85  }
86  case TypeCol:
87  {
88  QString type = index.data(/*mitk::TypeRole*/).value<QString>();
89  QComboBox* c = qobject_cast<QComboBox*>(editor);
90  c->setCurrentIndex(c->findText(type));
91  connect(c, SIGNAL(currentIndexChanged(int)), this, SLOT(ComboBoxCurrentIndexChanged(int)));
92  return;
93  }
94  case NodeCol:
95  {
96  mitk::DataNode::Pointer n = index.data(/*mitk::OrganNodeRole*/).value<mitk::DataNode::Pointer>();
97  if (n.IsNotNull())
98  {
99  QmitkDataStorageComboBox* dsc = qobject_cast<QmitkDataStorageComboBox*>(editor);
100  dsc->setCurrentIndex(dsc->findText(QString::fromStdString(n->GetName())));
101  connect(dsc, SIGNAL(currentIndexChanged(int)), this, SLOT(ComboBoxCurrentIndexChanged(int)));
102  }
103  return;
104  }
105  case IndexCol:
106  case NameCol:
107  case StatusCol:
108  default:
109  QStyledItemDelegate::setEditorData(editor, index);
110  }
111 }
112 
113 
114 void QmitkNDIToolDelegate::setModelData(QWidget *editor, QAbstractItemModel* model, const QModelIndex &index) const
115 {
116  if (index.isValid() == false)
117  return;
118 
119  switch (index.column())
120  {
121  case SROMCol:
122  {
123  QLabel* l = qobject_cast<QLabel*>(editor);
124  //model->setData(index, l->text(), mitk::FileNameRole);
125  //model->setData(index, l->text(), Qt::DisplayRole); // use for display too
126  model->setData(index, l->text()); // use for display too
127  return;
128  }
129  case TypeCol:
130  {
131  QComboBox* c = qobject_cast<QComboBox*>(editor);
132  //model->setData(index, c->currentText(), mitk::TypeRole);
133  model->setData(index, c->currentText(), Qt::DisplayRole);
134  return;
135  }
136  case NodeCol:
137  {
138  QmitkDataStorageComboBox* dsc = qobject_cast<QmitkDataStorageComboBox*>(editor);
139  if (dsc->GetSelectedNode().IsNotNull())
140  {
141  model->setData(index, qVariantFromValue(dsc->GetSelectedNode()), OrganNodeRole);
142  //model->setData(index, QString::fromStdString(dsc->GetSelectedNode()->GetName()), Qt::DisplayRole);
143  model->setData(index, QString::fromStdString(dsc->GetSelectedNode()->GetName()));
144  if ((m_TagProperty.IsNotNull()) && (m_TagPropertyName.empty() == false)) // tag this node as selected
145  dsc->GetSelectedNode()->SetProperty(m_TagPropertyName.c_str(), m_TagProperty);
146  }
147  }
148  return;
149  case IndexCol:
150  case NameCol:
151  case StatusCol:
152  default:
153  QStyledItemDelegate::setModelData(editor, model, index);
154  }
155 }
156 
157 void QmitkNDIToolDelegate::commitAndCloseEditor()
158 {
159  //QWidget* editor = 0;
160  //if(QPushButton *pushBtn = qobject_cast<QPushButton *>(sender()))
161  //{
162 
163  //}
164 
165  //if(editor)
166  //{
167  //emit commitData(editor);
168  //emit closeEditor(editor);
169  //}
170 
171 }
172 
173 
174 void QmitkNDIToolDelegate::ComboBoxCurrentIndexChanged( int /*index*/ )
175 {
176  if(QComboBox *comboBox = qobject_cast<QComboBox *>(sender()))
177  {
178  emit commitData(comboBox);
179  emit closeEditor(comboBox);
180  }
181 }
182 
183 
184 void QmitkNDIToolDelegate::SetTypes( const QStringList& types )
185 {
186  m_Types = types;
187 }
188 
189 
191 {
192  m_DataStorage = ds;
193 }
194 
195 
197 {
198  m_Predicate = p;
199 }
200 
201 
203 {
204  m_TagProperty = prop;
205 }
206 
207 void QmitkNDIToolDelegate::SetTagPropertyName( const std::string& name )
208 {
209  m_TagPropertyName = name;
210 }
virtual mitk::DataNode::Pointer GetSelectedNode() const
Returns the selected dataNode or 0 if there is none.
void SetDataStorage(mitk::DataStorage *ds)
set datastorage for organ node editor
Data management class that handles &#39;was created by&#39; relations.
Displays all or a subset (defined by a predicate) of nodes of the Data Storage.
void SetPredicate(mitk::NodePredicateBase::Pointer p)
set predicate for organ node editor
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
An item delegate for rendering and editing mitk::Properties in a QTableView.
void SetTagProperty(mitk::BaseProperty::Pointer prop)
set the property that is used to tag selected nodes
mitk::DataStorage::Pointer m_DataStorage
void setEditorData(QWidget *editor, const QModelIndex &index) const override
Implementation of a passive NDI optical tool.
QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
void SetTypes(const QStringList &types)
set types list for type editor combobox
void SetTagPropertyName(const std::string &name)
set name of the property that is used to tag selected nodes