Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
QmitkFileReaderWriterOptionsWidget.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 <QFormLayout>
16 
17 #include <limits>
18 
19 static QString GetAnyWidgetLabel(const std::string &name)
20 {
21  QString label;
22  // get the last segment from the option name and use it as the label
23  std::string::size_type pos = name.find_last_of('.');
24  if (pos == std::string::npos)
25  {
26  label = QString::fromStdString(name);
27  }
28  else if (pos < name.length() - 1)
29  {
30  label = QString::fromStdString(name.substr(pos + 1));
31  }
32  return label;
33 }
34 
35 static QWidget *GetAnyWidget(const std::string &name, const us::Any &any, const std::string &defaultValue)
36 {
37  const std::type_info &anyType = any.Type();
38 
39  if (anyType == typeid(std::string))
40  {
41  return new QmitkAnyStringWidget(name, any);
42  }
43  else if (anyType == typeid(std::vector<std::string>))
44  {
45  return new QmitkAnyVectorWidget(name, any, QString::fromStdString(defaultValue));
46  }
47  // else if (anyType == typeid(std::list<std::string>))
48  // {
49  // const std::list<std::string>& list = ref_any_cast<std::list<std::string> >(m_Any);
50  // for (std::list<std::string>::const_iterator it = list.begin();
51  // it != list.end(); ++it)
52  // {
53  // }
54  // }
55  else if (anyType == typeid(bool))
56  {
57  return new QmitkAnyBoolWidget(name, any);
58  }
59  else if (anyType == typeid(short))
60  {
61  return new QmitkAnyShortWidget(name, any);
62  }
63  else if (anyType == typeid(int))
64  {
65  return new QmitkAnyIntWidget(name, any);
66  }
67  else if (anyType == typeid(unsigned short))
68  {
69  return new QmitkAnyUShortWidget(name, any);
70  }
71  else if (anyType == typeid(unsigned int))
72  {
73  return new QmitkAnyUIntWidget(name, any);
74  }
75  else if (anyType == typeid(float))
76  {
77  return new QmitkAnyFloatWidget(name, any);
78  }
79  else if (anyType == typeid(double))
80  {
81  return new QmitkAnyDoubleWidget(name, any);
82  }
83  else
84  {
85  return new QmitkInvalidAnyWidget(name, any);
86  }
87 }
88 
90  : QWidget(parent)
91 {
92  Options filteredOptions = options;
93  std::map<std::string, std::string> optionToDefaultValue;
94  for (const auto &option : options)
95  {
96  const std::string &name = option.first;
97  if (name.size() > 4 && name.substr(name.size() - 4) == "enum")
98  {
99  filteredOptions.erase(name);
100 
101  std::string nameWithoutEnum = name.substr(0, name.size() - 5);
102  us::Any value = filteredOptions[nameWithoutEnum];
103  if (!value.Empty())
104  {
105  optionToDefaultValue[nameWithoutEnum] = value.ToString();
106  }
107  filteredOptions[nameWithoutEnum] = option.second;
108  }
109  }
110 
111  auto formLayout = new QFormLayout();
112  for (Options::const_iterator iter = filteredOptions.begin(), iterEnd = filteredOptions.end(); iter != iterEnd; ++iter)
113  {
114  formLayout->addRow(GetAnyWidgetLabel(iter->first),
115  GetAnyWidget(iter->first, iter->second, optionToDefaultValue[iter->first]));
116  }
117 
118  this->setLayout(formLayout);
119 }
120 
122 {
123  Options options;
124 
125  QFormLayout *layout = qobject_cast<QFormLayout *>(this->layout());
126  const int rows = layout->rowCount();
127  for (int i = 0; i < rows; ++i)
128  {
129  QmitkAnyAdapter *anyAdapter = dynamic_cast<QmitkAnyAdapter *>(layout->itemAt(i, QFormLayout::FieldRole)->widget());
130  if (anyAdapter)
131  {
132  options.insert(std::make_pair(anyAdapter->GetName(), anyAdapter->GetAny()));
133  }
134  }
135  return options;
136 }
137 
138 QmitkAnyStringWidget::QmitkAnyStringWidget(const std::string &name, const us::Any &any, QWidget *parent)
139  : QLineEdit(parent), QmitkAnyAdapter(name)
140 {
141  this->setText(QString::fromStdString(any.ToString()));
142 }
143 
145 {
146  return us::Any(this->text().toStdString());
147 }
148 
149 QmitkAnyBoolWidget::QmitkAnyBoolWidget(const std::string &name, const us::Any &any, QWidget *parent)
150  : QCheckBox(parent), QmitkAnyAdapter(name)
151 {
152  this->setChecked(us::any_cast<bool>(any));
153 }
154 
156 {
157  return us::Any(this->isChecked());
158 }
159 
160 QmitkAnyShortWidget::QmitkAnyShortWidget(const std::string &name, const us::Any &any, QWidget *parent)
161  : QSpinBox(parent), QmitkAnyAdapter(name)
162 {
164  this->setValue(us::any_cast<short>(any));
165 }
166 
168 {
169  return us::Any(static_cast<short>(this->value()));
170 }
171 
172 QmitkAnyUShortWidget::QmitkAnyUShortWidget(const std::string &name, const us::Any &any, QWidget *parent)
173  : QSpinBox(parent), QmitkAnyAdapter(name)
174 {
176  this->setValue(us::any_cast<unsigned short>(any));
177 }
178 
180 {
181  return us::Any(static_cast<unsigned short>(this->value()));
182 }
183 
184 QmitkAnyIntWidget::QmitkAnyIntWidget(const std::string &name, const us::Any &any, QWidget *parent)
185  : QSpinBox(parent), QmitkAnyAdapter(name)
186 {
188  this->setValue(us::any_cast<int>(any));
189 }
190 
192 {
193  return us::Any(this->value());
194 }
195 
196 QmitkAnyUIntWidget::QmitkAnyUIntWidget(const std::string &name, const us::Any &any, QWidget *parent)
197  : QSpinBox(parent), QmitkAnyAdapter(name)
198 {
200  this->setValue(us::any_cast<unsigned int>(any));
201 }
202 
204 {
205  return us::Any(static_cast<unsigned int>(this->value()));
206 }
207 
208 QmitkAnyFloatWidget::QmitkAnyFloatWidget(const std::string &name, const us::Any &any, QWidget *parent)
209  : QDoubleSpinBox(parent), QmitkAnyAdapter(name)
210 {
212  this->setValue(static_cast<double>(us::any_cast<float>(any)));
213 }
214 
216 {
217  return us::Any(static_cast<float>(this->value()));
218 }
219 
220 QmitkAnyDoubleWidget::QmitkAnyDoubleWidget(const std::string &name, const us::Any &any, QWidget *parent)
221  : QDoubleSpinBox(parent), QmitkAnyAdapter(name)
222 {
224  this->setValue(us::any_cast<double>(any));
225 }
226 
228 {
229  return us::Any(this->value());
230 }
231 
232 QmitkInvalidAnyWidget::QmitkInvalidAnyWidget(const std::string &name, const us::Any &any, QWidget *parent)
233  : QLabel(parent), QmitkAnyAdapter(name)
234 {
235  this->setText(QString("Unknown option type '%1'").arg(any.Type().name()));
236 }
237 
239 {
240  return us::Any();
241 }
242 
244  const us::Any &any,
245  const QString &defaultValue,
246  QWidget *parent)
247  : QComboBox(parent), QmitkAnyAdapter(name)
248 {
249  const std::vector<std::string> &entries = us::ref_any_cast<std::vector<std::string>>(any);
250  int index = 0;
251  int defaultIndex = 0;
252  for (auto iter = entries.begin(), iterEnd = entries.end(); iter != iterEnd; ++iter, ++index)
253  {
254  QString item = QString::fromStdString(*iter);
255  this->addItem(item);
256  if (item == defaultValue)
257  {
258  defaultIndex = index;
259  }
260  }
261  this->setCurrentIndex(defaultIndex);
262 }
263 
265 {
266  return us::Any(std::string(this->currentText().toStdString()));
267 }
QmitkAnyUIntWidget(const std::string &name, const us::Any &any, QWidget *parent=nullptr)
virtual us::Any GetAny() const =0
QmitkAnyFloatWidget(const std::string &name, const us::Any &any, QWidget *parent=nullptr)
static QString GetAnyWidgetLabel(const std::string &name)
QmitkAnyUShortWidget(const std::string &name, const us::Any &any, QWidget *parent=nullptr)
bool Empty() const
Definition: usAny.h:246
std::string ToString() const
Definition: usAny.h:257
QmitkFileReaderWriterOptionsWidget(const Options &options, QWidget *parent=nullptr)
const std::type_info & Type() const
Definition: usAny.h:278
Definition: usAny.h:163
QmitkAnyVectorWidget(const std::string &name, const us::Any &any, const QString &defaultValue, QWidget *parent=nullptr)
QmitkAnyShortWidget(const std::string &name, const us::Any &any, QWidget *parent=nullptr)
static T max(T x, T y)
Definition: svm.cpp:56
const ValueType & ref_any_cast(const Any &operand)
Definition: usAny.h:449
static T min(T x, T y)
Definition: svm.cpp:53
QmitkAnyIntWidget(const std::string &name, const us::Any &any, QWidget *parent=nullptr)
QmitkAnyStringWidget(const std::string &name, const us::Any &any, QWidget *parent=nullptr)
static QWidget * GetAnyWidget(const std::string &name, const us::Any &any, const std::string &defaultValue)
QmitkAnyBoolWidget(const std::string &name, const us::Any &any, QWidget *parent=nullptr)
QmitkInvalidAnyWidget(const std::string &name, const us::Any &any, QWidget *parent=nullptr)
QmitkAnyDoubleWidget(const std::string &name, const us::Any &any, QWidget *parent=nullptr)