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" 29 FilterGroup::FilterGroup(QString type) {
32 m_filterType =
new QString(type);
39 FilterGroup::FilterGroup(
const FilterGroup &other) {
42 m_filterType =
new QString(*other.m_filterType);
46 foreach (AbstractFilterSelector * selector, *other.m_selectors) {
47 AbstractFilterSelector *newSelector = NULL;
48 if (*m_filterType ==
"Points and Measures") {
49 newSelector =
new PointMeasureFilterSelector(
50 *((PointMeasureFilterSelector *) selector));
53 if (*m_filterType ==
"Images and Points") {
54 newSelector =
new ImagePointFilterSelector(
55 *((ImagePointFilterSelector *) selector));
58 if (*m_filterType ==
"Connections") {
59 newSelector =
new ImageImageFilterSelector(
60 *((ImageImageFilterSelector *) selector));
65 addSelector(newSelector);
68 m_buttonGroup->button(other.m_buttonGroup->checkedId())->click();
72 FilterGroup::~FilterGroup() {
90 bool FilterGroup::hasFilter(
bool (AbstractFilter::*meth)()
const)
const {
93 for (
int i = 0; !found && i < m_selectors->size(); i++)
95 found = m_selectors->at(i)->hasFilter(meth);
97 found = m_selectors->at(i)->hasFilter();
103 void FilterGroup::nullify() {
104 m_buttonGroup = NULL;
105 m_closeButton = NULL;
106 m_groupBoxLayout = NULL;
111 void FilterGroup::init() {
114 QLabel *descriptionLabel =
new QLabel(
"Combine filters using logic " 116 QFont descriptionFont(
"SansSerif", 11);
117 descriptionLabel->setFont(descriptionFont);
118 QFont logicTypeFont(
"SansSerif", 12, QFont::Bold);
119 QRadioButton *andButton =
new QRadioButton(
"and");
120 andButton->setFont(logicTypeFont);
121 QRadioButton *orButton =
new QRadioButton(
"or");
122 orButton->setFont(logicTypeFont);
123 m_buttonGroup =
new QButtonGroup;
124 m_buttonGroup->addButton(andButton, 0);
125 m_buttonGroup->addButton(orButton, 1);
126 connect(m_buttonGroup, SIGNAL(buttonClicked(
int)),
this,
127 SLOT(changeFilterCombinationLogic(
int)));
132 QHBoxLayout *logicLayout =
new QHBoxLayout;
133 QMargins margins = logicLayout->contentsMargins();
134 margins.setBottom(4);
135 logicLayout->setContentsMargins(margins);
136 logicLayout->addStretch();
137 logicLayout->addWidget(descriptionLabel);
138 logicLayout->addWidget(andButton);
139 logicLayout->addWidget(orButton);
140 logicLayout->addStretch();
142 m_logicWidget->setLayout(logicLayout);
144 m_newSelectorButton =
new QPushButton;
145 m_newSelectorButton->setIcon(QIcon(FileName(
"$base/icons/add.png").expanded()));
146 QString newSelectorTooltip =
"Add new filter";
147 m_newSelectorButton->setToolTip(newSelectorTooltip);
148 m_newSelectorButton->setStatusTip(newSelectorTooltip);
150 connect(m_newSelectorButton, SIGNAL(clicked()),
this, SLOT(addSelector()));
151 QHBoxLayout *newSelectorLayout =
new QHBoxLayout;
152 newSelectorLayout->addWidget(m_newSelectorButton);
153 newSelectorLayout->addStretch();
155 m_groupBoxLayout =
new QVBoxLayout;
156 m_groupBoxLayout->addWidget(m_logicWidget);
157 m_groupBoxLayout->addLayout(newSelectorLayout);
158 QGroupBox *groupBox =
new QGroupBox;
159 groupBox->setLayout(m_groupBoxLayout);
161 QVBoxLayout *mainLayout =
new QVBoxLayout;
162 margins = mainLayout->contentsMargins();
164 margins.setBottom(2);
165 mainLayout->setContentsMargins(margins);
166 mainLayout->addWidget(groupBox);
168 setLayout(mainLayout);
172 void FilterGroup::addSelector() {
173 AbstractFilterSelector *filterSelector = NULL;
174 if (*m_filterType ==
"Points and Measures")
175 filterSelector =
new PointMeasureFilterSelector;
176 else if (*m_filterType ==
"Images and Points")
177 filterSelector =
new ImagePointFilterSelector;
178 else if (*m_filterType ==
"Connections")
179 filterSelector =
new ImageImageFilterSelector;
181 addSelector(filterSelector);
185 void FilterGroup::addSelector(AbstractFilterSelector *newSelector) {
189 connect(newSelector, SIGNAL(close(AbstractFilterSelector *)),
190 this, SLOT(deleteSelector(AbstractFilterSelector *)));
191 connect(newSelector, SIGNAL(filterChanged()),
192 this, SIGNAL(filterChanged()));
193 connect(newSelector, SIGNAL(sizeChanged()),
194 this, SLOT(sendSizeChanged()));
195 m_groupBoxLayout->insertWidget(m_groupBoxLayout->count() - 1, newSelector);
196 m_selectors->append(newSelector);
197 m_selectors->size() > 1 ? m_logicWidget->show() : m_logicWidget->hide();
204 void FilterGroup::deleteSelector(AbstractFilterSelector *filterSelector) {
205 m_groupBoxLayout->removeWidget(filterSelector);
206 delete filterSelector;
207 m_selectors->removeOne(filterSelector);
209 int m_selectorsSize = m_selectors->size();
210 m_selectorsSize > 1 ? m_logicWidget->show() : m_logicWidget->hide();
211 if (!m_selectorsSize)
214 emit filterChanged();
218 void FilterGroup::sendClose() {
223 void FilterGroup::sendSizeChanged() {
224 emit sizeChanged(
this);
228 void FilterGroup::changeFilterCombinationLogic(
int button) {
229 m_andFiltersTogether = button == 0;
230 emit filterChanged();
234 bool FilterGroup::filtersAreAndedTogether()
const {
235 return m_andFiltersTogether;
239 FilterGroup &FilterGroup::operator=(FilterGroup other) {
240 ASSERT(m_filterType);
242 ASSERT(m_buttonGroup);
246 foreach (AbstractFilterSelector * selector, *other.m_selectors) {
247 AbstractFilterSelector *newSelector = NULL;
248 if (*m_filterType ==
"Points and Measures") {
249 newSelector =
new(nothrow) PointMeasureFilterSelector(
250 *((PointMeasureFilterSelector *) selector));
253 if (*m_filterType ==
"Images and Points") {
254 newSelector =
new(nothrow) ImagePointFilterSelector(
255 *((ImagePointFilterSelector *) selector));
258 if (*m_filterType ==
"Connections") {
259 newSelector =
new(nothrow) ImageImageFilterSelector(
260 *((ImageImageFilterSelector *) selector));
266 *newSelector = *selector;
267 newSelectors.append(newSelector);
272 if (newSelectors.size() == other.m_selectors->size()) {
273 foreach (AbstractFilterSelector * selector, *m_selectors) {
274 deleteSelector(selector);
277 foreach (AbstractFilterSelector * newSelector, newSelectors) {
278 addSelector(newSelector);
281 swap(*m_filterType, *other.m_filterType);
282 m_buttonGroup->button(other.m_buttonGroup->checkedId())->click();
286 foreach (AbstractFilterSelector * newSelector, newSelectors) {
293 IString msg =
"Assignment of FilterGroup failed";
301 QString FilterGroup::getDescription(
302 bool (AbstractFilter::*hasFilterMeth)()
const,
303 QString(AbstractFilter::*descriptionMeth)()
const)
const {
309 for (
int i = 0; i < m_selectors->size(); i++)
310 if (m_selectors->at(i)->hasFilter(hasFilterMeth))
311 selectorsWithFilters.append(m_selectors->at(i));
313 int numFilters = selectorsWithFilters.size();
316 QString logic =
"<b> ";
317 if (m_andFiltersTogether)
323 for (
int i = 0; i < numFilters - 1; i++) {
324 description += selectorsWithFilters[i]->getDescription(descriptionMeth)
328 description += selectorsWithFilters[numFilters - 1]->getDescription(
This error is for when a programmer made an API call that was illegal.
#define _FILEINFO_
Macro for the filename and line number.
Namespace for ISIS/Bullet specific routines.