6 #include "AbstractFilter.h" 9 #include <QAbstractButton> 10 #include <QButtonGroup> 13 #include <QHBoxLayout> 19 #include <QRadioButton> 22 #include <QVBoxLayout> 23 #include <QWriteLocker> 29 #include "AbstractFilterSelector.h" 33 AbstractFilter::AbstractFilter(FilterEffectivenessFlag effectiveness,
34 int minimumForSuccess) {
37 m_minForSuccess = minimumForSuccess;
39 m_effectivenessFlags =
new FilterEffectivenessFlag(effectiveness);
41 m_smallFont =
new QFont(
"SansSerif", 9);
47 AbstractFilter::AbstractFilter(
const AbstractFilter &other) {
50 m_minForSuccess = other.m_minForSuccess;
52 m_effectivenessFlags =
new FilterEffectivenessFlag(*other.m_effectivenessFlags);
54 m_smallFont =
new QFont(*other.m_smallFont);
58 m_inclusiveExclusiveGroup->button(
59 other.m_inclusiveExclusiveGroup->checkedId())->click();
63 AbstractFilter::~AbstractFilter() {
64 delete m_effectivenessFlags;
65 m_effectivenessFlags = NULL;
67 delete m_inclusiveExclusiveGroup;
68 m_inclusiveExclusiveGroup = NULL;
75 bool AbstractFilter::canFilterImages()
const {
76 return m_effectivenessFlags->testFlag(Images);
80 bool AbstractFilter::canFilterPoints()
const {
81 return m_effectivenessFlags->testFlag(Points);
85 bool AbstractFilter::canFilterMeasures()
const {
86 return m_effectivenessFlags->testFlag(Measures);
90 QString AbstractFilter::getImageDescription()
const {
91 return "have at least " + QString::number(getMinForSuccess()) +
" ";
95 QString AbstractFilter::getPointDescription()
const {
100 QString AbstractFilter::getMeasureDescription()
const {
105 void AbstractFilter::nullify() {
106 m_effectivenessGroup = NULL;
107 m_inclusiveExclusiveGroup = NULL;
108 m_inclusiveExclusiveLayout = NULL;
111 m_effectivenessFlags = NULL;
116 void AbstractFilter::createWidget() {
117 QRadioButton *inclusiveButton =
new QRadioButton(
"Inclusive");
118 inclusiveButton->setFont(*m_smallFont);
119 QRadioButton *exclusiveButton =
new QRadioButton(
"Exclusive");
120 exclusiveButton->setFont(*m_smallFont);
122 m_inclusiveExclusiveGroup =
new QButtonGroup;
123 connect(m_inclusiveExclusiveGroup, SIGNAL(buttonClicked(
int)),
124 this, SIGNAL(filterChanged()));
125 m_inclusiveExclusiveGroup->addButton(inclusiveButton, 0);
126 m_inclusiveExclusiveGroup->addButton(exclusiveButton, 1);
128 m_inclusiveExclusiveLayout =
new QHBoxLayout;
129 QMargins margins = m_inclusiveExclusiveLayout->contentsMargins();
131 margins.setBottom(0);
132 m_inclusiveExclusiveLayout->setContentsMargins(margins);
133 m_inclusiveExclusiveLayout->addWidget(inclusiveButton);
134 m_inclusiveExclusiveLayout->addWidget(exclusiveButton);
136 QHBoxLayout *controlsLayout =
new QHBoxLayout;
137 margins = controlsLayout->contentsMargins();
139 margins.setBottom(0);
140 controlsLayout->setContentsMargins(margins);
142 controlsLayout->addLayout(m_inclusiveExclusiveLayout);
144 m_effectivenessGroup =
new QButtonGroup();
145 m_effectivenessGroup->setExclusive(
false);
147 if (m_effectivenessFlags->testFlag(Images))
148 m_effectivenessGroup->addButton(
149 createEffectivenessCheckBox(
"&Images"), 0);
151 if (m_effectivenessFlags->testFlag(Points))
152 m_effectivenessGroup->addButton(
153 createEffectivenessCheckBox(
"&Points"), 1);
155 if (m_effectivenessFlags->testFlag(Measures))
156 m_effectivenessGroup->addButton(
157 createEffectivenessCheckBox(
"&Measures"), 2);
159 QString firstGroupEntry;
160 ASSERT(m_effectivenessGroup->buttons().size());
161 if (m_effectivenessGroup->buttons().size()) {
162 firstGroupEntry = m_effectivenessGroup->buttons()[0]->text();
163 firstGroupEntry.remove(0, 1);
167 if (m_effectivenessGroup->buttons().size() >= 2) {
168 QHBoxLayout *effectivenessLayout =
new QHBoxLayout;
169 QMargins effectivenessMargins = effectivenessLayout->contentsMargins();
170 effectivenessMargins.setTop(0);
171 effectivenessMargins.setBottom(0);
172 effectivenessLayout->setContentsMargins(effectivenessMargins);
174 for (
int i = 0; i < buttons.size(); i++)
175 effectivenessLayout->addWidget(buttons[i]);
177 controlsLayout->addLayout(effectivenessLayout);
180 for (
int i = 0; i < buttons.size(); i++)
182 delete m_effectivenessGroup;
183 m_effectivenessGroup = NULL;
186 if (m_minForSuccess != -1) {
187 QLabel *label =
new QLabel;
189 "<span>Min Count<br/>for " + firstGroupEntry +
"</span>");
190 label->setFont(QFont(
"SansSerif", 7));
192 spinBox->setRange(1, std::numeric_limits< int >::max());
193 spinBox->setValue(1);
194 connect(spinBox, SIGNAL(valueChanged(
int)),
195 this, SLOT(updateMinForSuccess(
int)));
196 QHBoxLayout *minLayout =
new QHBoxLayout;
197 margins = minLayout->contentsMargins();
199 margins.setBottom(0);
200 minLayout->setContentsMargins(margins);
201 minLayout->addWidget(label);
202 minLayout->addWidget(spinBox);
204 m_minWidget->setLayout(minLayout);
206 controlsLayout->addWidget(m_minWidget);
207 controlsLayout->setAlignment(m_minWidget, Qt::AlignTop);
208 m_minWidget->setVisible(
true);
211 controlsLayout->addStretch();
213 m_mainLayout =
new QVBoxLayout;
214 margins = m_mainLayout->contentsMargins();
216 margins.setBottom(0);
217 m_mainLayout->setContentsMargins(margins);
218 m_mainLayout->addLayout(controlsLayout);
221 setLayout(m_mainLayout);
224 inclusiveButton->click();
228 QCheckBox *AbstractFilter::createEffectivenessCheckBox(QString text) {
229 QCheckBox *checkBox =
new QCheckBox(text,
this);
230 checkBox->setChecked(
true);
231 checkBox->setFont(*m_smallFont);
232 connect(checkBox, SIGNAL(toggled(
bool)),
233 this, SLOT(updateEffectiveness()));
234 connect(checkBox, SIGNAL(toggled(
bool)),
this, SIGNAL(filterChanged()));
239 bool AbstractFilter::inclusive()
const {
240 return m_inclusiveExclusiveGroup->checkedId() == 0;
244 AbstractFilter::FilterEffectivenessFlag *
245 AbstractFilter::getEffectivenessFlags()
const {
246 return m_effectivenessFlags;
250 QBoxLayout *AbstractFilter::getMainLayout()
const {
251 ASSERT(m_mainLayout);
257 QBoxLayout *AbstractFilter::getInclusiveExclusiveLayout()
const {
258 ASSERT(m_inclusiveExclusiveLayout);
260 return m_inclusiveExclusiveLayout;
265 bool usePoints)
const {
268 foreach (ControlMeasure * measure, measures) {
272 ControlPoint *point = measure->Parent();
274 if (point && evaluate(point))
278 if (measure && evaluate(measure))
283 return passedCount >= getMinForSuccess();
287 bool AbstractFilter::evaluateImageFromPointFilter(
289 bool evaluation =
true;
291 if (canFilterImages()) {
292 evaluation = evaluateFromCount(imageAndNet->second->GetMeasuresInCube(imageAndNet->first),
300 bool AbstractFilter::evaluateImageFromMeasureFilter(
302 bool evaluation =
true;
304 if (canFilterImages()) {
305 evaluation = evaluateFromCount(imageAndNet->second->GetMeasuresInCube(imageAndNet->first),
313 bool AbstractFilter::evaluatePointFromMeasureFilter(
314 const ControlPoint *point)
const {
317 bool evaluation =
true;
319 if (canFilterPoints())
320 evaluation = evaluateFromCount(point->getMeasures(),
false);
326 bool AbstractFilter::evaluate(
const ControlPoint *point,
327 bool (ControlPoint::*meth)()
const)
const {
330 return !((point->*meth)() ^ inclusive());
334 bool AbstractFilter::evaluate(
const ControlMeasure *measure,
335 bool (ControlMeasure::*meth)()
const)
const {
338 return !((measure->*meth)() ^ inclusive());
342 void AbstractFilter::updateEffectiveness() {
343 ASSERT(m_effectivenessGroup);
345 if (m_effectivenessGroup) {
346 FilterEffectivenessFlag newFlags;
351 m_minWidget->setVisible(
false);
353 for (
int i = 0; i < buttons.size(); i++) {
354 if (buttons[i]->isChecked()) {
355 if (buttons[i]->text() ==
"&Images")
357 else if (buttons[i]->text() ==
"&Points")
359 else if (buttons[i]->text() ==
"&Measures")
360 newFlags |= Measures;
362 if (i == 0 && m_minWidget)
363 m_minWidget->setVisible(
true);
367 *m_effectivenessFlags = newFlags;
372 void AbstractFilter::updateMinForSuccess(
int newMin) {
373 m_minForSuccess = newMin;
374 emit filterChanged();
Namespace for ISIS/Bullet specific routines.