on xenial help sign in
Expanded visible indicators.
2f15a07Nick Dedekind
plugins/Unity/Indicators/sharedunitymenumodel.cpp+6−1
@@ -18,6 +18,8 @@
18#include "sharedunitymenumodel.h"
18#include "sharedunitymenumodel.h"
19#include "unitymenumodelcache.h"
19#include "unitymenumodelcache.h"
20
20
21+#include <unitymenumodel.h>
22+
21SharedUnityMenuModel::SharedUnityMenuModel(QObject* parent)
23SharedUnityMenuModel::SharedUnityMenuModel(QObject* parent)
22 : QObject(parent)
24 : QObject(parent)
23{
25{
@@ -78,8 +80,11 @@ void SharedUnityMenuModel::initialize()
78 Q_EMIT modelChanged();
80 Q_EMIT modelChanged();
79 }
81 }
80 } else {
82 } else {
81− QSharedPointer<UnityMenuModel> model = UnityMenuModelCache::singleton()->model(m_busName, m_menuObjectPath, m_actions);
83+ QSharedPointer<UnityMenuModel> model = UnityMenuModelCache::singleton()->model(m_menuObjectPath);
82 if (model != m_model) {
84 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+
83 m_model = model;
88 m_model = model;
84 Q_EMIT modelChanged();
89 Q_EMIT modelChanged();
85 }
90 }
plugins/Unity/Indicators/unitymenumodelcache.cpp+1−5
@@ -37,9 +37,7 @@ UnityMenuModelCache::UnityMenuModelCache(QObject* parent)
37{
37{
38}
38}
39
39
40−QSharedPointer<UnityMenuModel> UnityMenuModelCache::model(const QByteArray& bus,
40+QSharedPointer<UnityMenuModel> UnityMenuModelCache::model(const QByteArray& path)
41− const QByteArray& path,
42− const QVariantMap& actions)
43{
41{
44 if (m_registry.contains(path))
42 if (m_registry.contains(path))
45 return m_registry[path];
43 return m_registry[path];
@@ -59,9 +57,7 @@ QSharedPointer<UnityMenuModel> UnityMenuModelCache::model(const QByteArray& bus,
59 });
57 });
60 m_registry[path] = menuModel.toWeakRef();
58 m_registry[path] = menuModel.toWeakRef();
61
59
62− menuModel->setBusName(bus);
63 menuModel->setMenuObjectPath(path);
60 menuModel->setMenuObjectPath(path);
64− menuModel->setActions(actions);
65 return menuModel;
61 return menuModel;
66}
62}
67
63
plugins/Unity/Indicators/unitymenumodelcache.h+1−3
@@ -36,9 +36,7 @@ public:
36
36
37 static UnityMenuModelCache* singleton();
37 static UnityMenuModelCache* singleton();
38
38
39− virtual QSharedPointer<UnityMenuModel> model(const QByteArray& bus,
39+ virtual QSharedPointer<UnityMenuModel> model(const QByteArray& path);
40− const QByteArray& path,
41− const QVariantMap& actions);
42
40
43 // for tests use
41 // for tests use
44 Q_INVOKABLE virtual bool contains(const QByteArray& path);
42 Q_INVOKABLE virtual bool contains(const QByteArray& path);
qml/Panel/IndicatorItem.qml+1−1
@@ -38,7 +38,7 @@ IndicatorDelegate {
38
38
39 signal clicked()
39 signal clicked()
40
40
41− width: mainItems.width
41+ implicitWidth: mainItems.width
42
42
43 MouseArea {
43 MouseArea {
44 anchors.fill: parent
44 anchors.fill: parent
qml/Panel/IndicatorItemRow.qml+45−4
@@ -123,6 +123,7 @@ Item {
123 id: d
123 id: d
124 property bool firstItemSwitch: true
124 property bool firstItemSwitch: true
125 property var previousItem
125 property var previousItem
126+ property bool forceAlignmentAnimationDisabled: false
126 }
127 }
127
128
128 onCurrentItemChanged: {
129 onCurrentItemChanged: {
@@ -139,6 +140,22 @@ Item {
139 bottom: parent.bottom
140 bottom: parent.bottom
140 }
141 }
141
142
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+
142 Repeater {
159 Repeater {
143 id: repeater
160 id: repeater
144 model: indicatorsModel
161 model: indicatorsModel
@@ -159,13 +176,14 @@ Item {
159 }
176 }
160 }
177 }
161
178
179+
162 delegate: IndicatorItem {
180 delegate: IndicatorItem {
163− id: item
181+ id: indicatorItem
164 objectName: identifier+"-panelItem"
182 objectName: identifier+"-panelItem"
165
183
166 property int ownIndex: index
184 property int ownIndex: index
167 property bool overflow: row.width - x > overFlowWidth
185 property bool overflow: row.width - x > overFlowWidth
168− property bool hidden: !item.expanded && overflow
186+ property bool hidden: !expanded && (overflow || !indicatorVisible)
169
187
170 height: row.height
188 height: row.height
171 expanded: root.expanded
189 expanded: root.expanded
@@ -177,7 +195,30 @@ Item {
177 menuObjectPath: indicatorProperties.menuObjectPath
195 menuObjectPath: indicatorProperties.menuObjectPath
178
196
179 opacity: hidden ? 0.0 : 1.0
197 opacity: hidden ? 0.0 : 1.0
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 {
180− Behavior on opacity { NumberAnimation { duration: UbuntuAnimation.SnapDuration } }
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+ }
181 }
222 }
182 }
223 }
183 }
224 }
@@ -226,7 +267,7 @@ Item {
226 property real currentItemX: currentItem ? currentItem.x : 0
267 property real currentItemX: currentItem ? currentItem.x : 0
227 Behavior on currentItemX {
268 Behavior on currentItemX {
228 id: currentItemXBehavior
269 id: currentItemXBehavior
229− enabled: !d.firstItemSwitch && expanded
270+ enabled: !d.firstItemSwitch && expanded && !d.forceAlignmentAnimationDisabled
230 NumberAnimation { duration: UbuntuAnimation.FastDuration; easing: UbuntuAnimation.StandardEasing }
271 NumberAnimation { duration: UbuntuAnimation.FastDuration; easing: UbuntuAnimation.StandardEasing }
231 }
272 }
232 x: currentItemX + highlightCenterOffset
273 x: currentItemX + highlightCenterOffset
qml/Panel/Indicators/IndicatorBase.qml−2
@@ -23,8 +23,6 @@ import Unity.Indicators 0.1
23Item {
23Item {
24 id: indicatorItem
24 id: indicatorItem
25
25
26− enabled: menuObjectPath != ""
27−
28 //const
26 //const
29 property string identifier
27 property string identifier
30 property string busName
28 property string busName
qml/Panel/Indicators/IndicatorDelegate.qml+2−2
@@ -20,6 +20,6 @@
20import QtQuick 2.0
20import QtQuick 2.0
21
21
22IndicatorBase {
22IndicatorBase {
23− enabled: rootActionState.visible
23+ readonly property bool indicatorVisible: rootActionState.indicatorVisible
24− property string title: rootActionState.title
24+ readonly property string title: rootActionState.title
25}
25}
qml/Panel/IndicatorsBar.qml+2−2
@@ -95,10 +95,10 @@ Item {
95 if (row.width > flickable.width && flickable.contentX < 0) {
95 if (row.width > flickable.width && flickable.contentX < 0) {
96 d.alignmentAdjustment += flickable.contentX;
96 d.alignmentAdjustment += flickable.contentX;
97 // current item overlap on left
97 // current item overlap on left
98− } else if (row.currentItem.x < flickable.contentX) {
98+ } else if (row.currentItem && row.currentItem.x < flickable.contentX) {
99 d.alignmentAdjustment -= (row.currentItem.x - flickable.contentX);
99 d.alignmentAdjustment -= (row.currentItem.x - flickable.contentX);
100 // current item overlap on right
100 // 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) {
102 d.alignmentAdjustment -= ((row.currentItem.x + row.currentItem.width) - (flickable.contentX + flickable.width));
102 d.alignmentAdjustment -= ((row.currentItem.x + row.currentItem.width) - (flickable.contentX + flickable.width));
103 }
103 }
104 }
104 }
tests/mocks/Unity/Indicators/IndicatorsModel.qml+83−79
@@ -20,45 +20,93 @@ import Unity.Indicators 0.1 as Indicators
20Indicators.FakeIndicatorsModel {
20Indicators.FakeIndicatorsModel {
21 id: root
21 id: root
22
22
23− Component.onCompleted: {
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+
24− Indicators.UnityMenuModelCache.setCachedModelData("com.canonical.indicators.fake1",
84+ Indicators.UnityMenuModelCache.setCachedModelData("/com/canonical/indicators/fake1",
25− "/com/canonical/indicators/fake1",
26− "/com/canonical/indicators/fake1",
27 getUnityMenuModelData("fake-indicator-bluetooth",
85 getUnityMenuModelData("fake-indicator-bluetooth",
28 "Bluetooth (F)",
86 "Bluetooth (F)",
29 "",
87 "",
30 [ "image://theme/bluetooth-active" ]));
88 [ "image://theme/bluetooth-active" ]));
31− Indicators.UnityMenuModelCache.setCachedModelData("com.canonical.indicators.fake2",
89+ Indicators.UnityMenuModelCache.setCachedModelData("/com/canonical/indicators/fake2",
32− "/com/canonical/indicators/fake2",
33− "/com/canonical/indicators/fake2",
34 getUnityMenuModelData("fake-indicator-network",
90 getUnityMenuModelData("fake-indicator-network",
35 "Network (F)",
91 "Network (F)",
36 "",
92 "",
37 [ "image://theme/simcard-error", "image://theme/wifi-high" ]));
93 [ "image://theme/simcard-error", "image://theme/wifi-high" ]));
38− Indicators.UnityMenuModelCache.setCachedModelData("com.canonical.indicators.fake3",
94+ Indicators.UnityMenuModelCache.setCachedModelData("/com/canonical/indicators/fake3",
39− "/com/canonical/indicators/fake3",
40− "/com/canonical/indicators/fake3",
41 getUnityMenuModelData("fake-indicator-messages",
95 getUnityMenuModelData("fake-indicator-messages",
42 "Messages (F)",
96 "Messages (F)",
43 "",
97 "",
44 [ "image://theme/messages-new" ]));
98 [ "image://theme/messages-new" ]));
45− Indicators.UnityMenuModelCache.setCachedModelData("com.canonical.indicators.fake4",
99+ Indicators.UnityMenuModelCache.setCachedModelData("/com/canonical/indicators/fake4",
46− "/com/canonical/indicators/fake4",
47− "/com/canonical/indicators/fake4",
48 getUnityMenuModelData("fake-indicator-sound",
100 getUnityMenuModelData("fake-indicator-sound",
49 "Sound (F)",
101 "Sound (F)",
50 "",
102 "",
51 [ "image://theme/audio-volume-high" ]));
103 [ "image://theme/audio-volume-high" ]));
52− Indicators.UnityMenuModelCache.setCachedModelData("com.canonical.indicators.fake5",
104+ Indicators.UnityMenuModelCache.setCachedModelData("/com/canonical/indicators/fake5",
53− "/com/canonical/indicators/fake5",
54− "/com/canonical/indicators/fake5",
55 getUnityMenuModelData("fake-indicator-power",
105 getUnityMenuModelData("fake-indicator-power",
56 "Battery (F)",
106 "Battery (F)",
57 "",
107 "",
58 [ "image://theme/battery-020" ]));
108 [ "image://theme/battery-020" ]));
59− Indicators.UnityMenuModelCache.setCachedModelData("com.canonical.indicators.fake6",
109+ Indicators.UnityMenuModelCache.setCachedModelData("/com/canonical/indicators/fake6",
60− "/com/canonical/indicators/fake6",
61− "/com/canonical/indicators/fake6",
62 getUnityMenuModelData("fake-indicator-datetime",
110 getUnityMenuModelData("fake-indicator-datetime",
63 "Upcoming Events (F)",
111 "Upcoming Events (F)",
64 "12:04",
112 "12:04",
@@ -78,11 +126,12 @@ Indicators.FakeIndicatorsModel {
78 "actionState": {
126 "actionState": {
79 "title": title,
127 "title": title,
80 "label": label,
128 "label": label,
81− "icons": icons
129+ "icons": icons,
130+ "visible": true
82 },
131 },
83 "isCheck": false,
132 "isCheck": false,
84 "isRadio": false,
133 "isRadio": false,
85− "isToggled": false,
134+ "isToggled": false
86 },
135 },
87 "submenu": []
136 "submenu": []
88 }];
137 }];
@@ -101,7 +150,7 @@ Indicators.FakeIndicatorsModel {
101 "actionState": {},
150 "actionState": {},
102 "isCheck": false,
151 "isCheck": false,
103 "isRadio": false,
152 "isRadio": false,
104− "isToggled": false,
153+ "isToggled": false
105 }};
154 }};
106 submenus.push(submenu);
155 submenus.push(submenu);
107 }
156 }
@@ -110,65 +159,20 @@ Indicators.FakeIndicatorsModel {
110 return root;
159 return root;
111 }
160 }
112
161
162+ function setIndicatorVisible(identifier, visible) {
113− property var originalModelData: [
163+ for (var i = 0; i < originalModelData.length; i++) {
114− {
164+ if (originalModelData[i]["identifier"] === identifier) {
115− "identifier": "fake-indicator-bluetooth",
165+ var data = Indicators.UnityMenuModelCache.getCachedModelData(
116− "indicatorProperties": {
166+ originalModelData[i]["indicatorProperties"]["menuObjectPath"]);
117− "enabled": true,
167+
118− "busName": "com.canonical.indicators.fake1",
168+ data[0]["rowData"]["actionState"]["visible"] = visible;
119− "menuObjectPath": "/com/canonical/indicators/fake1",
169+
120− "actionsObjectPath": "/com/canonical/indicators/fake1"
170+ Indicators.UnityMenuModelCache.setCachedModelData(
121− }
171+ originalModelData[i]["indicatorProperties"]["menuObjectPath"],
122− },
172+ data);
123− {
173+ break;
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"
166 }
174 }
167 }
175 }
168− ]
169
176
170− function load(profile) {
171− unload();
172− root.modelData = originalModelData;
173 }
177 }
174}
178}
tests/mocks/Unity/Indicators/RootActionState.qml+2−2
@@ -27,7 +27,7 @@ Item {
27 property string rightLabel: cachedState && cachedState.hasOwnProperty("label") ? cachedState["label"] : ""
27 property string rightLabel: cachedState && cachedState.hasOwnProperty("label") ? cachedState["label"] : ""
28 property var icons: cachedState && cachedState.hasOwnProperty("icons") ? cachedState["icons"] : []
28 property var icons: cachedState && cachedState.hasOwnProperty("icons") ? cachedState["icons"] : []
29 property string accessibleName: cachedState && cachedState.hasOwnProperty("accessible-desc") ? cachedState["accessible-desc"] : ""
29 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
31
31
32 property var cachedState: menu ? menu.get(0, "actionState") : undefined
32 property var cachedState: menu ? menu.get(0, "actionState") : undefined
33 Connections {
33 Connections {
@@ -45,5 +45,5 @@ Item {
45 onRightLabelChanged: updated()
45 onRightLabelChanged: updated()
46 onIconsChanged: updated()
46 onIconsChanged: updated()
47 onAccessibleNameChanged: updated()
47 onAccessibleNameChanged: updated()
48− onVisibleChanged: updated()
48+ onIndicatorVisibleChanged: updated()
49}
49}
tests/mocks/Unity/Indicators/fakeunitymenumodelcache.cpp+10−8
@@ -32,11 +32,9 @@ FakeUnityMenuModelCache::FakeUnityMenuModelCache(QObject* parent)
32{
32{
33}
33}
34
34
35−QSharedPointer<UnityMenuModel> FakeUnityMenuModelCache::model(const QByteArray& bus,
35+QSharedPointer<UnityMenuModel> FakeUnityMenuModelCache::model(const QByteArray& path)
36− const QByteArray& path,
37− const QVariantMap& actions)
38{
36{
39− return UnityMenuModelCache::singleton()->model(bus, path, actions);
37+ return UnityMenuModelCache::singleton()->model(path);
40}
38}
41
39
42bool FakeUnityMenuModelCache::contains(const QByteArray& path)
40bool FakeUnityMenuModelCache::contains(const QByteArray& path)
@@ -44,14 +42,18 @@ bool FakeUnityMenuModelCache::contains(const QByteArray& path)
44 return UnityMenuModelCache::singleton()->contains(path);
42 return UnityMenuModelCache::singleton()->contains(path);
45}
43}
46
44
47−void FakeUnityMenuModelCache::setCachedModelData(const QByteArray& bus,
45+void FakeUnityMenuModelCache::setCachedModelData(const QByteArray& path,
48− const QByteArray& path,
49− const QVariantMap& actions,
50 const QVariant& data)
46 const QVariant& data)
51{
47{
52 // keep a ref forever!
48 // keep a ref forever!
53 if (!m_models.contains(path)) {
49 if (!m_models.contains(path)) {
54− m_models[path] = model(bus, path, actions);
50+ m_models[path] = model(path);
55 }
51 }
56 m_models[path]->setModelData(data);
52 m_models[path]->setModelData(data);
57}
53}
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:
30
30
31 static FakeUnityMenuModelCache* singleton();
31 static FakeUnityMenuModelCache* singleton();
32
32
33− QSharedPointer<UnityMenuModel> model(const QByteArray& bus,
33+ QSharedPointer<UnityMenuModel> model(const QByteArray& path) override;
34− const QByteArray& path,
35− const QVariantMap& actions) override;
36 bool contains(const QByteArray& path) override;
34 bool contains(const QByteArray& path) override;
37
35
38−
39−
40− Q_INVOKABLE void setCachedModelData(const QByteArray& bus,
36+ Q_INVOKABLE void setCachedModelData(const QByteArray& path,
41− const QByteArray& path,
42− const QVariantMap& actions,
43 const QVariant& data = QVariant());
37 const QVariant& data = QVariant());
44
38
39+ Q_INVOKABLE QVariant getCachedModelData(const QByteArray& path);
40+
45private:
41private:
46 static FakeUnityMenuModelCache* theFakeCache;
42 static FakeUnityMenuModelCache* theFakeCache;
47 QHash<QByteArray, QSharedPointer<UnityMenuModel>> m_models;
43 QHash<QByteArray, QSharedPointer<UnityMenuModel>> m_models;
tests/qmltests/Greeter/tst_Clock.qml+1−3
@@ -37,9 +37,7 @@ Rectangle {
37 }
37 }
38
38
39 function updateDatetimeModelTime(label) {
39 function updateDatetimeModelTime(label) {
40− Indicators.UnityMenuModelCache.setCachedModelData("com.canonical.indicator.datetime",
40+ Indicators.UnityMenuModelCache.setCachedModelData("/com/canonical/indicator/datetime/phone",
41− "/com/canonical/indicator/datetime/phone",
42− "/com/canonical/indicator/datetime",
43 [{
41 [{
44 "rowData": {
42 "rowData": {
45 "actionState": { "label": label }
43 "actionState": { "label": label }
tests/qmltests/Panel/IndicatorTest.qml+23−10
@@ -26,10 +26,18 @@ Rectangle {
26 id: root
26 id: root
27 color: "white"
27 color: "white"
28
28
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+
30 Indicators.IndicatorsModel {
38 Indicators.IndicatorsModel {
31 id: __indicatorsModel
39 id: __indicatorsModel
32− Component.onCompleted: load()
40+ Component.onCompleted: load();
33 }
41 }
34
42
35 function insertIndicator(index) {
43 function insertIndicator(index) {
@@ -38,30 +46,35 @@ Rectangle {
38 var done = false;
46 var done = false;
39 for (i = index; !done && i >= 1; i--) {
47 for (i = index; !done && i >= 1; i--) {
40
48
41− var lookFor = indicatorsModel.originalModelData[i-1]["identifier"]
49+ var lookFor = __indicatorsModel.originalModelData[i-1]["identifier"]
42
50
43 var j;
51 var j;
44− for (j = indicatorsModel.modelData.length-1; !done && j >= 0; j--) {
52+ for (j = __indicatorsModel.modelData.length-1; !done && j >= 0; j--) {
45− if (indicatorsModel.modelData[j]["identifier"] === lookFor) {
53+ if (__indicatorsModel.modelData[j]["identifier"] === lookFor) {
46 insertIndex = j+1;
54 insertIndex = j+1;
47 done = true;
55 done = true;
48 }
56 }
49 }
57 }
50 }
58 }
51− indicatorsModel.insert(insertIndex, indicatorsModel.originalModelData[index]);
59+ __indicatorsModel.insert(insertIndex, __indicatorsModel.originalModelData[index]);
52 }
60 }
53
61
54 function removeIndicator(index) {
62 function removeIndicator(index) {
55 var i;
63 var i;
56− for (i = 0; i < indicatorsModel.modelData.length; i++) {
64+ for (i = 0; i < __indicatorsModel.modelData.length; i++) {
57− if (indicatorsModel.modelData[i]["identifier"] === indicatorsModel.originalModelData[index]["identifier"]) {
65+ if (__indicatorsModel.modelData[i]["identifier"] === __indicatorsModel.originalModelData[index]["identifier"]) {
58− indicatorsModel.remove(i);
66+ __indicatorsModel.remove(i);
59 break;
67 break;
60 }
68 }
61 }
69 }
62 }
70 }
63
71
72+ function setIndicatorVisible(index, visible) {
73+ var identifier = __indicatorsModel.originalModelData[index]["identifier"];
74+ __indicatorsModel.setIndicatorVisible(identifier, visible);
75+ }
76+
64 function resetData() {
77 function resetData() {
65− indicatorsModel.load();
78+ __indicatorsModel.load();
66 }
79 }
67}
80}
tests/qmltests/Panel/tst_IndicatorItemRow.qml+27−16
@@ -24,7 +24,7 @@ import Unity.Indicators 0.1 as Indicators
24
24
25IndicatorTest {
25IndicatorTest {
26 id: root
26 id: root
27− width: units.gu(100)
27+ width: units.gu(120)
28 height: units.gu(40)
28 height: units.gu(40)
29 color: "white"
29 color: "white"
30
30
@@ -91,13 +91,24 @@ IndicatorTest {
91 }
91 }
92
92
93 Repeater {
93 Repeater {
94− model: indicatorsModel.originalModelData
94+ model: root.originalModelData
95 RowLayout {
95 RowLayout {
96 CheckBox {
96 CheckBox {
97 checked: true
97 checked: true
98 onCheckedChanged: checked ? insertIndicator(index) : removeIndicator(index);
98 onCheckedChanged: checked ? insertIndicator(index) : removeIndicator(index);
99 }
99 }
100+ Label {
101+ Layout.fillWidth: true
100− Label { text: modelData["identifier"] }
102+ text: modelData["identifier"]
103+ }
104+
105+ CheckBox {
106+ checked: true
107+ onCheckedChanged: setIndicatorVisible(index, checked);
108+ }
109+ Label {
110+ text: "visible"
111+ }
101 }
112 }
102 }
113 }
103 }
114 }
@@ -138,9 +149,9 @@ IndicatorTest {
138 var item;
149 var item;
139 var itemsToRemove = [0, 2];
150 var itemsToRemove = [0, 2];
140
151
141− verify(indicatorsModel.originalModelData.length > 0);
152+ verify(root.originalModelData.length > 0);
142− for (i = 0; i < indicatorsModel.originalModelData.length; i++) {
153+ for (i = 0; i < root.originalModelData.length; i++) {
143− item = findChild(indicatorsRow, indicatorsModel.originalModelData[i]["identifier"] + "-panelItem");
154+ item = findChild(indicatorsRow, root.originalModelData[i]["identifier"] + "-panelItem");
144 verify(item);
155 verify(item);
145
156
146 compare(item.ownIndex, i, "Item at incorrect index");
157 compare(item.ownIndex, i, "Item at incorrect index");
@@ -151,8 +162,8 @@ IndicatorTest {
151 }
162 }
152
163
153 // test removals
164 // test removals
154− for (i = 0; i < indicatorsModel.originalModelData.length; i++) {
165+ for (i = 0; i < root.originalModelData.length; i++) {
155− item = findChild(indicatorsRow, indicatorsModel.originalModelData[i]["identifier"] + "-panelItem");
166+ item = findChild(indicatorsRow, root.originalModelData[i]["identifier"] + "-panelItem");
156
167
157 verify(data.remove.indexOf(i) !== -1 ? (item === null) : (item !== null));
168 verify(data.remove.indexOf(i) !== -1 ? (item === null) : (item !== null));
158 }
169 }
@@ -162,8 +173,8 @@ IndicatorTest {
162 insertIndicator(data.remove[i]);
173 insertIndicator(data.remove[i]);
163 }
174 }
164
175
165− for (i = 0; i < indicatorsModel.originalModelData.length; i++) {
176+ for (i = 0; i < root.originalModelData.length; i++) {
166− item = findChild(indicatorsRow, indicatorsModel.originalModelData[i]["identifier"] + "-panelItem");
177+ item = findChild(indicatorsRow, root.originalModelData[i]["identifier"] + "-panelItem");
167 verify(item);
178 verify(item);
168
179
169 compare(item.ownIndex, i, "Item at incorrect index");
180 compare(item.ownIndex, i, "Item at incorrect index");
@@ -180,7 +191,7 @@ IndicatorTest {
180
191
181 // test selecting the item at it's position sets the current item of the row.
192 // test selecting the item at it's position sets the current item of the row.
182 function test_validCurrentItem(data) {
193 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");
184 verify(dataItem !== null);
195 verify(dataItem !== null);
185
196
186 indicatorsRow.selectItemAt(dataItem.x + dataItem.width/2);
197 indicatorsRow.selectItemAt(dataItem.x + dataItem.width/2);
@@ -190,7 +201,7 @@ IndicatorTest {
190 // tests item default selection (no item at position X)
201 // tests item default selection (no item at position X)
191 function test_invalidCurrentItem() {
202 function test_invalidCurrentItem() {
192 indicatorsRow.selectItemAt(-100);
203 indicatorsRow.selectItemAt(-100);
193− var item = findChild(indicatorsRow, indicatorsModel.originalModelData[0]["identifier"] + "-panelItem");
204+ var item = findChild(indicatorsRow, root.originalModelData[0]["identifier"] + "-panelItem");
194 compare(indicatorsRow.currentItem, item);
205 compare(indicatorsRow.currentItem, item);
195 }
206 }
196
207
@@ -206,10 +217,10 @@ IndicatorTest {
206 indicatorsRow.expanded = true;
217 indicatorsRow.expanded = true;
207 wait_for_expansion_to_settle();
218 wait_for_expansion_to_settle();
208
219
209− var fromItem = findChild(indicatorsRow, indicatorsModel.originalModelData[data.from]["identifier"] + "-panelItem");
220+ var fromItem = findChild(indicatorsRow, root.originalModelData[data.from]["identifier"] + "-panelItem");
210 verify(fromItem !== null);
221 verify(fromItem !== null);
211
222
212− var toItem = findChild(indicatorsRow, indicatorsModel.originalModelData[data.to]["identifier"] + "-panelItem");
223+ var toItem = findChild(indicatorsRow, root.originalModelData[data.to]["identifier"] + "-panelItem");
213 verify(toItem !== null);
224 verify(toItem !== null);
214
225
215 var fromPosition = indicatorsRow.mapFromItem(fromItem, fromItem.width/2, fromItem.height/2);
226 var fromPosition = indicatorsRow.mapFromItem(fromItem, fromItem.width/2, fromItem.height/2);
@@ -231,7 +242,7 @@ IndicatorTest {
231 wait_for_expansion_to_settle();
242 wait_for_expansion_to_settle();
232
243
233 var highlight = findChild(indicatorsRow, "highlight");
244 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");
235 verify(item !== null);
246 verify(item !== null);
236 var mappedPosition = indicatorsRow.mapFromItem(item, item.width/2, item.height/2);
247 var mappedPosition = indicatorsRow.mapFromItem(item, item.width/2, item.height/2);
237
248
@@ -256,7 +267,7 @@ IndicatorTest {
256 wait_for_expansion_to_settle();
267 wait_for_expansion_to_settle();
257
268
258 var highlight = findChild(indicatorsRow, "highlight");
269 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");
260 verify(item !== null);
271 verify(item !== null);
261 var mappedPosition = indicatorsRow.mapFromItem(item, item.width/2, item.height/2);
272 var mappedPosition = indicatorsRow.mapFromItem(item, item.width/2, item.height/2);
262
273
tests/qmltests/Panel/tst_IndicatorPage.qml+1−3
@@ -110,9 +110,7 @@ Item {
110 }]; // end row 1
110 }]; // end row 1
111
111
112 function initializeMenuData(data) {
112 function initializeMenuData(data) {
113− Indicators.UnityMenuModelCache.setCachedModelData("com.canonical.indicator.test",
113+ Indicators.UnityMenuModelCache.setCachedModelData("/com/canonical/indicator/test",
114− "/com/canonical/indicator/test",
115− "/com/canonical/indicator/test",
116 data);
114 data);
117 }
115 }
118
116
tests/qmltests/Panel/tst_IndicatorsBar.qml+58−12
@@ -49,11 +49,12 @@ IndicatorTest {
49 width: units.gu(30)
49 width: units.gu(30)
50 anchors.centerIn: parent
50 anchors.centerIn: parent
51 indicatorsModel: root.indicatorsModel
51 indicatorsModel: root.indicatorsModel
52+ interactive: expanded && height === units.gu(7)
52
53
53 Behavior on height {
54 Behavior on height {
54 NumberAnimation {
55 NumberAnimation {
55 id: heightAnimation
56 id: heightAnimation
56− duration: UbuntuAnimation.SnapDuration; easing: UbuntuAnimation.StandardEasing
57+ duration: UbuntuAnimation.FastDuration; easing: UbuntuAnimation.StandardEasing
57 }
58 }
58 }
59 }
59
60
@@ -85,13 +86,24 @@ IndicatorTest {
85 }
86 }
86
87
87 Repeater {
88 Repeater {
88− model: indicatorsModel.originalModelData
89+ model: root.originalModelData
89 RowLayout {
90 RowLayout {
90 CheckBox {
91 CheckBox {
91 checked: true
92 checked: true
92 onCheckedChanged: checked ? insertIndicator(index) : removeIndicator(index);
93 onCheckedChanged: checked ? insertIndicator(index) : removeIndicator(index);
93 }
94 }
95+ Label {
96+ Layout.fillWidth: true
94− Label { text: modelData["identifier"] }
97+ text: modelData["identifier"]
98+ }
99+
100+ CheckBox {
101+ checked: true
102+ onCheckedChanged: setIndicatorVisible(index, checked);
103+ }
104+ Label {
105+ text: "visible"
106+ }
95 }
107 }
96 }
108 }
97 }
109 }
@@ -103,7 +115,7 @@ IndicatorTest {
103
115
104 function init() {
116 function init() {
105 indicatorsBar.expanded = false;
117 indicatorsBar.expanded = false;
106− tryCompare(heightAnimation, "running", false);
118+ wait_for_expansion_to_settle();
107 }
119 }
108
120
109 function test_expandSelectedItem_data() {
121 function test_expandSelectedItem_data() {
@@ -116,12 +128,12 @@ IndicatorTest {
116
128
117 function wait_for_expansion_to_settle() {
129 function wait_for_expansion_to_settle() {
118 tryCompare(heightAnimation, "running", false);
130 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
120 }
132 }
121
133
122 // Rough check that expanding a selected item keeps it within the area of the original item.
134 // Rough check that expanding a selected item keeps it within the area of the original item.
123 function test_expandSelectedItem(data) {
135 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");
125 verify(dataItem !== null);
137 verify(dataItem !== null);
126
138
127 var mappedPosition = indicatorsBar.mapFromItem(dataItem, dataItem.width/2, dataItem.height/2);
139 var mappedPosition = indicatorsBar.mapFromItem(dataItem, dataItem.width/2, dataItem.height/2);
@@ -130,19 +142,24 @@ IndicatorTest {
130 indicatorsBar.expanded = true;
142 indicatorsBar.expanded = true;
131 wait_for_expansion_to_settle();
143 wait_for_expansion_to_settle();
132
144
133− var mappedRect = indicatorsBar.mapFromItem(dataItem, 0, 0, dataItem.width, dataItem.height);
134
145
135 // mappedPosition contained within mappedRect
146 // mappedPosition contained within mappedRect
147+ tryCompareFunction(function() {
148+ var mappedRect = indicatorsBar.mapFromItem(dataItem, 0, 0, dataItem.width, dataItem.height);
136− verify(mappedRect.x <= mappedPosition.x);
149+ return mappedRect.x <= mappedPosition.x; },
150+ true);
151+ tryCompareFunction(function() {
152+ var mappedRect = indicatorsBar.mapFromItem(dataItem, 0, 0, dataItem.width, dataItem.height);
137− verify(mappedRect.x + mappedRect.width >= mappedPosition.x);
153+ return mappedRect.x + mappedRect.width >= mappedPosition.x;
154+ }, true);
138 }
155 }
139
156
140 function test_scrollOffset() {
157 function test_scrollOffset() {
141 indicatorsBar.expanded = true;
158 indicatorsBar.expanded = true;
142 wait_for_expansion_to_settle();
159 wait_for_expansion_to_settle();
143
160
144− var lastItemIndex = indicatorsModel.originalModelData.length-1;
161+ var lastItemIndex = root.originalModelData.length-1;
145− var dataItem = findChild(indicatorsBar, indicatorsModel.originalModelData[lastItemIndex]["identifier"] + "-panelItem");
162+ var dataItem = findChild(indicatorsBar, root.originalModelData[lastItemIndex]["identifier"] + "-panelItem");
146 verify(dataItem !== null);
163 verify(dataItem !== null);
147
164
148 var row = findChild(indicatorsBar, "indicatorItemRow");
165 var row = findChild(indicatorsBar, "indicatorItemRow");
@@ -167,12 +184,41 @@ IndicatorTest {
167 indicatorsBar.expanded = true;
184 indicatorsBar.expanded = true;
168 wait_for_expansion_to_settle();
185 wait_for_expansion_to_settle();
169
186
170− var dataItem = findChild(indicatorsBar, indicatorsModel.originalModelData[data.index]["identifier"] + "-panelItem");
187+ var dataItem = findChild(indicatorsBar, root.originalModelData[data.index]["identifier"] + "-panelItem");
171 if (indicatorsBar.mapFromItem(dataItem, dataItem.width/2, dataItem.height/2).x < 0) {
188 if (indicatorsBar.mapFromItem(dataItem, dataItem.width/2, dataItem.height/2).x < 0) {
172 skip("Out of bounds");
189 skip("Out of bounds");
173 }
190 }
174 mouseClick(dataItem, dataItem.width/2, dataItem.height/2);
191 mouseClick(dataItem, dataItem.width/2, dataItem.height/2);
175 verify(dataItem.selected === true);
192 verify(dataItem.selected === true);
176 }
193 }
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+ }
177 }
223 }
178}
224}
tests/qmltests/Panel/tst_IndicatorsMenu.qml+16−5
@@ -79,13 +79,24 @@ IndicatorTest {
79 }
79 }
80
80
81 Repeater {
81 Repeater {
82− model: indicatorsModel.originalModelData
82+ model: root.originalModelData
83 RowLayout {
83 RowLayout {
84 CheckBox {
84 CheckBox {
85 checked: true
85 checked: true
86 onCheckedChanged: checked ? insertIndicator(index) : removeIndicator(index);
86 onCheckedChanged: checked ? insertIndicator(index) : removeIndicator(index);
87 }
87 }
88+ Label {
89+ Layout.fillWidth: true
88− Label { text: modelData["identifier"] }
90+ text: modelData["identifier"]
91+ }
92+
93+ CheckBox {
94+ checked: true
95+ onCheckedChanged: setIndicatorVisible(index, checked);
96+ }
97+ Label {
98+ text: "visible"
99+ }
89 }
100 }
90 }
101 }
91 }
102 }
@@ -105,7 +116,7 @@ IndicatorTest {
105 }
116 }
106
117
107 function get_indicator_item(index) {
118 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");
109 verify(indicatorItem !== null);
120 verify(indicatorItem !== null);
110
121
111 return indicatorItem;
122 return indicatorItem;
@@ -181,7 +192,7 @@ IndicatorTest {
181 var indicatorItemRow = findChild(indicatorsMenu, "indicatorItemRow");
192 var indicatorItemRow = findChild(indicatorsMenu, "indicatorItemRow");
182 verify(indicatorItemRow !== null);
193 verify(indicatorItemRow !== null);
183
194
184− for (var i = 0; i < indicatorsModel.originalModelData.length; i++) {
195+ for (var i = 0; i < root.originalModelData.length; i++) {
185 var indicatorItem = get_indicator_item(i);
196 var indicatorItem = get_indicator_item(i);
186
197
187 var mappedPosition = root.mapFromItem(indicatorItem, indicatorItem.width/2, indicatorItem.height/2);
198 var mappedPosition = root.mapFromItem(indicatorItem, indicatorItem.width/2, indicatorItem.height/2);
@@ -209,7 +220,7 @@ IndicatorTest {
209 // if the x position changes
220 // if the x position changes
210 function test_verticalVelocityDetector() {
221 function test_verticalVelocityDetector() {
211 indicatorsMenu.verticalVelocityThreshold = 0;
222 indicatorsMenu.verticalVelocityThreshold = 0;
212− verify(indicatorsModel.originalModelData.length >= 2);
223+ verify(root.originalModelData.length >= 2);
213
224
214 var indicatorItemRow = findChild(indicatorsMenu, "indicatorItemRow");
225 var indicatorItemRow = findChild(indicatorsMenu, "indicatorItemRow");
215 verify(indicatorItemRow !== null);
226 verify(indicatorItemRow !== null);
tests/qmltests/Panel/tst_MenuContent.qml+5−5
@@ -63,12 +63,12 @@ IndicatorTest {
63 if (menuContent.currentMenuIndex == -1)
63 if (menuContent.currentMenuIndex == -1)
64 activate_content(0);
64 activate_content(0);
65 else
65 else
66− activate_content((menuContent.currentMenuIndex + 1) % indicatorsModel.count)
66+ activate_content((menuContent.currentMenuIndex + 1) % root.originalModelData.length)
67 }
67 }
68
68
69 function activate_content(index)
69 function activate_content(index)
70 {
70 {
71− menuContent.setCurrentMenuIndex(index)
71+ menuContent.currentMenuIndex = index;
72 }
72 }
73
73
74 function get_test_menu_objecName(index) {
74 function get_test_menu_objecName(index) {
@@ -100,7 +100,7 @@ IndicatorTest {
100
100
101 // Check that the correct menus are displayed for the requested item.
101 // Check that the correct menus are displayed for the requested item.
102 function test_show_menu() {
102 function test_show_menu() {
103− var menuCount = root.indicatorsModel.count;
103+ var menuCount = root.originalModelData.length;
104 verify(menuCount > 0, "Menu count should be greater than zero");
104 verify(menuCount > 0, "Menu count should be greater than zero");
105
105
106 var listView = menu_content_test.findChild(menuContent, "indicatorsContentListView")
106 var listView = menu_content_test.findChild(menuContent, "indicatorsContentListView")
@@ -111,7 +111,7 @@ IndicatorTest {
111 var menuIndex = i%menuCount;
111 var menuIndex = i%menuCount;
112
112
113 activate_content(menuIndex);
113 activate_content(menuIndex);
114− testItemObjectName = indicatorsModel.data(menuIndex, Indicators.IndicatorsModelRole.Identifier);
114+ testItemObjectName = indicatorsModel.model.data(menuIndex, Indicators.IndicatorsModelRole.Identifier);
115 compare(listView.currentIndex, menuIndex, "Current tab index does not match selected tab index");
115 compare(listView.currentIndex, menuIndex, "Current tab index does not match selected tab index");
116 tryCompareFunction(current_item_equals_test_item, true);
116 tryCompareFunction(current_item_equals_test_item, true);
117 }
117 }
@@ -119,7 +119,7 @@ IndicatorTest {
119
119
120 // Tests QTBUG-30632 - asynchronous loader crashes when changing index quickly.
120 // Tests QTBUG-30632 - asynchronous loader crashes when changing index quickly.
121 function test_multi_activate() {
121 function test_multi_activate() {
122− var menuCount = root.indicatorsModel.count;
122+ var menuCount = root.originalModelData.length;
123 verify(menuCount > 0, "Menu count should be greater than zero");
123 verify(menuCount > 0, "Menu count should be greater than zero");
124
124
125 for (var i = 0; i < 100; i++) {
125 for (var i = 0; i < 100; i++) {
tests/qmltests/Panel/tst_Panel.qml+15−4
@@ -96,13 +96,24 @@ IndicatorTest {
96 }
96 }
97
97
98 Repeater {
98 Repeater {
99− model: indicatorsModel.originalModelData
99+ model: root.originalModelData
100 RowLayout {
100 RowLayout {
101 CheckBox {
101 CheckBox {
102 checked: true
102 checked: true
103 onCheckedChanged: checked ? insertIndicator(index) : removeIndicator(index);
103 onCheckedChanged: checked ? insertIndicator(index) : removeIndicator(index);
104 }
104 }
105+ Label {
106+ Layout.fillWidth: true
105− Label { text: modelData["identifier"] }
107+ text: modelData["identifier"]
108+ }
109+
110+ CheckBox {
111+ checked: true
112+ onCheckedChanged: setIndicatorVisible(index, checked);
113+ }
114+ Label {
115+ text: "visible"
116+ }
106 }
117 }
107 }
118 }
108 }
119 }
@@ -132,7 +143,7 @@ IndicatorTest {
132 }
143 }
133
144
134 function get_indicator_item(index) {
145 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");
136 verify(indicatorItem !== null);
147 verify(indicatorItem !== null);
137
148
138 return indicatorItem;
149 return indicatorItem;
@@ -172,7 +183,7 @@ IndicatorTest {
172 // (switches between normal and fullscreen modes are animated)
183 // (switches between normal and fullscreen modes are animated)
173 tryCompareFunction(function() { return indicatorArea.y }, data.indicatorY);
184 tryCompareFunction(function() { return indicatorArea.y }, data.indicatorY);
174
185
175− for (var i = 0; i < indicatorsModel.originalModelData.length; i++) {
186+ for (var i = 0; i < root.originalModelData.length; i++) {
176 var indicatorItem = get_indicator_item(i);
187 var indicatorItem = get_indicator_item(i);
177
188
178 var startXPosition = root.mapFromItem(indicatorItem, indicatorItem.width / 2, 0).x;
189 var startXPosition = root.mapFromItem(indicatorItem, indicatorItem.width / 2, 0).x;