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.