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.