3 #include "FilterGroup.h"
5 #include <QButtonGroup>
11 #include <QRadioButton>
13 #include <QVBoxLayout>
19 #include "AbstractFilterSelector.h"
20 #include "ImageImageFilterSelector.h"
21 #include "PointMeasureFilterSelector.h"
22 #include "ImagePointFilterSelector.h"
30 FilterGroup::FilterGroup(QString type) {
33 m_filterType =
new QString(type);
40 FilterGroup::FilterGroup(
const FilterGroup &other) {
43 m_filterType =
new QString(*other.m_filterType);
47 foreach (AbstractFilterSelector * selector, *other.m_selectors) {
48 AbstractFilterSelector *newSelector = NULL;
49 if (*m_filterType ==
"Points and Measures") {
50 newSelector =
new PointMeasureFilterSelector(
51 *((PointMeasureFilterSelector *) selector));
54 if (*m_filterType ==
"Images and Points") {
55 newSelector =
new ImagePointFilterSelector(
56 *((ImagePointFilterSelector *) selector));
59 if (*m_filterType ==
"Connections") {
60 newSelector =
new ImageImageFilterSelector(
61 *((ImageImageFilterSelector *) selector));
66 addSelector(newSelector);
69 m_buttonGroup->button(other.m_buttonGroup->checkedId())->click();
73 FilterGroup::~FilterGroup() {
91 bool FilterGroup::hasFilter(
bool (AbstractFilter::*meth)()
const)
const {
94 for (
int i = 0; !found && i < m_selectors->size(); i++)
96 found = m_selectors->at(i)->hasFilter(meth);
98 found = m_selectors->at(i)->hasFilter();
104 void FilterGroup::nullify() {
105 m_buttonGroup = NULL;
106 m_closeButton = NULL;
107 m_groupBoxLayout = NULL;
112 void FilterGroup::init() {
115 QLabel *descriptionLabel =
new QLabel(
"Combine filters using logic "
117 QFont descriptionFont(
"SansSerif", 11);
118 descriptionLabel->setFont(descriptionFont);
119 QFont logicTypeFont(
"SansSerif", 12, QFont::Bold);
120 QRadioButton *andButton =
new QRadioButton(
"and");
121 andButton->setFont(logicTypeFont);
122 QRadioButton *orButton =
new QRadioButton(
"or");
123 orButton->setFont(logicTypeFont);
124 m_buttonGroup =
new QButtonGroup;
125 m_buttonGroup->addButton(andButton, 0);
126 m_buttonGroup->addButton(orButton, 1);
127 connect(m_buttonGroup, SIGNAL(buttonClicked(
int)),
this,
128 SLOT(changeFilterCombinationLogic(
int)));
133 QHBoxLayout *logicLayout =
new QHBoxLayout;
134 QMargins margins = logicLayout->contentsMargins();
135 margins.setBottom(4);
136 logicLayout->setContentsMargins(margins);
137 logicLayout->addStretch();
138 logicLayout->addWidget(descriptionLabel);
139 logicLayout->addWidget(andButton);
140 logicLayout->addWidget(orButton);
141 logicLayout->addStretch();
143 m_logicWidget->setLayout(logicLayout);
145 m_newSelectorButton =
new QPushButton;
146 m_newSelectorButton->setIcon(QIcon(FileName(
"$base/icons/add.png").expanded()));
147 QString newSelectorTooltip =
"Add new filter";
148 m_newSelectorButton->setToolTip(newSelectorTooltip);
149 m_newSelectorButton->setStatusTip(newSelectorTooltip);
151 connect(m_newSelectorButton, SIGNAL(clicked()),
this, SLOT(addSelector()));
152 QHBoxLayout *newSelectorLayout =
new QHBoxLayout;
153 newSelectorLayout->addWidget(m_newSelectorButton);
154 newSelectorLayout->addStretch();
156 m_groupBoxLayout =
new QVBoxLayout;
157 m_groupBoxLayout->addWidget(m_logicWidget);
158 m_groupBoxLayout->addLayout(newSelectorLayout);
159 QGroupBox *groupBox =
new QGroupBox;
160 groupBox->setLayout(m_groupBoxLayout);
162 QVBoxLayout *mainLayout =
new QVBoxLayout;
163 margins = mainLayout->contentsMargins();
165 margins.setBottom(2);
166 mainLayout->setContentsMargins(margins);
167 mainLayout->addWidget(groupBox);
169 setLayout(mainLayout);
173 void FilterGroup::addSelector() {
174 AbstractFilterSelector *filterSelector = NULL;
175 if (*m_filterType ==
"Points and Measures")
176 filterSelector =
new PointMeasureFilterSelector;
177 else if (*m_filterType ==
"Images and Points")
178 filterSelector =
new ImagePointFilterSelector;
179 else if (*m_filterType ==
"Connections")
180 filterSelector =
new ImageImageFilterSelector;
182 addSelector(filterSelector);
186 void FilterGroup::addSelector(AbstractFilterSelector *newSelector) {
190 connect(newSelector, SIGNAL(close(AbstractFilterSelector *)),
191 this, SLOT(deleteSelector(AbstractFilterSelector *)));
192 connect(newSelector, SIGNAL(filterChanged()),
193 this, SIGNAL(filterChanged()));
194 connect(newSelector, SIGNAL(sizeChanged()),
195 this, SLOT(sendSizeChanged()));
196 m_groupBoxLayout->insertWidget(m_groupBoxLayout->count() - 1, newSelector);
197 m_selectors->append(newSelector);
198 m_selectors->size() > 1 ? m_logicWidget->show() : m_logicWidget->hide();
205 void FilterGroup::deleteSelector(AbstractFilterSelector *filterSelector) {
206 m_groupBoxLayout->removeWidget(filterSelector);
207 delete filterSelector;
208 m_selectors->removeOne(filterSelector);
210 int m_selectorsSize = m_selectors->size();
211 m_selectorsSize > 1 ? m_logicWidget->show() : m_logicWidget->hide();
212 if (!m_selectorsSize)
215 emit filterChanged();
219 void FilterGroup::sendClose() {
224 void FilterGroup::sendSizeChanged() {
225 emit sizeChanged(
this);
229 void FilterGroup::changeFilterCombinationLogic(
int button) {
230 m_andFiltersTogether = button == 0;
231 emit filterChanged();
235 bool FilterGroup::filtersAreAndedTogether()
const {
236 return m_andFiltersTogether;
240 FilterGroup &FilterGroup::operator=(FilterGroup other) {
241 ASSERT(m_filterType);
243 ASSERT(m_buttonGroup);
247 foreach (AbstractFilterSelector * selector, *other.m_selectors) {
248 AbstractFilterSelector *newSelector = NULL;
249 if (*m_filterType ==
"Points and Measures") {
250 newSelector =
new(nothrow) PointMeasureFilterSelector(
251 *((PointMeasureFilterSelector *) selector));
254 if (*m_filterType ==
"Images and Points") {
255 newSelector =
new(nothrow) ImagePointFilterSelector(
256 *((ImagePointFilterSelector *) selector));
259 if (*m_filterType ==
"Connections") {
260 newSelector =
new(nothrow) ImageImageFilterSelector(
261 *((ImageImageFilterSelector *) selector));
267 *newSelector = *selector;
268 newSelectors.append(newSelector);
273 if (newSelectors.size() == other.m_selectors->size()) {
274 foreach (AbstractFilterSelector * selector, *m_selectors) {
275 deleteSelector(selector);
278 foreach (AbstractFilterSelector * newSelector, newSelectors) {
279 addSelector(newSelector);
282 swap(*m_filterType, *other.m_filterType);
283 m_buttonGroup->button(other.m_buttonGroup->checkedId())->click();
287 foreach (AbstractFilterSelector * newSelector, newSelectors) {
294 IString msg =
"Assignment of FilterGroup failed";
302 QString FilterGroup::getDescription(
303 bool (AbstractFilter::*hasFilterMeth)()
const,
304 QString(AbstractFilter::*descriptionMeth)()
const)
const {
310 for (
int i = 0; i < m_selectors->size(); i++)
311 if (m_selectors->at(i)->hasFilter(hasFilterMeth))
312 selectorsWithFilters.append(m_selectors->at(i));
314 int numFilters = selectorsWithFilters.size();
317 QString logic =
"<b> ";
318 if (m_andFiltersTogether)
324 for (
int i = 0; i < numFilters - 1; i++) {
325 description += selectorsWithFilters[i]->getDescription(descriptionMeth)
329 description += selectorsWithFilters[numFilters - 1]->getDescription(