on xenial help sign in
Added VisibleIndicatorsModel for indicator visibility filter
f5c8353Nick Dedekind
Panel/IndicatorItem.qml+2−2
@@ -26,12 +26,12 @@ Item {
26 property bool highlighted: false
26 property bool highlighted: false
27 property bool dimmed: false
27 property bool dimmed: false
28 property var indicatorProperties: undefined
28 property var indicatorProperties: undefined
29− property bool indicatorVisible: loader.item != undefined && loader.status == Loader.Ready ? loader.item.enabled : false
29+ property bool indicatorVisible: loader.item ? loader.item.enabled : false
30
30
31 opacity: dimmed ? 0.4 : 1
31 opacity: dimmed ? 0.4 : 1
32 Behavior on opacity { StandardAnimation {} }
32 Behavior on opacity { StandardAnimation {} }
33
33
34− width: loader.item != undefined && loader.status == Loader.Ready ? loader.item.width : 0
34+ width: loader.item ? loader.item.width : 0
35
35
36 Loader {
36 Loader {
37 id: loader
37 id: loader
Panel/IndicatorRow.qml+11−2
@@ -26,6 +26,7 @@ Item {
26 readonly property int currentItemIndex: currentItem ? currentItem.ownIndex : -1
26 readonly property int currentItemIndex: currentItem ? currentItem.ownIndex : -1
27 property alias row: row
27 property alias row: row
28 property QtObject indicatorsModel: null
28 property QtObject indicatorsModel: null
29+ property var visibleIndicators: defined
29
30
30 width: units.gu(40)
31 width: units.gu(40)
31 height: units.gu(3)
32 height: units.gu(3)
@@ -74,10 +75,18 @@ Item {
74 indicatorProperties : model.indicatorProperties
75 indicatorProperties : model.indicatorProperties
75
76
76 Component.onCompleted: {
77 Component.onCompleted: {
77− indicatorsModel.setData(index, indicatorVisible, Indicators.IndicatorsModelRole.IsVisible);
78+ if (visibleIndicators == undefined) {
79+ visibleIndicators = {}
80+ }
81+ indicatorRow.visibleIndicators[model.identifier] = indicatorVisible;
82+ indicatorRow.visibleIndicatorsChanged();
78 }
83 }
79 onIndicatorVisibleChanged: {
84 onIndicatorVisibleChanged: {
80− indicatorsModel.setData(index, indicatorVisible, Indicators.IndicatorsModelRole.IsVisible);
85+ if (visibleIndicators == undefined) {
86+ visibleIndicators = {}
87+ }
88+ indicatorRow.visibleIndicators[model.identifier] = indicatorVisible;
89+ indicatorRow.visibleIndicatorsChanged();
81 }
90 }
82 }
91 }
83
92
Panel/Indicators.qml+1
@@ -178,6 +178,7 @@ Showable {
178 indicatorsModel: indicatorsModel
178 indicatorsModel: indicatorsModel
179 clip: !indicators.fullyOpened
179 clip: !indicators.fullyOpened
180 activeHeader: indicators.state == "hint" || indicators.state == "reveal"
180 activeHeader: indicators.state == "hint" || indicators.state == "reveal"
181+ visibleIndicators: indicatorRow.visibleIndicators
181
182
182 Connections {
183 Connections {
183 property bool enableIndexChangeSignal: true
184 property bool enableIndexChangeSignal: true
Panel/MenuContent.qml+9−3
@@ -32,6 +32,7 @@ MainView {
32 backgroundColor: "#221e1c" // FIXME not in palette yet
32 backgroundColor: "#221e1c" // FIXME not in palette yet
33 property int contentReleaseInterval: 20000
33 property int contentReleaseInterval: 20000
34 property bool activeHeader: false
34 property bool activeHeader: false
35+ property alias visibleIndicators: visibleIndicatorsModel.visible
35
36
36 width: units.gu(40)
37 width: units.gu(40)
37 height: units.gu(42)
38 height: units.gu(42)
@@ -66,13 +67,18 @@ MainView {
66
67
67 SortFilterProxyModel {
68 SortFilterProxyModel {
68 id: filteredIndicators
69 id: filteredIndicators
69− model: indicatorsModel
70+ model: visibleIndicatorsModel
70 dynamicSortFilter: true
71 dynamicSortFilter: true
71
72
72 filterRole: Indicators.IndicatorsModelRole.IsVisible
73 filterRole: Indicators.IndicatorsModelRole.IsVisible
73 filterRegExp: RegExp("^true$")
74 filterRegExp: RegExp("^true$")
74 }
75 }
75
76
77+ Indicators.VisibleIndicatorsModel {
78+ id: visibleIndicatorsModel
79+ model: indicatorsModel
80+ }
81+
76 Tabs {
82 Tabs {
77 id: tabs
83 id: tabs
78 objectName: "tabs"
84 objectName: "tabs"
@@ -82,7 +88,7 @@ MainView {
82 Repeater {
88 Repeater {
83 id: repeater
89 id: repeater
84 model: filteredIndicators
90 model: filteredIndicators
85− objectName: "menus"
91+ objectName: "tabsRepeater"
86
92
87 // FIXME: This is needed because tabs dont handle repeaters well.
93 // FIXME: This is needed because tabs dont handle repeaters well.
88 // Due to the child ordering happening after child insertion.
94 // Due to the child ordering happening after child insertion.
@@ -126,7 +132,7 @@ MainView {
126 item[pName] = indicatorProperties[pName]
132 item[pName] = indicatorProperties[pName]
127 }
133 }
128 }
134 }
129− if (contentActive && menus.visible) {
135+ if (contentActive && tabs.visible) {
130 item.start()
136 item.start()
131 }
137 }
132 }
138 }
plugins/Unity/Indicators/CMakeLists.txt+1
@@ -34,6 +34,7 @@ set(IndicatorsQML_SOURCES
34 rootactionstate.cpp
34 rootactionstate.cpp
35 unitymenumodelcache.cpp
35 unitymenumodelcache.cpp
36 unitymenumodelstack.cpp
36 unitymenumodelstack.cpp
37+ visibleindicatorsmodel.cpp
37)
38)
38add_definitions(-DUNITYINDICATORS_LIBRARY)
39add_definitions(-DUNITYINDICATORS_LIBRARY)
39
40
plugins/Unity/Indicators/indicator.cpp+1−17
@@ -23,8 +23,7 @@
23
23
24Indicator::Indicator(QObject *parent)
24Indicator::Indicator(QObject *parent)
25 : QObject(parent),
25 : QObject(parent),
26− m_position(0),
26+ m_position(0)
27− m_visible(false)
28{
27{
29}
28}
30
29
@@ -87,21 +86,6 @@ void Indicator::setPosition(int position)
87 }
86 }
88}
87}
89
88
90−bool Indicator::isVisible() const
91−{
92− return m_visible;
93−}
94−
95−bool Indicator::setVisible(bool visible)
96−{
97− if (visible != m_visible) {
98− m_visible = visible;
99− Q_EMIT visibleChanged(m_visible);
100− return true;
101− }
102− return false;
103−}
104−
105QVariant Indicator::indicatorProperties() const
89QVariant Indicator::indicatorProperties() const
106{
90{
107 return m_properties;
91 return m_properties;
plugins/Unity/Indicators/indicator.h−6
@@ -40,15 +40,10 @@ public:
40 QString identifier() const;
40 QString identifier() const;
41 int position() const;
41 int position() const;
42 QVariant indicatorProperties() const;
42 QVariant indicatorProperties() const;
43− bool isVisible() const;
44−
45− // is set once we know if we're connected.
46− bool setVisible(bool visible);
47
43
48Q_SIGNALS:
44Q_SIGNALS:
49 void identifierChanged(const QString &identifier);
45 void identifierChanged(const QString &identifier);
50 void positionChanged(int position);
46 void positionChanged(int position);
51− void visibleChanged(bool visible);
52 void indicatorPropertiesChanged(const QVariant &properties);
47 void indicatorPropertiesChanged(const QVariant &properties);
53
48
54protected:
49protected:
@@ -59,7 +54,6 @@ protected:
59private:
54private:
60 QString m_identifier;
55 QString m_identifier;
61 int m_position;
56 int m_position;
62− bool m_visible;
63 QVariant m_properties;
57 QVariant m_properties;
64};
58};
65
59
plugins/Unity/Indicators/indicatorsmodel.cpp−31
@@ -206,7 +206,6 @@ QHash<int, QByteArray> IndicatorsModel::roleNames() const
206 roles[IndicatorsModelRole::WidgetSource] = "widgetSource";
206 roles[IndicatorsModelRole::WidgetSource] = "widgetSource";
207 roles[IndicatorsModelRole::PageSource] = "pageSource";
207 roles[IndicatorsModelRole::PageSource] = "pageSource";
208 roles[IndicatorsModelRole::IndicatorProperties] = "indicatorProperties";
208 roles[IndicatorsModelRole::IndicatorProperties] = "indicatorProperties";
209− roles[IndicatorsModelRole::IsVisible] = "isVisible";
210 }
209 }
211 return roles;
210 return roles;
212}
211}
@@ -269,8 +268,6 @@ QVariant IndicatorsModel::data(const QModelIndex &index, int role) const
269 return QVariant(indicator->indicatorProperties());
268 return QVariant(indicator->indicatorProperties());
270 }
269 }
271 break;
270 break;
272− case IndicatorsModelRole::IsVisible:
273− return (indicator ? indicator->isVisible() : false);
274 case IndicatorsModelRole::Title:
271 case IndicatorsModelRole::Title:
275 case IndicatorsModelRole::Description:
272 case IndicatorsModelRole::Description:
276 case IndicatorsModelRole::WidgetSource:
273 case IndicatorsModelRole::WidgetSource:
@@ -282,34 +279,6 @@ QVariant IndicatorsModel::data(const QModelIndex &index, int role) const
282 return QVariant();
279 return QVariant();
283}
280}
284
281
285−void IndicatorsModel::setData(int row, const QVariant& value, int role)
286−{
287− setData(index(row, 0), value, role);
288−}
289−
290−bool IndicatorsModel::setData(const QModelIndex & index, const QVariant & value, int role)
291−{
292− if (!index.isValid() || index.row() >= m_indicators.size())
293− return false;
294−
295− Indicator::Ptr indicator = m_indicators[index.row()];
296−
297− switch (role)
298− {
299− case IndicatorsModelRole::IsVisible:
300− if (indicator) {
301− if (indicator->setVisible(value.toBool())) {
302− dataChanged(index, index, QVector<int>() << role);
303− }
304− return true;
305− }
306− break;
307− default:
308− break;
309− }
310− return false;
311−}
312−
313QVariant IndicatorsModel::indicatorData(const Indicator::Ptr& indicator, int role) const
282QVariant IndicatorsModel::indicatorData(const Indicator::Ptr& indicator, int role) const
314{
283{
315 if (indicator && m_parsed_indicator_data.contains(indicator->identifier()))
284 if (indicator && m_parsed_indicator_data.contains(indicator->identifier()))
plugins/Unity/Indicators/indicatorsmodel.h−2
@@ -45,13 +45,11 @@ public:
45 Q_INVOKABLE void unload();
45 Q_INVOKABLE void unload();
46
46
47 Q_INVOKABLE QVariant data(int row, int role) const;
47 Q_INVOKABLE QVariant data(int row, int role) const;
48− Q_INVOKABLE void setData(int row, const QVariant& value, int role);
49
48
50 /* QAbstractItemModel */
49 /* QAbstractItemModel */
51 QHash<int, QByteArray> roleNames() const;
50 QHash<int, QByteArray> roleNames() const;
52 int columnCount(const QModelIndex &parent = QModelIndex()) const;
51 int columnCount(const QModelIndex &parent = QModelIndex()) const;
53 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
52 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
54− bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole);
55 QModelIndex parent (const QModelIndex &index) const;
53 QModelIndex parent (const QModelIndex &index) const;
56 int rowCount(const QModelIndex &parent = QModelIndex()) const;
54 int rowCount(const QModelIndex &parent = QModelIndex()) const;
57
55
plugins/Unity/Indicators/plugin.cpp+2
@@ -32,6 +32,7 @@
32#include "rootactionstate.h"
32#include "rootactionstate.h"
33#include "unitymenumodelcache.h"
33#include "unitymenumodelcache.h"
34#include "unitymenumodelstack.h"
34#include "unitymenumodelstack.h"
35+#include "visibleindicatorsmodel.h"
35
36
36static QObject* menuModelCacheSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
37static QObject* menuModelCacheSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
37 Q_UNUSED(engine);
38 Q_UNUSED(engine);
@@ -47,6 +48,7 @@ void Indicators2Plugin::registerTypes(const char *uri)
47 qmlRegisterType<UnityMenuModelStack>(uri, 0, 1, "UnityMenuModelStack");
48 qmlRegisterType<UnityMenuModelStack>(uri, 0, 1, "UnityMenuModelStack");
48 qmlRegisterType<RootActionState>(uri, 0, 1, "RootActionState");
49 qmlRegisterType<RootActionState>(uri, 0, 1, "RootActionState");
49 qmlRegisterType<ModelPrinter>(uri, 0, 1, "ModelPrinter");
50 qmlRegisterType<ModelPrinter>(uri, 0, 1, "ModelPrinter");
51+ qmlRegisterType<VisibleIndicatorsModel>(uri, 0, 1, "VisibleIndicatorsModel");
50
52
51 qmlRegisterSingletonType<UnityMenuModelCache>(uri, 0, 1, "UnityMenuModelCache", menuModelCacheSingleton);
53 qmlRegisterSingletonType<UnityMenuModelCache>(uri, 0, 1, "UnityMenuModelCache", menuModelCacheSingleton);
52
54
plugins/Unity/Indicators/visibleindicatorsmodel.cppnew file+88
@@ -0,0 +1,88 @@
1+/*
2+ * Copyright (C) 2012, 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+// self
18+#include "visibleindicatorsmodel.h"
19+#include "indicators.h"
20+
21+VisibleIndicatorsModel::VisibleIndicatorsModel(QObject *parent)
22+ : QIdentityProxyModel(parent),
23+ m_inserting(false)
24+{
25+ QObject::connect(this, SIGNAL(rowsAboutToBeInserted(QModelIndex, int, int)), this, SLOT(onBeginRowInserted(QModelIndex, int, int)));
26+ QObject::connect(this, SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(onRowInserted(QModelIndex, int, int)));
27+}
28+
29+QHash<int, QByteArray> VisibleIndicatorsModel::roleNames() const
30+{
31+ static QHash<int, QByteArray> roles;
32+ if (roles.isEmpty() && sourceModel())
33+ {
34+ roles = sourceModel()->roleNames();
35+ roles[IndicatorsModelRole::IsVisible] = "isVisible";
36+ }
37+ return roles;
38+}
39+
40+void VisibleIndicatorsModel::setSourceModel(QAbstractItemModel *model)
41+{
42+ if (sourceModel() != model) {
43+ QIdentityProxyModel::setSourceModel(model);
44+ Q_EMIT modelChanged();
45+ }
46+}
47+
48+QVariantMap VisibleIndicatorsModel::visible() const
49+{
50+ return m_visible;
51+}
52+
53+void VisibleIndicatorsModel::onBeginRowInserted(const QModelIndex&, int, int)
54+{
55+ m_inserting = true;
56+}
57+
58+void VisibleIndicatorsModel::onRowInserted(const QModelIndex&, int, int)
59+{
60+ m_inserting = false;
61+}
62+
63+void VisibleIndicatorsModel::setVisible(const QVariantMap& visible)
64+{
65+ if (m_visible != visible) {
66+ m_visible = visible;
67+ Q_EMIT visibleChanged();
68+
69+ // need to tell the view that the visible data has changed.
70+ if (!m_inserting && rowCount() > 0) {
71+ Q_EMIT dataChanged(index(0, 0), index(rowCount() - 1, 0), QVector<int>() << IndicatorsModelRole::IsVisible);
72+ }
73+ }
74+}
75+
76+QVariant VisibleIndicatorsModel::data(const QModelIndex &index, int role) const
77+{
78+ if (role != IndicatorsModelRole::IsVisible) {
79+ return QIdentityProxyModel::data(index, role);
80+ }
81+
82+ if (!index.isValid()) {
83+ return false;
84+ }
85+
86+ QString ident = QIdentityProxyModel::data(index, IndicatorsModelRole::Identifier).toString();
87+ return m_visible.value(ident, false).toBool();
88+}
plugins/Unity/Indicators/visibleindicatorsmodel.hnew file+56
@@ -0,0 +1,56 @@
1+/*
2+ * Copyright (C) 2012, 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+ * Authors:
17+ * Nick Dedekind <nick.dedekind@canonical.com>
18+ */
19+
20+#ifndef VISIBLEINDICATORSMODEL_H
21+#define VISIBLEINDICATORSMODEL_H
22+
23+#include <QIdentityProxyModel>
24+
25+class VisibleIndicatorsModel : public QIdentityProxyModel
26+{
27+ Q_OBJECT
28+
29+ Q_PROPERTY(QAbstractItemModel* model READ sourceModel WRITE setSourceModel NOTIFY modelChanged)
30+ Q_PROPERTY(QVariantMap visible READ visible WRITE setVisible NOTIFY visibleChanged)
31+
32+public:
33+ explicit VisibleIndicatorsModel(QObject *parent = 0);
34+
35+ virtual void setSourceModel(QAbstractItemModel *model);
36+ virtual QHash<int, QByteArray> roleNames() const;
37+ virtual QVariant data(const QModelIndex &index, int role) const;
38+
39+ QVariantMap visible() const;
40+ void setVisible(const QVariantMap& visible);
41+
42+public Q_SLOTS:
43+ void onBeginRowInserted(const QModelIndex&, int start, int end);
44+ void onRowInserted(const QModelIndex&, int start, int end);
45+
46+Q_SIGNALS:
47+ void totalCountChanged();
48+ void modelChanged();
49+ void visibleChanged();
50+
51+private:
52+ QVariantMap m_visible;
53+ bool m_inserting;
54+};
55+
56+#endif // VISIBLEINDICATORSMODEL_H