CustusX  18.04
An IGT application
cxFiltersWidget.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 "cxFiltersWidget.h"
13 
14 #include "cxStringProperty.h"
15 
16 
19 #include "cxLogger.h"
20 #include "cxDummyFilter.h"
23 #include "cxContourFilter.h"
24 #include "cxSmoothingImageFilter.h"
25 #include "cxResampleImageFilter.h"
26 #include "cxFilterPresetWidget.h"
27 #include "cxDilationFilter.h"
28 #include "cxPluginFramework.h"
29 #include "cxLogicManager.h"
30 #include <boost/bind.hpp>
31 #include <boost/shared_ptr.hpp>
32 #include <boost/shared_ptr.hpp>
33 #include "cxNullDeleter.h"
34 #include "cxProfile.h"
35 
36 namespace cx {
37 
38 FiltersWidget::FiltersWidget(VisServicesPtr services, QWidget* parent, QStringList wantedFilters, QString optionfileTag) :
39  BaseWidget(parent, "algorithm_widgets_configurable_filter", "All Filters"),
40  mWantedFilters(wantedFilters)
41 {
42  XmlOptionFile options = profile()->getXmlSettings().descend(optionfileTag);
43  mFilters.reset(new FilterGroup(options));
44 
45  this->appendFilters(services);
46 
47  this->setWindowTitleAndObjectNameBasedOnWantedFilters();
48 
49  this->configureFilterSelector(options);
50 
51  this->setupLayout(services, options);
52 
53  this->filterChangedSlot();
54 }
55 
57 {
58  return QString("<html>"
59  "<h3>Filter Widget.</h3>"
60  "<p>Select one type of filter.</p>"
61  "<p><i>Currently selected filter:</i></p>"
62  "<p>%1</p>"
63  "</html>").arg(mSetupWidget->generateHelpText());
64 }
65 
66 void FiltersWidget::filterChangedSlot()
67 {
68  for (unsigned i=0; i<mFilters->size(); ++i)
69  {
70  if (mFilters->get(i)->getUid() == mFilterSelector->getValue())
71  {
72  mCurrentFilter = mFilters->get(i);
73  }
74  }
75 
76  mSetupWidget->setFilter(mCurrentFilter);
77  mFilterSelector->setHelp(this->generateHelpText());
78 }
79 
80 void FiltersWidget::toggleDetailsSlot()
81 {
82  mSetupWidget->toggleDetailed();
83 
84 }
85 
86 void FiltersWidget::runFilterSlot()
87 {
88  if (!mCurrentFilter)
89  return;
90  if (mThread)
91  {
92  reportWarning(QString("Last operation on %1 is not finished. Could not start filtering").arg(mThread->getFilter()->getName()));
93  return;
94  }
95 
96  mThread.reset(new FilterTimedAlgorithm(mCurrentFilter));
97  connect(mThread.get(), SIGNAL(finished()), this, SLOT(finishedSlot()));
98  mTimedAlgorithmProgressBar->attach(mThread);
99 
100  mThread->execute();
101 }
102 
103 void FiltersWidget::finishedSlot()
104 {
105  mTimedAlgorithmProgressBar->detach(mThread);
106  disconnect(mThread.get(), SIGNAL(finished()), this, SLOT(finishedSlot()));
107  mThread.reset();
108 }
109 
110 void FiltersWidget::onServiceAdded(Filter* service)
111 {
112  this->appendFilterIfWanted(FilterPtr(service, null_deleter()));
113 }
114 
115 void FiltersWidget::onServiceRemoved(Filter *service)
116 {
117  mFilters->remove(service);
118 }
119 
120 void FiltersWidget::appendFiltersThatAreNotServices(VisServicesPtr services)
121 {
122  this->appendFilterIfWanted(FilterPtr(new BinaryThresholdImageFilter(services)));
123  this->appendFilterIfWanted(FilterPtr(new BinaryThinningImageFilter3DFilter(services)));
124  this->appendFilterIfWanted(FilterPtr(new ContourFilter(services)));
125  this->appendFilterIfWanted(FilterPtr(new SmoothingImageFilter(services)));
126  this->appendFilterIfWanted(FilterPtr(new ResampleImageFilter(services)));
127  this->appendFilterIfWanted(FilterPtr(new DilationFilter(services)));
128 }
129 
130 void FiltersWidget::appendFilterServices()
131 {
132  mServiceListener.reset(
134  LogicManager::getInstance()->getPluginContext(),
135  boost::bind(&FiltersWidget::onServiceAdded, this, _1),
136  boost::function<void(Filter*)>(),
137  boost::bind(&FiltersWidget::onServiceRemoved, this, _1)));
138  mServiceListener->open();
139 }
140 
141 void FiltersWidget::appendFilters(VisServicesPtr services)
142 {
143  this->appendFiltersThatAreNotServices(services);
144  this->appendFilterServices();
145 }
146 
147 void FiltersWidget::appendFilterIfWanted(FilterPtr filter)
148 {
149  if(mWantedFilters.empty() || mWantedFilters.contains(filter->getName()))
150  mFilters->append(filter);
151 }
152 
153 void FiltersWidget::configureFilterSelector(XmlOptionFile options)
154 {
155  QStringList availableFilters;
156  std::map<QString,QString> names;
157  for (unsigned i=0; i<mFilters->size(); ++i)
158  {
159  availableFilters << mFilters->get(i)->getUid();
160  names[mFilters->get(i)->getUid()] = mFilters->get(i)->getName();
161  }
162  if(availableFilters.isEmpty())
163  {
164  availableFilters << "FILTER NOT FOUND";
165  }
166  mFilterSelector = StringProperty::initialize("filterSelector",
167  "Filter",
168  "Select which filter to use.",
169  availableFilters[0],
170  availableFilters,
171  options.getElement());
172  mFilterSelector->setDisplayNames(names);
173  connect(mFilterSelector.get(), &StringProperty::valueWasSet, this, &FiltersWidget::filterChangedSlot);
174 }
175 
176 void FiltersWidget::addDetailedButton(QHBoxLayout* filterLayout)
177 {
178  QAction* detailsAction = this->createAction(this,
179  QIcon(":/icons/open_icon_library/system-run-5.png"),
180  "Details", "Toggle Details",
181  SLOT(toggleDetailsSlot()),
182  NULL);
183 
184  QToolButton* detailsButton = new QToolButton();
185  detailsButton->setObjectName("DetailedButton");
186  detailsButton->setDefaultAction(detailsAction);
187  filterLayout->addWidget(detailsButton);
188 }
189 
190 void FiltersWidget::addRunButton(QHBoxLayout* filterLayout)
191 {
192  QAction* runAction = this->createAction(this,
193  QIcon(":/icons/open_icon_library/arrow-right-3.png"),
194  "Run Filter", "",
195  SLOT(runFilterSlot()),
196  NULL);
197 
198  CXSmallToolButton* button = new CXSmallToolButton();
199  button->setObjectName("RunFilterButton");
200  button->setDefaultAction(runAction);
201  filterLayout->addWidget(button);
202 }
203 
204 QHBoxLayout * FiltersWidget::addFilterSelector(QVBoxLayout* topLayout)
205 {
206  QHBoxLayout* filterLayout = new QHBoxLayout;
207  topLayout->addLayout(filterLayout);
208  LabeledComboBoxWidget* filterSelectorWidget = new LabeledComboBoxWidget(this, mFilterSelector);
209  filterSelectorWidget->showLabel(false);
210  filterLayout->addWidget(filterSelectorWidget);
211 
212  return filterLayout;
213 }
214 
215 void FiltersWidget::addProgressBar(QVBoxLayout* topLayout)
216 {
217  mTimedAlgorithmProgressBar = new cx::TimedAlgorithmProgressBar;
218  topLayout->addWidget(mTimedAlgorithmProgressBar);
219 }
220 
221 void FiltersWidget::addFilterWidget(XmlOptionFile options, VisServicesPtr services, QVBoxLayout* topLayout)
222 {
223  mSetupWidget = new FilterSetupWidget(services, this, options, false);
224  topLayout->addWidget(mSetupWidget);
225 }
226 
227 void FiltersWidget::setWindowTitleAndObjectNameBasedOnWantedFilters()
228 {
229  if(mWantedFilters.size() == 1)
230  {
231  this->setWindowTitle(mWantedFilters.first());
232  this->setObjectName(mWantedFilters.first()+" Widget");
233  }
234  else if(mWantedFilters.empty())
235  {
236  this->setWindowTitle("All Filters");
237  this->setObjectName("algorithm_widgets_configurable_filter");
238  }
239 }
240 
241 void FiltersWidget::setupLayout(VisServicesPtr services, XmlOptionFile options)
242 {
243  QVBoxLayout* topLayout = new QVBoxLayout(this);
244  QHBoxLayout* filterLayout = addFilterSelector(topLayout);
245  this->addDetailedButton(filterLayout);
246  this->addRunButton(filterLayout);
247  this->addProgressBar(topLayout);
248  this->addFilterWidget(options, services, topLayout);
249  topLayout->addStretch();
250 }
251 
252 } /* namespace cx */
cxResource_EXPORT ProfilePtr profile()
Definition: cxProfile.cpp:160
boost::shared_ptr< class VisServices > VisServicesPtr
Definition: cxMainWindow.h:40
FiltersWidget(VisServicesPtr services, QWidget *parent, QStringList wantedFilters=QStringList(), QString optionfileTag="filterwidget")
FiltersWidget Widget for displaying N image filters.
Composite widget for string selection.
Show progress for a TimedBaseAlgorithm.
QDomElement getElement()
return the current element
void addRunButton(QHBoxLayout *filterLayout)
QAction * createAction(QObject *parent, QIcon iconName, QString text, QString tip, T slot, QLayout *layout=NULL, QToolButton *button=new QToolButton())
Definition: cxBaseWidget.h:129
void detach(TimedAlgorithmPtr algorithm)
boost::shared_ptr< class Filter > FilterPtr
void reportWarning(QString msg)
Definition: cxLogger.cpp:70
static LogicManager * getInstance()
QString generateHelpText() const
void setFilter(FilterPtr filter)
void attach(TimedAlgorithmPtr algorithm)
static StringPropertyPtr initialize(const QString &uid, QString name, QString help, QString value, QStringList range, QDomNode root=QDomNode())
Helper class for listening to services being added, modified and removed.
Interface for QWidget which handles widgets uniformly for the system.
Definition: cxBaseWidget.h:88
QString generateHelpText() const
Helper class for xml files used to store ssc/cx data.
Namespace for all CustusX production code.