on xenial help sign in
Expanded visible indicators.
commit2f15a07c45847f8832113a82a0fcc4e0b86ddff0 authorNick Dedekind <nick.dedekind@canonical.com> dateFri 17 Oct 2014, 15:55 (12 years ago) parent0742924
20 files changed+303−175
plugins/Unity/Indicators/sharedunitymenumodel.cpp+6−1 plugins/Unity/Indicators/unitymenumodelcache.cpp+1−5 plugins/Unity/Indicators/unitymenumodelcache.h+1−3 qml/Panel/IndicatorItem.qml+1−1 qml/Panel/IndicatorItemRow.qml+45−4 qml/Panel/Indicators/IndicatorBase.qml−2 qml/Panel/Indicators/IndicatorDelegate.qml+2−2 qml/Panel/IndicatorsBar.qml+2−2 tests/mocks/Unity/Indicators/IndicatorsModel.qml+83−79 tests/mocks/Unity/Indicators/RootActionState.qml+2−2 tests/mocks/Unity/Indicators/fakeunitymenumodelcache.cpp+10−8 tests/mocks/Unity/Indicators/fakeunitymenumodelcache.h+4−8 tests/qmltests/Greeter/tst_Clock.qml+1−3 tests/qmltests/Panel/IndicatorTest.qml+23−10 tests/qmltests/Panel/tst_IndicatorItemRow.qml+27−16 tests/qmltests/Panel/tst_IndicatorPage.qml+1−3 tests/qmltests/Panel/tst_IndicatorsBar.qml+58−12 tests/qmltests/Panel/tst_IndicatorsMenu.qml+16−5 tests/qmltests/Panel/tst_MenuContent.qml+5−5 tests/qmltests/Panel/tst_Panel.qml+15−4
plugins/Unity/Indicators/sharedunitymenumodel.cpp+6−1
@@ -18,6 +18,8 @@
1818#include "sharedunitymenumodel.h"
1919#include "unitymenumodelcache.h"
2020
21+#include <unitymenumodel.h>
22+
2123SharedUnityMenuModel::SharedUnityMenuModel(QObject* parent)
2224 : QObject(parent)
2325{
@@ -78,8 +80,11 @@ void SharedUnityMenuModel::initialize()
7880 Q_EMIT modelChanged();
7981 }
8082 } else {
81− QSharedPointer<UnityMenuModel> model = UnityMenuModelCache::singleton()->model(m_busName, m_menuObjectPath, m_actions);
83+ QSharedPointer<UnityMenuModel> model = UnityMenuModelCache::singleton()->model(m_menuObjectPath);
8284 if (model != m_model) {
85+ if (model->busName() != m_busName) model->setBusName(m_busName);
86+ if (model->actions() != m_actions) model->setActions(m_actions);
87+
8388 m_model = model;
8489 Q_EMIT modelChanged();
8590 }
plugins/Unity/Indicators/unitymenumodelcache.cpp+1−5
@@ -37,9 +37,7 @@ UnityMenuModelCache::UnityMenuModelCache(QObject* parent)
3737{
3838}
3939
40−QSharedPointer<UnityMenuModel> UnityMenuModelCache::model(const QByteArray& bus,
41− const QByteArray& path,
42− const QVariantMap& actions)
40+QSharedPointer<UnityMenuModel> UnityMenuModelCache::model(const QByteArray& path)
4341{
4442 if (m_registry.contains(path))
4543 return m_registry[path];
@@ -59,9 +57,7 @@ QSharedPointer<UnityMenuModel> UnityMenuModelCache::model(const QByteArray& bus,
5957 });
6058 m_registry[path] = menuModel.toWeakRef();
6159
62− menuModel->setBusName(bus);
6360 menuModel->setMenuObjectPath(path);
64− menuModel->setActions(actions);
6561 return menuModel;
6662}
6763
plugins/Unity/Indicators/unitymenumodelcache.h+1−3
@@ -36,9 +36,7 @@ public:
3636
3737 static UnityMenuModelCache* singleton();
3838
39− virtual QSharedPointer<UnityMenuModel> model(const QByteArray& bus,
40− const QByteArray& path,
41− const QVariantMap& actions);
39+ virtual QSharedPointer<UnityMenuModel> model(const QByteArray& path);
4240
4341 // for tests use
4442 Q_INVOKABLE virtual bool contains(const QByteArray& path);
qml/Panel/IndicatorItem.qml+1−1
@@ -38,7 +38,7 @@ IndicatorDelegate {
3838
3939 signal clicked()
4040
41− width: mainItems.width
41+ implicitWidth: mainItems.width
4242
4343 MouseArea {
4444 anchors.fill: parent
qml/Panel/IndicatorItemRow.qml+45−4
@@ -123,6 +123,7 @@ Item {
123123 id: d
124124 property bool firstItemSwitch: true
125125 property var previousItem
126+ property bool forceAlignmentAnimationDisabled: false
126127 }
127128
128129 onCurrentItemChanged: {
@@ -139,6 +140,22 @@ Item {
139140 bottom: parent.bottom
140141 }
141142
143+ // TODO: make this better
144+ // when the width changes, the highlight will lag behind due to animation, so we need to disable the animation
145+ // and adjust the highlight X immediately.
146+ width: implicitWidth
147+ Behavior on width {
148+ SequentialAnimation {
149+ ScriptAction {
150+ script: {
151+ d.forceAlignmentAnimationDisabled = true;
152+ highlight.currentItemX = Qt.binding(function() { return currentItem ? currentItem.x : 0 });
153+ d.forceAlignmentAnimationDisabled = false;
154+ }
155+ }
156+ }
157+ }
158+
142159 Repeater {
143160 id: repeater
144161 model: indicatorsModel
@@ -159,13 +176,14 @@ Item {
159176 }
160177 }
161178
179+
162180 delegate: IndicatorItem {
163− id: item
181+ id: indicatorItem
164182 objectName: identifier+"-panelItem"
165183
166184 property int ownIndex: index
167185 property bool overflow: row.width - x > overFlowWidth
168− property bool hidden: !item.expanded && overflow
186+ property bool hidden: !expanded && (overflow || !indicatorVisible)
169187
170188 height: row.height
171189 expanded: root.expanded
@@ -177,7 +195,30 @@ Item {
177195 menuObjectPath: indicatorProperties.menuObjectPath
178196
179197 opacity: hidden ? 0.0 : 1.0
180− Behavior on opacity { NumberAnimation { duration: UbuntuAnimation.SnapDuration } }
198+ Behavior on opacity {
199+ NumberAnimation { duration: UbuntuAnimation.SnapDuration; easing: UbuntuAnimation.StandardEasing }
200+ }
201+
202+ width: (expanded || indicatorVisible) ? implicitWidth : 0
203+
204+ Behavior on width {
205+ NumberAnimation { duration: UbuntuAnimation.SnapDuration; easing: UbuntuAnimation.StandardEasing }
206+ }
207+
208+ Component.onDestruction: {
209+ // current item removed.
210+ if (currentItem === this) {
211+ var i = 0;
212+ while (i < row.children.length) {
213+ var childItem = row.children[i];
214+ if (childItem !== this) {
215+ setCurrentItemIndex(i);
216+ break;
217+ }
218+ i++;
219+ }
220+ }
221+ }
181222 }
182223 }
183224 }
@@ -226,7 +267,7 @@ Item {
226267 property real currentItemX: currentItem ? currentItem.x : 0
227268 Behavior on currentItemX {
228269 id: currentItemXBehavior
229− enabled: !d.firstItemSwitch && expanded
270+ enabled: !d.firstItemSwitch && expanded && !d.forceAlignmentAnimationDisabled
230271 NumberAnimation { duration: UbuntuAnimation.FastDuration; easing: UbuntuAnimation.StandardEasing }
231272 }
232273 x: currentItemX + highlightCenterOffset
qml/Panel/Indicators/IndicatorBase.qml−2
@@ -23,8 +23,6 @@ import Unity.Indicators 0.1
2323Item {
2424 id: indicatorItem
2525
26− enabled: menuObjectPath != ""
27−
2826 //const
2927 property string identifier
3028 property string busName
qml/Panel/Indicators/IndicatorDelegate.qml+2−2
@@ -20,6 +20,6 @@
2020import QtQuick 2.0
2121
2222IndicatorBase {
23− enabled: rootActionState.visible
24− property string title: rootActionState.title
23+ readonly property bool indicatorVisible: rootActionState.indicatorVisible
24+ readonly property string title: rootActionState.title
2525}
qml/Panel/IndicatorsBar.qml+2−2
@@ -95,10 +95,10 @@ Item {
9595 if (row.width > flickable.width && flickable.contentX < 0) {
9696 d.alignmentAdjustment += flickable.contentX;
9797 // current item overlap on left
98− } else if (row.currentItem.x < flickable.contentX) {
98+ } else if (row.currentItem && row.currentItem.x < flickable.contentX) {
9999 d.alignmentAdjustment -= (row.currentItem.x - flickable.contentX);
100100 // current item overlap on right
101− } else if (row.currentItem.x + row.currentItem.width > flickable.contentX + flickable.width) {
101+ } else if (row.currentItem && row.currentItem.x + row.currentItem.width > flickable.contentX + flickable.width) {
102102 d.alignmentAdjustment -= ((row.currentItem.x + row.currentItem.width) - (flickable.contentX + flickable.width));
103103 }
104104 }
tests/mocks/Unity/Indicators/IndicatorsModel.qml+83−79
@@ -20,45 +20,93 @@ import Unity.Indicators 0.1 as Indicators
2020Indicators.FakeIndicatorsModel {
2121 id: root
2222
23− Component.onCompleted: {
24− Indicators.UnityMenuModelCache.setCachedModelData("com.canonical.indicators.fake1",
25− "/com/canonical/indicators/fake1",
26− "/com/canonical/indicators/fake1",
23+ property var originalModelData: [
24+ {
25+ "identifier": "fake-indicator-bluetooth",
26+ "indicatorProperties": {
27+ "enabled": true,
28+ "busName": "com.canonical.indicators.fake1",
29+ "menuObjectPath": "/com/canonical/indicators/fake1",
30+ "actionsObjectPath": "/com/canonical/indicators/fake1"
31+ }
32+ },
33+ {
34+ "identifier": "fake-indicator-network",
35+ "indicatorProperties": {
36+ "enabled": true,
37+ "busName": "com.canonical.indicators.fake2",
38+ "menuObjectPath": "/com/canonical/indicators/fake2",
39+ "actionsObjectPath": "/com/canonical/indicators/fake2"
40+ }
41+ },
42+ {
43+ "identifier": "fake-indicator-messages",
44+ "indicatorProperties": {
45+ "enabled": true,
46+ "busName": "com.canonical.indicators.fake3",
47+ "menuObjectPath": "/com/canonical/indicators/fake3",
48+ "actionsObjectPath": "/com/canonical/indicators/fake3"
49+ }
50+ },
51+ {
52+ "identifier": "fake-indicator-sound",
53+ "indicatorProperties": {
54+ "enabled": true,
55+ "busName": "com.canonical.indicators.fake4",
56+ "menuObjectPath": "/com/canonical/indicators/fake4",
57+ "actionsObjectPath": "/com/canonical/indicators/fake4"
58+ }
59+ },
60+ {
61+ "identifier": "fake-indicator-power",
62+ "indicatorProperties": {
63+ "enabled": true,
64+ "busName": "com.canonical.indicators.fake5",
65+ "menuObjectPath": "/com/canonical/indicators/fake5",
66+ "actionsObjectPath": "/com/canonical/indicators/fake5"
67+ }
68+ },
69+ {
70+ "identifier": "fake-indicator-datetime",
71+ "indicatorProperties": {
72+ "enabled": true,
73+ "busName": "com.canonical.indicators.fake6",
74+ "menuObjectPath": "/com/canonical/indicators/fake6",
75+ "actionsObjectPath": "/com/canonical/indicators/fake6"
76+ }
77+ }
78+ ]
79+
80+ function load(profile) {
81+ unload();
82+ root.modelData = originalModelData;
83+
84+ Indicators.UnityMenuModelCache.setCachedModelData("/com/canonical/indicators/fake1",
2785 getUnityMenuModelData("fake-indicator-bluetooth",
2886 "Bluetooth (F)",
2987 "",
3088 [ "image://theme/bluetooth-active" ]));
31− Indicators.UnityMenuModelCache.setCachedModelData("com.canonical.indicators.fake2",
32− "/com/canonical/indicators/fake2",
33− "/com/canonical/indicators/fake2",
89+ Indicators.UnityMenuModelCache.setCachedModelData("/com/canonical/indicators/fake2",
3490 getUnityMenuModelData("fake-indicator-network",
3591 "Network (F)",
3692 "",
3793 [ "image://theme/simcard-error", "image://theme/wifi-high" ]));
38− Indicators.UnityMenuModelCache.setCachedModelData("com.canonical.indicators.fake3",
39− "/com/canonical/indicators/fake3",
40− "/com/canonical/indicators/fake3",
94+ Indicators.UnityMenuModelCache.setCachedModelData("/com/canonical/indicators/fake3",
4195 getUnityMenuModelData("fake-indicator-messages",
4296 "Messages (F)",
4397 "",
4498 [ "image://theme/messages-new" ]));
45− Indicators.UnityMenuModelCache.setCachedModelData("com.canonical.indicators.fake4",
46− "/com/canonical/indicators/fake4",
47− "/com/canonical/indicators/fake4",
99+ Indicators.UnityMenuModelCache.setCachedModelData("/com/canonical/indicators/fake4",
48100 getUnityMenuModelData("fake-indicator-sound",
49101 "Sound (F)",
50102 "",
51103 [ "image://theme/audio-volume-high" ]));
52− Indicators.UnityMenuModelCache.setCachedModelData("com.canonical.indicators.fake5",
53− "/com/canonical/indicators/fake5",
54− "/com/canonical/indicators/fake5",
104+ Indicators.UnityMenuModelCache.setCachedModelData("/com/canonical/indicators/fake5",
55105 getUnityMenuModelData("fake-indicator-power",
56106 "Battery (F)",
57107 "",
58108 [ "image://theme/battery-020" ]));
59− Indicators.UnityMenuModelCache.setCachedModelData("com.canonical.indicators.fake6",
60− "/com/canonical/indicators/fake6",
61− "/com/canonical/indicators/fake6",
109+ Indicators.UnityMenuModelCache.setCachedModelData("/com/canonical/indicators/fake6",
62110 getUnityMenuModelData("fake-indicator-datetime",
63111 "Upcoming Events (F)",
64112 "12:04",
@@ -78,11 +126,12 @@ Indicators.FakeIndicatorsModel {
78126 "actionState": {
79127 "title": title,
80128 "label": label,
81− "icons": icons
129+ "icons": icons,
130+ "visible": true
82131 },
83132 "isCheck": false,
84133 "isRadio": false,
85− "isToggled": false,
134+ "isToggled": false
86135 },
87136 "submenu": []
88137 }];
@@ -101,7 +150,7 @@ Indicators.FakeIndicatorsModel {
101150 "actionState": {},
102151 "isCheck": false,
103152 "isRadio": false,
104− "isToggled": false,
153+ "isToggled": false
105154 }};
106155 submenus.push(submenu);
107156 }
@@ -110,65 +159,20 @@ Indicators.FakeIndicatorsModel {
110159 return root;
111160 }
112161
113− property var originalModelData: [
114− {
115− "identifier": "fake-indicator-bluetooth",
116− "indicatorProperties": {
117− "enabled": true,
118− "busName": "com.canonical.indicators.fake1",
119− "menuObjectPath": "/com/canonical/indicators/fake1",
120− "actionsObjectPath": "/com/canonical/indicators/fake1"
121− }
122− },
123− {
124− "identifier": "fake-indicator-network",
125− "indicatorProperties": {
126− "enabled": true,
127− "busName": "com.canonical.indicators.fake2",
128− "menuObjectPath": "/com/canonical/indicators/fake2",
129− "actionsObjectPath": "/com/canonical/indicators/fake2"
130− }
131− },
132− {
133− "identifier": "fake-indicator-messages",
134− "indicatorProperties": {
135− "enabled": true,
136− "busName": "com.canonical.indicators.fake3",
137− "menuObjectPath": "/com/canonical/indicators/fake3",
138− "actionsObjectPath": "/com/canonical/indicators/fake3"
139− }
140− },
141− {
142− "identifier": "fake-indicator-sound",
143− "indicatorProperties": {
144− "enabled": true,
145− "busName": "com.canonical.indicators.fake4",
146− "menuObjectPath": "/com/canonical/indicators/fake4",
147− "actionsObjectPath": "/com/canonical/indicators/fake4"
148− }
149− },
150− {
151− "identifier": "fake-indicator-power",
152− "indicatorProperties": {
153− "enabled": true,
154− "busName": "com.canonical.indicators.fake5",
155− "menuObjectPath": "/com/canonical/indicators/fake5",
156− "actionsObjectPath": "/com/canonical/indicators/fake5"
157− }
158− },
159− {
160− "identifier": "fake-indicator-datetime",
161− "indicatorProperties": {
162− "enabled": true,
163− "busName": "com.canonical.indicators.fake6",
164− "menuObjectPath": "/com/canonical/indicators/fake6",
165− "actionsObjectPath": "/com/canonical/indicators/fake6"
162+ function setIndicatorVisible(identifier, visible) {
163+ for (var i = 0; i < originalModelData.length; i++) {
164+ if (originalModelData[i]["identifier"] === identifier) {
165+ var data = Indicators.UnityMenuModelCache.getCachedModelData(
166+ originalModelData[i]["indicatorProperties"]["menuObjectPath"]);
167+
168+ data[0]["rowData"]["actionState"]["visible"] = visible;
169+
170+ Indicators.UnityMenuModelCache.setCachedModelData(
171+ originalModelData[i]["indicatorProperties"]["menuObjectPath"],
172+ data);
173+ break;
166174 }
167175 }
168− ]
169176
170− function load(profile) {
171− unload();
172− root.modelData = originalModelData;
173177 }
174178}
tests/mocks/Unity/Indicators/RootActionState.qml+2−2
@@ -27,7 +27,7 @@ Item {
2727 property string rightLabel: cachedState && cachedState.hasOwnProperty("label") ? cachedState["label"] : ""
2828 property var icons: cachedState && cachedState.hasOwnProperty("icons") ? cachedState["icons"] : []
2929 property string accessibleName: cachedState && cachedState.hasOwnProperty("accessible-desc") ? cachedState["accessible-desc"] : ""
30− visible: cachedState && cachedState.hasOwnProperty("visible") ? cachedState["visible"] : true
30+ property bool indicatorVisible: cachedState && cachedState.hasOwnProperty("visible") ? cachedState["visible"] : true
3131
3232 property var cachedState: menu ? menu.get(0, "actionState") : undefined
3333 Connections {
@@ -45,5 +45,5 @@ Item {
4545 onRightLabelChanged: updated()
4646 onIconsChanged: updated()
4747 onAccessibleNameChanged: updated()
48− onVisibleChanged: updated()
48+ onIndicatorVisibleChanged: updated()
4949}
tests/mocks/Unity/Indicators/fakeunitymenumodelcache.cpp+10−8
@@ -32,11 +32,9 @@ FakeUnityMenuModelCache::FakeUnityMenuModelCache(QObject* parent)
3232{
3333}
3434
35−QSharedPointer<UnityMenuModel> FakeUnityMenuModelCache::model(const QByteArray& bus,
36− const QByteArray& path,
37− const QVariantMap& actions)
35+QSharedPointer<UnityMenuModel> FakeUnityMenuModelCache::model(const QByteArray& path)
3836{
39− return UnityMenuModelCache::singleton()->model(bus, path, actions);
37+ return UnityMenuModelCache::singleton()->model(path);
4038}
4139
4240bool FakeUnityMenuModelCache::contains(const QByteArray& path)
@@ -44,14 +42,18 @@ bool FakeUnityMenuModelCache::contains(const QByteArray& path)
4442 return UnityMenuModelCache::singleton()->contains(path);
4543}
4644
47−void FakeUnityMenuModelCache::setCachedModelData(const QByteArray& bus,
48− const QByteArray& path,
49− const QVariantMap& actions,
45+void FakeUnityMenuModelCache::setCachedModelData(const QByteArray& path,
5046 const QVariant& data)
5147{
5248 // keep a ref forever!
5349 if (!m_models.contains(path)) {
54− m_models[path] = model(bus, path, actions);
50+ m_models[path] = model(path);
5551 }
5652 m_models[path]->setModelData(data);
5753}
54+
55+QVariant FakeUnityMenuModelCache::getCachedModelData(const QByteArray& path)
56+{
57+ QSharedPointer<UnityMenuModel> model = this->model(path);
58+ return model.isNull() ? QVariant() : model->modelData();
59+}
tests/mocks/Unity/Indicators/fakeunitymenumodelcache.h+4−8
@@ -30,18 +30,14 @@ public:
3030
3131 static FakeUnityMenuModelCache* singleton();
3232
33− QSharedPointer<UnityMenuModel> model(const QByteArray& bus,
34− const QByteArray& path,
35− const QVariantMap& actions) override;
33+ QSharedPointer<UnityMenuModel> model(const QByteArray& path) override;
3634 bool contains(const QByteArray& path) override;
3735
38−
39−
40− Q_INVOKABLE void setCachedModelData(const QByteArray& bus,
41− const QByteArray& path,
42− const QVariantMap& actions,
36+ Q_INVOKABLE void setCachedModelData(const QByteArray& path,
4337 const QVariant& data = QVariant());
4438
39+ Q_INVOKABLE QVariant getCachedModelData(const QByteArray& path);
40+
4541private:
4642 static FakeUnityMenuModelCache* theFakeCache;
4743 QHash<QByteArray, QSharedPointer<UnityMenuModel>> m_models;
tests/qmltests/Greeter/tst_Clock.qml+1−3
@@ -37,9 +37,7 @@ Rectangle {
3737 }
3838
3939 function updateDatetimeModelTime(label) {
40− Indicators.UnityMenuModelCache.setCachedModelData("com.canonical.indicator.datetime",
41− "/com/canonical/indicator/datetime/phone",
42− "/com/canonical/indicator/datetime",
40+ Indicators.UnityMenuModelCache.setCachedModelData("/com/canonical/indicator/datetime/phone",
4341 [{
4442 "rowData": {
4543 "actionState": { "label": label }
tests/qmltests/Panel/IndicatorTest.qml+23−10
@@ -26,10 +26,18 @@ Rectangle {
2626 id: root
2727 color: "white"
2828
29− property alias indicatorsModel: __indicatorsModel
29+ property alias indicatorsModel: __visibleIndicatorsModel
30+ property alias originalModelData: __indicatorsModel.originalModelData
31+
32+ Indicators.VisibleIndicatorsModel {
33+ id: __visibleIndicatorsModel
34+
35+ model: __indicatorsModel
36+ }
37+
3038 Indicators.IndicatorsModel {
3139 id: __indicatorsModel
32− Component.onCompleted: load()
40+ Component.onCompleted: load();
3341 }
3442
3543 function insertIndicator(index) {
@@ -38,30 +46,35 @@ Rectangle {
3846 var done = false;
3947 for (i = index; !done && i >= 1; i--) {
4048
41− var lookFor = indicatorsModel.originalModelData[i-1]["identifier"]
49+ var lookFor = __indicatorsModel.originalModelData[i-1]["identifier"]
4250
4351 var j;
44− for (j = indicatorsModel.modelData.length-1; !done && j >= 0; j--) {
45− if (indicatorsModel.modelData[j]["identifier"] === lookFor) {
52+ for (j = __indicatorsModel.modelData.length-1; !done && j >= 0; j--) {
53+ if (__indicatorsModel.modelData[j]["identifier"] === lookFor) {
4654 insertIndex = j+1;
4755 done = true;
4856 }
4957 }
5058 }
51− indicatorsModel.insert(insertIndex, indicatorsModel.originalModelData[index]);
59+ __indicatorsModel.insert(insertIndex, __indicatorsModel.originalModelData[index]);
5260 }
5361
5462 function removeIndicator(index) {
5563 var i;
56− for (i = 0; i < indicatorsModel.modelData.length; i++) {
57− if (indicatorsModel.modelData[i]["identifier"] === indicatorsModel.originalModelData[index]["identifier"]) {
58− indicatorsModel.remove(i);
64+ for (i = 0; i < __indicatorsModel.modelData.length; i++) {
65+ if (__indicatorsModel.modelData[i]["identifier"] === __indicatorsModel.originalModelData[index]["identifier"]) {
66+ __indicatorsModel.remove(i);
5967 break;
6068 }
6169 }
6270 }
6371
72+ function setIndicatorVisible(index, visible) {
73+ var identifier = __indicatorsModel.originalModelData[index]["identifier"];
74+ __indicatorsModel.setIndicatorVisible(identifier, visible);
75+ }
76+
6477 function resetData() {
65− indicatorsModel.load();
78+ __indicatorsModel.load();
6679 }
6780}
tests/qmltests/Panel/tst_IndicatorItemRow.qml+27−16
@@ -24,7 +24,7 @@ import Unity.Indicators 0.1 as Indicators
2424
2525IndicatorTest {
2626 id: root
27− width: units.gu(100)
27+ width: units.gu(120)
2828 height: units.gu(40)
2929 color: "white"
3030
@@ -91,13 +91,24 @@ IndicatorTest {
9191 }
9292
9393 Repeater {
94− model: indicatorsModel.originalModelData
94+ model: root.originalModelData
9595 RowLayout {
9696 CheckBox {
9797 checked: true
9898 onCheckedChanged: checked ? insertIndicator(index) : removeIndicator(index);
9999 }
100− Label { text: modelData["identifier"] }
100+ Label {
101+ Layout.fillWidth: true
102+ text: modelData["identifier"]
103+ }
104+
105+ CheckBox {
106+ checked: true
107+ onCheckedChanged: setIndicatorVisible(index, checked);
108+ }
109+ Label {
110+ text: "visible"
111+ }
101112 }
102113 }
103114 }
@@ -138,9 +149,9 @@ IndicatorTest {
138149 var item;
139150 var itemsToRemove = [0, 2];
140151
141− verify(indicatorsModel.originalModelData.length > 0);
142− for (i = 0; i < indicatorsModel.originalModelData.length; i++) {
143− item = findChild(indicatorsRow, indicatorsModel.originalModelData[i]["identifier"] + "-panelItem");
152+ verify(root.originalModelData.length > 0);
153+ for (i = 0; i < root.originalModelData.length; i++) {
154+ item = findChild(indicatorsRow, root.originalModelData[i]["identifier"] + "-panelItem");
144155 verify(item);
145156
146157 compare(item.ownIndex, i, "Item at incorrect index");
@@ -151,8 +162,8 @@ IndicatorTest {
151162 }
152163
153164 // test removals
154− for (i = 0; i < indicatorsModel.originalModelData.length; i++) {
155− item = findChild(indicatorsRow, indicatorsModel.originalModelData[i]["identifier"] + "-panelItem");
165+ for (i = 0; i < root.originalModelData.length; i++) {
166+ item = findChild(indicatorsRow, root.originalModelData[i]["identifier"] + "-panelItem");
156167
157168 verify(data.remove.indexOf(i) !== -1 ? (item === null) : (item !== null));
158169 }
@@ -162,8 +173,8 @@ IndicatorTest {
162173 insertIndicator(data.remove[i]);
163174 }
164175
165− for (i = 0; i < indicatorsModel.originalModelData.length; i++) {
166− item = findChild(indicatorsRow, indicatorsModel.originalModelData[i]["identifier"] + "-panelItem");
176+ for (i = 0; i < root.originalModelData.length; i++) {
177+ item = findChild(indicatorsRow, root.originalModelData[i]["identifier"] + "-panelItem");
167178 verify(item);
168179
169180 compare(item.ownIndex, i, "Item at incorrect index");
@@ -180,7 +191,7 @@ IndicatorTest {
180191
181192 // test selecting the item at it's position sets the current item of the row.
182193 function test_validCurrentItem(data) {
183− var dataItem = findChild(indicatorsRow, indicatorsModel.originalModelData[data.index]["identifier"] + "-panelItem");
194+ var dataItem = findChild(indicatorsRow, root.originalModelData[data.index]["identifier"] + "-panelItem");
184195 verify(dataItem !== null);
185196
186197 indicatorsRow.selectItemAt(dataItem.x + dataItem.width/2);
@@ -190,7 +201,7 @@ IndicatorTest {
190201 // tests item default selection (no item at position X)
191202 function test_invalidCurrentItem() {
192203 indicatorsRow.selectItemAt(-100);
193− var item = findChild(indicatorsRow, indicatorsModel.originalModelData[0]["identifier"] + "-panelItem");
204+ var item = findChild(indicatorsRow, root.originalModelData[0]["identifier"] + "-panelItem");
194205 compare(indicatorsRow.currentItem, item);
195206 }
196207
@@ -206,10 +217,10 @@ IndicatorTest {
206217 indicatorsRow.expanded = true;
207218 wait_for_expansion_to_settle();
208219
209− var fromItem = findChild(indicatorsRow, indicatorsModel.originalModelData[data.from]["identifier"] + "-panelItem");
220+ var fromItem = findChild(indicatorsRow, root.originalModelData[data.from]["identifier"] + "-panelItem");
210221 verify(fromItem !== null);
211222
212− var toItem = findChild(indicatorsRow, indicatorsModel.originalModelData[data.to]["identifier"] + "-panelItem");
223+ var toItem = findChild(indicatorsRow, root.originalModelData[data.to]["identifier"] + "-panelItem");
213224 verify(toItem !== null);
214225
215226 var fromPosition = indicatorsRow.mapFromItem(fromItem, fromItem.width/2, fromItem.height/2);
@@ -231,7 +242,7 @@ IndicatorTest {
231242 wait_for_expansion_to_settle();
232243
233244 var highlight = findChild(indicatorsRow, "highlight");
234− var item = findChild(indicatorsRow, indicatorsModel.originalModelData[2]["identifier"] + "-panelItem");
245+ var item = findChild(indicatorsRow, root.originalModelData[2]["identifier"] + "-panelItem");
235246 verify(item !== null);
236247 var mappedPosition = indicatorsRow.mapFromItem(item, item.width/2, item.height/2);
237248
@@ -256,7 +267,7 @@ IndicatorTest {
256267 wait_for_expansion_to_settle();
257268
258269 var highlight = findChild(indicatorsRow, "highlight");
259− var item = findChild(indicatorsRow, indicatorsModel.originalModelData[2]["identifier"] + "-panelItem");
270+ var item = findChild(indicatorsRow, root.originalModelData[2]["identifier"] + "-panelItem");
260271 verify(item !== null);
261272 var mappedPosition = indicatorsRow.mapFromItem(item, item.width/2, item.height/2);
262273
tests/qmltests/Panel/tst_IndicatorPage.qml+1−3
@@ -110,9 +110,7 @@ Item {
110110 }]; // end row 1
111111
112112 function initializeMenuData(data) {
113− Indicators.UnityMenuModelCache.setCachedModelData("com.canonical.indicator.test",
114− "/com/canonical/indicator/test",
115− "/com/canonical/indicator/test",
113+ Indicators.UnityMenuModelCache.setCachedModelData("/com/canonical/indicator/test",
116114 data);
117115 }
118116
tests/qmltests/Panel/tst_IndicatorsBar.qml+58−12
@@ -49,11 +49,12 @@ IndicatorTest {
4949 width: units.gu(30)
5050 anchors.centerIn: parent
5151 indicatorsModel: root.indicatorsModel
52+ interactive: expanded && height === units.gu(7)
5253
5354 Behavior on height {
5455 NumberAnimation {
5556 id: heightAnimation
56− duration: UbuntuAnimation.SnapDuration; easing: UbuntuAnimation.StandardEasing
57+ duration: UbuntuAnimation.FastDuration; easing: UbuntuAnimation.StandardEasing
5758 }
5859 }
5960
@@ -85,13 +86,24 @@ IndicatorTest {
8586 }
8687
8788 Repeater {
88− model: indicatorsModel.originalModelData
89+ model: root.originalModelData
8990 RowLayout {
9091 CheckBox {
9192 checked: true
9293 onCheckedChanged: checked ? insertIndicator(index) : removeIndicator(index);
9394 }
94− Label { text: modelData["identifier"] }
95+ Label {
96+ Layout.fillWidth: true
97+ text: modelData["identifier"]
98+ }
99+
100+ CheckBox {
101+ checked: true
102+ onCheckedChanged: setIndicatorVisible(index, checked);
103+ }
104+ Label {
105+ text: "visible"
106+ }
95107 }
96108 }
97109 }
@@ -103,7 +115,7 @@ IndicatorTest {
103115
104116 function init() {
105117 indicatorsBar.expanded = false;
106− tryCompare(heightAnimation, "running", false);
118+ wait_for_expansion_to_settle();
107119 }
108120
109121 function test_expandSelectedItem_data() {
@@ -116,12 +128,12 @@ IndicatorTest {
116128
117129 function wait_for_expansion_to_settle() {
118130 tryCompare(heightAnimation, "running", false);
119− wait(200); // put a little extra wait in for things to settle
131+ wait(UbuntuAnimation.SnapDuration); // put a little extra wait in for things to settle
120132 }
121133
122134 // Rough check that expanding a selected item keeps it within the area of the original item.
123135 function test_expandSelectedItem(data) {
124− var dataItem = findChild(indicatorsBar, indicatorsModel.originalModelData[data.index]["identifier"] + "-panelItem");
136+ var dataItem = findChild(indicatorsBar, root.originalModelData[data.index]["identifier"] + "-panelItem");
125137 verify(dataItem !== null);
126138
127139 var mappedPosition = indicatorsBar.mapFromItem(dataItem, dataItem.width/2, dataItem.height/2);
@@ -130,19 +142,24 @@ IndicatorTest {
130142 indicatorsBar.expanded = true;
131143 wait_for_expansion_to_settle();
132144
133− var mappedRect = indicatorsBar.mapFromItem(dataItem, 0, 0, dataItem.width, dataItem.height);
134145
135146 // mappedPosition contained within mappedRect
136− verify(mappedRect.x <= mappedPosition.x);
137− verify(mappedRect.x + mappedRect.width >= mappedPosition.x);
147+ tryCompareFunction(function() {
148+ var mappedRect = indicatorsBar.mapFromItem(dataItem, 0, 0, dataItem.width, dataItem.height);
149+ return mappedRect.x <= mappedPosition.x; },
150+ true);
151+ tryCompareFunction(function() {
152+ var mappedRect = indicatorsBar.mapFromItem(dataItem, 0, 0, dataItem.width, dataItem.height);
153+ return mappedRect.x + mappedRect.width >= mappedPosition.x;
154+ }, true);
138155 }
139156
140157 function test_scrollOffset() {
141158 indicatorsBar.expanded = true;
142159 wait_for_expansion_to_settle();
143160
144− var lastItemIndex = indicatorsModel.originalModelData.length-1;
145− var dataItem = findChild(indicatorsBar, indicatorsModel.originalModelData[lastItemIndex]["identifier"] + "-panelItem");
161+ var lastItemIndex = root.originalModelData.length-1;
162+ var dataItem = findChild(indicatorsBar, root.originalModelData[lastItemIndex]["identifier"] + "-panelItem");
146163 verify(dataItem !== null);
147164
148165 var row = findChild(indicatorsBar, "indicatorItemRow");
@@ -167,12 +184,41 @@ IndicatorTest {
167184 indicatorsBar.expanded = true;
168185 wait_for_expansion_to_settle();
169186
170− var dataItem = findChild(indicatorsBar, indicatorsModel.originalModelData[data.index]["identifier"] + "-panelItem");
187+ var dataItem = findChild(indicatorsBar, root.originalModelData[data.index]["identifier"] + "-panelItem");
171188 if (indicatorsBar.mapFromItem(dataItem, dataItem.width/2, dataItem.height/2).x < 0) {
172189 skip("Out of bounds");
173190 }
174191 mouseClick(dataItem, dataItem.width/2, dataItem.height/2);
175192 verify(dataItem.selected === true);
176193 }
194+
195+ function test_visibleIndicators_data() {
196+ return [
197+ { visible: [true, false, true, false, true, true] },
198+ { visible: [false, false, false, false, false, false] }
199+ ];
200+ }
201+
202+ function test_visibleIndicators(data) {
203+ for (var i = 0; i < data.visible.length; i++) {
204+ var visible = data.visible[i];
205+ root.setIndicatorVisible(i, visible);
206+
207+ var dataItem = findChild(indicatorsBar, root.originalModelData[i]["identifier"] + "-panelItem");
208+ tryCompare(dataItem, "opacity", visible ? 1.0 : 0.0);
209+ tryCompareFunction(function() { return dataItem.width > 0.0; }, visible);
210+ }
211+
212+ indicatorsBar.expanded = true;
213+ wait_for_expansion_to_settle();
214+
215+ for (var i = 0; i < data.visible.length; i++) {
216+ root.setIndicatorVisible(i, data.visible[i]);
217+
218+ var dataItem = findChild(indicatorsBar, root.originalModelData[i]["identifier"] + "-panelItem");
219+ tryCompareFunction(function() { return dataItem.opacity > 0.0; }, true);
220+ tryCompareFunction(function() { return dataItem.width > 0.0; }, true);
221+ }
222+ }
177223 }
178224}
tests/qmltests/Panel/tst_IndicatorsMenu.qml+16−5
@@ -79,13 +79,24 @@ IndicatorTest {
7979 }
8080
8181 Repeater {
82− model: indicatorsModel.originalModelData
82+ model: root.originalModelData
8383 RowLayout {
8484 CheckBox {
8585 checked: true
8686 onCheckedChanged: checked ? insertIndicator(index) : removeIndicator(index);
8787 }
88− Label { text: modelData["identifier"] }
88+ Label {
89+ Layout.fillWidth: true
90+ text: modelData["identifier"]
91+ }
92+
93+ CheckBox {
94+ checked: true
95+ onCheckedChanged: setIndicatorVisible(index, checked);
96+ }
97+ Label {
98+ text: "visible"
99+ }
89100 }
90101 }
91102 }
@@ -105,7 +116,7 @@ IndicatorTest {
105116 }
106117
107118 function get_indicator_item(index) {
108− var indicatorItem = findChild(indicatorsMenu, indicatorsModel.originalModelData[index]["identifier"] + "-panelItem");
119+ var indicatorItem = findChild(indicatorsMenu, root.originalModelData[index]["identifier"] + "-panelItem");
109120 verify(indicatorItem !== null);
110121
111122 return indicatorItem;
@@ -181,7 +192,7 @@ IndicatorTest {
181192 var indicatorItemRow = findChild(indicatorsMenu, "indicatorItemRow");
182193 verify(indicatorItemRow !== null);
183194
184− for (var i = 0; i < indicatorsModel.originalModelData.length; i++) {
195+ for (var i = 0; i < root.originalModelData.length; i++) {
185196 var indicatorItem = get_indicator_item(i);
186197
187198 var mappedPosition = root.mapFromItem(indicatorItem, indicatorItem.width/2, indicatorItem.height/2);
@@ -209,7 +220,7 @@ IndicatorTest {
209220 // if the x position changes
210221 function test_verticalVelocityDetector() {
211222 indicatorsMenu.verticalVelocityThreshold = 0;
212− verify(indicatorsModel.originalModelData.length >= 2);
223+ verify(root.originalModelData.length >= 2);
213224
214225 var indicatorItemRow = findChild(indicatorsMenu, "indicatorItemRow");
215226 verify(indicatorItemRow !== null);
tests/qmltests/Panel/tst_MenuContent.qml+5−5
@@ -63,12 +63,12 @@ IndicatorTest {
6363 if (menuContent.currentMenuIndex == -1)
6464 activate_content(0);
6565 else
66− activate_content((menuContent.currentMenuIndex + 1) % indicatorsModel.count)
66+ activate_content((menuContent.currentMenuIndex + 1) % root.originalModelData.length)
6767 }
6868
6969 function activate_content(index)
7070 {
71− menuContent.setCurrentMenuIndex(index)
71+ menuContent.currentMenuIndex = index;
7272 }
7373
7474 function get_test_menu_objecName(index) {
@@ -100,7 +100,7 @@ IndicatorTest {
100100
101101 // Check that the correct menus are displayed for the requested item.
102102 function test_show_menu() {
103− var menuCount = root.indicatorsModel.count;
103+ var menuCount = root.originalModelData.length;
104104 verify(menuCount > 0, "Menu count should be greater than zero");
105105
106106 var listView = menu_content_test.findChild(menuContent, "indicatorsContentListView")
@@ -111,7 +111,7 @@ IndicatorTest {
111111 var menuIndex = i%menuCount;
112112
113113 activate_content(menuIndex);
114− testItemObjectName = indicatorsModel.data(menuIndex, Indicators.IndicatorsModelRole.Identifier);
114+ testItemObjectName = indicatorsModel.model.data(menuIndex, Indicators.IndicatorsModelRole.Identifier);
115115 compare(listView.currentIndex, menuIndex, "Current tab index does not match selected tab index");
116116 tryCompareFunction(current_item_equals_test_item, true);
117117 }
@@ -119,7 +119,7 @@ IndicatorTest {
119119
120120 // Tests QTBUG-30632 - asynchronous loader crashes when changing index quickly.
121121 function test_multi_activate() {
122− var menuCount = root.indicatorsModel.count;
122+ var menuCount = root.originalModelData.length;
123123 verify(menuCount > 0, "Menu count should be greater than zero");
124124
125125 for (var i = 0; i < 100; i++) {
tests/qmltests/Panel/tst_Panel.qml+15−4
@@ -96,13 +96,24 @@ IndicatorTest {
9696 }
9797
9898 Repeater {
99− model: indicatorsModel.originalModelData
99+ model: root.originalModelData
100100 RowLayout {
101101 CheckBox {
102102 checked: true
103103 onCheckedChanged: checked ? insertIndicator(index) : removeIndicator(index);
104104 }
105− Label { text: modelData["identifier"] }
105+ Label {
106+ Layout.fillWidth: true
107+ text: modelData["identifier"]
108+ }
109+
110+ CheckBox {
111+ checked: true
112+ onCheckedChanged: setIndicatorVisible(index, checked);
113+ }
114+ Label {
115+ text: "visible"
116+ }
106117 }
107118 }
108119 }
@@ -132,7 +143,7 @@ IndicatorTest {
132143 }
133144
134145 function get_indicator_item(index) {
135− var indicatorItem = findChild(panel, indicatorsModel.originalModelData[index]["identifier"]+"-panelItem");
146+ var indicatorItem = findChild(panel, root.originalModelData[index]["identifier"]+"-panelItem");
136147 verify(indicatorItem !== null);
137148
138149 return indicatorItem;
@@ -172,7 +183,7 @@ IndicatorTest {
172183 // (switches between normal and fullscreen modes are animated)
173184 tryCompareFunction(function() { return indicatorArea.y }, data.indicatorY);
174185
175− for (var i = 0; i < indicatorsModel.originalModelData.length; i++) {
186+ for (var i = 0; i < root.originalModelData.length; i++) {
176187 var indicatorItem = get_indicator_item(i);
177188
178189 var startXPosition = root.mapFromItem(indicatorItem, indicatorItem.width / 2, 0).x;