Changeset b6bf57a in subsurface


Ignore:
Timestamp:
Dec 26, 2017, 1:08:49 PM (4 weeks ago)
Author:
Dirk Hohndel <dirk@…>
Branches:
master
Children:
65213f0
Parents:
b86c70a
git-author:
Berthold Stoeger <bstoeger@…> (12/24/17 05:35:59)
git-committer:
Dirk Hohndel <dirk@…> (12/26/17 13:08:49)
Message:

Introduce negate-toggle buttons to filter lists

Introduce toggle buttons which mean "filter all dives except
those fulfilling the selected criteria".

The old code used to check for rowCount() == 0. This should never happen,
because there is always a row "empty field". This check was moved into
the preamble of the functions to seperate it from the actual logic.

Fixes #435

Signed-off-by: Berthold Stoeger <bstoeger@…>

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • desktop-widgets/listfilter.ui

    rb86c70a rb6bf57a  
    5252      </widget>
    5353     </item>
     54     <item>
     55      <widget class="QToolButton" name="notButton">
     56       <property name="text">
     57        <string>¬</string>
     58       </property>
     59       <property name="checkable">
     60        <bool>true</bool>
     61       </property>
     62      </widget>
     63     </item>
    5464    </layout>
    5565   </item>
  • desktop-widgets/simplewidgets.cpp

    rb86c70a rb6bf57a  
    517517        filter->setFilterCaseSensitivity(Qt::CaseInsensitive);
    518518        connect(ui.filterInternalList, SIGNAL(textChanged(QString)), filter, SLOT(setFilterFixedString(QString)));
     519        connect(ui.notButton, &QToolButton::toggled, model, &FilterModelBase::setNegate);
    519520        ui.filterList->setModel(filter);
    520521
  • qt-models/filtermodels.cpp

    reec69de rb6bf57a  
    2727
    2828FilterModelBase::FilterModelBase(QObject *parent) : QStringListModel(parent),
    29         anyChecked(false)
     29        anyChecked(false),
     30        negate(false)
    3031{
    3132}
     
    116117}
    117118
     119void FilterModelBase::setNegate(bool negateParam)
     120{
     121        negate = negateParam;
     122        emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, 0));
     123}
     124
    118125SuitsFilterModel::SuitsFilterModel(QObject *parent) : FilterModelBase(parent)
    119126{
     
    130137        Q_UNUSED(sourceModel);
    131138
    132         if (!anyChecked) {
     139        // rowCount() == 0 should never happen, because we have the "no suits" row
     140        // let's handle it gracefully anyway.
     141        if (!anyChecked || rowCount() == 0)
    133142                return true;
    134         }
    135143
    136144        // Checked means 'Show', Unchecked means 'Hide'.
    137145        QString suit(d->suit);
    138146        // only show empty suit dives if the user checked that.
    139         if (suit.isEmpty()) {
    140                 if (rowCount() > 0)
    141                         return checkState[rowCount() - 1];
    142                 else
    143                         return true;
    144         }
     147        if (suit.isEmpty())
     148                return checkState[rowCount() - 1] != negate;
    145149
    146150        // there is a suit selected
     
    149153        for (int i = 0; i < rowCount() - 1; i++) {
    150154                if (checkState[i] && suit == suitList[i])
    151                         return true;
    152         }
    153         return false;
     155                        return !negate;
     156        }
     157        return negate;
    154158}
    155159
     
    201205
    202206        // If there's nothing checked, this should show everything
    203         if (!anyChecked) {
     207        // rowCount() == 0 should never happen, because we have the "no tags" row
     208        // let's handle it gracefully anyway.
     209        if (!anyChecked || rowCount() == 0)
    204210                return true;
    205         }
     211
    206212        // Checked means 'Show', Unchecked means 'Hide'.
    207213        struct tag_entry *head = d->tag_list;
    208214
    209         if (!head) { // last tag means "Show empty tags";
    210                 if (rowCount() > 0)
    211                         return checkState[rowCount() - 1];
    212                 else
    213                         return true;
    214         }
     215        if (!head) // last tag means "Show empty tags";
     216                return checkState[rowCount() - 1] != negate;
    215217
    216218        // have at least one tag.
     
    222224                        int index = tagList.indexOf(tagName);
    223225                        if (checkState[index])
    224                                 return true;
     226                                return !negate;
    225227                        head = head->next;
    226228                }
    227229        }
    228         return false;
     230        return negate;
    229231}
    230232
     
    244246
    245247        // If there's nothing checked, this should show everything
    246         if (!anyChecked) {
     248        // rowCount() == 0 should never happen, because we have the "no tags" row
     249        // let's handle it gracefully anyway.
     250        if (!anyChecked || rowCount() == 0)
    247251                return true;
    248         }
     252
    249253        // Checked means 'Show', Unchecked means 'Hide'.
    250254        QString persons = QString(d->buddy) + "," + QString(d->divemaster);
     
    253257                s = s.trimmed();
    254258        // only show empty buddie dives if the user checked that.
    255         if (personsList.isEmpty()) {
    256                 if (rowCount() > 0)
    257                         return checkState[rowCount() - 1];
    258                 else
    259                         return true;
    260         }
     259        if (personsList.isEmpty())
     260                return checkState[rowCount() - 1] != negate;
    261261
    262262        // have at least one buddy
     
    265265        for (int i = 0; i < rowCount() - 1; i++) {
    266266                if (checkState[i] && personsList.contains(buddyList[i], Qt::CaseInsensitive))
    267                         return true;
    268         }
    269         return false;
     267                        return !negate;
     268        }
     269        return negate;
    270270}
    271271
     
    303303        Q_UNUSED(sourceModel);
    304304
    305         if (!anyChecked) {
     305        // rowCount() == 0 should never happen, because we have the "no location" row
     306        // let's handle it gracefully anyway.
     307        if (!anyChecked || rowCount() == 0)
    306308                return true;
    307         }
     309
    308310        // Checked means 'Show', Unchecked means 'Hide'.
    309311        QString location(get_dive_location(d));
    310312        // only show empty location dives if the user checked that.
    311         if (location.isEmpty()) {
    312                 if (rowCount() > 0)
    313                         return checkState[rowCount() - 1];
    314                 else
    315                         return true;
    316         }
     313        if (location.isEmpty())
     314                return checkState[rowCount() - 1] != negate;
    317315
    318316        // There is a location selected
     
    321319        for (int i = 0; i < rowCount() - 1; i++) {
    322320                if (checkState[i] && location == locationList[i])
    323                         return true;
    324         }
    325         return false;
     321                        return !negate;
     322        }
     323        return negate;
    326324}
    327325
  • qt-models/filtermodels.h

    r7451517e rb6bf57a  
    99
    1010class FilterModelBase : public QStringListModel {
     11        Q_OBJECT
    1112public:
    1213        virtual bool doFilter(struct dive *d, QModelIndex &index0, QAbstractItemModel *sourceModel) const = 0;
     
    1617        std::vector<char> checkState;
    1718        bool anyChecked;
     19        bool negate;
     20public
     21slots:
     22        void setNegate(bool negate);
    1823protected:
    1924        explicit FilterModelBase(QObject *parent = 0);
Note: See TracChangeset for help on using the changeset viewer.