on xenial help sign in
Added SignalsList convienience class and use it to disconnect Unity's signals.
commit356dc315e983daeefa50ab92baf02818fd0a237e authorPawel Stolowski <pawel.stolowski@canonical.com> dateTue 9 Jul 2013, 14:25 (13 years ago) parentf2191cb
20 files changed+216−32
plugins/Unity/CMakeLists.txt+1 plugins/Unity/checkoptionfilter.cpp+3−3 plugins/Unity/checkoptionfilter.h+2 plugins/Unity/combinedfilteroption.cpp+5−5 plugins/Unity/combinedfilteroption.h+3−1 plugins/Unity/filter.cpp+9−9 plugins/Unity/filter.h+6 plugins/Unity/filteroption.cpp+5−5 plugins/Unity/filteroption.h+2 plugins/Unity/multirangefilter.cpp+2−5 plugins/Unity/multirangefilter.h+2 plugins/Unity/radiooptionfilter.cpp+2−2 plugins/Unity/radiooptionfilter.h+2 plugins/Unity/ratingsfilter.cpp+2−2 plugins/Unity/ratingsfilter.h+2 plugins/Unity/signalslist.cpp+39 plugins/Unity/signalslist.h+38 tests/plugins/Unity/CMakeLists.txt+4 tests/plugins/Unity/signalslisttest.cpp+57 tests/plugins/Unity/signalslisttest.h+30
plugins/Unity/CMakeLists.txt+1
@@ -40,6 +40,7 @@ set(QMLPLUGIN_SRC
4040 preview.cpp
4141 previewaction.cpp
4242 previewinfohint.cpp
43+ signalslist.cpp
4344 variantutils.cpp
4445 )
4546
plugins/Unity/checkoptionfilter.cpp+3−3
@@ -38,10 +38,10 @@ void CheckOptionFilter::setUnityFilter(unity::dash::Filter::Ptr filter)
3838 onOptionsChanged(m_unityCheckOptionFilter->options);
3939}
4040
41−void CheckOptionFilter::onOptionsChanged(unity::dash::CheckOptionFilter::CheckOptions options)
41+void CheckOptionFilter::onOptionsChanged(unity::dash::CheckOptionFilter::CheckOptions /* options */)
4242{
4343 if (m_options != NULL) {
44− // FIXME: should disconnect from m_unityFilter's signals
44+ m_signals.disconnectAll();
4545 delete m_options;
4646 m_options = NULL;
4747 }
@@ -54,7 +54,7 @@ void CheckOptionFilter::onOptionsChanged(unity::dash::CheckOptionFilter::CheckOp
5454 }
5555
5656 /* Property change signals */
57− m_unityCheckOptionFilter->options.changed.connect(sigc::mem_fun(this, &CheckOptionFilter::onOptionsChanged));
57+ m_signals.append(m_unityCheckOptionFilter->options.changed.connect(sigc::mem_fun(this, &CheckOptionFilter::onOptionsChanged)));
5858
5959 Q_EMIT optionsChanged();
6060}
plugins/Unity/checkoptionfilter.h+2
@@ -30,6 +30,7 @@
3030// Local
3131#include "filter.h"
3232#include "filteroption.h"
33+#include "signalslist.h"
3334
3435class Q_DECL_EXPORT CheckOptionFilter : public Filter
3536{
@@ -55,6 +56,7 @@ protected:
5556private:
5657 unity::dash::CheckOptionFilter::Ptr m_unityCheckOptionFilter;
5758 FilterOptions* m_options;
59+ SignalsList m_signals;
5860
5961 void onOptionsChanged(unity::dash::CheckOptionFilter::CheckOptions);
6062};
plugins/Unity/combinedfilteroption.cpp+5−5
@@ -108,7 +108,7 @@ void CombinedFilterOption::setUnityFilterOption(unity::dash::FilterOption::Ptr u
108108{
109109 for (int i=0; i<2; i++) {
110110 if (m_unityFilterOption[0] != NULL) {
111− // FIXME: should disconnect from m_unityFilterOption's signals
111+ m_signals.disconnectAll();
112112 }
113113 }
114114
@@ -118,10 +118,10 @@ void CombinedFilterOption::setUnityFilterOption(unity::dash::FilterOption::Ptr u
118118 /* Property change signals */
119119 for (int i=0; i<2; i++) {
120120 if (m_unityFilterOption[i] != nullptr) {
121− m_unityFilterOption[i]->id.changed.connect(sigc::mem_fun(this, &CombinedFilterOption::onIdChanged));
122− m_unityFilterOption[i]->name.changed.connect(sigc::mem_fun(this, &CombinedFilterOption::nameChanged));
123− m_unityFilterOption[i]->icon_hint.changed.connect(sigc::mem_fun(this, &CombinedFilterOption::iconHintChanged));
124− m_unityFilterOption[i]->active.changed.connect(sigc::mem_fun(this, &CombinedFilterOption::onActiveChanged));
121+ m_signals << m_unityFilterOption[i]->id.changed.connect(sigc::mem_fun(this, &CombinedFilterOption::onIdChanged))
122+ << m_unityFilterOption[i]->name.changed.connect(sigc::mem_fun(this, &CombinedFilterOption::nameChanged))
123+ << m_unityFilterOption[i]->icon_hint.changed.connect(sigc::mem_fun(this,&CombinedFilterOption::iconHintChanged))
124+ << m_unityFilterOption[i]->active.changed.connect(sigc::mem_fun(this, &CombinedFilterOption::onActiveChanged));
125125 }
126126 }
127127}
plugins/Unity/combinedfilteroption.h+3−1
@@ -22,6 +22,7 @@
2222
2323// Local
2424#include "abstractfilteroption.h"
25+#include "signalslist.h"
2526
2627// libunity-core
2728#include <UnityCore/Filter.h>
@@ -60,9 +61,10 @@ private:
6061 CombinedFilterOption is active. */
6162 void setInactive(const CombinedFilterOption &otherFilter);
6263
63− bool m_active; //not needed???
64+ bool m_active;
6465 bool m_requested_active;
6566 unity::dash::FilterOption::Ptr m_unityFilterOption[2];
67+ SignalsList m_signals;
6668
6769 friend class CombinedFilterOptions;
6870};
plugins/Unity/filter.cpp+9−9
@@ -85,22 +85,22 @@ void Filter::clear()
8585void Filter::setUnityFilter(unity::dash::Filter::Ptr unityFilter)
8686{
8787 if (m_unityFilter != NULL) {
88− // FIXME: should disconnect from m_unityFilter's signals
88+ m_signals.disconnectAll();
8989 }
9090
9191 m_unityFilter = unityFilter;
9292
9393 /* Property change signals */
94− m_unityFilter->id.changed.connect(sigc::mem_fun(this, &Filter::idChanged));
95− m_unityFilter->name.changed.connect(sigc::mem_fun(this, &Filter::nameChanged));
96− m_unityFilter->icon_hint.changed.connect(sigc::mem_fun(this, &Filter::iconHintChanged));
97− m_unityFilter->renderer_name.changed.connect(sigc::mem_fun(this, &Filter::rendererNameChanged));
98− m_unityFilter->visible.changed.connect(sigc::mem_fun(this, &Filter::visibleChanged));
99− m_unityFilter->collapsed.changed.connect(sigc::mem_fun(this, &Filter::collapsedChanged));
100− m_unityFilter->filtering.changed.connect(sigc::mem_fun(this, &Filter::filteringChanged));
94+ m_signals << m_unityFilter->id.changed.connect(sigc::mem_fun(this, &Filter::idChanged))
95+ << m_unityFilter->name.changed.connect(sigc::mem_fun(this, &Filter::nameChanged))
96+ << m_unityFilter->icon_hint.changed.connect(sigc::mem_fun(this, &Filter::iconHintChanged))
97+ << m_unityFilter->renderer_name.changed.connect(sigc::mem_fun(this, &Filter::rendererNameChanged))
98+ << m_unityFilter->visible.changed.connect(sigc::mem_fun(this, &Filter::visibleChanged))
99+ << m_unityFilter->collapsed.changed.connect(sigc::mem_fun(this, &Filter::collapsedChanged))
100+ << m_unityFilter->filtering.changed.connect(sigc::mem_fun(this, &Filter::filteringChanged));
101101
102102 /* Signals forwarding */
103− m_unityFilter->removed.connect(sigc::mem_fun(this, &Filter::removed));
103+ m_signals << m_unityFilter->removed.connect(sigc::mem_fun(this, &Filter::removed));
104104}
105105
106106Filter* Filter::newFromUnityFilter(unity::dash::Filter::Ptr unityFilter)
plugins/Unity/filter.h+6
@@ -27,6 +27,9 @@
2727// libunity-core
2828#include <UnityCore/Filter.h>
2929
30+// local
31+#include "signalslist.h"
32+
3033class Q_DECL_EXPORT Filter : public QObject
3134{
3235 Q_OBJECT
@@ -70,6 +73,9 @@ Q_SIGNALS:
7073protected:
7174 unity::dash::Filter::Ptr m_unityFilter;
7275 virtual void setUnityFilter(unity::dash::Filter::Ptr unityFilter);
76+
77+private:
78+ SignalsList m_signals;
7379};
7480
7581Q_DECLARE_METATYPE(Filter*)
plugins/Unity/filteroption.cpp+5−5
@@ -57,16 +57,16 @@ void FilterOption::setActive(bool active)
5757void FilterOption::setUnityFilterOption(unity::dash::FilterOption::Ptr unityFilterOption)
5858{
5959 if (m_unityFilterOption != NULL) {
60− // FIXME: should disconnect from m_unityFilterOption's signals
60+ m_signals.disconnectAll();
6161 }
6262
6363 m_unityFilterOption = unityFilterOption;
6464
6565 /* Property change signals */
66− m_unityFilterOption->id.changed.connect(sigc::mem_fun(this, &FilterOption::idChanged));
67− m_unityFilterOption->name.changed.connect(sigc::mem_fun(this, &FilterOption::nameChanged));
68− m_unityFilterOption->icon_hint.changed.connect(sigc::mem_fun(this, &FilterOption::iconHintChanged));
69− m_unityFilterOption->active.changed.connect(sigc::mem_fun(this, &FilterOption::activeChanged));
66+ m_signals << m_unityFilterOption->id.changed.connect(sigc::mem_fun(this, &FilterOption::idChanged))
67+ << m_unityFilterOption->name.changed.connect(sigc::mem_fun(this, &FilterOption::nameChanged))
68+ << m_unityFilterOption->icon_hint.changed.connect(sigc::mem_fun(this, &FilterOption::iconHintChanged))
69+ << m_unityFilterOption->active.changed.connect(sigc::mem_fun(this, &FilterOption::activeChanged));
7070}
7171
7272#include "filteroption.moc"
plugins/Unity/filteroption.h+2
@@ -23,6 +23,7 @@
2323// Local
2424#include "abstractfilteroption.h"
2525#include "listmodelwrapper.h"
26+#include "signalslist.h"
2627
2728// libunity-core
2829#include <UnityCore/Filter.h>
@@ -45,6 +46,7 @@ public:
4546
4647private:
4748 void setUnityFilterOption(unity::dash::FilterOption::Ptr unityFilterOption);
49+ SignalsList m_signals;
4850
4951 unity::dash::FilterOption::Ptr m_unityFilterOption;
5052};
plugins/Unity/multirangefilter.cpp+2−5
@@ -41,19 +41,16 @@ void MultiRangeFilter::setUnityFilter(unity::dash::Filter::Ptr filter)
4141void MultiRangeFilter::onOptionsChanged(unity::dash::MultiRangeFilter::Options /* options */)
4242{
4343 if (m_options != NULL) {
44− // FIXME: should disconnect from m_unityFilter's signals
44+ m_signals.disconnectAll();
4545 delete m_options;
4646 m_options = NULL;
4747 }
48−/* m_options = new FilterOptions(m_unityMultiRangeFilter->options,
49− m_unityMultiRangeFilter->option_added,
50− m_unityMultiRangeFilter->option_removed);*/
5148
5249 m_options = new CombinedFilterOptions(m_unityMultiRangeFilter->options,
5350 m_unityMultiRangeFilter->option_added,
5451 m_unityMultiRangeFilter->option_removed);
5552 /* Property change signals */
56− m_unityMultiRangeFilter->options.changed.connect(sigc::mem_fun(this, &MultiRangeFilter::onOptionsChanged));
53+ m_signals << m_unityMultiRangeFilter->options.changed.connect(sigc::mem_fun(this, &MultiRangeFilter::onOptionsChanged));
5754
5855 Q_EMIT optionsChanged();
5956}
plugins/Unity/multirangefilter.h+2
@@ -31,6 +31,7 @@
3131#include "filter.h"
3232#include "filteroption.h"
3333#include "combinedfilteroptions.h"
34+#include "signalslist.h"
3435
3536class Q_DECL_EXPORT MultiRangeFilter : public Filter
3637{
@@ -53,6 +54,7 @@ protected:
5354private:
5455 unity::dash::MultiRangeFilter::Ptr m_unityMultiRangeFilter;
5556 CombinedFilterOptions* m_options;
57+ SignalsList m_signals;
5658
5759 void onOptionsChanged(unity::dash::MultiRangeFilter::Options);
5860};
plugins/Unity/radiooptionfilter.cpp+2−2
@@ -51,7 +51,7 @@ void RadioOptionFilter::setUnityFilter(unity::dash::Filter::Ptr filter)
5151void RadioOptionFilter::onOptionsChanged(unity::dash::RadioOptionFilter::RadioOptions)
5252{
5353 if (m_options != NULL) {
54− // FIXME: should disconnect from m_unityFilter's signals
54+ m_signals.disconnectAll();
5555 delete m_options;
5656 m_options = NULL;
5757 }
@@ -59,7 +59,7 @@ void RadioOptionFilter::onOptionsChanged(unity::dash::RadioOptionFilter::RadioOp
5959 m_unityRadioOptionFilter->option_added,
6060 m_unityRadioOptionFilter->option_removed);
6161 /* Property change signals */
62− m_unityRadioOptionFilter->options.changed.connect(sigc::mem_fun(this, &RadioOptionFilter::onOptionsChanged));
62+ m_signals << m_unityRadioOptionFilter->options.changed.connect(sigc::mem_fun(this, &RadioOptionFilter::onOptionsChanged));
6363
6464 Q_EMIT optionsChanged();
6565}
plugins/Unity/radiooptionfilter.h+2
@@ -30,6 +30,7 @@
3030// Local
3131#include "filter.h"
3232#include "filteroption.h"
33+#include "signalslist.h"
3334
3435class Q_DECL_EXPORT RadioOptionFilter : public Filter
3536{
@@ -54,6 +55,7 @@ protected:
5455private:
5556 unity::dash::RadioOptionFilter::Ptr m_unityRadioOptionFilter;
5657 FilterOptions* m_options;
58+ SignalsList m_signals;
5759
5860 void onOptionsChanged(unity::dash::RadioOptionFilter::RadioOptions);
5961};
plugins/Unity/ratingsfilter.cpp+2−2
@@ -38,14 +38,14 @@ void RatingsFilter::setRating(float rating)
3838void RatingsFilter::setUnityFilter(unity::dash::Filter::Ptr filter)
3939{
4040 if (m_unityFilter != NULL) {
41− // FIXME: should disconnect from m_unityFilter's signals
41+ m_signals.disconnectAll();
4242 }
4343
4444 Filter::setUnityFilter(filter);
4545 m_unityRatingsFilter = std::dynamic_pointer_cast<unity::dash::RatingsFilter>(m_unityFilter);
4646
4747 /* Property change signals */
48− m_unityRatingsFilter->rating.changed.connect(sigc::mem_fun(this, &RatingsFilter::ratingChanged));
48+ m_signals << m_unityRatingsFilter->rating.changed.connect(sigc::mem_fun(this, &RatingsFilter::ratingChanged));
4949}
5050
5151#include "ratingsfilter.moc"
plugins/Unity/ratingsfilter.h+2
@@ -29,6 +29,7 @@
2929
3030// Local
3131#include "filter.h"
32+#include "signalslist.h"
3233
3334class Q_DECL_EXPORT RatingsFilter : public Filter
3435{
@@ -53,6 +54,7 @@ protected:
5354
5455private:
5556 unity::dash::RatingsFilter::Ptr m_unityRatingsFilter;
57+ SignalsList m_signals;
5658};
5759
5860Q_DECLARE_METATYPE(RatingsFilter*)
plugins/Unity/signalslist.cppnew file+39
@@ -0,0 +1,39 @@
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+#include "signalslist.h"
21+
22+void SignalsList::append(const sigc::connection &c)
23+{
24+ m_signals.append(c);
25+}
26+
27+void SignalsList::disconnectAll()
28+{
29+ Q_FOREACH(auto sig, m_signals) {
30+ sig.disconnect();
31+ }
32+ m_signals.clear();
33+}
34+
35+SignalsList& SignalsList::operator<<(const sigc::connection &c)
36+{
37+ append(c);
38+ return *this;
39+}
plugins/Unity/signalslist.hnew file+38
@@ -0,0 +1,38 @@
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 SIGNALSLIST_H
21+#define SIGNALSLIST_H
22+
23+#include <QList>
24+#include <sigc++/sigc++.h>
25+
26+class Q_DECL_EXPORT SignalsList
27+{
28+public:
29+ void append(const sigc::connection &c);
30+ void disconnectAll();
31+
32+ SignalsList& operator<<(const sigc::connection &c);
33+
34+private:
35+ QList<sigc::connection> m_signals;
36+};
37+
38+#endif
tests/plugins/Unity/CMakeLists.txt+4
@@ -1,6 +1,7 @@
11pkg_check_modules(UNITYCORE REQUIRED unity-core-6.0)
22pkg_check_modules(LIBUNITYPROTO REQUIRED unity-protocol-private)
33pkg_check_modules(LIBUNITY REQUIRED unity)
4+pkg_check_modules(LIBSIGCPP REQUIRED sigc++-2.0)
45
56include_directories(
67 ${Unity-qml_SOURCE_DIR}
@@ -8,6 +9,7 @@ include_directories(
89 ${CMAKE_CURRENT_BINARY_DIR}
910 ${LIBUNITYPROTO_INCLUDE_DIRS}
1011 ${LIBUNITY_INCLUDE_DIRS}
12+ ${LIBSIGCPP_INCLUDE_DIRS}
1113 ${UNITYCORE_INCLUDE_DIRS}
1214 )
1315
@@ -30,6 +32,7 @@ macro(run_tests)
3032 ${UNITYCORE_LDFLAGS}
3133 ${LIBUNITY_LDFLAGS}
3234 ${LIBUNITYPROTO_LDFLAGS}
35+ ${LIBSIGCPP_LDFLAGS}
3336 )
3437
3538 set(_test_list "${_test_list};${_test}")
@@ -37,6 +40,7 @@ macro(run_tests)
3740endmacro(run_tests)
3841
3942run_tests(
43+ signalslisttest
4044 previewbindingstest
4145 filtersbindingstest
4246 )
tests/plugins/Unity/signalslisttest.cppnew file+57
@@ -0,0 +1,57 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+// local
18+#include "signalslisttest.h"
19+#include "signalslist.h"
20+
21+// Qt
22+#include <QTest>
23+
24+class TestSource
25+{
26+ public:
27+ TestSource(): m_count(0) {}
28+ void update()
29+ {
30+ countChanged(++m_count);
31+ }
32+
33+ sigc::signal<void, int> countChanged;
34+ int m_count;
35+};
36+
37+void SignalsListTest::testSignalsList()
38+{
39+ TestSource src;
40+ SignalsList signals;
41+ int counter = -1;
42+
43+ signals << src.countChanged.connect([&counter](int val) {
44+ counter = val;
45+ });
46+
47+ src.update();
48+ QCOMPARE(counter, 1);
49+ src.update();
50+ QCOMPARE(counter, 2);
51+
52+ signals.disconnectAll();
53+ src.update();
54+ QCOMPARE(counter, 2);
55+}
56+
57+QTEST_MAIN(SignalsListTest)
tests/plugins/Unity/signalslisttest.hnew file+30
@@ -0,0 +1,30 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef SIGNALSLISTTEST_H
18+#define SIGNALSLISTTEST_H
19+
20+#include <QObject>
21+
22+class SignalsListTest : public QObject
23+{
24+ Q_OBJECT
25+
26+ private Q_SLOTS:
27+ void testSignalsList();
28+};
29+
30+#endif