on xenial help sign in
Added VisibleIndicatorsModel for indicator visibility filter
commitf5c8353698eba6f5bee8a5eb55e46f470b92f7f8 authorNick Dedekind <nicholas.dedekind@gmail.com> dateMon 2 Sep 2013, 08:39 (13 years ago) parent1832ace
12 files changed+171−63
Panel/IndicatorItem.qml+2−2 Panel/IndicatorRow.qml+11−2 Panel/Indicators.qml+1 Panel/MenuContent.qml+9−3 plugins/Unity/Indicators/CMakeLists.txt+1 plugins/Unity/Indicators/indicator.cpp+1−17 plugins/Unity/Indicators/indicator.h−6 plugins/Unity/Indicators/indicatorsmodel.cpp−31 plugins/Unity/Indicators/indicatorsmodel.h−2 plugins/Unity/Indicators/plugin.cpp+2 plugins/Unity/Indicators/visibleindicatorsmodel.cpp+88 plugins/Unity/Indicators/visibleindicatorsmodel.h+56
Panel/IndicatorItem.qml+2−2
@@ -26,12 +26,12 @@ Item {
2626 property bool highlighted: false
2727 property bool dimmed: false
2828 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
3030
3131 opacity: dimmed ? 0.4 : 1
3232 Behavior on opacity { StandardAnimation {} }
3333
34− width: loader.item != undefined && loader.status == Loader.Ready ? loader.item.width : 0
34+ width: loader.item ? loader.item.width : 0
3535
3636 Loader {
3737 id: loader
Panel/IndicatorRow.qml+11−2
@@ -26,6 +26,7 @@ Item {
2626 readonly property int currentItemIndex: currentItem ? currentItem.ownIndex : -1
2727 property alias row: row
2828 property QtObject indicatorsModel: null
29+ property var visibleIndicators: defined
2930
3031 width: units.gu(40)
3132 height: units.gu(3)
@@ -74,10 +75,18 @@ Item {
7475 indicatorProperties : model.indicatorProperties
7576
7677 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();
7883 }
7984 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();
8190 }
8291 }
8392
Panel/Indicators.qml+1
@@ -178,6 +178,7 @@ Showable {
178178 indicatorsModel: indicatorsModel
179179 clip: !indicators.fullyOpened
180180 activeHeader: indicators.state == "hint" || indicators.state == "reveal"
181+ visibleIndicators: indicatorRow.visibleIndicators
181182
182183 Connections {
183184 property bool enableIndexChangeSignal: true
Panel/MenuContent.qml+9−3
@@ -32,6 +32,7 @@ MainView {
3232 backgroundColor: "#221e1c" // FIXME not in palette yet
3333 property int contentReleaseInterval: 20000
3434 property bool activeHeader: false
35+ property alias visibleIndicators: visibleIndicatorsModel.visible
3536
3637 width: units.gu(40)
3738 height: units.gu(42)
@@ -66,13 +67,18 @@ MainView {
6667
6768 SortFilterProxyModel {
6869 id: filteredIndicators
69− model: indicatorsModel
70+ model: visibleIndicatorsModel
7071 dynamicSortFilter: true
7172
7273 filterRole: Indicators.IndicatorsModelRole.IsVisible
7374 filterRegExp: RegExp("^true$")
7475 }
7576
77+ Indicators.VisibleIndicatorsModel {
78+ id: visibleIndicatorsModel
79+ model: indicatorsModel
80+ }
81+
7682 Tabs {
7783 id: tabs
7884 objectName: "tabs"
@@ -82,7 +88,7 @@ MainView {
8288 Repeater {
8389 id: repeater
8490 model: filteredIndicators
85− objectName: "menus"
91+ objectName: "tabsRepeater"
8692
8793 // FIXME: This is needed because tabs dont handle repeaters well.
8894 // Due to the child ordering happening after child insertion.
@@ -126,7 +132,7 @@ MainView {
126132 item[pName] = indicatorProperties[pName]
127133 }
128134 }
129− if (contentActive && menus.visible) {
135+ if (contentActive && tabs.visible) {
130136 item.start()
131137 }
132138 }
plugins/Unity/Indicators/CMakeLists.txt+1
@@ -34,6 +34,7 @@ set(IndicatorsQML_SOURCES
3434 rootactionstate.cpp
3535 unitymenumodelcache.cpp
3636 unitymenumodelstack.cpp
37+ visibleindicatorsmodel.cpp
3738)
3839add_definitions(-DUNITYINDICATORS_LIBRARY)
3940
plugins/Unity/Indicators/indicator.cpp+1−17
@@ -23,8 +23,7 @@
2323
2424Indicator::Indicator(QObject *parent)
2525 : QObject(parent),
26− m_position(0),
27− m_visible(false)
26+ m_position(0)
2827{
2928}
3029
@@ -87,21 +86,6 @@ void Indicator::setPosition(int position)
8786 }
8887}
8988
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−
10589QVariant Indicator::indicatorProperties() const
10690{
10791 return m_properties;
plugins/Unity/Indicators/indicator.h−6
@@ -40,15 +40,10 @@ public:
4040 QString identifier() const;
4141 int position() const;
4242 QVariant indicatorProperties() const;
43− bool isVisible() const;
44−
45− // is set once we know if we're connected.
46− bool setVisible(bool visible);
4743
4844Q_SIGNALS:
4945 void identifierChanged(const QString &identifier);
5046 void positionChanged(int position);
51− void visibleChanged(bool visible);
5247 void indicatorPropertiesChanged(const QVariant &properties);
5348
5449protected:
@@ -59,7 +54,6 @@ protected:
5954private:
6055 QString m_identifier;
6156 int m_position;
62− bool m_visible;
6357 QVariant m_properties;
6458};
6559
plugins/Unity/Indicators/indicatorsmodel.cpp−31
@@ -206,7 +206,6 @@ QHash<int, QByteArray> IndicatorsModel::roleNames() const
206206 roles[IndicatorsModelRole::WidgetSource] = "widgetSource";
207207 roles[IndicatorsModelRole::PageSource] = "pageSource";
208208 roles[IndicatorsModelRole::IndicatorProperties] = "indicatorProperties";
209− roles[IndicatorsModelRole::IsVisible] = "isVisible";
210209 }
211210 return roles;
212211}
@@ -269,8 +268,6 @@ QVariant IndicatorsModel::data(const QModelIndex &index, int role) const
269268 return QVariant(indicator->indicatorProperties());
270269 }
271270 break;
272− case IndicatorsModelRole::IsVisible:
273− return (indicator ? indicator->isVisible() : false);
274271 case IndicatorsModelRole::Title:
275272 case IndicatorsModelRole::Description:
276273 case IndicatorsModelRole::WidgetSource:
@@ -282,34 +279,6 @@ QVariant IndicatorsModel::data(const QModelIndex &index, int role) const
282279 return QVariant();
283280}
284281
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−
313282QVariant IndicatorsModel::indicatorData(const Indicator::Ptr& indicator, int role) const
314283{
315284 if (indicator && m_parsed_indicator_data.contains(indicator->identifier()))
plugins/Unity/Indicators/indicatorsmodel.h−2
@@ -45,13 +45,11 @@ public:
4545 Q_INVOKABLE void unload();
4646
4747 Q_INVOKABLE QVariant data(int row, int role) const;
48− Q_INVOKABLE void setData(int row, const QVariant& value, int role);
4948
5049 /* QAbstractItemModel */
5150 QHash<int, QByteArray> roleNames() const;
5251 int columnCount(const QModelIndex &parent = QModelIndex()) const;
5352 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
54− bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole);
5553 QModelIndex parent (const QModelIndex &index) const;
5654 int rowCount(const QModelIndex &parent = QModelIndex()) const;
5755
plugins/Unity/Indicators/plugin.cpp+2
@@ -32,6 +32,7 @@
3232#include "rootactionstate.h"
3333#include "unitymenumodelcache.h"
3434#include "unitymenumodelstack.h"
35+#include "visibleindicatorsmodel.h"
3536
3637static QObject* menuModelCacheSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
3738 Q_UNUSED(engine);
@@ -47,6 +48,7 @@ void Indicators2Plugin::registerTypes(const char *uri)
4748 qmlRegisterType<UnityMenuModelStack>(uri, 0, 1, "UnityMenuModelStack");
4849 qmlRegisterType<RootActionState>(uri, 0, 1, "RootActionState");
4950 qmlRegisterType<ModelPrinter>(uri, 0, 1, "ModelPrinter");
51+ qmlRegisterType<VisibleIndicatorsModel>(uri, 0, 1, "VisibleIndicatorsModel");
5052
5153 qmlRegisterSingletonType<UnityMenuModelCache>(uri, 0, 1, "UnityMenuModelCache", menuModelCacheSingleton);
5254
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