on xenial help sign in
Implement a virtual 'All' filter option.
65edd41Pawel Stolowski
plugins/Unity/CMakeLists.txt+1
@@ -43,6 +43,7 @@ set(QMLPLUGIN_SRC
43 preview.cpp
43 preview.cpp
44 previewaction.cpp
44 previewaction.cpp
45 previewinfohint.cpp
45 previewinfohint.cpp
46+ showallfilteroption.cpp
46 signalslist.cpp
47 signalslist.cpp
47 socialpreview.cpp
48 socialpreview.cpp
48 socialpreviewcomment.cpp
49 socialpreviewcomment.cpp
plugins/Unity/checkoptionfilter.cpp+3−1
@@ -52,9 +52,11 @@ void CheckOptionFilter::onOptionsChanged(unity::dash::CheckOptionFilter::CheckOp
52
52
53 m_options = new UnityOptionsModel(this, options,
53 m_options = new UnityOptionsModel(this, options,
54 m_unityCheckOptionFilter->option_added,
54 m_unityCheckOptionFilter->option_added,
55− m_unityCheckOptionFilter->option_removed);
55+ m_unityCheckOptionFilter->option_removed,
56+ m_unityCheckOptionFilter->show_all_button);
56
57
57 connect(m_options, SIGNAL(activeChanged(AbstractFilterOption *)), m_options, SLOT(ensureTheOnlyActive(AbstractFilterOption *)));
58 connect(m_options, SIGNAL(activeChanged(AbstractFilterOption *)), m_options, SLOT(ensureTheOnlyActive(AbstractFilterOption *)));
59+ connect(m_options, SIGNAL(showAllActivated()), this, SLOT(clear()));
58
60
59 /* Property change signals */
61 /* Property change signals */
60 m_signals << m_unityCheckOptionFilter->options.changed.connect(sigc::mem_fun(this, &CheckOptionFilter::onOptionsChanged));
62 m_signals << m_unityCheckOptionFilter->options.changed.connect(sigc::mem_fun(this, &CheckOptionFilter::onOptionsChanged));
plugins/Unity/filter.h+3−2
@@ -56,11 +56,12 @@ public:
56 bool filtering() const;
56 bool filtering() const;
57 virtual GenericOptionsModel* options() const = 0;
57 virtual GenericOptionsModel* options() const = 0;
58
58
59− Q_INVOKABLE void clear();
60−
61 static Filter* newFromUnityFilter(unity::dash::Filter::Ptr unityFilter);
59 static Filter* newFromUnityFilter(unity::dash::Filter::Ptr unityFilter);
62 bool hasUnityFilter(unity::dash::Filter::Ptr unityFilter) const;
60 bool hasUnityFilter(unity::dash::Filter::Ptr unityFilter) const;
63
61
62+public Q_SLOTS:
63+ void clear();
64+
64Q_SIGNALS:
65Q_SIGNALS:
65 void optionsChanged();
66 void optionsChanged();
66
67
plugins/Unity/genericoptionsmodel.cpp+20−3
@@ -22,10 +22,18 @@
22
22
23// local
23// local
24#include "abstractfilteroption.h"
24#include "abstractfilteroption.h"
25+#include "showallfilteroption.h"
25
26
26−GenericOptionsModel::GenericOptionsModel(QObject *parent)
27+GenericOptionsModel::GenericOptionsModel(bool showAllOption, QObject *parent)
27 : QAbstractListModel(parent)
28 : QAbstractListModel(parent)
28{
29{
30+ if (showAllOption)
31+ {
32+ auto showAll = new ShowAllFilterOption(this);
33+ connect(showAll, SIGNAL(activeChanged(bool)), this, SLOT(onOptionChanged()));
34+ connect(showAll, SIGNAL(activeChanged(bool)), this, SLOT(onShowAllClicked(bool)));
35+ addOption(showAll);
36+ }
29}
37}
30
38
31GenericOptionsModel::~GenericOptionsModel()
39GenericOptionsModel::~GenericOptionsModel()
@@ -73,7 +81,7 @@ QVariant GenericOptionsModel::data(const QModelIndex& index, int role) const
73
81
74int GenericOptionsModel::rowCount(const QModelIndex& /* parent */) const
82int GenericOptionsModel::rowCount(const QModelIndex& /* parent */) const
75{
83{
76− return m_options.size ();
84+ return m_options.size();
77}
85}
78
86
79void GenericOptionsModel::setActive(int idx, bool value)
87void GenericOptionsModel::setActive(int idx, bool value)
@@ -117,7 +125,10 @@ void GenericOptionsModel::ensureTheOnlyActive(AbstractFilterOption *activeOption
117
125
118void GenericOptionsModel::addOption(AbstractFilterOption *option, int index)
126void GenericOptionsModel::addOption(AbstractFilterOption *option, int index)
119{
127{
128+ if (index >= 0)
120− m_options.insert(index, option);
129+ m_options.insert(index, option);
130+ else
131+ m_options.append(option);
121
132
122 connect(option, SIGNAL(idChanged(const QString &)), this, SLOT(onOptionChanged()));
133 connect(option, SIGNAL(idChanged(const QString &)), this, SLOT(onOptionChanged()));
123 connect(option, SIGNAL(nameChanged(const QString &)), this, SLOT(onOptionChanged()));
134 connect(option, SIGNAL(nameChanged(const QString &)), this, SLOT(onOptionChanged()));
@@ -168,3 +179,9 @@ void GenericOptionsModel::onActiveChanged()
168 Q_EMIT activeChanged(option);
179 Q_EMIT activeChanged(option);
169 }
180 }
170}
181}
182+
183+void GenericOptionsModel::onShowAllClicked(bool active)
184+{
185+ if (active)
186+ Q_EMIT showAllActivated();
187+}
plugins/Unity/genericoptionsmodel.h+4−2
@@ -35,7 +35,7 @@ class Q_DECL_EXPORT GenericOptionsModel : public QAbstractListModel
35 Q_ENUMS(Roles)
35 Q_ENUMS(Roles)
36
36
37public:
37public:
38− GenericOptionsModel(QObject *parent = nullptr);
38+ GenericOptionsModel(bool showAllOption = false, QObject *parent = nullptr);
39 ~GenericOptionsModel();
39 ~GenericOptionsModel();
40
40
41 enum Roles {
41 enum Roles {
@@ -59,13 +59,15 @@ public Q_SLOTS:
59
59
60Q_SIGNALS:
60Q_SIGNALS:
61 void activeChanged(AbstractFilterOption *option);
61 void activeChanged(AbstractFilterOption *option);
62+ void showAllActivated();
62
63
63protected Q_SLOTS:
64protected Q_SLOTS:
64 void onOptionChanged();
65 void onOptionChanged();
65 void onActiveChanged();
66 void onActiveChanged();
67+ void onShowAllClicked(bool active);
66
68
67protected:
69protected:
68− void addOption(AbstractFilterOption *option, int index);
70+ void addOption(AbstractFilterOption *option, int index = -1);
69 void removeOption(int index);
71 void removeOption(int index);
70 int indexOf(const QString &option_id);
72 int indexOf(const QString &option_id);
71
73
plugins/Unity/multirangefilter.cpp+3−1
@@ -52,9 +52,11 @@ void MultiRangeFilter::onOptionsChanged(unity::dash::MultiRangeFilter::Options o
52
52
53 m_options = new UnityOptionsModel(this, options,
53 m_options = new UnityOptionsModel(this, options,
54 m_unityMultiRangeFilter->option_added,
54 m_unityMultiRangeFilter->option_added,
55− m_unityMultiRangeFilter->option_removed);
55+ m_unityMultiRangeFilter->option_removed,
56+ m_unityMultiRangeFilter->show_all_button);
56
57
57 connect(m_options, SIGNAL(activeChanged(AbstractFilterOption *)), m_options, SLOT(ensureTheOnlyActive(AbstractFilterOption *)));
58 connect(m_options, SIGNAL(activeChanged(AbstractFilterOption *)), m_options, SLOT(ensureTheOnlyActive(AbstractFilterOption *)));
59+ connect(m_options, SIGNAL(showAllActivated()), this, SLOT(clear()));
58
60
59 /* Property change signals */
61 /* Property change signals */
60 m_signals << m_unityMultiRangeFilter->options.changed.connect(sigc::mem_fun(this, &MultiRangeFilter::onOptionsChanged));
62 m_signals << m_unityMultiRangeFilter->options.changed.connect(sigc::mem_fun(this, &MultiRangeFilter::onOptionsChanged));
plugins/Unity/radiooptionfilter.cpp+3−1
@@ -51,7 +51,9 @@ void RadioOptionFilter::onOptionsChanged(unity::dash::RadioOptionFilter::RadioOp
51 }
51 }
52 m_options = new UnityOptionsModel(this, m_unityRadioOptionFilter->options,
52 m_options = new UnityOptionsModel(this, m_unityRadioOptionFilter->options,
53 m_unityRadioOptionFilter->option_added,
53 m_unityRadioOptionFilter->option_added,
54− m_unityRadioOptionFilter->option_removed);
54+ m_unityRadioOptionFilter->option_removed,
55+ m_unityRadioOptionFilter->show_all_button);
56+ connect(m_options, SIGNAL(showAllActivated()), this, SLOT(clear()));
55
57
56 m_signals << m_unityRadioOptionFilter->options.changed.connect(sigc::mem_fun(this, &RadioOptionFilter::onOptionsChanged));
58 m_signals << m_unityRadioOptionFilter->options.changed.connect(sigc::mem_fun(this, &RadioOptionFilter::onOptionsChanged));
57
59
plugins/Unity/ratingoptionsmodel.cpp+3−3
@@ -23,11 +23,11 @@
23// local
23// local
24#include "ratingfilteroption.h"
24#include "ratingfilteroption.h"
25
25
26−RatingOptionsModel::RatingOptionsModel(QObject *parent) :
26+RatingOptionsModel::RatingOptionsModel(bool showAllOption, QObject *parent) :
27− GenericOptionsModel(parent)
27+ GenericOptionsModel(showAllOption, parent)
28{
28{
29 for (int i=1; i<=5; i++) {
29 for (int i=1; i<=5; i++) {
30 auto opt = new RatingFilterOption(QString::number(i), i*0.2f, this);
30 auto opt = new RatingFilterOption(QString::number(i), i*0.2f, this);
31− addOption(opt, i-1);
31+ addOption(opt);
32 }
32 }
33}
33}
plugins/Unity/ratingoptionsmodel.h+1−1
@@ -27,7 +27,7 @@ class RatingOptionsModel : public GenericOptionsModel
27 Q_OBJECT
27 Q_OBJECT
28
28
29public:
29public:
30− RatingOptionsModel(QObject *parent);
30+ RatingOptionsModel(bool showAllOption, QObject *parent);
31};
31};
32
32
33#endif // RATINGOPTIONSMODEL_H
33#endif // RATINGOPTIONSMODEL_H
plugins/Unity/ratingsfilter.cpp+2−1
@@ -53,9 +53,10 @@ void RatingsFilter::setUnityFilter(unity::dash::Filter::Ptr filter)
53
53
54 delete m_options;
54 delete m_options;
55
55
56− m_options = new RatingOptionsModel(this);
56+ m_options = new RatingOptionsModel(m_unityRatingsFilter->show_all_button, this);
57 connect(m_options, SIGNAL(activeChanged(AbstractFilterOption *)), m_options, SLOT(ensureTheOnlyActive(AbstractFilterOption *)));
57 connect(m_options, SIGNAL(activeChanged(AbstractFilterOption *)), m_options, SLOT(ensureTheOnlyActive(AbstractFilterOption *)));
58 connect(m_options, SIGNAL(activeChanged(AbstractFilterOption *)), this, SLOT(onActiveChanged(AbstractFilterOption *)));
58 connect(m_options, SIGNAL(activeChanged(AbstractFilterOption *)), this, SLOT(onActiveChanged(AbstractFilterOption *)));
59+ connect(m_options, SIGNAL(showAllActivated()), this, SLOT(clear()));
59
60
60 Q_EMIT optionsChanged();
61 Q_EMIT optionsChanged();
61}
62}
plugins/Unity/showallfilteroption.cppnew file+60
@@ -0,0 +1,60 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * Authors:
5+ * Pawel Stolowski <pawel.stolowski@canonical.com>
6+ *
7+ * This program is free software; you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation; version 3.
10+ *
11+ * This program is distributed in the hope that it will be useful,
12+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+ * GNU General Public License for more details.
15+ *
16+ * You should have received a copy of the GNU General Public License
17+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
18+ */
19+
20+// self
21+#include "showallfilteroption.h"
22+
23+#include <libintl.h>
24+
25+unsigned int ShowAllFilterOption::m_showAllCount = 0;
26+
27+ShowAllFilterOption::ShowAllFilterOption(QObject *parent) :
28+ AbstractFilterOption(parent),
29+ m_active(false)
30+{
31+ m_id = QString("show_all::%1").arg(m_showAllCount++);
32+}
33+
34+QString ShowAllFilterOption::id() const
35+{
36+ return m_id;
37+}
38+
39+QString ShowAllFilterOption::name() const
40+{
41+ return QString::fromUtf8(dgettext("unity", "All"));
42+}
43+
44+QString ShowAllFilterOption::iconHint() const
45+{
46+ return QString::Null();
47+}
48+
49+bool ShowAllFilterOption::active() const
50+{
51+ return m_active;
52+}
53+
54+void ShowAllFilterOption::setActive(bool active)
55+{
56+ if (active != m_active) {
57+ m_active = active;
58+ Q_EMIT activeChanged(m_active);
59+ }
60+}
plugins/Unity/showallfilteroption.hnew file+51
@@ -0,0 +1,51 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * Authors:
5+ * Pawel Stolowski <pawel.stolowski@canonical.com>
6+ *
7+ * This program is free software; you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation; version 3.
10+ *
11+ * This program is distributed in the hope that it will be useful,
12+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+ * GNU General Public License for more details.
15+ *
16+ * You should have received a copy of the GNU General Public License
17+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
18+ */
19+
20+#ifndef SHOWALLFILTEROPTION_H
21+#define SHOWALLFILTEROPTION_H
22+
23+// local
24+#include "abstractfilteroption.h"
25+
26+class Q_DECL_EXPORT ShowAllFilterOption : public AbstractFilterOption
27+{
28+ Q_OBJECT
29+
30+public:
31+ explicit ShowAllFilterOption(QObject *parent = nullptr);
32+
33+ /* getters */
34+ QString id() const override;
35+ QString name() const override;
36+ QString iconHint() const override;
37+ bool active() const override;
38+
39+ /* setters */
40+ void setActive(bool active) override;
41+
42+private:
43+ bool m_active;
44+ QString m_id;
45+
46+ static unsigned int m_showAllCount;
47+};
48+
49+Q_DECLARE_METATYPE(ShowAllFilterOption*)
50+
51+#endif // SHOWALLFILTEROPTION_H
plugins/Unity/unityoptionsmodel.cpp+5−4
@@ -26,8 +26,9 @@
26UnityOptionsModel::UnityOptionsModel(QObject *parent,
26UnityOptionsModel::UnityOptionsModel(QObject *parent,
27 const std::vector<unity::dash::FilterOption::Ptr> options,
27 const std::vector<unity::dash::FilterOption::Ptr> options,
28 sigc::signal<void, unity::dash::FilterOption::Ptr> optionAdded,
28 sigc::signal<void, unity::dash::FilterOption::Ptr> optionAdded,
29− sigc::signal<void, unity::dash::FilterOption::Ptr> optionRemoved) :
29+ sigc::signal<void, unity::dash::FilterOption::Ptr> optionRemoved,
30+ bool showAllOption) :
30− GenericOptionsModel(parent)
31+ GenericOptionsModel(showAllOption, parent)
31{
32{
32 setOptions(options, optionAdded, optionRemoved);
33 setOptions(options, optionAdded, optionRemoved);
33}
34}
@@ -38,7 +39,7 @@ void UnityOptionsModel::setOptions(const std::vector<unity::dash::FilterOption::
38{
39{
39 for (unsigned int i=0; i<options.size(); i++)
40 for (unsigned int i=0; i<options.size(); i++)
40 {
41 {
41− addOption(new FilterOption(options[i], this), i);
42+ addOption(new FilterOption(options[i], this));
42 }
43 }
43 optionAdded.connect(sigc::mem_fun(this, &UnityOptionsModel::onOptionAdded));
44 optionAdded.connect(sigc::mem_fun(this, &UnityOptionsModel::onOptionAdded));
44 optionRemoved.connect(sigc::mem_fun(this, &UnityOptionsModel::onOptionRemoved));
45 optionRemoved.connect(sigc::mem_fun(this, &UnityOptionsModel::onOptionRemoved));
@@ -50,7 +51,7 @@ void UnityOptionsModel::onOptionAdded(unity::dash::FilterOption::Ptr option)
50 if (index >= 0)
51 if (index >= 0)
51 {
52 {
52 beginInsertRows(QModelIndex(), index, index);
53 beginInsertRows(QModelIndex(), index, index);
53− addOption(new FilterOption(option, this), index);
54+ addOption(new FilterOption(option, this));
54 endInsertRows();
55 endInsertRows();
55 }
56 }
56}
57}
plugins/Unity/unityoptionsmodel.h+2−1
@@ -35,7 +35,8 @@ public:
35 UnityOptionsModel(QObject *parent,
35 UnityOptionsModel(QObject *parent,
36 const std::vector<unity::dash::FilterOption::Ptr> options,
36 const std::vector<unity::dash::FilterOption::Ptr> options,
37 sigc::signal<void, unity::dash::FilterOption::Ptr> optionAdded,
37 sigc::signal<void, unity::dash::FilterOption::Ptr> optionAdded,
38− sigc::signal<void, unity::dash::FilterOption::Ptr> optionRemoved);
38+ sigc::signal<void, unity::dash::FilterOption::Ptr> optionRemoved,
39+ bool showAllOption);
39
40
40private:
41private:
41 void setOptions(const std::vector<unity::dash::FilterOption::Ptr> options,
42 void setOptions(const std::vector<unity::dash::FilterOption::Ptr> options,
tests/plugins/Unity/filtersbindingstest.cpp+61−30
@@ -65,17 +65,17 @@ DeeModel* FiltersBindingsTest::createFilterModel()
65
65
66void FiltersBindingsTest::createMultiRangeFilter(DeeModel *model, const std::string &id, const std::string &name, int optionCount)
66void FiltersBindingsTest::createMultiRangeFilter(DeeModel *model, const std::string &id, const std::string &name, int optionCount)
67{
67{
68− createFilter(model, "filter-multirange", id, name, optionCount);
68+ createFilter(model, "filter-multirange", id, name, optionCount, true);
69}
69}
70
70
71void FiltersBindingsTest::createRadioOptionFilter(DeeModel *model, const std::string &id, const std::string &name, int optionCount)
71void FiltersBindingsTest::createRadioOptionFilter(DeeModel *model, const std::string &id, const std::string &name, int optionCount)
72{
72{
73− createFilter(model, "filter-radiooption", id, name, optionCount);
73+ createFilter(model, "filter-radiooption", id, name, optionCount, true);
74}
74}
75
75
76void FiltersBindingsTest::createCheckOptionFilter(DeeModel *model, const std::string &id, const std::string &name, int optionCount)
76void FiltersBindingsTest::createCheckOptionFilter(DeeModel *model, const std::string &id, const std::string &name, int optionCount)
77{
77{
78− createFilter(model, "filter-checkoption", id, name, optionCount);
78+ createFilter(model, "filter-checkoption", id, name, optionCount, true);
79}
79}
80
80
81void FiltersBindingsTest::createRatingsFilter(DeeModel *model, const std::string &id, const std::string &name)
81void FiltersBindingsTest::createRatingsFilter(DeeModel *model, const std::string &id, const std::string &name)
@@ -90,7 +90,7 @@ void FiltersBindingsTest::createRatingsFilter(DeeModel *model, const std::string
90 GVariant *children[2];
90 GVariant *children[2];
91 GVariant *key1 = g_variant_new_string("show-all-button");
91 GVariant *key1 = g_variant_new_string("show-all-button");
92 GVariant *key2 = g_variant_new_string("rating");
92 GVariant *key2 = g_variant_new_string("rating");
93− children[0] = g_variant_new_dict_entry(key1, g_variant_new_variant(g_variant_new_boolean(false)));
93+ children[0] = g_variant_new_dict_entry(key1, g_variant_new_variant(g_variant_new_boolean(true)));
94 children[1] = g_variant_new_dict_entry(key2, g_variant_new_variant(g_variant_new_double(0.0f)));
94 children[1] = g_variant_new_dict_entry(key2, g_variant_new_variant(g_variant_new_double(0.0f)));
95 auto fhints = g_variant_new_array(G_VARIANT_TYPE("{sv}"), children, 2);
95 auto fhints = g_variant_new_array(G_VARIANT_TYPE("{sv}"), children, 2);
96
96
@@ -102,7 +102,7 @@ void FiltersBindingsTest::createRatingsFilter(DeeModel *model, const std::string
102 dee_model_append_row(model, row);
102 dee_model_append_row(model, row);
103}
103}
104
104
105−void FiltersBindingsTest::createFilter(DeeModel *model, const std::string &renderer, const std::string &id, const std::string &name, int optionCount)
105+void FiltersBindingsTest::createFilter(DeeModel *model, const std::string &renderer, const std::string &id, const std::string &name, int optionCount, bool showAll)
106{
106{
107 GVariant* row[8];
107 GVariant* row[8];
108
108
@@ -114,7 +114,7 @@ void FiltersBindingsTest::createFilter(DeeModel *model, const std::string &rende
114 GVariant *children[2];
114 GVariant *children[2];
115 GVariant *key1 = g_variant_new_string("show-all-button");
115 GVariant *key1 = g_variant_new_string("show-all-button");
116 GVariant *key2 = g_variant_new_string("options");
116 GVariant *key2 = g_variant_new_string("options");
117− children[0] = g_variant_new_dict_entry(key1, g_variant_new_variant(g_variant_new_boolean(false)));
117+ children[0] = g_variant_new_dict_entry(key1, g_variant_new_variant(g_variant_new_boolean(showAll)));
118 children[1] = g_variant_new_dict_entry(key2, g_variant_new_variant(createOptions(optionCount)));
118 children[1] = g_variant_new_dict_entry(key2, g_variant_new_variant(createOptions(optionCount)));
119 auto fhints = g_variant_new_array(G_VARIANT_TYPE("{sv}"), children, 2);
119 auto fhints = g_variant_new_array(G_VARIANT_TYPE("{sv}"), children, 2);
120
120
@@ -143,9 +143,9 @@ void FiltersBindingsTest::testMultiRangeFilter()
143 auto multi_filter = dynamic_cast<MultiRangeFilter*>(bind_filter);
143 auto multi_filter = dynamic_cast<MultiRangeFilter*>(bind_filter);
144 QVERIFY(multi_filter != nullptr);
144 QVERIFY(multi_filter != nullptr);
145 auto options = multi_filter->options();
145 auto options = multi_filter->options();
146− QCOMPARE(options->rowCount(), 1);
146+ QCOMPARE(options->rowCount(), 2);
147
147
148− auto idx = options->index(0);
148+ auto idx = options->index(1);
149 QVariant id_var = options->data(idx, GenericOptionsModel::RoleId);
149 QVariant id_var = options->data(idx, GenericOptionsModel::RoleId);
150 QVariant name_var = options->data(idx, GenericOptionsModel::RoleName);
150 QVariant name_var = options->data(idx, GenericOptionsModel::RoleName);
151 QVariant icon_var = options->data(idx, GenericOptionsModel::RoleIconHint);
151 QVariant icon_var = options->data(idx, GenericOptionsModel::RoleIconHint);
@@ -168,9 +168,9 @@ void FiltersBindingsTest::testMultiRangeFilter()
168 auto multi_filter = dynamic_cast<MultiRangeFilter*>(bind_filter);
168 auto multi_filter = dynamic_cast<MultiRangeFilter*>(bind_filter);
169 QVERIFY(multi_filter != nullptr);
169 QVERIFY(multi_filter != nullptr);
170 auto options = multi_filter->options();
170 auto options = multi_filter->options();
171− QCOMPARE(options->rowCount(), 2);
171+ QCOMPARE(options->rowCount(), 3);
172
172
173− auto idx = options->index(0);
173+ auto idx = options->index(1);
174 QVariant id_var = options->data(idx, GenericOptionsModel::RoleId);
174 QVariant id_var = options->data(idx, GenericOptionsModel::RoleId);
175 QVariant name_var = options->data(idx, GenericOptionsModel::RoleName);
175 QVariant name_var = options->data(idx, GenericOptionsModel::RoleName);
176 QVariant icon_var = options->data(idx, GenericOptionsModel::RoleIconHint);
176 QVariant icon_var = options->data(idx, GenericOptionsModel::RoleIconHint);
@@ -181,10 +181,10 @@ void FiltersBindingsTest::testMultiRangeFilter()
181 QCOMPARE(icon_var.toString(), QString(""));
181 QCOMPARE(icon_var.toString(), QString(""));
182 QCOMPARE(active_var.toBool(), false);
182 QCOMPARE(active_var.toBool(), false);
183
183
184− AbstractFilterOption* opt1 = options->getRawOption(0);
184+ AbstractFilterOption* opt1 = options->getRawOption(1);
185 QCOMPARE(opt1->id(), QString("opt0"));
185 QCOMPARE(opt1->id(), QString("opt0"));
186
186
187− AbstractFilterOption* opt2 = options->getRawOption(1);
187+ AbstractFilterOption* opt2 = options->getRawOption(2);
188 QCOMPARE(opt2->id(), QString("opt1"));
188 QCOMPARE(opt2->id(), QString("opt1"));
189
189
190 delete multi_filter;
190 delete multi_filter;
@@ -199,18 +199,21 @@ void FiltersBindingsTest::testMultiRangeFilter()
199 auto multi_filter = dynamic_cast<MultiRangeFilter*>(bind_filter);
199 auto multi_filter = dynamic_cast<MultiRangeFilter*>(bind_filter);
200 QVERIFY(multi_filter != nullptr);
200 QVERIFY(multi_filter != nullptr);
201 auto options = multi_filter->options();
201 auto options = multi_filter->options();
202− QCOMPARE(options->rowCount(), 3);
202+ QCOMPARE(options->rowCount(), 4);
203+
204+ AbstractFilterOption* showAll = options->getRawOption(0);
205+ QVERIFY(showAll->id().startsWith("show_all::"));
203
206
204− AbstractFilterOption* opt0 = options->getRawOption(0);
207+ AbstractFilterOption* opt0 = options->getRawOption(1);
205 QCOMPARE(opt0->id(), QString("opt0"));
208 QCOMPARE(opt0->id(), QString("opt0"));
206
209
207− AbstractFilterOption* opt1 = options->getRawOption(1);
210+ AbstractFilterOption* opt1 = options->getRawOption(2);
208 QCOMPARE(opt1->id(), QString("opt1"));
211 QCOMPARE(opt1->id(), QString("opt1"));
209
212
210− AbstractFilterOption* opt2 = options->getRawOption(2);
213+ AbstractFilterOption* opt2 = options->getRawOption(3);
211 QCOMPARE(opt2->id(), QString("opt2"));
214 QCOMPARE(opt2->id(), QString("opt2"));
212
215
213− // verify combined filter options are bound to correct underlying unity options
216+ // verify filter options are bound to correct underlying unity options
214 auto core_multi_filter = std::dynamic_pointer_cast<unity::dash::MultiRangeFilter>(core_filter);
217 auto core_multi_filter = std::dynamic_pointer_cast<unity::dash::MultiRangeFilter>(core_filter);
215 QCOMPARE(QString::fromStdString(core_multi_filter->options()[0]->id()), QString("opt0"));
218 QCOMPARE(QString::fromStdString(core_multi_filter->options()[0]->id()), QString("opt0"));
216 QCOMPARE(QString::fromStdString(core_multi_filter->options()[1]->id()), QString("opt1"));
219 QCOMPARE(QString::fromStdString(core_multi_filter->options()[1]->id()), QString("opt1"));
@@ -274,7 +277,7 @@ void FiltersBindingsTest::testCheckOptionFilter()
274 auto check_filter = dynamic_cast<CheckOptionFilter*>(bind_filter);
277 auto check_filter = dynamic_cast<CheckOptionFilter*>(bind_filter);
275 QVERIFY(check_filter != nullptr);
278 QVERIFY(check_filter != nullptr);
276 auto options = check_filter->options();
279 auto options = check_filter->options();
277− QCOMPARE(options->rowCount(), 3);
280+ QCOMPARE(options->rowCount(), 4);
278
281
279 QCOMPARE(check_filter->id(), QString("f1"));
282 QCOMPARE(check_filter->id(), QString("f1"));
280 QCOMPARE(check_filter->name(), QString("Filter1"));
283 QCOMPARE(check_filter->name(), QString("Filter1"));
@@ -284,7 +287,7 @@ void FiltersBindingsTest::testCheckOptionFilter()
284 QCOMPARE(check_filter->collapsed(), false);
287 QCOMPARE(check_filter->collapsed(), false);
285 QCOMPARE(check_filter->filtering(), false);
288 QCOMPARE(check_filter->filtering(), false);
286
289
287− auto idx = options->index(0);
290+ auto idx = options->index(1);
288 QVariant id_var = options->data(idx, GenericOptionsModel::RoleId);
291 QVariant id_var = options->data(idx, GenericOptionsModel::RoleId);
289 QVariant name_var = options->data(idx, GenericOptionsModel::RoleName);
292 QVariant name_var = options->data(idx, GenericOptionsModel::RoleName);
290 QVariant icon_var = options->data(idx, GenericOptionsModel::RoleIconHint);
293 QVariant icon_var = options->data(idx, GenericOptionsModel::RoleIconHint);
@@ -295,7 +298,7 @@ void FiltersBindingsTest::testCheckOptionFilter()
295 QCOMPARE(icon_var.toString(), QString(""));
298 QCOMPARE(icon_var.toString(), QString(""));
296 QCOMPARE(active_var.toBool(), false);
299 QCOMPARE(active_var.toBool(), false);
297
300
298− idx = options->index(1);
301+ idx = options->index(2);
299 id_var = options->data(idx, GenericOptionsModel::RoleId);
302 id_var = options->data(idx, GenericOptionsModel::RoleId);
300 name_var = options->data(idx, GenericOptionsModel::RoleName);
303 name_var = options->data(idx, GenericOptionsModel::RoleName);
301 icon_var = options->data(idx, GenericOptionsModel::RoleIconHint);
304 icon_var = options->data(idx, GenericOptionsModel::RoleIconHint);
@@ -306,38 +309,55 @@ void FiltersBindingsTest::testCheckOptionFilter()
306 QCOMPARE(icon_var.toString(), QString(""));
309 QCOMPARE(icon_var.toString(), QString(""));
307 QCOMPARE(active_var.toBool(), false);
310 QCOMPARE(active_var.toBool(), false);
308
311
312+ AbstractFilterOption* showAll = options->getRawOption(0);
309− AbstractFilterOption* opt0 = options->getRawOption(0);
313+ AbstractFilterOption* opt0 = options->getRawOption(1);
310− AbstractFilterOption* opt1 = options->getRawOption(1);
314+ AbstractFilterOption* opt1 = options->getRawOption(2);
311− AbstractFilterOption* opt2 = options->getRawOption(2);
315+ AbstractFilterOption* opt2 = options->getRawOption(3);
312
316
317+ QSignalSpy showAllSpy(showAll, SIGNAL(activeChanged(bool)));
313 QSignalSpy opt0spy(opt0, SIGNAL(activeChanged(bool)));
318 QSignalSpy opt0spy(opt0, SIGNAL(activeChanged(bool)));
314 QSignalSpy opt1spy(opt1, SIGNAL(activeChanged(bool)));
319 QSignalSpy opt1spy(opt1, SIGNAL(activeChanged(bool)));
315 QSignalSpy opt2spy(opt2, SIGNAL(activeChanged(bool)));
320 QSignalSpy opt2spy(opt2, SIGNAL(activeChanged(bool)));
316 QSignalSpy dataChangedSpy(options, SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&, const QVector<int>&)));
321 QSignalSpy dataChangedSpy(options, SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&, const QVector<int>&)));
317
322
318 // test active property changes
323 // test active property changes
324+ QCOMPARE(showAll->active(), false);
319 QCOMPARE(opt0->active(), false);
325 QCOMPARE(opt0->active(), false);
320 QCOMPARE(opt1->active(), false);
326 QCOMPARE(opt1->active(), false);
321 QCOMPARE(opt2->active(), false);
327 QCOMPARE(opt2->active(), false);
322
328
323 opt0->setActive(true);
329 opt0->setActive(true);
330+ QCOMPARE(showAllSpy.count(), 0);
324 QCOMPARE(opt0spy.count(), 1);
331 QCOMPARE(opt0spy.count(), 1);
325 QCOMPARE(opt1spy.count(), 0);
332 QCOMPARE(opt1spy.count(), 0);
326 QCOMPARE(opt2spy.count(), 0);
333 QCOMPARE(opt2spy.count(), 0);
334+ QCOMPARE(showAll->active(), false);
327 QCOMPARE(opt0->active(), true);
335 QCOMPARE(opt0->active(), true);
328 QCOMPARE(opt1->active(), false);
336 QCOMPARE(opt1->active(), false);
329 QCOMPARE(opt2->active(), false);
337 QCOMPARE(opt2->active(), false);
330
338
331 opt1->setActive(true);
339 opt1->setActive(true);
340+ QCOMPARE(showAllSpy.count(), 0);
332 QCOMPARE(opt0spy.count(), 2);
341 QCOMPARE(opt0spy.count(), 2);
333 QCOMPARE(opt1spy.count(), 1);
342 QCOMPARE(opt1spy.count(), 1);
334 QCOMPARE(opt2spy.count(), 0);
343 QCOMPARE(opt2spy.count(), 0);
344+ QCOMPARE(showAll->active(), false);
335 QCOMPARE(opt0->active(), false);
345 QCOMPARE(opt0->active(), false);
336 QCOMPARE(opt1->active(), true);
346 QCOMPARE(opt1->active(), true);
337 QCOMPARE(opt2->active(), false);
347 QCOMPARE(opt2->active(), false);
338
348
339 QCOMPARE(dataChangedSpy.count(), 3);
349 QCOMPARE(dataChangedSpy.count(), 3);
340
350
351+ showAll->setActive(true);
352+ QCOMPARE(showAllSpy.count(), 1);
353+ QCOMPARE(opt0spy.count(), 2);
354+ QCOMPARE(opt1spy.count(), 2);
355+ QCOMPARE(opt2spy.count(), 0);
356+ QCOMPARE(showAll->active(), true);
357+ QCOMPARE(opt0->active(), false);
358+ QCOMPARE(opt1->active(), false);
359+ QCOMPARE(opt2->active(), false);
360+
341 delete check_filter;
361 delete check_filter;
342 }
362 }
343}
363}
@@ -357,7 +377,7 @@ void FiltersBindingsTest::testRadioOptionFilter()
357 auto radio_filter = dynamic_cast<RadioOptionFilter*>(bind_filter);
377 auto radio_filter = dynamic_cast<RadioOptionFilter*>(bind_filter);
358 QVERIFY(radio_filter != nullptr);
378 QVERIFY(radio_filter != nullptr);
359 auto options = radio_filter->options();
379 auto options = radio_filter->options();
360− QCOMPARE(options->rowCount(), 3);
380+ QCOMPARE(options->rowCount(), 4);
361
381
362 auto idx = options->index(0);
382 auto idx = options->index(0);
363 QVariant id_var = options->data(idx, GenericOptionsModel::RoleId);
383 QVariant id_var = options->data(idx, GenericOptionsModel::RoleId);
@@ -365,12 +385,23 @@ void FiltersBindingsTest::testRadioOptionFilter()
365 QVariant icon_var = options->data(idx, GenericOptionsModel::RoleIconHint);
385 QVariant icon_var = options->data(idx, GenericOptionsModel::RoleIconHint);
366 QVariant active_var = options->data(idx, GenericOptionsModel::RoleActive);
386 QVariant active_var = options->data(idx, GenericOptionsModel::RoleActive);
367
387
388+ QVERIFY(id_var.toString().startsWith("show_all::"));
389+ QVERIFY(name_var.toString().size() > 0);
390+ QCOMPARE(icon_var.toString(), QString(""));
391+ QCOMPARE(active_var.toBool(), false);
392+
393+ idx = options->index(1);
394+ id_var = options->data(idx, GenericOptionsModel::RoleId);
395+ name_var = options->data(idx, GenericOptionsModel::RoleName);
396+ icon_var = options->data(idx, GenericOptionsModel::RoleIconHint);
397+ active_var = options->data(idx, GenericOptionsModel::RoleActive);
398+
368 QCOMPARE(id_var.toString(), QString("opt0"));
399 QCOMPARE(id_var.toString(), QString("opt0"));
369 QCOMPARE(name_var.toString(), QString("Option 0"));
400 QCOMPARE(name_var.toString(), QString("Option 0"));
370 QCOMPARE(icon_var.toString(), QString(""));
401 QCOMPARE(icon_var.toString(), QString(""));
371 QCOMPARE(active_var.toBool(), false);
402 QCOMPARE(active_var.toBool(), false);
372
403
373− idx = options->index(1);
404+ idx = options->index(2);
374 id_var = options->data(idx, GenericOptionsModel::RoleId);
405 id_var = options->data(idx, GenericOptionsModel::RoleId);
375 name_var = options->data(idx, GenericOptionsModel::RoleName);
406 name_var = options->data(idx, GenericOptionsModel::RoleName);
376 icon_var = options->data(idx, GenericOptionsModel::RoleIconHint);
407 icon_var = options->data(idx, GenericOptionsModel::RoleIconHint);
@@ -381,9 +412,9 @@ void FiltersBindingsTest::testRadioOptionFilter()
381 QCOMPARE(icon_var.toString(), QString(""));
412 QCOMPARE(icon_var.toString(), QString(""));
382 QCOMPARE(active_var.toBool(), false);
413 QCOMPARE(active_var.toBool(), false);
383
414
384− AbstractFilterOption* opt0 = options->getRawOption(0);
415+ AbstractFilterOption* opt0 = options->getRawOption(1);
385− AbstractFilterOption* opt1 = options->getRawOption(1);
416+ AbstractFilterOption* opt1 = options->getRawOption(2);
386− AbstractFilterOption* opt2 = options->getRawOption(2);
417+ AbstractFilterOption* opt2 = options->getRawOption(3);
387
418
388 QSignalSpy opt0spy(opt0, SIGNAL(activeChanged(bool)));
419 QSignalSpy opt0spy(opt0, SIGNAL(activeChanged(bool)));
389 QSignalSpy opt1spy(opt1, SIGNAL(activeChanged(bool)));
420 QSignalSpy opt1spy(opt1, SIGNAL(activeChanged(bool)));
@@ -432,11 +463,11 @@ void FiltersBindingsTest::testRatingsFilter()
432 auto rating_filter = dynamic_cast<RatingsFilter*>(bind_filter);
463 auto rating_filter = dynamic_cast<RatingsFilter*>(bind_filter);
433 QVERIFY(rating_filter != nullptr);
464 QVERIFY(rating_filter != nullptr);
434 auto options = rating_filter->options();
465 auto options = rating_filter->options();
435− QCOMPARE(options->rowCount(), 5);
466+ QCOMPARE(options->rowCount(), 6);
436
467
437 RatingFilterOption* opt[5];
468 RatingFilterOption* opt[5];
438 for (int i = 0; i<5; i++) {
469 for (int i = 0; i<5; i++) {
439− opt[i] = dynamic_cast<RatingFilterOption *>(options->getRawOption(i));
470+ opt[i] = dynamic_cast<RatingFilterOption *>(options->getRawOption(i+1));
440 }
471 }
441
472
442 QSignalSpy opt0spy(opt[0], SIGNAL(activeChanged(bool)));
473 QSignalSpy opt0spy(opt[0], SIGNAL(activeChanged(bool)));
tests/plugins/Unity/filtersbindingstest.h+1−1
@@ -41,7 +41,7 @@ class FiltersBindingsTest : public QObject
41 void createCheckOptionFilter(DeeModel *model, const std::string &id, const std::string &name, int optionCount);
41 void createCheckOptionFilter(DeeModel *model, const std::string &id, const std::string &name, int optionCount);
42 void createRadioOptionFilter(DeeModel *model, const std::string &id, const std::string &name, int optionCount);
42 void createRadioOptionFilter(DeeModel *model, const std::string &id, const std::string &name, int optionCount);
43 void createRatingsFilter(DeeModel *model, const std::string &id, const std::string &name);
43 void createRatingsFilter(DeeModel *model, const std::string &id, const std::string &name);
44− void createFilter(DeeModel *model, const std::string &renderer, const std::string &id, const std::string &name, int optionCount);
44+ void createFilter(DeeModel *model, const std::string &renderer, const std::string &id, const std::string &name, int optionCount, bool showAll);
45};
45};
46
46
47#endif // FILTERSBINDINGSTEST_H
47#endif // FILTERSBINDINGSTEST_H