32 #include <boost/bind.hpp>
33 #include <boost/shared_ptr.hpp>
34 #include <boost/shared_ptr.hpp>
41 BaseWidget(parent,
"algorithm_widgets_configurable_filter",
"All Filters"),
42 mWantedFilters(wantedFilters)
47 this->appendFilters(services);
49 this->setWindowTitleAndObjectNameBasedOnWantedFilters();
51 this->configureFilterSelector(options);
53 this->setupLayout(services, options);
55 this->filterChangedSlot();
60 return QString(
"<html>"
61 "<h3>Filter Widget.</h3>"
62 "<p>Select one type of filter.</p>"
63 "<p><i>Currently selected filter:</i></p>"
68 void FiltersWidget::filterChangedSlot()
70 for (
unsigned i=0; i<mFilters->size(); ++i)
72 if (mFilters->get(i)->getUid() == mFilterSelector->getValue())
74 mCurrentFilter = mFilters->get(i);
82 void FiltersWidget::toggleDetailsSlot()
88 void FiltersWidget::runFilterSlot()
94 reportWarning(QString(
"Last operation on %1 is not finished. Could not start filtering").arg(mThread->getFilter()->getName()));
98 mThread.reset(
new FilterTimedAlgorithm(mCurrentFilter));
99 connect(mThread.get(), SIGNAL(finished()),
this, SLOT(finishedSlot()));
100 mTimedAlgorithmProgressBar->
attach(mThread);
105 void FiltersWidget::finishedSlot()
107 mTimedAlgorithmProgressBar->
detach(mThread);
108 disconnect(mThread.get(), SIGNAL(finished()),
this, SLOT(finishedSlot()));
112 void FiltersWidget::onServiceAdded(Filter* service)
114 this->appendFilterIfWanted(
FilterPtr(service, null_deleter()));
117 void FiltersWidget::onServiceRemoved(Filter *service)
119 mFilters->remove(service);
122 void FiltersWidget::appendFiltersThatAreNotServices(
VisServicesPtr services)
124 this->appendFilterIfWanted(
FilterPtr(
new BinaryThresholdImageFilter(services)));
125 this->appendFilterIfWanted(
FilterPtr(
new BinaryThinningImageFilter3DFilter(services)));
126 this->appendFilterIfWanted(
FilterPtr(
new ContourFilter(services)));
127 this->appendFilterIfWanted(
FilterPtr(
new ColorVariationFilter(services)));
128 this->appendFilterIfWanted(
FilterPtr(
new SmoothingImageFilter(services)));
129 this->appendFilterIfWanted(
FilterPtr(
new GenericScriptFilter(services)));
130 this->appendFilterIfWanted(
FilterPtr(
new ResampleImageFilter(services)));
131 this->appendFilterIfWanted(
FilterPtr(
new DilationFilter(services)));
134 void FiltersWidget::appendFilterServices()
136 mServiceListener.reset(
137 new ServiceTrackerListener<Filter>(
139 boost::bind(&FiltersWidget::onServiceAdded,
this, _1),
140 boost::function<
void(Filter*)>(),
141 boost::bind(&FiltersWidget::onServiceRemoved,
this, _1)));
142 mServiceListener->open();
147 this->appendFiltersThatAreNotServices(services);
148 this->appendFilterServices();
151 void FiltersWidget::appendFilterIfWanted(
FilterPtr filter)
153 if(mWantedFilters.empty() || mWantedFilters.contains(filter->getName()))
154 mFilters->append(filter);
157 void FiltersWidget::configureFilterSelector(XmlOptionFile options)
159 QStringList availableFilters;
160 std::map<QString,QString> names;
161 for (
unsigned i=0; i<mFilters->size(); ++i)
163 availableFilters << mFilters->get(i)->getUid();
164 names[mFilters->get(i)->getUid()] = mFilters->get(i)->getName();
166 if(availableFilters.isEmpty())
168 availableFilters <<
"FILTER NOT FOUND";
172 "Select which filter to use.",
175 options.getElement());
176 mFilterSelector->setDisplayNames(names);
180 void FiltersWidget::addDetailedButton(QHBoxLayout* filterLayout)
183 QIcon(
":/icons/open_icon_library/system-run-5.png"),
184 "Details",
"Toggle Details",
185 SLOT(toggleDetailsSlot()),
188 QToolButton* detailsButton =
new QToolButton();
189 detailsButton->setObjectName(
"DetailedButton");
190 detailsButton->setDefaultAction(detailsAction);
191 filterLayout->addWidget(detailsButton);
197 QIcon(
":/icons/open_icon_library/arrow-right-3.png"),
199 SLOT(runFilterSlot()),
203 button->setObjectName(
"RunFilterButton");
204 button->setDefaultAction(runAction);
205 filterLayout->addWidget(button);
208 QHBoxLayout * FiltersWidget::addFilterSelector(QVBoxLayout* topLayout)
210 QHBoxLayout* filterLayout =
new QHBoxLayout;
211 topLayout->addLayout(filterLayout);
214 filterLayout->addWidget(filterSelectorWidget);
219 void FiltersWidget::addProgressBar(QVBoxLayout* topLayout)
222 topLayout->addWidget(mTimedAlgorithmProgressBar);
225 void FiltersWidget::addFilterWidget(XmlOptionFile options,
VisServicesPtr services, QVBoxLayout* topLayout)
227 mSetupWidget =
new FilterSetupWidget(services,
this, options,
false);
228 topLayout->addWidget(mSetupWidget);
231 void FiltersWidget::setWindowTitleAndObjectNameBasedOnWantedFilters()
233 if(mWantedFilters.size() == 1)
235 this->setWindowTitle(mWantedFilters.first());
236 this->setObjectName(mWantedFilters.first()+
" Widget");
238 else if(mWantedFilters.empty())
240 this->setWindowTitle(
"All Filters");
241 this->setObjectName(
"algorithm_widgets_configurable_filter");
245 void FiltersWidget::setupLayout(
VisServicesPtr services, XmlOptionFile options)
247 QVBoxLayout* topLayout =
new QVBoxLayout(
this);
248 QHBoxLayout* filterLayout = addFilterSelector(topLayout);
249 this->addDetailedButton(filterLayout);
251 this->addProgressBar(topLayout);
252 this->addFilterWidget(options, services, topLayout);
253 topLayout->addStretch();