NorMIT-nav  22.09
An IGT application
cxRegistrationWidget.cpp
Go to the documentation of this file.
1 /*=========================================================================
2 This file is part of CustusX, an Image Guided Therapy Application.
3 
4 Copyright (c) SINTEF Department of Medical Technology.
5 All rights reserved.
6 
7 CustusX is released under a BSD 3-Clause license.
8 
9 See Lisence.txt (https://github.com/SINTEFMedtek/CustusX/blob/master/License.txt) for details.
10 =========================================================================*/
11 
12 #include "cxRegistrationWidget.h"
13 #include <boost/bind.hpp>
14 #include <boost/function.hpp>
15 #include <QLabel>
16 #include <QVBoxLayout>
17 #include <QGroupBox>
18 #include <QStackedWidget>
19 #include <QComboBox>
20 #include <QStringList>
21 
22 #include "cxTypeConversions.h"
23 #include "cxLogger.h"
26 #include "cxRegistrationService.h"
27 #include "cxPatientModelService.h"
28 #include "cxStringProperty.h"
29 #include "cxProfile.h"
30 
31 namespace cx
32 {
33 
34 RegistrationTypeWidget::RegistrationTypeWidget(QString type, QString defVal, XmlOptionFile options, QWidget* parent) :
35  BaseWidget(parent, type, type),
36  mOptions(options)
37 {
38  mStackedWidget = new QStackedWidget(this);
39  mStackedWidget->setFocusPolicy(Qt::StrongFocus);
40 
41  QVBoxLayout *layoutV = new QVBoxLayout(this);
42 // layoutV->setMargin(0);
43 
44  mMethodSelector = StringProperty::initialize(type,
45  "Method",
46  "Select registration method",
47  defVal,
48  QStringList(),
49  mOptions.getElement());
50  connect(mMethodSelector.get(), &StringProperty::valueWasSet, this, &RegistrationTypeWidget::onIndexChanged);
51 
52  layoutV->addWidget(new LabeledComboBoxWidget(this, mMethodSelector));
53  layoutV->addWidget(mStackedWidget);
54 }
55 
56 void RegistrationTypeWidget::selectRegistrationMethod(QString selectRegistrationMethod)
57 {
58  mMethodSelector->setValue(selectRegistrationMethod);
59 }
60 
61 void RegistrationTypeWidget::onIndexChanged()
62 {
63  QString method = mMethodSelector->getValue();
64  int pos = mMethodSelector->getValueRange().indexOf(method);
65  mStackedWidget->setCurrentIndex(pos);
66  this->setObjectName(mStackedWidget->currentWidget()->objectName());
67 }
68 
70 {
71  mStackedWidget->addWidget(service->createWidget());
72  QStringList values = mMethodSelector->getValueRange();
73  values << service->getRegistrationMethod();
74  mMethodSelector->setValueRange(values);
75 
76  // initialize if not set
77  if (mMethodSelector->getValue().isEmpty())
78  {
79  mMethodSelector->setValue(service->getRegistrationMethod());
80  }
81 
82  if (mMethodSelector->getValue() == service->getRegistrationMethod())
83  this->onIndexChanged();
84 }
85 
87 {
88  this->removeWidgetFromStackedWidget(service->getWidgetName());
89 
90  QStringList values = mMethodSelector->getValueRange();
91  if (!values.removeOne(service->getRegistrationMethod()))
92  reportWarning("RegistrationWidget::onServiceRemoved: Cannot find and remove service from combobox: "+ service->getRegistrationMethod());
93  mMethodSelector->setValueRange(values);
94 }
95 
96 void RegistrationTypeWidget::removeWidgetFromStackedWidget(QString widgetName)
97 {
98  for(int i = 0; i < mStackedWidget->count(); ++i)
99  {
100  QWidget* widget = mStackedWidget->widget(i);
101  if(widget->objectName() == widgetName)
102  {
103  mStackedWidget->removeWidget(widget);
104  delete widget;
105  }
106  }
107 }
108 
109 
110 //---------------------------------------------------------
111 //---------------------------------------------------------
112 //---------------------------------------------------------
113 
114 
115 RegistrationWidget::RegistrationWidget(ctkPluginContext *pluginContext, QWidget* parent) :
116  TabbedWidget(parent, "org_custusx_registration_gui_widget", "Registration"),
117  mPluginContext(pluginContext),
118  mOptions(profile()->getXmlSettings().descend("RegistrationWidget"))
119 {
120  connect(mTabWidget, &QTabWidget::currentChanged, this, &RegistrationWidget::onCurrentChanged);
121  this->initRegistrationTypesWidgets();
122  this->initServiceListener();
123 }
124 
125 void RegistrationWidget::selectRegistrationMethod(QString registrationType, QString registrationMethodName)
126 {
127  RegistrationTypeWidget* widget = mRegistrationTypeMap[registrationType];
128  if(widget)
129  widget->selectRegistrationMethod(registrationMethodName);
130 }
131 
132 void RegistrationWidget::initRegistrationTypesWidgets()
133 {
134  mRegistrationTypes << "ImageToPatient" << "ImageToImage" << "ImageTransform";
135  QStringList typeDefaults;
136  typeDefaults << "Landmark" << "Landmark" << "";
137 
138  for(int i = 0; i < mRegistrationTypes.count(); ++i)
139  {
140  QString type = mRegistrationTypes[i];
141  RegistrationTypeWidget* widget =
142  new RegistrationTypeWidget(type,
143  typeDefaults[i],
144  mOptions, this);
145 
146  mRegistrationTypeMap[type] = widget;
147  this->addTab(widget, type);
148 
149  }
150 
151  // Create typeselector after the widgets, as the addwidget trigger
152  // a signal that causes type to be overwritten.
153  mTypeSelector = StringProperty::initialize("RegistrationTypes",
154  "Registration Types",
155  "Select registration type",
156  "",
157  mRegistrationTypes,
158  mOptions.getElement());
159  if (mRegistrationTypeMap.count(mTypeSelector->getValue()))
160  mTabWidget->setCurrentWidget(mRegistrationTypeMap[mTypeSelector->getValue()]);
161 }
162 
163 void RegistrationWidget::onCurrentChanged(int index)
164 {
165  if (index<0)
166  return;
167  if (mTypeSelector)
168  mTypeSelector->setValue(mRegistrationTypes[index]);
169 }
170 
171 void RegistrationWidget::initServiceListener()
172 {
173  mServiceListener.reset(new ServiceTrackerListener<RegistrationMethodService>(
174  mPluginContext,
175  boost::bind(&RegistrationWidget::onServiceAdded, this, _1),
176  boost::function<void (RegistrationMethodService*)>(),
177  boost::bind(&RegistrationWidget::onServiceRemoved, this, _1)
178  ));
179  mServiceListener->open();
180 }
181 
182 void RegistrationWidget::onServiceAdded(RegistrationMethodService* service)
183 {
184  QString type = service->getRegistrationType();
185  if(!mRegistrationTypeMap.count(type))
186  {
187  reportError("Unknown registrationType : " + type);
188  return;
189  }
190  mRegistrationTypeMap[type]->addMethod(service);
191 }
192 
193 void RegistrationWidget::onServiceRemoved(RegistrationMethodService *service)
194 {
195  QString type = service->getRegistrationType();
196  mRegistrationTypeMap[type]->removeMethod(service);
197 }
198 
199 } /* namespace cx */
cx::LabeledComboBoxWidget
Composite widget for string selection.
Definition: cxLabeledComboBoxWidget.h:36
cx::XmlOptionFile
Helper class for xml files used to store ssc/cx data.
Definition: cxXmlOptionItem.h:78
cxLogger.h
cx::RegistrationMethodService::getRegistrationMethod
virtual QString getRegistrationMethod()=0
cx::RegistrationMethodService
Registration Method services.
Definition: cxRegistrationMethodService.h:36
cx::TabbedWidget::addTab
void addTab(BaseWidget *newTab, QString newTabName)
Definition: cxTabbedWidget.cpp:37
cx
Namespace for all CustusX production code.
Definition: cx_dev_group_definitions.h:13
cx::BaseWidget
Interface for QWidget which handles widgets uniformly for the system.
Definition: cxBaseWidget.h:88
cx::RegistrationTypeWidget::selectRegistrationMethod
void selectRegistrationMethod(QString registrationMethodName)
Definition: cxRegistrationWidget.cpp:56
cx::RegistrationTypeWidget
Definition: cxRegistrationWidget.h:40
cx::RegistrationTypeWidget::addMethod
void addMethod(RegistrationMethodService *service)
Definition: cxRegistrationWidget.cpp:69
cxLabeledComboBoxWidget.h
cx::StringProperty::valueWasSet
void valueWasSet()
cx::TabbedWidget
Interface for making widgets with a hierarchy of tabs.
Definition: cxTabbedWidget.h:34
cx::TabbedWidget::mTabWidget
QTabWidget * mTabWidget
Definition: cxTabbedWidget.h:49
cx::RegistrationTypeWidget::removeMethod
void removeMethod(RegistrationMethodService *service)
Definition: cxRegistrationWidget.cpp:86
cxProfile.h
cx::XmlOptionFile::getElement
QDomElement getElement()
return the current element
Definition: cxXmlOptionItem.cpp:365
cxTypeConversions.h
cxPatientModelService.h
cx::RegistrationWidget::selectRegistrationMethod
void selectRegistrationMethod(QString registrationType, QString registrationMethodName)
Definition: cxRegistrationWidget.cpp:125
cx::profile
cxResource_EXPORT ProfilePtr profile()
Definition: cxProfile.cpp:160
cxRegistrationProperties.h
cx::RegistrationMethodService::getWidgetName
virtual QString getWidgetName()=0
cx::StringProperty::initialize
static StringPropertyPtr initialize(const QString &uid, QString name, QString help, QString value, QStringList range, QDomNode root=QDomNode())
Definition: cxStringProperty.cpp:29
cxRegistrationService.h
cxStringProperty.h
cx::RegistrationTypeWidget::RegistrationTypeWidget
RegistrationTypeWidget(QString type, QString defVal, XmlOptionFile options, QWidget *parent=0)
Definition: cxRegistrationWidget.cpp:34
cxRegistrationWidget.h
cx::reportError
void reportError(QString msg)
Definition: cxLogger.cpp:71
cx::RegistrationWidget::RegistrationWidget
RegistrationWidget(ctkPluginContext *pluginContext, QWidget *parent=0)
Definition: cxRegistrationWidget.cpp:115
cx::reportWarning
void reportWarning(QString msg)
Definition: cxLogger.cpp:70
cx::RegistrationMethodService::createWidget
virtual QWidget * createWidget()=0