on xenial help sign in
Merged with trunk, fixed failing autopilot-tests again.
commit852b6a5075041ad82cb8805e5a659627837abb2b authorMirco Müller <mirco.mueller@ubuntu.com> dateMon 5 Aug 2013, 14:33 (13 years ago) parent000d9d05da4ba4
100 files changed+1278−327
Components/ApplicationManagerWrapper.qml+2 Components/CrossFadeImage.qml+3−1 Dash/DashVideos.qml+1−1 Greeter/Greeter.qml+2−3 Greeter/GreeterContent.qml−2 Greeter/Lockscreen.qml+9−9 Greeter/PinLockscreen.qml+110−41 Greeter/PinPadButton.qml+5−16 Panel/Indicators/client/IndicatorsClient.qml+8−9 Panel/Indicators/client/IndicatorsPage.qml+57−12 Panel/Indicators/client/IndicatorsTree.qml+62 Shell.qml+68−32 debian/changelog+48 debian/control+3−1 debian/unity8-private.install+1 plugins/CMakeLists.txt+1 plugins/ListViewWithPageHeader/listviewwithpageheader.cpp+26−8 plugins/ListViewWithPageHeader/listviewwithpageheader.h+1−1 plugins/Powerd/CMakeLists.txt+13 plugins/Powerd/Powerd.cpp+36 plugins/Powerd/Powerd.h+40 plugins/Powerd/plugin.cpp+36 plugins/Powerd/plugin.h+35 plugins/Powerd/qmldir+3 plugins/Unity/Indicators/CMakeLists.txt+1 plugins/Unity/Indicators/modelprinter.cpp+114 plugins/Unity/Indicators/modelprinter.h+50 plugins/Unity/Indicators/plugin.cpp+2 plugins/Unity/scope.h−3 po/ar.po+2−2 po/az.po+2−2 po/bg.po+2−2 po/ca.po+2−2 po/de.po+2−2 po/el.po+2−2 po/en_AU.po+2−2 po/en_GB.po+2−2 po/eo.po+2−2 po/es.po+2−2 po/fi.po+2−2 po/fo.po+2−2 po/fr.po+2−2 po/gl.po+2−2 po/he.po+2−2 po/hr.po+2−2 po/hu.po+2−2 po/hy.po+2−2 po/id.po+2−2 po/it.po+2−2 po/ja.po+2−2 po/kn.po+2−2 po/ko.po+2−2 po/ky.po+2−2 po/lv.po+2−2 po/my.po+2−2 po/nb.po+2−2 po/nl.po+2−2 po/pl.po+2−2 po/pt_BR.po+2−2 po/ro.po+2−2 po/ru.po+2−2 po/si.po+2−2 po/sl.po+2−2 po/sr.po+2−2 po/sv.po+2−2 po/te.po+2−2 po/tr.po+2−2 po/ug.po+2−2 po/uk.po+2−2 po/zh_CN.po+2−2 po/zh_TW.po+2−2 tests/autopilot/unity8/indicators_client/tests/test_battery.py+1−1 tests/autopilot/unity8/shell/emulators/greeter.py+4−1 tests/autopilot/unity8/shell/emulators/hud.py+4−7 tests/autopilot/unity8/shell/emulators/main_window.py+1−1 tests/autopilot/unity8/shell/tests/test_hud.py+5−5 tests/autopilot/unity8/shell/tests/test_lock_screen.py+58−26 tests/autopilot/unity8/shell/tests/test_notifications.py+10−10 tests/data/unity/backgrounds/blue.png tests/data/unity/backgrounds/red.png tests/mocks/CMakeLists.txt+1 tests/mocks/GSettings/CMakeLists.txt+31 tests/mocks/GSettings/fake_gsettings.cpp+102 tests/mocks/GSettings/fake_gsettings.h+90 tests/mocks/GSettings/plugin.cpp+33 tests/mocks/GSettings/plugin.h+31 tests/mocks/GSettings/qmldir+2 tests/mocks/LightDM/single/GreeterPrivate.cpp+2−4 tests/mocks/Ubuntu/Application/ApplicationManager.h+4 tests/mocks/Unity/Indicators/qml/fake_menu_page1.qml−8 tests/mocks/Unity/Indicators/qml/fake_menu_page2.qml−8 tests/mocks/Unity/Indicators/qml/fake_menu_page3.qml−8 tests/mocks/Unity/Indicators/qml/fake_menu_page4.qml−8 tests/mocks/Unity/Indicators/qml/fake_menu_page5.qml−8 tests/plugins/ListViewWithPageHeader/listviewwithpageheadertestsection.cpp+51−2 tests/qmltests/CMakeLists.txt+1−1 tests/qmltests/Dash/tst_FilterGrids.qml+1−1 tests/qmltests/Greeter/tst_Lockscreen.qml+1 tests/qmltests/tst_Shell.qml+14 tests/utils/modules/Unity/Test/UnityTestCase.qml+10−5
Components/ApplicationManagerWrapper.qml+2
@@ -29,6 +29,8 @@ Item {
2929 property bool keyboardVisible: ApplicationManager.keyboardVisible
3030 property int keyboardHeight: ApplicationManager.keyboardHeight
3131
32+ property bool fake: ApplicationManager.fake ? ApplicationManager.fake : false
33+
3234 Component.onCompleted: {
3335 // Start the watcher so that the ApplicationManager applications model can be populated.
3436 ApplicationManager.startWatcher();
Components/CrossFadeImage.qml+3−1
@@ -85,7 +85,7 @@ Item {
8585 Connections {
8686 target: __nextImage
8787 onStatusChanged: {
88− if (__nextImage.status == Image.Ready) {
88+ if (__nextImage.status == Image.Ready || __nextImage.status == Image.Error) {
8989 swapImages();
9090 }
9191 }
@@ -96,6 +96,7 @@ Item {
9696 anchors.fill: parent
9797 cache: false
9898 asynchronous: true
99+ fillMode: Image.PreserveAspectCrop
99100 z: 1
100101 }
101102
@@ -104,6 +105,7 @@ Item {
104105 anchors.fill: parent
105106 cache: false
106107 asynchronous: true
108+ fillMode: Image.PreserveAspectCrop
107109 z: 0
108110 }
109111
Dash/DashVideos.qml+1−1
@@ -118,7 +118,7 @@ ScopeView {
118118 var dataItem;
119119 // VideosCarousel and VideosFilterGrid have different
120120 // clicked signals, accomodate for that
121− if (categoryId == 1) {
121+ if (categoryId == "featured") {
122122 var fileUri = delegateItem.model.uri.replace(/^[^:]+:/, "")
123123 dataItem = {fileUri: fileUri, nfoUri: delegateItem.model.comment}
124124 } else {
Greeter/Greeter.qml+2−3
@@ -34,7 +34,7 @@ Showable {
3434
3535 property alias dragHandleWidth: dragHandle.width
3636 property alias model: greeterContentLoader.model
37− property bool locked: shown && multiUser && !greeterContentLoader.promptless
37+ property bool locked: shown && !LightDM.Greeter.promptless
3838
3939 readonly property bool narrowMode: !multiUser && width <= units.gu(60)
4040 readonly property bool multiUser: LightDM.Users.count > 1
@@ -59,7 +59,6 @@ Showable {
5959 anchors.fill: parent
6060 property var model: LightDM.Users
6161 property int currentIndex: 0
62− property bool promptless: item ? item.promptless : false
6362 property var infographicModel: LightDM.Infographic
6463
6564 source: required ? "GreeterContent.qml" : ""
@@ -113,7 +112,7 @@ Showable {
113112 // UI element)
114113 distanceThreshold: 0
115114
116− enabled: !greeter.locked
115+ enabled: greeter.narrowMode || !greeter.locked
117116
118117 direction: Direction.Leftwards
119118 }
Greeter/GreeterContent.qml−2
@@ -23,7 +23,6 @@ MouseArea {
2323 id: root
2424 anchors.fill: parent
2525
26− property bool promptless: loginLoader.status == Loader.Ready && LightDM.Greeter.promptless
2726 property bool ready: wallpaper.status == Image.Ready
2827 property bool leftTeaserPressed: teasingMouseArea.pressed &&
2928 teasingMouseArea.mouseX < teasingMouseArea.width / 2
@@ -38,7 +37,6 @@ MouseArea {
3837
3938 source: shell.background
4039 anchors.fill: parent
41− crossFade: false
4240 fadeInFirst: false
4341 }
4442
Greeter/Lockscreen.qml+9−9
@@ -69,7 +69,7 @@ Showable {
6969 left: parent.left
7070 right: parent.right
7171 verticalCenter: parent.verticalCenter
72− verticalCenterOffset: root.alphaNumeric ? -units.gu(10) : 0
72+ verticalCenterOffset: root.alphaNumeric ? -units.gu(10) : -units.gu(4)
7373 }
7474 property bool resetting: false
7575
@@ -107,11 +107,11 @@ Showable {
107107 Column {
108108 anchors {
109109 left: parent.left
110− top: pinPadLoader.bottom
111− topMargin: units.gu(4)
112− right: parent.right
113110 bottom: parent.bottom
111+ bottomMargin: units.gu(4)
112+ right: parent.right
114113 }
114+ height: childrenRect.height
115115 spacing: units.gu(1)
116116
117117 Icon {
@@ -120,8 +120,8 @@ Showable {
120120 width: height
121121 anchors.horizontalCenter: parent.horizontalCenter
122122 name: "phone-app-call-symbolic"
123− color: "white"
124− opacity: 0.9
123+ color: "#f3f3e7"
124+ opacity: 0.6
125125
126126 MouseArea {
127127 anchors.fill: parent
@@ -130,9 +130,9 @@ Showable {
130130 }
131131
132132 Label {
133− text: i18n.tr("Emergency call")
134− color: "white"
135− opacity: 0.9
133+ text: i18n.tr("Emergency Call")
134+ color: "#f3f3e7"
135+ opacity: 0.6
136136 fontSize: "medium"
137137 anchors.horizontalCenter: parent.horizontalCenter
138138 }
Greeter/PinLockscreen.qml+110−41
@@ -16,15 +16,17 @@
1616
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
19+import Ubuntu.Components.ListItems 0.1
1920import "../Components"
2021
2122Column {
2223 id: root
2324 anchors.centerIn: parent
24− spacing: units.gu(2.5)
25+ spacing: units.gu(3.5)
2526
2627 property alias placeholderText: pinentryField.placeholderText
27− property int padWidth: units.gu(32)
28+ property int padWidth: units.gu(34)
29+ property int padHeight: units.gu(28)
2830 property int pinLength: 4
2931
3032 signal entered(string passphrase)
@@ -37,70 +39,137 @@ Column {
3739 }
3840 }
3941
40− TextField {
42+
43+ UbuntuShape {
4144 id: pinentryField
4245 objectName: "pinentryField"
4346 anchors.horizontalCenter: parent.horizontalCenter
44− width: units.gu(32)
47+ color: "#55000000"
48+ width:root.padWidth
4549 height: units.gu(5)
46− echoMode: TextInput.Password
47− font.pixelSize: units.dp(44)
48− color: "white"
49− opacity: 0.9
50− hasClearButton: false
51− horizontalAlignment: Text.AlignHCenter
52−
50+ radius: "medium"
51+ property string text: ""
52+ property string placeholderText: ""
5353 onTextChanged: {
54− if (pinentryField.text.length === root.pinLength) {
55− root.entered(pinentryField.text);
54+ pinentryFieldLabel.text = "";
55+ for (var i = 0; i < text.length; ++i) {
56+ pinentryFieldLabel.text += "•";
57+ }
58+ if (text.length === root.pinLength) {
59+ root.entered(text);
5660 }
5761 }
5862
59− // Using a MouseArea to eat clicks. We don't want to disable the TextField for styling reasons
60− MouseArea {
61− anchors.fill: parent
63+ Label {
64+ id: pinentryFieldLabel
65+ anchors.centerIn: parent
66+ font.pixelSize: units.dp(44)
67+ color: "#f3f3e7"
68+ opacity: 0.6
69+ }
70+ Label {
71+ id: pinentryFieldPlaceHolder
72+ anchors.centerIn: parent
73+ color: "grey"
74+ text: parent.placeholderText
75+ visible: pinentryFieldLabel.text.length == 0
6276 }
6377 }
6478
65− Grid {
79+ UbuntuShape {
6680 anchors {
6781 left: parent.left
6882 right: parent.right
6983 margins: (parent.width - root.padWidth) / 2
7084 }
85+ height: root.padHeight
86+ color: "#55000000"
87+ radius: "medium"
88+
89+ ThinDivider {
90+ anchors {
91+ left: parent.left
92+ right: parent.right
93+ top: parent.top
94+ topMargin: root.padHeight / 4
95+ }
96+ }
97+ ThinDivider {
98+ anchors {
99+ left: parent.left
100+ right: parent.right
101+ verticalCenter: parent.verticalCenter
102+ }
103+ }
104+ ThinDivider {
105+ anchors {
106+ left: parent.left
107+ right: parent.right
108+ bottom: parent.bottom
109+ bottomMargin: root.padHeight / 4
110+ }
111+ }
71112
72− columns: 3
73− spacing: units.gu(1)
113+ ThinDivider {
114+ anchors.centerIn: parent
115+ anchors.horizontalCenterOffset: -root.padWidth / 6
116+ width: root.padHeight
117+ rotation: -90
118+ }
119+ ThinDivider {
120+ anchors.centerIn: parent
121+ anchors.horizontalCenterOffset: root.padWidth / 6
122+ width: root.padHeight
123+ rotation: -90
124+ }
74125
75− Repeater {
76− model: 9
126+ Grid {
127+ anchors {
128+ left: parent.left
129+ right: parent.right
130+ margins: (parent.width - root.padWidth) / 2
131+ }
77132
78− PinPadButton {
79− objectName: "pinPadButton" + (index + 1)
80− text: index + 1
133+ columns: 3
134+
135+ Repeater {
136+ model: 9
137+
138+ PinPadButton {
139+ objectName: "pinPadButton" + (index + 1)
140+ width: root.padWidth / 3
141+ height: root.padHeight / 4
142+ text: index + 1
81143
82− onClicked: {
83− pinentryField.text = pinentryField.text + text
144+ onClicked: {
145+ pinentryField.text = pinentryField.text + text;
146+ }
84147 }
85148 }
86− }
87149
88− PinPadButton {
89− objectName: "pinPadButtonBack"
90− iconName: "back"
91− onClicked: root.cancel();
150+ PinPadButton {
151+ objectName: "pinPadButtonBack"
152+ width: root.padWidth / 3
153+ height: root.padHeight / 4
154+ iconName: "back"
155+ onClicked: root.cancel();
156+ }
92157
93− }
94− PinPadButton {
95− objectName: "pinPadButton0"
96− text: "0"
97− onClicked: pinentryField.text = pinentryField.text + text
158+ PinPadButton {
159+ objectName: "pinPadButton0"
160+ width: root.padWidth / 3
161+ height: root.padHeight / 4
162+ text: "0"
163+ onClicked: pinentryField.text = pinentryField.text + text
164+ }
98165
99− }
100− PinPadButton {
101− objectName: "pinPadButtonErase"
102− iconName: "erase"
103− onClicked: pinentryField.text = pinentryField.text.substring(0, pinentryField.text.length-1)
166+ PinPadButton {
167+ objectName: "pinPadButtonErase"
168+ width: root.padWidth / 3
169+ height: root.padHeight / 4
170+ iconName: "erase"
171+ onClicked: pinentryField.text = pinentryField.text.substring(0, pinentryField.text.length-1)
172+ }
104173 }
105174 }
106175
Greeter/PinPadButton.qml+5−16
@@ -17,28 +17,20 @@
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
1919
20−UbuntuShape {
20+Item {
2121 id: root
22− width: units.gu(10)
23− height: units.gu(7)
24− radius: "medium"
2522
2623 property alias text: label.text
2724 property alias iconName: icon.name
2825
2926 signal clicked()
3027
31− Behavior on color {
32− ColorAnimation { duration: 100 }
33− }
34−
3528 Label {
3629 id: label
3730 anchors.centerIn: parent
38− color: "white"
39− fontSize: "x-large"
40− font.weight: Font.Light
41− opacity: 0.9
31+ color: "#f3f3e7"
32+ fontSize: "large"
33+ font.weight: Font.DemiBold
4234 }
4335
4436 Icon {
@@ -46,14 +38,11 @@ UbuntuShape {
4638 height: units.gu(3)
4739 width: height
4840 anchors.centerIn: parent
49− color: "white"
50− opacity: 0.9
41+ color: "#f3f3e7"
5142 }
5243
5344 MouseArea {
5445 anchors.fill: parent
5546 onClicked: root.clicked()
56− onPressed: root.color = Qt.rgba(0, 0, 0, 0.3)
57− onReleased: root.color = Qt.rgba(0, 0, 0, 0)
5847 }
5948}
Panel/Indicators/client/IndicatorsClient.qml+8−9
@@ -27,16 +27,15 @@ Rectangle {
2727
2828 PageStack {
2929 id: pages
30−
3130 anchors.fill: parent
32− Component.onCompleted: root.reset()
33− }
31+ Component.onCompleted: reset()
3432
35− function reset() {
36− pages.clear();
37− var component = Qt.createComponent("IndicatorsList.qml");
38− var page = component.createObject(pages);
39− console.log(component.errorString());
40− pages.push(page);
33+ function reset() {
34+ clear();
35+ var component = Qt.createComponent("IndicatorsList.qml");
36+ var page = component.createObject(pages);
37+ console.log(component.errorString());
38+ push(page);
39+ }
4140 }
4241}
Panel/Indicators/client/IndicatorsPage.qml+57−12
@@ -15,35 +15,80 @@
1515 *
1616 * Authors:
1717 * Renato Araujo Oliveira Filho <renato@canonical.com>
18+ * Nick Dedekind <nick.dedekind@canonical.com>
1819 */
1920
2021import QtQuick 2.0
2122import Ubuntu.Components 0.1
23+import Ubuntu.Components.ListItems 0.1 as ListItem
2224
2325Page {
24− id: _page
26+ id: page
2527
2628 title: indicatorProperties && indicatorProperties.title ? indicatorProperties.title : ""
2729 property variant indicatorProperties
28− property alias pageSource : page_loader.source
30+ property string pageSource : pageLoader.source
2931
3032 anchors.fill: parent
3133
34+ ListItem.Standard {
35+ id: visualCheckItem
36+ text: "Enable Visual Representation"
37+ control: Switch {
38+ id: visualCheck
39+ checked: true
40+ }
41+ }
42+
3243 Loader {
33− id: page_loader
34− objectName: "page_loader"
44+ id: pageLoader
45+ objectName: "pageLoader"
3546
36− anchors.fill: parent
47+ anchors {
48+ top: visualCheckItem.bottom
49+ left: parent.left
50+ right: parent.right
51+ bottom: buttons.top
52+ topMargin: units.gu(2)
53+ bottomMargin: units.gu(2)
54+ }
55+ source : visualCheck.checked ? page.pageSource : "IndicatorsTree.qml"
3756
38− onStatusChanged: {
39− if (status == Loader.Ready) {
40− for(var pName in indicatorProperties) {
41− if (item.hasOwnProperty(pName)) {
42− item[pName] = indicatorProperties[pName];
43− }
57+ onLoaded: {
58+ for(var pName in indicatorProperties) {
59+ if (item.hasOwnProperty(pName)) {
60+ item[pName] = indicatorProperties[pName];
4461 }
45− item.start();
4662 }
63+ item.start();
64+ }
65+ }
66+
67+ Item {
68+ id: buttons
69+ anchors {
70+ left: parent.left
71+ right: parent.right
72+ bottom: parent.bottom
73+ margins: units.gu(1)
74+ }
75+ height: childrenRect.height
76+
77+ Button {
78+ anchors {
79+ left: parent.left
80+ }
81+ text: "Back"
82+ onClicked: page.pageStack.reset()
83+ }
84+ Button {
85+ id: refresh
86+ visible: !visualCheck.checked
87+ anchors {
88+ right: parent.right
89+ }
90+ text: "Refresh"
91+ onClicked: pageLoader.item.refresh()
4792 }
4893 }
4994}
Panel/Indicators/client/IndicatorsTree.qmlnew file+62
@@ -0,0 +1,62 @@
1+/*
2+ * Copyright 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 Lesser 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 Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Authors:
17+ * Nick Dedekind <nick.dededkind@canonical.com>
18+ */
19+
20+import QtQuick 2.0
21+import Ubuntu.Components 0.1
22+import Unity.Indicators 0.1 as Indicators
23+import QMenuModel 0.1
24+import Ubuntu.Components.ListItems 0.1 as ListItem
25+
26+Page {
27+ id: page
28+ anchors.fill: parent
29+
30+ property alias busType: menuModel.busType
31+ property alias busName: menuModel.busName
32+ property string actionsObjectPath
33+ property var menuObjectPaths: undefined
34+ readonly property string device: "phone"
35+
36+ property string deviceMenuObjectPath: menuObjectPaths.hasOwnProperty(device) ? menuObjectPaths[device] : ""
37+
38+ function start() {
39+ menuModel.start();
40+ }
41+
42+ QDBusMenuModel {
43+ id: menuModel
44+ objectPath: page.deviceMenuObjectPath
45+ }
46+
47+ Indicators.ModelPrinter {
48+ id: printer
49+ model: menuModel
50+ }
51+
52+ Flickable {
53+ anchors.fill: parent
54+ contentHeight: all_data.height
55+ clip:true
56+ Text {
57+ id: all_data
58+ color: "white"
59+ text: printer.text
60+ }
61+ }
62+}
Shell.qml+68−32
@@ -15,10 +15,12 @@
1515 */
1616
1717import QtQuick 2.0
18+import GSettings 1.0
1819import Ubuntu.Application 0.1
1920import Ubuntu.Components 0.1
2021import Ubuntu.Gestures 0.1
2122import LightDM 0.1 as LightDM
23+import Powerd 0.1
2224import "Dash"
2325import "Greeter"
2426import "Launcher"
@@ -40,8 +42,8 @@ FocusScope {
4042 height: tablet ? units.gu(100) : applicationArguments.hasGeometry() ? applicationArguments.height() : units.gu(71)
4143
4244 property real edgeSize: units.gu(2)
43− property url default_background: shell.width >= units.gu(60) ? "graphics/tablet_background.jpg" : "graphics/phone_background.jpg"
44− property url background: default_background
45+ property url defaultBackground: shell.width >= units.gu(60) ? "graphics/tablet_background.jpg" : "graphics/phone_background.jpg"
46+ property url background: backgroundSettings.pictureUri
4547 readonly property real panelHeight: panel.panelHeight
4648
4749 property bool dashShown: dash.shown
@@ -114,6 +116,11 @@ FocusScope {
114116 }
115117 }
116118
119+ GSettings {
120+ id: backgroundSettings
121+ schema.id: "org.gnome.desktop.background"
122+ }
123+
117124 VolumeControl {
118125 id: volumeControl
119126 }
@@ -121,12 +128,6 @@ FocusScope {
121128 Keys.onVolumeUpPressed: volumeControl.volumeUp()
122129 Keys.onVolumeDownPressed: volumeControl.volumeDown()
123130
124− Keys.onReleased: {
125− if (event.key == Qt.Key_PowerOff) {
126− greeter.show()
127− }
128− }
129−
130131 Item {
131132 id: underlay
132133 objectName: "underlay"
@@ -144,12 +145,16 @@ FocusScope {
144145 // through the translucent parts of the shell surface.
145146 visible: !fullyCovered && !applicationSurfaceShouldBeSeen
146147
147− Image {
148+ CrossFadeImage {
148149 id: backgroundImage
150+ objectName: "backgroundImage"
149151 source: shell.background
150− sourceSize.width: parent.width
151− sourceSize.height: parent.height
152152 anchors.fill: parent
153+ onStatusChanged: {
154+ if (status == Image.Error) {
155+ backgroundSettings.pictureUri = shell.defaultBackground
156+ }
157+ }
153158 }
154159
155160 Rectangle {
@@ -194,7 +199,6 @@ FocusScope {
194199 }
195200 }
196201
197−
198202 Item {
199203 id: stagesOuterContainer
200204
@@ -259,7 +263,6 @@ FocusScope {
259263 ignoreUnknownSignals: true
260264 }
261265
262−
263266 Stage {
264267 id: mainStage
265268
@@ -420,9 +423,6 @@ FocusScope {
420423
421424 dragHandleWidth: shell.edgeSize
422425
423− property var previousMainApp: null
424− property var previousSideApp: null
425−
426426 onShownChanged: {
427427 if (shown) {
428428 lockscreen.reset();
@@ -432,27 +432,13 @@ FocusScope {
432432 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
433433 }
434434 greeter.forceActiveFocus();
435− // FIXME: *FocusedApplication are not updated when unfocused, hence the need to check whether
436− // the stage was actually shown
437− if (mainStage.fullyShown) greeter.previousMainApp = applicationManager.mainStageFocusedApplication;
438− if (sideStage.fullyShown) greeter.previousSideApp = applicationManager.sideStageFocusedApplication;
439− applicationManager.unfocusCurrentApplication();
440− } else {
441− if (greeter.previousMainApp) {
442− applicationManager.focusApplication(greeter.previousMainApp);
443− greeter.previousMainApp = null;
444− }
445− if (greeter.previousSideApp) {
446− applicationManager.focusApplication(greeter.previousSideApp);
447− greeter.previousSideApp = null;
448− }
449435 }
450436 }
451437
452438 onUnlocked: greeter.hide()
453439 onSelected: {
454440 var bgPath = greeter.model.data(uid, LightDM.UserRoles.BackgroundPathRole)
455− shell.background = bgPath ? bgPath : default_background
441+ shell.background = bgPath ? bgPath : defaultBackground
456442 }
457443
458444 onLeftTeaserPressedChanged: {
@@ -467,6 +453,42 @@ FocusScope {
467453 blockInput: greeter.shown || lockscreen.shown
468454 }
469455
456+ Connections {
457+ id: powerConnection
458+ target: Powerd
459+
460+ property var previousMainApp: null
461+ property var previousSideApp: null
462+
463+ function setFocused(focused) {
464+ if (!focused) {
465+ // FIXME: *FocusedApplication are not updated when unfocused, hence the need to check whether
466+ // the stage was actually shown
467+ if (mainStage.fullyShown) powerConnection.previousMainApp = applicationManager.mainStageFocusedApplication;
468+ if (sideStage.fullyShown) powerConnection.previousSideApp = applicationManager.sideStageFocusedApplication;
469+ applicationManager.unfocusCurrentApplication();
470+ } else {
471+ if (powerConnection.previousMainApp) {
472+ applicationManager.focusApplication(powerConnection.previousMainApp);
473+ powerConnection.previousMainApp = null;
474+ }
475+ if (powerConnection.previousSideApp) {
476+ applicationManager.focusApplication(powerConnection.previousSideApp);
477+ powerConnection.previousSideApp = null;
478+ }
479+ }
480+ }
481+
482+ onPowerStateChange: {
483+ if (state == 0) { // suspend
484+ powerConnection.setFocused(false);
485+ greeter.show();
486+ } else if (state == 1) { // active
487+ powerConnection.setFocused(true);
488+ }
489+ }
490+ }
491+
470492 Item {
471493 id: overlay
472494
@@ -552,7 +574,7 @@ FocusScope {
552574 anchors.bottom: parent.bottom
553575 width: parent.width
554576 dragAreaWidth: shell.edgeSize
555− available: !greeter.locked
577+ available: !greeter.shown || greeter.narrowMode
556578 onDashItemSelected: {
557579 greeter.hide()
558580 // Animate if moving between application and dash
@@ -647,4 +669,18 @@ FocusScope {
647669
648670 enabled: shell.applicationManager && shell.applicationManager.keyboardVisible
649671 }
672+
673+ Label {
674+ anchors.fill: parent
675+ visible: applicationManager.fake
676+ text: "EARLY ALPHA\nNOT READY FOR USE"
677+ color: "lightgrey"
678+ opacity: 0.2
679+ font.weight: Font.Black
680+ horizontalAlignment: Text.AlignHCenter
681+ verticalAlignment: Text.AlignVCenter
682+ fontSizeMode: Text.Fit
683+ font.pixelSize: height/2
684+ rotation: -45
685+ }
650686}
debian/changelog+48
@@ -1,3 +1,51 @@
1+unity8 (7.81.3+13.10.20130802-0ubuntu1) saucy; urgency=low
2+
3+ [ Michael Terry ]
4+ * Make hud autopilot tests more reliable by fixing how it calculates
5+ relative coordinates.
6+
7+ [ Albert Astals ]
8+ * Only update the "section" if we are not culling the item If the item
9+ is not shown we should not care about its section.
10+
11+ [ Ubuntu daily release ]
12+ * Automatic snapshot from revision 155
13+
14+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 02 Aug 2013 02:40:11 +0000
15+
16+unity8 (7.81.3+13.10.20130801.1-0ubuntu1) saucy; urgency=low
17+
18+ [ Michał Sawicz ]
19+ * Add a disclaimer for the fake applications plugin.
20+
21+ [ Nick Dedekind ]
22+ * Removed animations from fake indicator pages.
23+
24+ [ Ubuntu daily release ]
25+ * Automatic snapshot from revision 152
26+
27+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 01 Aug 2013 14:30:40 +0000
28+
29+unity8 (7.81.3+13.10.20130801ubuntu.unity.next-0ubuntu1) saucy; urgency=low
30+
31+ [ Michael Zanetti ]
32+ * implemented new Lockscreen design.
33+
34+ [ Michał Sawicz ]
35+ * Fix mock VideoPreview to use the string categoryId as well.
36+
37+ [ Nick Dedekind ]
38+ * Added a text tree representation of the qmenumodel to the
39+ indicators-client application.
40+
41+ [ Albert Astals ]
42+ * Don't need deelistmodel here.
43+
44+ [ Ubuntu daily release ]
45+ * Automatic snapshot from revision 149 (ubuntu-unity/next)
46+
47+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 01 Aug 2013 02:32:03 +0000
48+
149unity8 (7.81.3+13.10.20130730ubuntu.unity.next-0ubuntu1) saucy; urgency=low
250
351 [ Michał Sawicz ]
debian/control+3−1
@@ -56,8 +56,10 @@ Description: Indicators client test application
5656
5757Package: unity8
5858Architecture: any
59−Depends: qmenumodel-qml,
59+Depends: gsettings-desktop-schemas,
60+ qmenumodel-qml,
6061 qtdeclarative5-dee-plugin,
62+ qtdeclarative5-gsettings1.0,
6163 qtdeclarative5-ubuntu-ui-toolkit-plugin,
6264 qtdeclarative5-unity-notifications-plugin | unity-notifications-impl,
6365 qtdeclarative5-xmllistmodel-plugin,
debian/unity8-private.install+1
@@ -1,6 +1,7 @@
11usr/lib/*/unity8/qml/HudClient
22usr/lib/*/unity8/qml/LightDM
33usr/lib/*/unity8/qml/ListViewWithPageHeader
4+usr/lib/*/unity8/qml/Powerd
45usr/lib/*/unity8/qml/Ubuntu
56usr/lib/*/unity8/qml/Unity
67usr/lib/*/unity8/qml/Utils
plugins/CMakeLists.txt+1
@@ -4,3 +4,4 @@ add_subdirectory(Unity)
44add_subdirectory(HudClient)
55add_subdirectory(LightDM)
66add_subdirectory(ListViewWithPageHeader)
7+add_subdirectory(Powerd)
plugins/ListViewWithPageHeader/listviewwithpageheader.cpp+26−8
@@ -280,7 +280,7 @@ void ListViewWithPageHeader::setSectionDelegate(QQmlComponent *delegate)
280280
281281 m_sectionDelegate = delegate;
282282
283− m_topSectionItem = getSectionItem(QString());
283+ m_topSectionItem = getSectionItem(-1, QString());
284284 m_topSectionItem->setZ(3);
285285 QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
286286
@@ -599,16 +599,17 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(int modelIndex, bool alreadyI
599599 }
600600 }
601601
602− return getSectionItem(section);
602+ return getSectionItem(modelIndex, section);
603603}
604604
605−QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText)
605+QQuickItem *ListViewWithPageHeader::getSectionItem(int modelIndex, const QString &sectionText)
606606{
607607 QQuickItem *sectionItem = nullptr;
608608
609609 QQmlContext *creationContext = m_sectionDelegate->creationContext();
610610 QQmlContext *context = new QQmlContext(creationContext ? creationContext : qmlContext(this));
611611 context->setContextProperty(QLatin1String("section"), sectionText);
612+ context->setContextProperty(QLatin1String("delegateIndex"), modelIndex);
612613 QObject *nobj = m_sectionDelegate->beginCreate(context);
613614 if (nobj) {
614615 QQml_setParent_noEvent(context, nobj);
@@ -932,6 +933,14 @@ void ListViewWithPageHeader::onModelUpdated(const QQmlChangeSet &changeSet, bool
932933 adjustMinYExtent();
933934 }
934935
936+ for (int i = 0; i < m_visibleItems.count(); ++i) {
937+ ListItem *item = m_visibleItems[i];
938+ if (item->m_sectionItem) {
939+ QQmlContext *context = QQmlEngine::contextForObject(item->m_sectionItem)->parentContext();
940+ context->setContextProperty(QLatin1String("delegateIndex"), m_firstVisibleIndex + i);
941+ }
942+ }
943+
935944 layout();
936945 polish();
937946 m_contentHeightDirty = true;
@@ -1037,11 +1046,6 @@ void ListViewWithPageHeader::layout()
10371046 if (!cull && firstReallyVisibleItem == -1) {
10381047 firstReallyVisibleItem = modelIndex;
10391048 if (m_topSectionItem) {
1040− // Update the top sticky section header
1041− const QString section = m_delegateModel->stringValue(modelIndex, m_sectionProperty);
1042− QQmlContext *context = QQmlEngine::contextForObject(m_topSectionItem)->parentContext();
1043− context->setContextProperty(QLatin1String("section"), section);
1044−
10451049 // Positing the top section sticky item is a two step process
10461050 // First we set it either we cull it (because it doesn't need to be sticked to the top)
10471051 // or stick it to the top
@@ -1058,8 +1062,22 @@ void ListViewWithPageHeader::layout()
10581062 QQuickItemPrivate::get(item->m_sectionItem)->setCulled(false);
10591063 }
10601064 } else {
1065+ // Update the top sticky section header
1066+ const QString section = m_delegateModel->stringValue(modelIndex, m_sectionProperty);
1067+ QQmlContext *context = QQmlEngine::contextForObject(m_topSectionItem)->parentContext();
1068+ context->setContextProperty(QLatin1String("section"), section);
1069+
10611070 QQuickItemPrivate::get(m_topSectionItem)->setCulled(false);
10621071 m_topSectionItem->setY(topSectionStickPos);
1072+ int delegateIndex = modelIndex;
1073+ // Look for the first index with this section text
1074+ while (delegateIndex > 0) {
1075+ const QString prevSection = m_delegateModel->stringValue(delegateIndex - 1, m_sectionProperty);
1076+ if (prevSection != section)
1077+ break;
1078+ delegateIndex--;
1079+ }
1080+ context->setContextProperty(QLatin1String("delegateIndex"), delegateIndex);
10631081 if (item->m_sectionItem) {
10641082 QQuickItemPrivate::get(item->m_sectionItem)->setCulled(true);
10651083 }
plugins/ListViewWithPageHeader/listviewwithpageheader.h+1−1
@@ -152,7 +152,7 @@ private:
152152 void reallyReleaseItem(ListItem *item);
153153 void updateWatchedRoles();
154154 QQuickItem *getSectionItem(int modelIndex, bool alreadyInserted);
155− QQuickItem *getSectionItem(const QString &sectionText);
155+ QQuickItem *getSectionItem(int modelIndex, const QString &sectionText);
156156
157157#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
158158 QQuickVisualDataModel *m_delegateModel;
plugins/Powerd/CMakeLists.txtnew file+13
@@ -0,0 +1,13 @@
1+include(Plugins)
2+
3+add_definitions(-DSM_BUSNAME=systemBus)
4+
5+add_library(Powerd-qml MODULE
6+ plugin.cpp
7+ Powerd.cpp
8+ )
9+
10+qt5_use_modules(Powerd-qml DBus Qml)
11+
12+export_qmlfiles(Powerd Powerd)
13+export_qmlplugin(Powerd 0.1 Powerd TARGETS Powerd-qml)
plugins/Powerd/Powerd.cppnew file+36
@@ -0,0 +1,36 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Author: Michael Terry <michael.terry@canonical.com>
17+ */
18+
19+#include "Powerd.h"
20+
21+Powerd::Powerd(QObject* parent)
22+ : QObject(parent),
23+ powerd(NULL)
24+{
25+ powerd = new QDBusInterface("com.canonical.powerd",
26+ "/com/canonical/powerd",
27+ "com.canonical.powerd",
28+ QDBusConnection::SM_BUSNAME(), this);
29+
30+ powerd->connection().connect("com.canonical.powerd",
31+ "/com/canonical/powerd",
32+ "com.canonical.powerd",
33+ "SysPowerStateChange",
34+ this,
35+ SIGNAL(powerStateChange(int)));
36+}
plugins/Powerd/Powerd.hnew file+40
@@ -0,0 +1,40 @@
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: Gerry Boland <gerry.boland@canonical.com>
17+ * Michael Terry <michael.terry@canonical.com>
18+ */
19+
20+#ifndef UNITY_POWERD_H
21+#define UNITY_POWERD_H
22+
23+#include <QtCore/QObject>
24+#include <QtDBus/QDBusInterface>
25+
26+class Powerd: public QObject
27+{
28+ Q_OBJECT
29+
30+public:
31+ explicit Powerd(QObject *parent = 0);
32+
33+Q_SIGNALS:
34+ void powerStateChange(int state);
35+
36+private:
37+ QDBusInterface *powerd;
38+};
39+
40+#endif
plugins/Powerd/plugin.cppnew file+36
@@ -0,0 +1,36 @@
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: Gerry Boland <gerry.boland@canonical.com>
17+ * Michael Terry <michael.terry@canonical.com>
18+ */
19+
20+#include "plugin.h"
21+#include "Powerd.h"
22+
23+#include <QtQml/QtQml>
24+
25+static QObject *powerd_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
26+{
27+ Q_UNUSED(engine)
28+ Q_UNUSED(scriptEngine)
29+ return new Powerd();
30+}
31+
32+void PowerdPlugin::registerTypes(const char *uri)
33+{
34+ Q_ASSERT(uri == QLatin1String("Powerd"));
35+ qmlRegisterSingletonType<Powerd>(uri, 0, 1, "Powerd", powerd_provider);
36+}
plugins/Powerd/plugin.hnew file+35
@@ -0,0 +1,35 @@
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: Gerry Boland <gerry.boland@canonical.com>
17+ * Michael Terry <michael.terry@canonical.com>
18+ */
19+
20+#ifndef POWER_PLUGIN_H
21+#define POWER_PLUGIN_H
22+
23+#include <QtQml/QQmlEngine>
24+#include <QtQml/QQmlExtensionPlugin>
25+
26+class PowerdPlugin : public QQmlExtensionPlugin
27+{
28+ Q_OBJECT
29+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
30+
31+public:
32+ void registerTypes(const char *uri);
33+};
34+
35+#endif
plugins/Powerd/qmldirnew file+3
@@ -0,0 +1,3 @@
1+module Powerd
2+plugin Powerd-qml
3+typeinfo plugin.qmltypes
plugins/Unity/Indicators/CMakeLists.txt+1
@@ -24,6 +24,7 @@ set(IndicatorsQML_SOURCES
2424 indicatorsmanager.cpp
2525 indicatorsmodel.cpp
2626 menucontentactivator.cpp
27+ modelprinter.cpp
2728 plugin.cpp
2829)
2930add_definitions(-DUNITYINDICATORS_LIBRARY)
plugins/Unity/Indicators/modelprinter.cppnew file+114
@@ -0,0 +1,114 @@
1+/*
2+ * Copyright 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 Lesser 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 Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser 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+// self
21+#include "modelprinter.h"
22+
23+// Qt
24+#include <QTextStream>
25+
26+ModelPrinter::ModelPrinter(QObject *parent)
27+ : QObject(parent)
28+ , m_model(NULL)
29+{
30+}
31+
32+void ModelPrinter::setSourceModel(QAbstractItemModel * sourceModel)
33+{
34+ if (m_model != NULL) {
35+ disconnect(m_model);
36+ }
37+ if (m_model != sourceModel) {
38+ m_model = sourceModel;
39+ Q_EMIT modelChanged();
40+ Q_EMIT textChanged();
41+ }
42+ if (m_model != NULL) {
43+ connect(m_model, SIGNAL(modelReset()), this, SIGNAL(textChanged()));
44+ connect(m_model, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SIGNAL(textChanged()));
45+ connect(m_model, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SIGNAL(textChanged()));
46+ }
47+}
48+
49+QAbstractItemModel* ModelPrinter::sourceModel() const
50+{
51+ return m_model;
52+}
53+
54+QString ModelPrinter::text(const QModelIndex& index) const
55+{
56+ return recurseString(index, 0);
57+}
58+
59+QString tabify(int level) { QString str;
60+ for (int i = 0; i < level; i++) {
61+ str += " ";
62+ }
63+ return str;
64+}
65+
66+QString ModelPrinter::recurseString(const QModelIndex& index, int level) const
67+{
68+ if (!m_model)
69+ return "";
70+
71+ QString str;
72+ QTextStream stream(&str);
73+
74+ QHash<int, QByteArray> roleNames = m_model->roleNames();
75+ QList<int> roles = roleNames.keys();
76+ qSort(roles);
77+ Q_FOREACH(int role, roles) {
78+ QVariant vData = m_model->data(index, role);
79+ if (vData.canConvert(QMetaType::QVariantMap)) {
80+ QMapIterator<QString, QVariant> iter(vData.toMap());
81+ while (iter.hasNext()) {
82+ iter.next();
83+ stream << tabify(level)
84+ << roleNames[role]
85+ << "."
86+ << iter.key()
87+ << ": "
88+ << iter.value().toString()
89+ << endl;
90+ }
91+ }
92+ else {
93+ stream << tabify(level)
94+ << roleNames[role]
95+ << ": "
96+ << vData.toString()
97+ << endl;
98+ }
99+ }
100+
101+ int rowCount = m_model->rowCount(index);
102+ stream << tabify(level)
103+ << "child count"
104+ << ": "
105+ << rowCount
106+ << endl
107+ << endl;
108+
109+ for (int i = 0; i < rowCount; i++) {
110+ QModelIndex child = m_model->index(i, 0, index);
111+ str += recurseString(child, level+1);
112+ }
113+ return str;
114+}
plugins/Unity/Indicators/modelprinter.hnew file+50
@@ -0,0 +1,50 @@
1+/*
2+ * Copyright 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 Lesser 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 Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser 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 MODELPRINTER_H
21+#define MODELPRINTER_H
22+
23+#include <QSortFilterProxyModel>
24+
25+// This class acts as a namespace only, with the addition that its enums
26+// are registered to be exposed on the QML side.
27+class ModelPrinter : public QObject
28+{
29+ Q_OBJECT
30+
31+ Q_PROPERTY(QAbstractItemModel* model READ sourceModel WRITE setSourceModel NOTIFY modelChanged)
32+ Q_PROPERTY(QString text READ text NOTIFY textChanged)
33+public:
34+ ModelPrinter(QObject* parent=0);
35+
36+ void setSourceModel(QAbstractItemModel* sourceModel);
37+ QAbstractItemModel* sourceModel() const;
38+
39+ Q_INVOKABLE QString text(const QModelIndex& index = QModelIndex()) const;
40+
41+Q_SIGNALS:
42+ void modelChanged();
43+ void textChanged();
44+
45+private:
46+ QString recurseString(const QModelIndex& index, int level) const;
47+ QAbstractItemModel* m_model;
48+};
49+
50+#endif // MODELPRINTER_H
plugins/Unity/Indicators/plugin.cpp+2
@@ -28,6 +28,7 @@
2828#include "indicatorsmodel.h"
2929#include "indicators.h"
3030#include "menucontentactivator.h"
31+#include "modelprinter.h"
3132
3233void IndicatorsPlugin::registerTypes(const char *uri)
3334{
@@ -36,6 +37,7 @@ void IndicatorsPlugin::registerTypes(const char *uri)
3637 qmlRegisterType<IndicatorsManager>(uri, 0, 1, "IndicatorsManager");
3738 qmlRegisterType<FlatMenuProxyModel>(uri, 0, 1, "FlatMenuProxyModel");
3839 qmlRegisterType<IndicatorsModel>(uri, 0, 1, "IndicatorsModel");
40+ qmlRegisterType<ModelPrinter>(uri, 0, 1, "ModelPrinter");
3941 qmlRegisterType<MenuContentActivator>(uri, 0, 1, "MenuContentActivator");
4042
4143 qmlRegisterUncreatableType<MenuContentState>(uri, 0, 1, "MenuContentState", "Can't create MenuContentState class");
plugins/Unity/scope.h−3
@@ -29,9 +29,6 @@
2929#include <UnityCore/Scope.h>
3030#include <UnityCore/Results.h>
3131
32−// dee-qt
33−#include "deelistmodel.h"
34−
3532#include "categories.h"
3633
3734class Preview;
po/ar.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/az.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/bg.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"MIME-Version: 1.0\n"
1616"Content-Type: text/plain; charset=UTF-8\n"
1717"Content-Transfer-Encoding: 8bit\n"
18−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
19−"X-Generator: Launchpad (build 16696)\n"
18+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
19+"X-Generator: Launchpad (build 16718)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
po/ca.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/de.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/el.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/en_AU.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/en_GB.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/eo.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/es.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/fi.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/fo.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/fr.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/gl.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/he.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/hr.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/hu.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/hy.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/id.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/it.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/ja.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/kn.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/ko.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/ky.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/lv.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/my.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/nb.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/nl.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/pl.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/pt_BR.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/ro.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/ru.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/si.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/sl.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/sr.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/sv.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/te.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/tr.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/ug.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/uk.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-22 06:19+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/zh_CN.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
po/zh_TW.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-07-17 07:49+0000\n"
18−"X-Generator: Launchpad (build 16696)\n"
17+"X-Launchpad-Export-Date: 2013-07-31 06:28+0000\n"
18+"X-Generator: Launchpad (build 16718)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
tests/autopilot/unity8/indicators_client/tests/test_battery.py+1−1
@@ -26,7 +26,7 @@ class TestDisplayMenus(IndicatorsTestCase):
2626 self.pointing_device.move_to_object(self.main_window.get_battery_menu())
2727 self.pointing_device.click()
2828
29− fn_loader = lambda: self.app.select_single("IndicatorsPage/QQuickLoader", objectName="page_loader");
29+ fn_loader = lambda: self.app.select_single("IndicatorsPage/QQuickLoader", objectName="pageLoader");
3030 self.assertThat(fn_loader, Eventually(NotEquals(None)));
3131 page_loader = fn_loader();
3232 self.assertThat(page_loader.progress, Eventually(Equals(1.0)))
tests/autopilot/unity8/shell/emulators/greeter.py+4−1
@@ -25,7 +25,7 @@ class Greeter(UnityEmulatorBase):
2525
2626 """An emulator that understands the greeter screen."""
2727
28− def unlock(self):
28+ def swipe(self):
2929 """Swipe the greeter screen away."""
3030 self.created.wait_for(True)
3131 touch = Touch.create()
@@ -38,3 +38,6 @@ class Greeter(UnityEmulatorBase):
3838 touch.drag(start_x, start_y, stop_x, stop_y)
3939
4040 self.created.wait_for(False)
41+
42+ def get_prompt(self):
43+ return self.select_single("TextField", objectName="passwordInput")
tests/autopilot/unity8/shell/emulators/hud.py+4−7
@@ -38,13 +38,10 @@ class Hud(UnityEmulatorBase):
3838 window = self.get_root_instance().select_single('QQuickView')
3939 hud_show_button = window.select_single("HudButton")
4040
41− start_x = int(window.x + (window.width / 2))
42− end_x = start_x
43− start_y = window.y + window.height
44− end_y = int(hud_show_button.y + (hud_show_button.height/2))
41+ swipe_coords = self.get_button_swipe_coords(window, hud_show_button)
4542
46− touch.press(start_x, start_y)
47− touch._finger_move(end_x, end_y)
43+ touch.press(swipe_coords.start_x, swipe_coords.start_y)
44+ touch._finger_move(swipe_coords.end_x, swipe_coords.end_y)
4845 try:
4946 hud_show_button.opacity.wait_for(1.0)
5047 touch.release()
@@ -78,6 +75,6 @@ class Hud(UnityEmulatorBase):
7875 start_x = int(main_view.x + (main_view.width / 2))
7976 end_x = start_x
8077 start_y = main_view.y + (main_view.height - 3)
81− end_y = int(hud_show_button.y + (hud_show_button.height/2))
78+ end_y = main_view.y + int(hud_show_button.y + (hud_show_button.height/2))
8279
8380 return SwipeCoords(start_x, end_x, start_y, end_y)
tests/autopilot/unity8/shell/emulators/main_window.py+1−1
@@ -89,4 +89,4 @@ class MainWindow(object):
8989 return self.app.select_single("Lockscreen")
9090
9191 def get_pinentryField(self):
92− return self.app.select_single("TextField", objectName="pinentryField")
92+ return self.app.select_single(objectName="pinentryField")
tests/autopilot/unity8/shell/tests/test_hud.py+5−5
@@ -37,7 +37,7 @@ class TestHud(UnityTestCase):
3737
3838 """
3939 self.launch_unity()
40− self.main_window.get_greeter().unlock()
40+ self.main_window.get_greeter().swipe()
4141 window = self.main_window.get_qml_view()
4242 hud_show_button = self.main_window.get_hud_show_button()
4343 hud = self.main_window.get_hud()
@@ -58,7 +58,7 @@ class TestHud(UnityTestCase):
5858
5959 """
6060 self.launch_unity()
61− self.main_window.get_greeter().unlock()
61+ self.main_window.get_greeter().swipe()
6262 window = self.main_window.get_qml_view()
6363 hud_show_button = self.main_window.get_hud_show_button()
6464 hud = self.main_window.get_hud()
@@ -81,7 +81,7 @@ class TestHud(UnityTestCase):
8181 def test_hide_hud_click(self):
8282 """Tapping the close button of the Hud must dismiss it."""
8383 self.launch_unity()
84− self.main_window.get_greeter().unlock()
84+ self.main_window.get_greeter().swipe()
8585 hud = self.main_window.get_hud()
8686
8787 self._launch_test_app_from_app_screen()
@@ -97,7 +97,7 @@ class TestHud(UnityTestCase):
9797
9898 """
9999 self.launch_unity()
100− self.main_window.get_greeter().unlock()
100+ self.main_window.get_greeter().swipe()
101101 hud = self.main_window.get_hud()
102102 window = self.main_window.get_qml_view()
103103
@@ -114,7 +114,7 @@ class TestHud(UnityTestCase):
114114 def test_launcher_hides_hud(self):
115115 """Opening the Launcher while the Hud is active must close the Hud."""
116116 self.launch_unity()
117− self.main_window.get_greeter().unlock()
117+ self.main_window.get_greeter().swipe()
118118 hud = self.main_window.get_hud()
119119 launcher = self.main_window.get_launcher()
120120
tests/autopilot/unity8/shell/tests/test_lock_screen.py+58−26
@@ -40,52 +40,68 @@ class TestLockscreen(UnityTestCase):
4040 """Must be able to unlock the PIN entry lock screen."""
4141 self.launch_unity()
4242 greeter = self.main_window.get_greeter()
43− greeter.unlock()
4443
45− lockscreen = self._wait_for_lockscreen()
46− self._enter_pincode("1234")
47−
48− self.assertThat(lockscreen.shown, Eventually(Equals(False)))
44+ if greeter.narrowMode:
45+ greeter.swipe()
46+ lockscreen = self._wait_for_lockscreen()
47+ self._enter_pincode("1234")
48+ self.assertThat(lockscreen.shown, Eventually(Equals(False)))
49+ else:
50+ self._enter_prompt_passphrase("1234")
51+ self.assertThat(greeter.shown, Eventually(Equals(False)))
4952
5053 @with_lightdm_mock("single-passphrase")
5154 def test_can_unlock_passphrase_screen(self):
5255 """Must be able to unlock the passphrase entry screen."""
5356 self.launch_unity()
5457 greeter = self.main_window.get_greeter()
55− greeter.unlock()
56−
57− lockscreen = self._wait_for_lockscreen()
58− self._enter_passphrase("password")
5958
60− self.assertThat(lockscreen.shown, Eventually(Equals(False)))
59+ if greeter.narrowMode:
60+ greeter.swipe()
61+ lockscreen = self._wait_for_lockscreen()
62+ self._enter_pin_passphrase("password")
63+ self.assertThat(lockscreen.shown, Eventually(Equals(False)))
64+ else:
65+ self._enter_prompt_passphrase("password")
66+ self.assertThat(greeter.shown, Eventually(Equals(False)))
6167
6268 @with_lightdm_mock("single-pin")
6369 def test_pin_screen_wrong_code(self):
6470 """Entering the wrong pin code must not dismiss the lock screen."""
6571 self.launch_unity()
6672 greeter = self.main_window.get_greeter()
67− greeter.unlock()
68−
69− lockscreen = self._wait_for_lockscreen()
70− self._enter_pincode("4321")
7173
72− pinentryField = self.main_window.get_pinentryField()
73− self.assertThat(pinentryField.text, Eventually(Equals("")))
74− self.assertThat(lockscreen.shown, Eventually(Equals(True)))
74+ if greeter.narrowMode:
75+ greeter.swipe()
76+ lockscreen = self._wait_for_lockscreen()
77+ self._enter_pincode("4321")
78+ pinentryField = self.main_window.get_pinentryField()
79+ self.assertThat(pinentryField.text, Eventually(Equals("")))
80+ self.assertThat(lockscreen.shown, Eventually(Equals(True)))
81+ else:
82+ self._enter_prompt_passphrase("4231")
83+ prompt = self.main_window.get_greeter().get_prompt()
84+ self.assertThat(prompt.text, Eventually(Equals("")))
85+ self.assertThat(greeter.shown, Eventually(Equals(True)))
7586
7687 @with_lightdm_mock("single-passphrase")
7788 def test_passphrase_screen_wrong_password(self):
7889 """Entering the wrong password must not dismiss the lock screen."""
7990 self.launch_unity()
8091 greeter = self.main_window.get_greeter()
81− greeter.unlock()
8292
83− lockscreen = self._wait_for_lockscreen()
84− self._enter_passphrase("foobar")
85−
86− pinentryField = self.main_window.get_pinentryField()
87− self.assertThat(pinentryField.text, Eventually(Equals("")))
88− self.assertThat(lockscreen.shown, Eventually(Equals(True)))
93+ if greeter.narrowMode:
94+ greeter.swipe()
95+ lockscreen = self._wait_for_lockscreen()
96+ self._enter_pin_passphrase("foobar")
97+ pinentryField = self.main_window.get_pinentryField()
98+ self.assertThat(pinentryField.text, Eventually(Equals("")))
99+ self.assertThat(lockscreen.shown, Eventually(Equals(True)))
100+ else:
101+ self._enter_prompt_passphrase("foobar")
102+ prompt = self.main_window.get_greeter().get_prompt()
103+ self.assertThat(prompt.text, Eventually(Equals("")))
104+ self.assertThat(greeter.shown, Eventually(Equals(True)))
89105
90106 def _wait_for_lockscreen(self):
91107 """Wait for the lock screen to load, and return it."""
@@ -114,9 +130,9 @@ class TestLockscreen(UnityTestCase):
114130 )
115131 self.touch.tap_object(self.main_window.get_pinPadButton(int(num)))
116132
117− def _enter_passphrase(self, passphrase):
133+ def _enter_pin_passphrase(self, passphrase):
118134 """Enter the password specified in 'passphrase' into the password entry
119− field.
135+ field of the pin lock screen.
120136
121137 :param passphrase: The string you want to enter.
122138 :raises: TypeError if passphrase is not a string.
@@ -129,3 +145,19 @@ class TestLockscreen(UnityTestCase):
129145 self.touch.tap_object(pinentryField)
130146 self.keyboard.type(passphrase)
131147 self.keyboard.type("\n")
148+
149+ def _enter_prompt_passphrase(self, passphrase):
150+ """Enter the password specified in 'passphrase' into the password entry
151+ field of the main user list's prompt.
152+
153+ :param passphrase: The string you want to enter.
154+ :raises: TypeError if passphrase is not a string.
155+
156+ """
157+ if not isinstance(passphrase, basestring):
158+ raise TypeError("'passphrase' parameter must be a string.")
159+
160+ prompt = self.main_window.get_greeter().get_prompt()
161+ self.touch.tap_object(prompt)
162+ self.keyboard.type(passphrase)
163+ self.keyboard.type("\n")
tests/autopilot/unity8/shell/tests/test_notifications.py+10−10
@@ -120,7 +120,7 @@ class InteractiveNotificationBase(NotificationsBase):
120120 """Interactive notification must react upon click on itself."""
121121 self.launch_unity()
122122 greeter = self.main_window.get_greeter()
123− greeter.unlock()
123+ greeter.swipe()
124124
125125 notify_list = self._get_notifications_list()
126126
@@ -159,7 +159,7 @@ class InteractiveNotificationBase(NotificationsBase):
159159 """Rejecting a call should make notification expand and offer more options."""
160160 self.launch_unity()
161161 greeter = self.main_window.get_greeter()
162− greeter.unlock()
162+ greeter.swipe()
163163
164164 notify_list = self._get_notifications_list()
165165
@@ -335,7 +335,7 @@ class EphemeralNotificationsTests(NotificationsBase):
335335 """Notification must display the expected summary and body text."""
336336 self.launch_unity()
337337 greeter = self.main_window.get_greeter()
338− greeter.unlock()
338+ greeter.swipe()
339339
340340 notify_list = self._get_notifications_list()
341341
@@ -369,7 +369,7 @@ class EphemeralNotificationsTests(NotificationsBase):
369369 """Notification must display the expected summary and secondary icon."""
370370 self.launch_unity()
371371 greeter = self.main_window.get_greeter()
372− greeter.unlock()
372+ greeter.swipe()
373373
374374 notify_list = self._get_notifications_list()
375375
@@ -407,7 +407,7 @@ class EphemeralNotificationsTests(NotificationsBase):
407407 """Notifications must be displayed in order according to their urgency."""
408408 self.launch_unity()
409409 greeter = self.main_window.get_greeter()
410− greeter.unlock()
410+ greeter.swipe()
411411
412412 notify_list = self._get_notifications_list()
413413
@@ -498,7 +498,7 @@ class EphemeralNotificationsTests(NotificationsBase):
498498 """Notification must display the expected summary- and body-text."""
499499 self.launch_unity()
500500 greeter = self.main_window.get_greeter()
501− greeter.unlock()
501+ greeter.swipe()
502502
503503 notify_list = self._get_notifications_list()
504504
@@ -524,7 +524,7 @@ class EphemeralNotificationsTests(NotificationsBase):
524524 """Notification must display only the expected summary-text."""
525525 self.launch_unity()
526526 greeter = self.main_window.get_greeter()
527− greeter.unlock()
527+ greeter.swipe()
528528
529529 notify_list = self._get_notifications_list()
530530
@@ -543,7 +543,7 @@ class EphemeralNotificationsTests(NotificationsBase):
543543 """Notification must allow updating its contents while being displayed."""
544544 self.launch_unity()
545545 greeter = self.main_window.get_greeter()
546− greeter.unlock()
546+ greeter.swipe()
547547
548548 notify_list = self._get_notifications_list()
549549
@@ -582,7 +582,7 @@ class EphemeralNotificationsTests(NotificationsBase):
582582 """Notification must allow updating its contents and layout while being displayed."""
583583 self.launch_unity()
584584 greeter = self.main_window.get_greeter()
585− greeter.unlock()
585+ greeter.swipe()
586586
587587 notify_list = self._get_notifications_list()
588588
@@ -628,7 +628,7 @@ class EphemeralNotificationsTests(NotificationsBase):
628628 """Notification has to accumulate body-text using append-hint."""
629629 self.launch_unity()
630630 greeter = self.main_window.get_greeter()
631− greeter.unlock()
631+ greeter.swipe()
632632
633633 notify_list = self._get_notifications_list()
634634
tests/data/unity/backgrounds/blue.pngnew file

Binary file not shown.

tests/data/unity/backgrounds/red.pngnew file

Binary file not shown.

tests/mocks/CMakeLists.txt+1
@@ -1,3 +1,4 @@
1+add_subdirectory(GSettings)
12add_subdirectory(libusermetrics)
23add_subdirectory(LightDM)
34add_subdirectory(QMenuModel)
tests/mocks/GSettings/CMakeLists.txtnew file+31
@@ -0,0 +1,31 @@
1+set(CMAKE_AUTOMOC ON)
2+
3+include(FindPkgConfig)
4+find_package(Qt5Core REQUIRED)
5+find_package(Qt5Quick REQUIRED)
6+
7+include_directories(
8+ ${CMAKE_CURRENT_BINARY_DIR}
9+ ${Qt5Core_INCLUDE_DIRS}
10+ ${Qt5Quick_INCLUDE_DIRS}
11+)
12+
13+add_definitions(-DQT_NO_KEYWORDS)
14+
15+set(GSettingsQML_SOURCES
16+ fake_gsettings.cpp
17+ plugin.cpp
18+)
19+
20+add_library(FakeGSettingsQml MODULE ${GSettingsQML_SOURCES})
21+target_link_libraries(FakeGSettingsQml
22+ ${Qt5Core_LIBRARIES}
23+ ${Qt5Quick_LIBRARIES}
24+)
25+
26+qt5_use_modules(FakeGSettingsQml Qml)
27+
28+# copy qmldir file into build directory for shadow builds
29+file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/qmldir"
30+ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
31+ )
tests/mocks/GSettings/fake_gsettings.cppnew file+102
@@ -0,0 +1,102 @@
1+/*
2+ * Copyright 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 Lesser 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 Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "fake_gsettings.h"
18+
19+#include <QList>
20+
21+GSettingsControllerQml* GSettingsControllerQml::s_controllerInstance = 0;
22+
23+GSettingsControllerQml::GSettingsControllerQml() {
24+}
25+
26+GSettingsControllerQml::~GSettingsControllerQml() {
27+ s_controllerInstance = 0;
28+}
29+
30+GSettingsControllerQml* GSettingsControllerQml::instance() {
31+ if(!s_controllerInstance) {
32+ s_controllerInstance = new GSettingsControllerQml();
33+ }
34+ return s_controllerInstance;
35+}
36+
37+void GSettingsControllerQml::registerSettingsObject(GSettingsQml *obj) {
38+ m_registeredGSettings.append(obj);
39+}
40+
41+void GSettingsControllerQml::unRegisterSettingsObject(GSettingsQml *obj) {
42+ m_registeredGSettings.removeOne(obj);
43+}
44+
45+void GSettingsControllerQml::setPictureUri(const QString &str) {
46+ Q_FOREACH (GSettingsQml *obj, m_registeredGSettings) {
47+ obj->setPictureUri(str);
48+ }
49+}
50+
51+GSettingsSchemaQml::GSettingsSchemaQml(QObject *parent): QObject(parent) {
52+}
53+
54+QByteArray GSettingsSchemaQml::id() const {
55+ return m_id;
56+}
57+
58+void GSettingsSchemaQml::setId(const QByteArray &id) {
59+ if (m_id.isEmpty()) {
60+ qWarning("GSettings.schema.id may only be set on construction");
61+ return;
62+ }
63+
64+ m_id = id;
65+}
66+
67+QByteArray GSettingsSchemaQml::path() const {
68+ return m_path;
69+}
70+
71+void GSettingsSchemaQml::setPath(const QByteArray &path) {
72+ if (m_path.isEmpty()) {
73+ qWarning("GSettings.schema.path may only be set on construction");
74+ return;
75+ }
76+
77+ m_path = path;
78+}
79+
80+GSettingsQml::GSettingsQml(QObject *parent): QObject(parent) {
81+ m_schema = new GSettingsSchemaQml(this);
82+ GSettingsControllerQml::instance()->registerSettingsObject(this);
83+}
84+
85+GSettingsQml::~GSettingsQml() {
86+ GSettingsControllerQml::instance()->unRegisterSettingsObject(this);
87+}
88+
89+GSettingsSchemaQml * GSettingsQml::schema() const {
90+ return m_schema;
91+}
92+
93+QString GSettingsQml::pictureUri() const {
94+ return m_pictureUri;
95+}
96+
97+void GSettingsQml::setPictureUri(const QString &str) {
98+ if (str != m_pictureUri) {
99+ m_pictureUri = str;
100+ Q_EMIT pictureUriChanged(m_pictureUri);
101+ }
102+}
tests/mocks/GSettings/fake_gsettings.hnew file+90
@@ -0,0 +1,90 @@
1+/*
2+ * Copyright 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 Lesser 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 Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef FAKE_GSETTINGS_H
18+#define FAKE_GSETTINGS_H
19+
20+#include <QList>
21+#include <QtQml>
22+
23+class GSettingsSchemaQml: public QObject
24+{
25+ Q_OBJECT
26+
27+ Q_PROPERTY(QByteArray id READ id WRITE setId)
28+
29+public:
30+ GSettingsSchemaQml(QObject *parent = NULL);
31+
32+ QByteArray id() const;
33+ void setId(const QByteArray &id);
34+
35+ QByteArray path() const;
36+ void setPath(const QByteArray &path);
37+
38+private:
39+ QByteArray m_id;
40+ QByteArray m_path;
41+};
42+
43+class GSettingsQml: public QObject
44+{
45+ Q_OBJECT
46+
47+ Q_PROPERTY(GSettingsSchemaQml* schema READ schema NOTIFY schemaChanged)
48+ Q_PROPERTY(QString pictureUri READ pictureUri WRITE setPictureUri NOTIFY pictureUriChanged)
49+
50+public:
51+ GSettingsQml(QObject *parent = NULL);
52+ ~GSettingsQml();
53+
54+ GSettingsSchemaQml * schema() const;
55+ QString pictureUri() const;
56+
57+ void setPictureUri(const QString &str);
58+
59+Q_SIGNALS:
60+ void schemaChanged();
61+ void pictureUriChanged(const QString&);
62+
63+private:
64+ GSettingsSchemaQml* m_schema;
65+
66+ QString m_pictureUri;
67+
68+ friend class GSettingsSchemaQml;
69+};
70+
71+class GSettingsControllerQml: public QObject
72+{
73+ Q_OBJECT
74+
75+public:
76+ static GSettingsControllerQml* instance();
77+ ~GSettingsControllerQml();
78+
79+ void registerSettingsObject(GSettingsQml *obj);
80+ void unRegisterSettingsObject(GSettingsQml *obj);
81+ Q_INVOKABLE void setPictureUri(const QString &str);
82+
83+private:
84+ GSettingsControllerQml();
85+
86+ static GSettingsControllerQml* s_controllerInstance;
87+ QList<GSettingsQml *> m_registeredGSettings;
88+};
89+
90+#endif // FAKE_GSETTINGS_H
tests/mocks/GSettings/plugin.cppnew file+33
@@ -0,0 +1,33 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "plugin.h"
18+#include "fake_gsettings.h"
19+
20+#include <QtQml>
21+
22+static QObject* controllerProvider(QQmlEngine* /* engine */, QJSEngine* /* scriptEngine */)
23+{
24+ return GSettingsControllerQml::instance();
25+}
26+
27+void FakeGSettingsQmlPlugin::registerTypes(const char *uri)
28+{
29+ qmlRegisterSingletonType<GSettingsControllerQml>(uri, 1, 0, "GSettingsController", controllerProvider);
30+ qmlRegisterType<GSettingsQml>(uri, 1, 0, "GSettings");
31+ qmlRegisterUncreatableType<GSettingsSchemaQml>(uri, 1, 0, "GSettingsSchema",
32+ "GSettingsSchema can only be used inside of a GSettings component");
33+}
tests/mocks/GSettings/plugin.hnew file+31
@@ -0,0 +1,31 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef PLUGIN_H
18+#define PLUGIN_H
19+
20+#include <QtQml/QQmlExtensionPlugin>
21+
22+class FakeGSettingsQmlPlugin : public QQmlExtensionPlugin
23+{
24+ Q_OBJECT
25+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26+
27+public:
28+ void registerTypes(const char *uri);
29+};
30+
31+#endif // PLUGIN_H
tests/mocks/GSettings/qmldirnew file+2
@@ -0,0 +1,2 @@
1+module GSettings
2+plugin FakeGSettingsQml
tests/mocks/LightDM/single/GreeterPrivate.cpp+2−4
@@ -34,10 +34,8 @@ void GreeterPrivate::handleAuthenticate()
3434{
3535 Q_Q(Greeter);
3636
37− if (authenticationUser == "one") {
38− authenticated = true;
39− Q_EMIT q->authenticationComplete();
40− }
37+ authenticated = true;
38+ Q_EMIT q->authenticationComplete();
4139}
4240
4341void GreeterPrivate::handleRespond(QString const &response)
tests/mocks/Ubuntu/Application/ApplicationManager.h+4
@@ -46,6 +46,8 @@ class ApplicationManager : public QObject {
4646 Q_PROPERTY(ApplicationInfo* sideStageFocusedApplication READ sideStageFocusedApplication
4747 NOTIFY sideStageFocusedApplicationChanged)
4848
49+ Q_PROPERTY(bool fake READ fake CONSTANT)
50+
4951 public:
5052 ApplicationManager(QObject *parent = NULL);
5153 virtual ~ApplicationManager();
@@ -80,6 +82,8 @@ class ApplicationManager : public QObject {
8082 ApplicationInfo* mainStageFocusedApplication() const;
8183 ApplicationInfo* sideStageFocusedApplication() const;
8284
85+ bool fake() { return true; }
86+
8387 Q_INVOKABLE void focusApplication(int handle);
8488 Q_INVOKABLE void unfocusCurrentApplication(StageHint stageHint);
8589 Q_INVOKABLE ApplicationInfo* startProcess(QString desktopFile,
tests/mocks/Unity/Indicators/qml/fake_menu_page1.qml−8
@@ -32,13 +32,5 @@ Indicators.FakeMenuPage {
3232 horizontalCenter: parent.horizontalCenter
3333 verticalCenter: parent.verticalCenter
3434 }
35−
36− NumberAnimation on rotation {
37− id: rotation_animation
38− from: 0
39− to: 360
40− duration: 5000
41− loops: Animation.Infinite
42− }
4335 }
4436}
tests/mocks/Unity/Indicators/qml/fake_menu_page2.qml−8
@@ -32,13 +32,5 @@ Indicators.FakeMenuPage {
3232 horizontalCenter: parent.horizontalCenter
3333 verticalCenter: parent.verticalCenter
3434 }
35−
36− NumberAnimation on rotation {
37− id: rotation_animation
38− from: 0
39− to: 360
40− duration: 5000
41− loops: Animation.Infinite
42− }
4335 }
4436}
tests/mocks/Unity/Indicators/qml/fake_menu_page3.qml−8
@@ -32,13 +32,5 @@ Indicators.FakeMenuPage {
3232 horizontalCenter: parent.horizontalCenter
3333 verticalCenter: parent.verticalCenter
3434 }
35−
36− NumberAnimation on rotation {
37− id: rotation_animation
38− from: 0
39− to: 360
40− duration: 5000
41− loops: Animation.Infinite
42− }
4335 }
4436}
tests/mocks/Unity/Indicators/qml/fake_menu_page4.qml−8
@@ -32,13 +32,5 @@ Indicators.FakeMenuPage {
3232 horizontalCenter: parent.horizontalCenter
3333 verticalCenter: parent.verticalCenter
3434 }
35−
36− NumberAnimation on rotation {
37− id: rotation_animation
38− from: 0
39− to: 360
40− duration: 5000
41− loops: Animation.Infinite
42− }
4335 }
4436}
tests/mocks/Unity/Indicators/qml/fake_menu_page5.qml−8
@@ -32,13 +32,5 @@ Indicators.FakeMenuPage {
3232 horizontalCenter: parent.horizontalCenter
3333 verticalCenter: parent.verticalCenter
3434 }
35−
36− NumberAnimation on rotation {
37− id: rotation_animation
38− from: 0
39− to: 360
40− duration: 5000
41− loops: Animation.Infinite
42− }
4335 }
4436}
tests/plugins/ListViewWithPageHeader/listviewwithpageheadertestsection.cpp+51−2
@@ -45,6 +45,7 @@ private:
4545 QCOMPARE(section(lvwph->m_visibleItems[visibleIndex]->m_sectionItem), sectionHeader);
4646 if (!sectionHeader.isNull()) {
4747 QCOMPARE(QQuickItemPrivate::get(lvwph->m_visibleItems[visibleIndex]->m_sectionItem)->culled, sectionHeaderCulled);
48+ QCOMPARE(sectionDelegateIndex(lvwph->m_visibleItems[visibleIndex]->m_sectionItem), lvwph->m_firstVisibleIndex + visibleIndex);
4849 }
4950 }
5051
@@ -116,6 +117,11 @@ private:
116117 return item ? QQmlEngine::contextForObject(item)->parentContext()->contextProperty(QLatin1String("section")).toString() : QString();
117118 }
118119
120+ int sectionDelegateIndex(QQuickItem *item)
121+ {
122+ return item ? QQmlEngine::contextForObject(item)->parentContext()->contextProperty(QLatin1String("delegateIndex")).toInt() : -1;
123+ }
124+
119125private Q_SLOTS:
120126
121127 void initTestCase()
@@ -220,6 +226,7 @@ private Q_SLOTS:
220226 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
221227 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
222228 QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
229+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 1);
223230 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
224231 }
225232
@@ -241,6 +248,7 @@ private Q_SLOTS:
241248 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
242249 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
243250 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
251+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 2);
244252 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
245253 }
246254
@@ -262,6 +270,7 @@ private Q_SLOTS:
262270 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
263271 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
264272 QCOMPARE(section(lvwph->m_topSectionItem), QString("Agressive"));
273+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 0);
265274 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
266275
267276 changeContentY(-30);
@@ -280,6 +289,7 @@ private Q_SLOTS:
280289 QCOMPARE(lvwph->m_headerItemShownHeight, 30.);
281290 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
282291 QCOMPARE(section(lvwph->m_topSectionItem), QString("Agressive"));
292+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 0);
283293 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
284294 }
285295
@@ -335,6 +345,7 @@ private Q_SLOTS:
335345 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
336346 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
337347 QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
348+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 1);
338349 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
339350
340351 lvwph->positionAtBeginning();
@@ -360,6 +371,7 @@ private Q_SLOTS:
360371 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
361372 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
362373 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
374+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 2);
363375 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
364376
365377 lvwph->positionAtBeginning();
@@ -404,6 +416,7 @@ private Q_SLOTS:
404416 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
405417 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
406418 QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
419+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 1);
407420 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
408421
409422 model->setProperty(0, "size", 400);
@@ -423,6 +436,7 @@ private Q_SLOTS:
423436 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
424437 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
425438 QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
439+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 1);
426440 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
427441
428442 scrollToTop();
@@ -476,6 +490,7 @@ private Q_SLOTS:
476490 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
477491 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
478492 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
493+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 2);
479494 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
480495
481496 model->setProperty(0, "size", 400);
@@ -495,6 +510,7 @@ private Q_SLOTS:
495510 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
496511 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
497512 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
513+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 2);
498514 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
499515
500516 scrollToTop();
@@ -531,6 +547,7 @@ private Q_SLOTS:
531547 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
532548 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
533549 QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
550+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 3);
534551 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
535552
536553 changeContentY(-30);
@@ -548,6 +565,7 @@ private Q_SLOTS:
548565 QCOMPARE(lvwph->m_headerItemShownHeight, 30.);
549566 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
550567 QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
568+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 3);
551569 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
552570
553571 changeContentY(30);
@@ -565,6 +583,7 @@ private Q_SLOTS:
565583 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
566584 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
567585 QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
586+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 3);
568587 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
569588
570589 changeContentY(-30);
@@ -582,6 +601,7 @@ private Q_SLOTS:
582601 QCOMPARE(lvwph->m_headerItemShownHeight, 30.);
583602 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
584603 QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
604+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 3);
585605 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
586606 }
587607
@@ -602,6 +622,7 @@ private Q_SLOTS:
602622 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
603623 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
604624 QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
625+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 3);
605626 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
606627
607628 lvwph->setDelegate(otherDelegate);
@@ -660,6 +681,7 @@ private Q_SLOTS:
660681 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
661682 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
662683 QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
684+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 3);
663685 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
664686
665687 scrollToTop();
@@ -698,6 +720,7 @@ private Q_SLOTS:
698720 QTRY_VERIFY(lvwph->isAtYEnd());
699721 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
700722 QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
723+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 3);
701724 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
702725
703726 scrollToTop();
@@ -734,6 +757,7 @@ private Q_SLOTS:
734757 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
735758 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
736759 QCOMPARE(section(lvwph->m_topSectionItem), QString("Agressive"));
760+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 0);
737761 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
738762 }
739763
@@ -818,6 +842,7 @@ private Q_SLOTS:
818842 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
819843 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
820844 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
845+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 2);
821846 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
822847
823848 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 100), Q_ARG(QVariant, "Agressive"));
@@ -838,6 +863,7 @@ private Q_SLOTS:
838863 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
839864 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
840865 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
866+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 4);
841867 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
842868
843869 scrollToTop();
@@ -878,6 +904,7 @@ private Q_SLOTS:
878904 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
879905 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
880906 QCOMPARE(section(lvwph->m_topSectionItem), QString("Agressive"));
907+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 0);
881908 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
882909
883910 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 3), Q_ARG(QVariant, 100), Q_ARG(QVariant, "Agressive"));
@@ -898,6 +925,7 @@ private Q_SLOTS:
898925 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
899926 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
900927 QCOMPARE(section(lvwph->m_topSectionItem), QString("Agressive"));
928+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 0);
901929 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
902930 }
903931
@@ -920,6 +948,7 @@ private Q_SLOTS:
920948 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
921949 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
922950 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
951+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 2);
923952 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
924953
925954 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 100), Q_ARG(QVariant, "Agressive"));
@@ -940,6 +969,7 @@ private Q_SLOTS:
940969 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
941970 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
942971 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
972+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 4);
943973 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
944974 }
945975
@@ -962,6 +992,7 @@ private Q_SLOTS:
962992 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
963993 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
964994 QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
995+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 1);
965996 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
966997
967998 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 100), Q_ARG(QVariant, "Agressive"));
@@ -982,6 +1013,7 @@ private Q_SLOTS:
9821013 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
9831014 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
9841015 QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
1016+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 3);
9851017 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
9861018
9871019 scrollToTop();
@@ -1029,6 +1061,7 @@ private Q_SLOTS:
10291061 QVERIFY(!lvwph->isAtYEnd());
10301062 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
10311063 QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
1064+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 3);
10321065 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
10331066
10341067 scrollToBottom();
@@ -1049,6 +1082,7 @@ private Q_SLOTS:
10491082 QVERIFY(lvwph->isAtYEnd());
10501083 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
10511084 QCOMPARE(section(lvwph->m_topSectionItem), QString("Lazy"));
1085+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 5);
10521086 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
10531087 }
10541088
@@ -1102,6 +1136,7 @@ private Q_SLOTS:
11021136 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
11031137 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
11041138 QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
1139+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 13);
11051140 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
11061141
11071142 changeContentY(-1700);
@@ -1126,6 +1161,7 @@ private Q_SLOTS:
11261161 QCOMPARE(lvwph->m_headerItemShownHeight, 50.);
11271162 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
11281163 QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
1164+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 4);
11291165 QCOMPARE(lvwph->m_topSectionItem->y(), -23.);
11301166 }
11311167
@@ -1187,6 +1223,7 @@ private Q_SLOTS:
11871223 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
11881224 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
11891225 QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
1226+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 1);
11901227 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
11911228 }
11921229
@@ -1210,6 +1247,7 @@ private Q_SLOTS:
12101247 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
12111248 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
12121249 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1250+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 2);
12131251 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
12141252 }
12151253
@@ -1232,6 +1270,7 @@ private Q_SLOTS:
12321270 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
12331271 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
12341272 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1273+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 2);
12351274 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
12361275
12371276 QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 1), Q_ARG(QVariant, 1));
@@ -1251,6 +1290,7 @@ private Q_SLOTS:
12511290 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
12521291 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
12531292 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1293+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 1);
12541294 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
12551295 }
12561296
@@ -1273,6 +1313,7 @@ private Q_SLOTS:
12731313 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
12741314 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
12751315 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1316+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 2);
12761317 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
12771318
12781319 QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 3), Q_ARG(QVariant, 1));
@@ -1292,6 +1333,7 @@ private Q_SLOTS:
12921333 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
12931334 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
12941335 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1336+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 2);
12951337 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
12961338 }
12971339
@@ -1371,6 +1413,7 @@ private Q_SLOTS:
13711413 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
13721414 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
13731415 QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
1416+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 3);
13741417 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
13751418
13761419 QMetaObject::invokeMethod(model, "moveItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 5), Q_ARG(QVariant, 1));
@@ -1391,6 +1434,7 @@ private Q_SLOTS:
13911434 QVERIFY(!lvwph->isAtYEnd());
13921435 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
13931436 QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
1437+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 2);
13941438 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
13951439 }
13961440
@@ -1414,6 +1458,7 @@ private Q_SLOTS:
14141458 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
14151459 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
14161460 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1461+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 2);
14171462 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
14181463
14191464 model->setProperty(1, "size", 100);
@@ -1434,6 +1479,7 @@ private Q_SLOTS:
14341479 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
14351480 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
14361481 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1482+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 2);
14371483 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
14381484 }
14391485
@@ -1455,7 +1501,7 @@ private Q_SLOTS:
14551501 QCOMPARE(lvwph->m_headerItem->y(), 0.);
14561502 QCOMPARE(lvwph->m_headerItem->height(), 50.);
14571503 QCOMPARE(lvwph->contentY(), 20.);
1458− QCOMPARE(lvwph->m_headerItemShownHeight, 0.);;
1504+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
14591505 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
14601506
14611507 lvwph->showHeader();
@@ -1475,6 +1521,7 @@ private Q_SLOTS:
14751521 QCOMPARE(lvwph->m_headerItemShownHeight, 50.);
14761522 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
14771523 QCOMPARE(section(lvwph->m_topSectionItem), QString("Agressive"));
1524+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 0);
14781525 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
14791526
14801527 scrollToTop();
@@ -1510,9 +1557,10 @@ private Q_SLOTS:
15101557 QCOMPARE(lvwph->m_headerItem->y(), 0.);
15111558 QCOMPARE(lvwph->m_headerItem->height(), 50.);
15121559 QCOMPARE(lvwph->contentY(), 375.);
1513− QCOMPARE(lvwph->m_headerItemShownHeight, 0.);;
1560+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
15141561 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
15151562 QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
1563+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 1);
15161564 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
15171565
15181566 lvwph->showHeader();
@@ -1533,6 +1581,7 @@ private Q_SLOTS:
15331581 QCOMPARE(lvwph->m_headerItemShownHeight, 50.);
15341582 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
15351583 QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
1584+ QCOMPARE(sectionDelegateIndex(lvwph->m_topSectionItem), 1);
15361585 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
15371586
15381587 scrollToTop();
tests/qmltests/CMakeLists.txt+1−1
@@ -26,7 +26,7 @@ set(qmltest_DEFAULT_TARGETS qmluitests)
2626set(qmltest_DEFAULT_NO_ADD_TEST TRUE)
2727set(qmltest_DEFAULT_PROPERTIES "")
2828
29−add_qml_test(. Shell IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS}
29+add_qml_test(. Shell IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks
3030 ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
3131add_manual_qml_test(Components DragHandle IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
3232add_qml_test(Components DraggingArea)
tests/qmltests/Dash/tst_FilterGrids.qml+1−1
@@ -118,7 +118,7 @@ Rectangle {
118118 gridLoader.source = "../../../Dash/" + data.component;
119119
120120 // Wait until the FilterGrid is loaded by the loader
121− tryCompare(gridLoader, "status", Loader.Ready, "Loader couldn't load " + data.component);
121+ tryCompare(gridLoader, "status", Loader.Ready);
122122
123123 // Wait until the GridView inside the model has finished rendering
124124 var gridView = findChild(gridLoader, "responsiveGridViewGrid");
tests/qmltests/Greeter/tst_Lockscreen.qml+1
@@ -186,6 +186,7 @@ Rectangle {
186186 function test_unlock(data) {
187187 unlockedCheckBox.checked = false
188188 LightDM.Greeter.authenticate(data.username)
189+ waitForRendering(lockscreen)
189190
190191 var inputField = findChild(lockscreen, "pinentryField")
191192 if (data.alphanumeric) {
tests/qmltests/tst_Shell.qml+14
@@ -19,6 +19,7 @@
1919
2020import QtQuick 2.0
2121import QtTest 1.0
22+import GSettings 1.0
2223import Ubuntu.Application 0.1
2324import Unity.Test 0.1 as UT
2425
@@ -277,5 +278,18 @@ Item {
277278 }
278279 } while (!isStill);
279280 }
281+
282+ function test_wallpaper_data() {
283+ return [
284+ {tag: "red", url: "tests/data/unity/backgrounds/red.png"},
285+ {tag: "blue", url: "tests/data/unity/backgrounds/blue.png"}
286+ ]
287+ }
288+
289+ function test_wallpaper(data) {
290+ var backgroundImage = findChild(shell, "backgroundImage")
291+ GSettingsController.setPictureUri(data.url)
292+ tryCompareFunction(function() { return backgroundImage.source.toString().indexOf(data.url) !== -1; }, true)
293+ }
280294 }
281295}
tests/utils/modules/Unity/Test/UnityTestCase.qml+10−5
@@ -72,11 +72,16 @@ TestCase {
7272 // Find an object with the given name recursively, starting
7373 // at the given object "obj"
7474 function findChild(obj,objectName) {
75− for (var i in obj.children) {
76− var child = obj.children[i];
77− if (child.objectName === objectName) return child;
78− var subChild = findChild(child,objectName);
79− if (subChild !== undefined) return subChild;
75+ var childs = new Array(0);
76+ childs.push(obj)
77+ while (childs.length > 0) {
78+ if (childs[0].objectName == objectName) {
79+ return childs[0]
80+ }
81+ for (var i in childs[0].data) {
82+ childs.push(childs[0].data[i])
83+ }
84+ childs.splice(0, 1);
8085 }
8186 return undefined;
8287 }