on xenial help sign in
Work with the scopes-v4 branch + departments->navigation renaming
b0f3e58Michal Hruby
debian/control+2−2
@@ -24,7 +24,7 @@ Build-Depends: cmake,
24 libpulse-dev,
24 libpulse-dev,
25 libqmenumodel-dev (>= 0.2.8),
25 libqmenumodel-dev (>= 0.2.8),
26 libqt5xmlpatterns5-dev,
26 libqt5xmlpatterns5-dev,
27− libunity-api-dev (>= 7.87),
27+ libunity-api-dev (>= 7.88),
28 libusermetricsoutput1-dev,
28 libusermetricsoutput1-dev,
29 libxcb1-dev,
29 libxcb1-dev,
30 pkg-config,
30 pkg-config,
@@ -112,7 +112,7 @@ Depends: qtdeclarative5-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
112 unity-application-impl-2,
112 unity-application-impl-2,
113 unity-notifications-impl-3,
113 unity-notifications-impl-3,
114 unity-plugin-scopes | unity-scopes-impl,
114 unity-plugin-scopes | unity-scopes-impl,
115− unity-scopes-impl-2,
115+ unity-scopes-impl-4,
116 unity8-fake-env | unity-application-impl,
116 unity8-fake-env | unity-application-impl,
117 ${misc:Depends},
117 ${misc:Depends},
118Breaks: unity8 (<< 7.86),
118Breaks: unity8 (<< 7.86),
qml/Dash/Dash.qml+9−11
@@ -38,7 +38,13 @@ Showable {
38 }
38 }
39
39
40 function setCurrentScope(scopeId, animate, reset) {
40 function setCurrentScope(scopeId, animate, reset) {
41− var scopeIndex = filteredScopes.findFirst(Scopes.RoleId, scopeId)
41+ var scopeIndex = -1;
42+ for (var i = 0; i < scopes.count; ++i) {
43+ if (scopes.getScope(i).id == scopeId) {
44+ scopeIndex = i;
45+ break;
46+ }
47+ }
42
48
43 if (scopeIndex == -1) {
49 if (scopeIndex == -1) {
44 console.warn("No match for scope with id: %1".arg(scopeId))
50 console.warn("No match for scope with id: %1".arg(scopeId))
@@ -63,15 +69,8 @@ Showable {
63 }
69 }
64 }
70 }
65
71
66− SortFilterProxyModel {
72+ Scopes {
67− id: filteredScopes
68− model: Scopes {
69− id: scopes
73+ id: scopes
70− }
71− dynamicSortFilter: true
72−
73− filterRole: Scopes.RoleVisible
74− filterRegExp: RegExp("^true$")
75 }
74 }
76
75
77 DashContent {
76 DashContent {
@@ -79,7 +78,6 @@ Showable {
79 objectName: "dashContent"
78 objectName: "dashContent"
80 width: parent.width
79 width: parent.width
81 height: parent.height
80 height: parent.height
82− model: filteredScopes
83 scopes: scopes
81 scopes: scopes
84 visible: x != -width
82 visible: x != -width
85 onGotoScope: {
83 onGotoScope: {
qml/Dash/DashContent.qml+3−5
@@ -23,8 +23,7 @@ import "../Components"
23Item {
23Item {
24 id: dashContent
24 id: dashContent
25
25
26− property var model: null
26+ property alias scopes: dashContentList.model
27− property var scopes: null
28 readonly property alias currentIndex: dashContentList.currentIndex
27 readonly property alias currentIndex: dashContentList.currentIndex
29
28
30 signal scopeLoaded(string scopeId)
29 signal scopeLoaded(string scopeId)
@@ -89,10 +88,9 @@ Item {
89 id: dashContentList
88 id: dashContentList
90 objectName: "dashContentList"
89 objectName: "dashContentList"
91
90
92− interactive: dashContent.scopes.loaded && currentItem && !currentItem.moving && !currentItem.departmentsShown
91+ interactive: dashContent.scopes.loaded && currentItem && !currentItem.moving && !currentItem.navigationShown
93
92
94 anchors.fill: parent
93 anchors.fill: parent
95− model: dashContent.model
96 orientation: ListView.Horizontal
94 orientation: ListView.Horizontal
97 boundsBehavior: Flickable.DragAndOvershootBounds
95 boundsBehavior: Flickable.DragAndOvershootBounds
98 flickDeceleration: units.gu(625)
96 flickDeceleration: units.gu(625)
@@ -130,7 +128,7 @@ Item {
130 objectName: scope.id + " loader"
128 objectName: scope.id + " loader"
131
129
132 readonly property bool moving: item ? item.moving : false
130 readonly property bool moving: item ? item.moving : false
133− readonly property bool departmentsShown: item ? item.departmentsShown : false
131+ readonly property bool navigationShown: item ? item.navigationShown : false
134 readonly property var categoryView: item ? item.categoryView : null
132 readonly property var categoryView: item ? item.categoryView : null
135 readonly property var theScope: scope
133 readonly property var theScope: scope
136
134
qml/Dash/DashDepartments.qml → qml/Dash/DashNavigation.qmlrenamed+44−44
@@ -15,17 +15,17 @@
15 */
15 */
16
16
17import QtQuick 2.2
17import QtQuick 2.2
18−import Ubuntu.Components 0.1
18+import Ubuntu.Components 1.1
19
19
20AbstractButton {
20AbstractButton {
21 id: root
21 id: root
22− objectName: "dashDepartments"
22+ objectName: "dashNavigation"
23
23
24 property var scope: null
24 property var scope: null
25
25
26 property bool showList: false
26 property bool showList: false
27
27
28− readonly property var currentDepartment: scope && scope.hasDepartments ? scope.getDepartment(scope.currentDepartmentId) : null
28+ readonly property var currentNavigation: scope && scope.hasNavigation ? scope.getNavigation(scope.currentNavigationId) : null
29
29
30 property alias windowWidth: blackRect.width
30 property alias windowWidth: blackRect.width
31 property alias windowHeight: blackRect.height
31 property alias windowHeight: blackRect.height
@@ -34,21 +34,21 @@ AbstractButton {
34 // Are we drilling down the tree or up?
34 // Are we drilling down the tree or up?
35 property bool isGoingBack: false
35 property bool isGoingBack: false
36
36
37− visible: root.currentDepartment != null
37+ visible: root.currentNavigation != null
38
38
39 height: visible ? units.gu(5) : 0
39 height: visible ? units.gu(5) : 0
40
40
41 onClicked: {
41 onClicked: {
42− departmentListView.updateMaxHeight();
42+ navigationListView.updateMaxHeight();
43 root.showList = !root.showList;
43 root.showList = !root.showList;
44 }
44 }
45
45
46 Rectangle {
46 Rectangle {
47 id: blackRect
47 id: blackRect
48 color: "black"
48 color: "black"
49− opacity: departmentListView.currentItem && departmentListView.currentItem.visible ? 0.3 : 0
49+ opacity: navigationListView.currentItem && navigationListView.currentItem.visible ? 0.3 : 0
50 Behavior on opacity { UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration } }
50 Behavior on opacity { UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration } }
51− anchors.top: departmentListView.top
51+ anchors.top: navigationListView.top
52 anchors.right: parent.right
52 anchors.right: parent.right
53 visible: opacity != 0
53 visible: opacity != 0
54 }
54 }
@@ -79,7 +79,7 @@ AbstractButton {
79 anchors.fill: parent
79 anchors.fill: parent
80 anchors.margins: units.gu(2)
80 anchors.margins: units.gu(2)
81 verticalAlignment: Text.AlignVCenter
81 verticalAlignment: Text.AlignVCenter
82− text: root.currentDepartment ? root.currentDepartment.label : ""
82+ text: root.currentNavigation ? root.currentNavigation.label : ""
83 color: root.scopeStyle ? root.scopeStyle.foreground : "grey"
83 color: root.scopeStyle ? root.scopeStyle.foreground : "grey"
84 }
84 }
85
85
@@ -93,18 +93,18 @@ AbstractButton {
93 color: root.scopeStyle ? root.scopeStyle.foreground : "grey"
93 color: root.scopeStyle ? root.scopeStyle.foreground : "grey"
94 }
94 }
95
95
96− // departmentListView is outside root
96+ // navigationListView is outside root
97 ListView {
97 ListView {
98− id: departmentListView
98+ id: navigationListView
99− objectName: "departmentListView"
99+ objectName: "navigationListView"
100 orientation: ListView.Horizontal
100 orientation: ListView.Horizontal
101 interactive: false
101 interactive: false
102 clip: root.width != windowWidth
102 clip: root.width != windowWidth
103 model: ListModel {
103 model: ListModel {
104− id: departmentModel
104+ id: navigationModel
105 // We have two roles
105 // We have two roles
106− // departmentId: the department id of the department the list represents
106+ // navigationId: the navigation id of the navigation the list represents
107− // nullifyDepartment: overrides departmentId to be null
107+ // nullifyNavigation: overrides navigationId to be null
108 // This is used to "clear" the delegate when going "right" on the tree
108 // This is used to "clear" the delegate when going "right" on the tree
109 }
109 }
110 anchors {
110 anchors {
@@ -126,84 +126,84 @@ AbstractButton {
126 }
126 }
127 }
127 }
128 highlightMoveDuration: UbuntuAnimation.FastDuration
128 highlightMoveDuration: UbuntuAnimation.FastDuration
129− delegate: DashDepartmentsList {
129+ delegate: DashNavigationList {
130− objectName: "department" + index
130+ objectName: "navigation" + index
131 visible: height != 0
131 visible: height != 0
132− width: departmentListView.width
132+ width: navigationListView.width
133 scopeStyle: root.scopeStyle
133 scopeStyle: root.scopeStyle
134 property real desiredHeight: {
134 property real desiredHeight: {
135 if (root.showList) {
135 if (root.showList) {
136− if (department && department.loaded && x == departmentListView.contentX)
136+ if (navigation && navigation.loaded && x == navigationListView.contentX)
137 {
137 {
138− departmentListView.updateMaxHeight();
138+ navigationListView.updateMaxHeight();
139− return Math.min(implicitHeight, departmentListView.maxHeight);
139+ return Math.min(implicitHeight, navigationListView.maxHeight);
140 } else {
140 } else {
141− return departmentListView.prevHeight;
141+ return navigationListView.prevHeight;
142 }
142 }
143 } else {
143 } else {
144 return 0;
144 return 0;
145 }
145 }
146 }
146 }
147 height: desiredHeight
147 height: desiredHeight
148− department: (nullifyDepartment || !scope) ? null : scope.getDepartment(departmentId)
148+ navigation: (nullifyNavigation || !scope) ? null : scope.getNavigation(navigationId)
149− currentDepartment: root.currentDepartment
149+ currentNavigation: root.currentNavigation
150− onEnterDepartment: {
150+ onEnterNavigation: {
151− scope.loadDepartment(newDepartmentId);
151+ scope.setNavigationState(newNavigationId, false);
152 // We only need to add a new item to the model
152 // We only need to add a new item to the model
153 // if we have children, otherwise just load it
153 // if we have children, otherwise just load it
154 if (hasChildren) {
154 if (hasChildren) {
155 isGoingBack = false;
155 isGoingBack = false;
156− departmentModel.append({"departmentId": newDepartmentId, "nullifyDepartment": false});
156+ navigationModel.append({"navigationId": newNavigationId, "nullifyNavigation": false});
157− departmentListView.currentIndex++;
157+ navigationListView.currentIndex++;
158 } else {
158 } else {
159 showList = false;
159 showList = false;
160 }
160 }
161 }
161 }
162 onGoBackToParentClicked: {
162 onGoBackToParentClicked: {
163− scope.loadDepartment(department.parentDepartmentId);
163+ scope.setNavigationState(navigation.parentNavigationId, false);
164 isGoingBack = true;
164 isGoingBack = true;
165− departmentModel.setProperty(departmentListView.currentIndex - 1, "nullifyDepartment", false);
165+ navigationModel.setProperty(navigationListView.currentIndex - 1, "nullifyNavigation", false);
166− departmentListView.currentIndex--;
166+ navigationListView.currentIndex--;
167 }
167 }
168− onAllDepartmentClicked: {
168+ onAllNavigationClicked: {
169 showList = false;
169 showList = false;
170− if (root.currentDepartment.parentDepartmentId == department.departmentId) {
170+ if (root.currentNavigation.parentNavigationId == navigation.navigationId) {
171 // For leaves we have to go to the parent too
171 // For leaves we have to go to the parent too
172− scope.loadDepartment(root.currentDepartment.parentDepartmentId);
172+ scope.setNavigationState(root.currentNavigation.parentNavigationId, false);
173 }
173 }
174 }
174 }
175 }
175 }
176 onContentXChanged: {
176 onContentXChanged: {
177− if (contentX == width * departmentListView.currentIndex) {
177+ if (contentX == width * navigationListView.currentIndex) {
178 if (isGoingBack) {
178 if (isGoingBack) {
179− departmentModel.remove(departmentListView.currentIndex + 1);
179+ navigationModel.remove(navigationListView.currentIndex + 1);
180 } else {
180 } else {
181− departmentModel.setProperty(departmentListView.currentIndex - 1, "nullifyDepartment", true);
181+ navigationModel.setProperty(navigationListView.currentIndex - 1, "nullifyNavigation", true);
182 }
182 }
183 }
183 }
184 }
184 }
185 }
185 }
186
186
187 InverseMouseArea {
187 InverseMouseArea {
188− anchors.fill: departmentListView
188+ anchors.fill: navigationListView
189 enabled: root.showList
189 enabled: root.showList
190 onClicked: root.showList = false
190 onClicked: root.showList = false
191 }
191 }
192
192
193 onScopeChanged: {
193 onScopeChanged: {
194− departmentModel.clear();
194+ navigationModel.clear();
195− if (scope && scope.hasDepartments) {
195+ if (scope && scope.hasNavigation) {
196− departmentModel.append({"departmentId": scope.currentDepartmentId, "nullifyDepartment": false});
196+ navigationModel.append({"navigationId": scope.currentNavigationId, "nullifyNavigation": false});
197 }
197 }
198 }
198 }
199
199
200 Connections {
200 Connections {
201 target: scope
201 target: scope
202− onHasDepartmentsChanged: {
202+ onHasNavigationChanged: {
203− if (scope.hasDepartments) {
203+ if (scope.hasNavigation) {
204− departmentModel.append({"departmentId": scope.currentDepartmentId, "nullifyDepartment": false});
204+ navigationModel.append({"navigationId": scope.currentNavigationId, "nullifyNavigation": false});
205 } else {
205 } else {
206− departmentModel.clear();
206+ navigationModel.clear();
207 }
207 }
208 }
208 }
209 }
209 }
qml/Dash/DashDepartmentsList.qml → qml/Dash/DashNavigationList.qmlrenamed+14−14
@@ -15,16 +15,16 @@
15 */
15 */
16
16
17import QtQuick 2.2
17import QtQuick 2.2
18−import Ubuntu.Components 0.1
18+import Ubuntu.Components 1.1
19
19
20Item {
20Item {
21 id: root
21 id: root
22− property var department: null
22+ property var navigation: null
23− property var currentDepartment: null
23+ property var currentNavigation: null
24 property var scopeStyle: null
24 property var scopeStyle: null
25− signal enterDepartment(var newDepartmentId, bool hasChildren)
25+ signal enterNavigation(var newNavigationId, bool hasChildren)
26 signal goBackToParentClicked()
26 signal goBackToParentClicked()
27− signal allDepartmentClicked()
27+ signal allNavigationClicked()
28
28
29 readonly property int itemHeight: units.gu(5)
29 readonly property int itemHeight: units.gu(5)
30 readonly property color foregroundColor: root.scopeStyle ? root.scopeStyle.foreground : "grey"
30 readonly property color foregroundColor: root.scopeStyle ? root.scopeStyle.foreground : "grey"
@@ -38,7 +38,7 @@ Item {
38 ActivityIndicator {
38 ActivityIndicator {
39 id: loadingIndicator
39 id: loadingIndicator
40 anchors.centerIn: parent
40 anchors.centerIn: parent
41− running: !(department && department.loaded)
41+ running: !(navigation && navigation.loaded)
42 }
42 }
43 clip: true
43 clip: true
44
44
@@ -69,7 +69,7 @@ Item {
69 id: backButton
69 id: backButton
70 objectName: "backButton"
70 objectName: "backButton"
71 width: parent.width
71 width: parent.width
72− visible: department && !department.isRoot || false
72+ visible: navigation && !navigation.isRoot || false
73 height: itemHeight
73 height: itemHeight
74
74
75 onClicked: root.goBackToParentClicked();
75 onClicked: root.goBackToParentClicked();
@@ -93,7 +93,7 @@ Item {
93 left: backImage.right
93 left: backImage.right
94 leftMargin: units.gu(0.5)
94 leftMargin: units.gu(0.5)
95 }
95 }
96− text: department ? department.parentLabel : ""
96+ text: navigation ? navigation.parentLabel : ""
97 color: root.foregroundColor
97 color: root.foregroundColor
98 }
98 }
99
99
@@ -115,7 +115,7 @@ Item {
115 id: allButton
115 id: allButton
116 objectName: "allButton"
116 objectName: "allButton"
117 width: parent.width
117 width: parent.width
118− visible: department && (!department.isRoot || (root.currentDepartment && !root.currentDepartment.isRoot && root.currentDepartment.parentDepartmentId == department.departmentId)) || false
118+ visible: navigation && (!navigation.isRoot || (root.currentNavigation && !root.currentNavigation.isRoot && root.currentNavigation.parentNavigationId == navigation.navigationId)) || false
119 height: itemHeight
119 height: itemHeight
120
120
121 Label {
121 Label {
@@ -124,7 +124,7 @@ Item {
124 left: parent.left
124 left: parent.left
125 leftMargin: units.gu(2)
125 leftMargin: units.gu(2)
126 }
126 }
127− text: department ? (department.allLabel != "" ? department.allLabel : department.label) : ""
127+ text: navigation ? (navigation.allLabel != "" ? navigation.allLabel : navigation.label) : ""
128 font.bold: true
128 font.bold: true
129 color: root.foregroundColor
129 color: root.foregroundColor
130 }
130 }
@@ -142,18 +142,18 @@ Item {
142 height: units.dp(1)
142 height: units.dp(1)
143 }
143 }
144
144
145− onClicked: root.allDepartmentClicked();
145+ onClicked: root.allNavigationClicked();
146 }
146 }
147
147
148 Repeater {
148 Repeater {
149− model: department && department.loaded ? department : null
149+ model: navigation && navigation.loaded ? navigation : null
150 clip: true
150 clip: true
151 delegate: AbstractButton {
151 delegate: AbstractButton {
152 objectName: root.objectName + "child" + index
152 objectName: root.objectName + "child" + index
153 height: root.itemHeight
153 height: root.itemHeight
154 width: root.width
154 width: root.width
155
155
156− onClicked: root.enterDepartment(departmentId, hasChildren)
156+ onClicked: root.enterNavigation(navigationId, hasChildren)
157
157
158 Label {
158 Label {
159 anchors {
159 anchors {
@@ -189,7 +189,7 @@ Item {
189 color: root.foregroundColor
189 color: root.foregroundColor
190 opacity: 0.1
190 opacity: 0.1
191 height: units.dp(1)
191 height: units.dp(1)
192− visible: index != department.count - 1
192+ visible: index != navigation.count - 1
193 }
193 }
194 }
194 }
195 }
195 }
qml/Dash/GenericScopeView.qml+4−14
@@ -25,7 +25,7 @@ import "../Components/ListItems" as ListItems
25FocusScope {
25FocusScope {
26 id: scopeView
26 id: scopeView
27
27
28− readonly property alias departmentsShown: dashDepartments.showList
28+ readonly property alias navigationShown: dashNavigation.showList
29 property var scope: null
29 property var scope: null
30 property SortFilterProxyModel categories: categoryFilter
30 property SortFilterProxyModel categories: categoryFilter
31 property bool isCurrent: false
31 property bool isCurrent: false
@@ -42,16 +42,6 @@ FocusScope {
42
42
43 signal backClicked()
43 signal backClicked()
44
44
45− onScopeChanged: {
46− if (scope) {
47− scope.activateApplication.connect(activateApp);
48− }
49− }
50−
51− function activateApp(appId) {
52− Qt.openUrlExternally(appId);
53− }
54−
55 function positionAtBeginning() {
45 function positionAtBeginning() {
56 categoryView.positionAtBeginning()
46 categoryView.positionAtBeginning()
57 }
47 }
@@ -122,7 +112,7 @@ FocusScope {
122 model: scopeView.categories
112 model: scopeView.categories
123 forceNoClip: previewListView.open
113 forceNoClip: previewListView.open
124 pixelAligned: true
114 pixelAligned: true
125− interactive: !dashDepartments.showList
115+ interactive: !dashNavigation.showList
126
116
127 property string expandedCategoryId: ""
117 property string expandedCategoryId: ""
128
118
@@ -398,8 +388,8 @@ FocusScope {
398 searchInProgress: scopeView.scope ? scopeView.scope.searchInProgress : false
388 searchInProgress: scopeView.scope ? scopeView.scope.searchInProgress : false
399 scopeStyle: scopeView.scopeStyle
389 scopeStyle: scopeView.scopeStyle
400
390
401− bottomItem: DashDepartments {
391+ bottomItem: DashNavigation {
402− id: dashDepartments
392+ id: dashNavigation
403 scope: scopeView.scope
393 scope: scopeView.scope
404 width: parent.width <= units.gu(60) ? parent.width : units.gu(40)
394 width: parent.width <= units.gu(60) ? parent.width : units.gu(40)
405 anchors.right: parent.right
395 anchors.right: parent.right
qml/ScopeTool.qml+1−11
@@ -45,16 +45,6 @@ Rectangle {
45 signal searchClicked
45 signal searchClicked
46 }
46 }
47
47
48− SortFilterProxyModel {
49− id: filteredScopes
50− model: Scopes {
51− id: scopes
52− }
53− dynamicSortFilter: true
54−
55− filterRole: Scopes.RoleVisible
56− filterRegExp: RegExp("^true$")
57− }
58
48
59 Rectangle {
49 Rectangle {
60 anchors.fill: dashContent
50 anchors.fill: dashContent
@@ -72,8 +62,8 @@ Rectangle {
72 DashContent {
62 DashContent {
73 id: dashContent
63 id: dashContent
74
64
75− model: filteredScopes
76 property var scope: scopes.getScope(currentIndex)
65 property var scope: scopes.getScope(currentIndex)
66+ scopes: Scopes { }
77
67
78 anchors {
68 anchors {
79 top: parent.top
69 top: parent.top
tests/mocks/Unity/CMakeLists.txt+3−3
@@ -7,7 +7,7 @@ add_subdirectory(DashCommunicator)
7pkg_search_module(DEE dee-1.0 REQUIRED)
7pkg_search_module(DEE dee-1.0 REQUIRED)
8pkg_search_module(GOBJECT gobject-2.0 REQUIRED)
8pkg_search_module(GOBJECT gobject-2.0 REQUIRED)
9pkg_search_module(DEEQT libdee-qt5 REQUIRED)
9pkg_search_module(DEEQT libdee-qt5 REQUIRED)
10−pkg_check_modules(SCOPES_API REQUIRED unity-shell-scopes=3)
10+pkg_check_modules(SCOPES_API REQUIRED unity-shell-scopes=4)
11
11
12include_directories(
12include_directories(
13 ${CMAKE_CURRENT_BINARY_DIR}
13 ${CMAKE_CURRENT_BINARY_DIR}
@@ -23,14 +23,14 @@ set(UnityQML_SOURCES
23 fake_scope.cpp
23 fake_scope.cpp
24 fake_scopes.cpp
24 fake_scopes.cpp
25 fake_categories.cpp
25 fake_categories.cpp
26− fake_department.cpp
26+ fake_navigation.cpp
27 fake_resultsmodel.cpp
27 fake_resultsmodel.cpp
28 fake_previewmodel.cpp
28 fake_previewmodel.cpp
29 fake_previewstack.cpp
29 fake_previewstack.cpp
30 fake_previewwidgetmodel.cpp
30 fake_previewwidgetmodel.cpp
31 fake_unity_plugin.cpp
31 fake_unity_plugin.cpp
32 ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/CategoriesInterface.h
32 ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/CategoriesInterface.h
33− ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/DepartmentInterface.h
33+ ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/NavigationInterface.h
34 ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/PreviewModelInterface.h
34 ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/PreviewModelInterface.h
35 ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/PreviewStackInterface.h
35 ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/PreviewStackInterface.h
36 ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/PreviewWidgetModelInterface.h
36 ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/PreviewWidgetModelInterface.h
tests/mocks/Unity/Unity.qmltypes+79−27
@@ -24,6 +24,12 @@ Module {
24 Parameter { name: "categoryId"; type: "string" }
24 Parameter { name: "categoryId"; type: "string" }
25 Parameter { name: "json"; type: "string" }
25 Parameter { name: "json"; type: "string" }
26 }
26 }
27+ Method {
28+ name: "data"
29+ type: "QVariant"
30+ Parameter { name: "row"; type: "int" }
31+ Parameter { name: "role"; type: "int" }
32+ }
27 }
33 }
28 Component {
34 Component {
29 name: "PreviewModel"
35 name: "PreviewModel"
@@ -62,6 +68,10 @@ Module {
62 prototype: "unity::shell::scopes::ScopeInterface"
68 prototype: "unity::shell::scopes::ScopeInterface"
63 exports: ["Unity/MockScope 0.2"]
69 exports: ["Unity/MockScope 0.2"]
64 exportMetaObjectRevisions: [0]
70 exportMetaObjectRevisions: [0]
71+ Signal {
72+ name: "performQuery"
73+ Parameter { name: "query"; type: "string" }
74+ }
65 Method {
75 Method {
66 name: "setSearchInProgress"
76 name: "setSearchInProgress"
67 Parameter { name: "inProg"; type: "bool" }
77 Parameter { name: "inProg"; type: "bool" }
@@ -81,18 +91,21 @@ Module {
81 Parameter { name: "scope"; type: "unity::shell::scopes::ScopeInterface"; isPointer: true }
91 Parameter { name: "scope"; type: "unity::shell::scopes::ScopeInterface"; isPointer: true }
82 }
92 }
83 Method {
93 Method {
84− name: "getDepartment"
94+ name: "getNavigation"
85− type: "unity::shell::scopes::DepartmentInterface*"
95+ type: "unity::shell::scopes::NavigationInterface*"
86− Parameter { name: "id"; type: "string" }
96+ Parameter { name: "navigationId"; type: "string" }
87 }
97 }
88 Method {
98 Method {
89− name: "loadDepartment"
99+ name: "getAltNavigation"
100+ type: "unity::shell::scopes::NavigationInterface*"
90− Parameter { name: "id"; type: "string" }
101+ Parameter { name: "altNavigationId"; type: "string" }
91 }
102 }
92 Method {
103 Method {
93− name: "performQuery"
104+ name: "setNavigationState"
94− Parameter { name: "query"; type: "string" }
105+ Parameter { name: "navigationId"; type: "string" }
106+ Parameter { name: "isAltNavigation"; type: "bool" }
95 }
107 }
108+ Method { name: "refresh" }
96 }
109 }
97 Component {
110 Component {
98 name: "Scopes"
111 name: "Scopes"
@@ -137,6 +150,7 @@ Module {
137 "RoleRawRendererTemplate": 3,
150 "RoleRawRendererTemplate": 3,
138 "RoleRenderer": 4,
151 "RoleRenderer": 4,
139 "RoleComponents": 5,
152 "RoleComponents": 5,
153+ "RoleHeaderLink": 6,
140 "RoleResults": 7,
154 "RoleResults": 7,
141 "RoleCount": 8
155 "RoleCount": 8
142 }
156 }
@@ -157,27 +171,28 @@ Module {
157 }
171 }
158 }
172 }
159 Component {
173 Component {
160− name: "unity::shell::scopes::DepartmentInterface"
174+ name: "unity::shell::scopes::NavigationInterface"
161 prototype: "QAbstractListModel"
175 prototype: "QAbstractListModel"
162− exports: ["Unity/Department 0.2"]
176+ exports: ["Unity/Navigation 0.2"]
163 isCreatable: false
177 isCreatable: false
164 exportMetaObjectRevisions: [0]
178 exportMetaObjectRevisions: [0]
165 Enum {
179 Enum {
166 name: "Roles"
180 name: "Roles"
167 values: {
181 values: {
168− "RoleDepartmentId": 0,
182+ "RoleNavigationId": 0,
169 "RoleLabel": 1,
183 "RoleLabel": 1,
170 "RoleHasChildren": 2,
184 "RoleHasChildren": 2,
171 "RoleIsActive": 3
185 "RoleIsActive": 3
172 }
186 }
173 }
187 }
174− Property { name: "departmentId"; type: "string"; isReadonly: true }
188+ Property { name: "navigationId"; type: "string"; isReadonly: true }
175 Property { name: "label"; type: "string"; isReadonly: true }
189 Property { name: "label"; type: "string"; isReadonly: true }
176 Property { name: "allLabel"; type: "string"; isReadonly: true }
190 Property { name: "allLabel"; type: "string"; isReadonly: true }
177− Property { name: "parentDepartmentId"; type: "string"; isReadonly: true }
191+ Property { name: "parentNavigationId"; type: "string"; isReadonly: true }
178 Property { name: "parentLabel"; type: "string"; isReadonly: true }
192 Property { name: "parentLabel"; type: "string"; isReadonly: true }
179 Property { name: "loaded"; type: "bool"; isReadonly: true }
193 Property { name: "loaded"; type: "bool"; isReadonly: true }
180 Property { name: "isRoot"; type: "bool"; isReadonly: true }
194 Property { name: "isRoot"; type: "bool"; isReadonly: true }
195+ Property { name: "hidden"; type: "bool"; isReadonly: true }
181 Property { name: "count"; type: "int"; isReadonly: true }
196 Property { name: "count"; type: "int"; isReadonly: true }
182 }
197 }
183 Component {
198 Component {
@@ -247,7 +262,8 @@ Module {
247 "RoleEmblem": 8,
262 "RoleEmblem": 8,
248 "RoleSummary": 9,
263 "RoleSummary": 9,
249 "RoleAttributes": 10,
264 "RoleAttributes": 10,
250− "RoleBackground": 11
265+ "RoleBackground": 11,
266+ "RoleOverlayColor": 12
251 }
267 }
252 }
268 }
253 Property { name: "categoryId"; type: "string" }
269 Property { name: "categoryId"; type: "string" }
@@ -259,13 +275,22 @@ Module {
259 exports: ["Unity/Scope 0.2"]
275 exports: ["Unity/Scope 0.2"]
260 isCreatable: false
276 isCreatable: false
261 exportMetaObjectRevisions: [0]
277 exportMetaObjectRevisions: [0]
278+ Enum {
279+ name: "Status"
280+ values: {
281+ "Okay": 0,
282+ "NoInternet": 1,
283+ "NoLocationData": 2,
284+ "Unknown": 3
285+ }
286+ }
262 Property { name: "id"; type: "string"; isReadonly: true }
287 Property { name: "id"; type: "string"; isReadonly: true }
263 Property { name: "name"; type: "string"; isReadonly: true }
288 Property { name: "name"; type: "string"; isReadonly: true }
264 Property { name: "iconHint"; type: "string"; isReadonly: true }
289 Property { name: "iconHint"; type: "string"; isReadonly: true }
265 Property { name: "description"; type: "string"; isReadonly: true }
290 Property { name: "description"; type: "string"; isReadonly: true }
266 Property { name: "searchHint"; type: "string"; isReadonly: true }
291 Property { name: "searchHint"; type: "string"; isReadonly: true }
267 Property { name: "searchInProgress"; type: "bool"; isReadonly: true }
292 Property { name: "searchInProgress"; type: "bool"; isReadonly: true }
268− Property { name: "visible"; type: "bool"; isReadonly: true }
293+ Property { name: "favorite"; type: "bool" }
269 Property { name: "shortcut"; type: "string"; isReadonly: true }
294 Property { name: "shortcut"; type: "string"; isReadonly: true }
270 Property {
295 Property {
271 name: "categories"
296 name: "categories"
@@ -273,13 +298,27 @@ Module {
273 isReadonly: true
298 isReadonly: true
274 isPointer: true
299 isPointer: true
275 }
300 }
301+ Property {
302+ name: "settings"
303+ type: "unity::shell::scopes::SettingsModelInterface"
304+ isReadonly: true
305+ isPointer: true
306+ }
276 Property { name: "searchQuery"; type: "string" }
307 Property { name: "searchQuery"; type: "string" }
277 Property { name: "noResultsHint"; type: "string" }
308 Property { name: "noResultsHint"; type: "string" }
278 Property { name: "formFactor"; type: "string" }
309 Property { name: "formFactor"; type: "string" }
279 Property { name: "isActive"; type: "bool" }
310 Property { name: "isActive"; type: "bool" }
311+ Property { name: "currentNavigationId"; type: "string"; isReadonly: true }
312+ Property { name: "hasNavigation"; type: "bool"; isReadonly: true }
280− Property { name: "currentDepartmentId"; type: "string"; isReadonly: true }
313+ Property { name: "currentAltNavigationId"; type: "string"; isReadonly: true }
281− Property { name: "hasDepartments"; type: "bool"; isReadonly: true }
314+ Property { name: "hasAltNavigation"; type: "bool"; isReadonly: true }
282 Property { name: "customizations"; type: "QVariantMap"; isReadonly: true }
315 Property { name: "customizations"; type: "QVariantMap"; isReadonly: true }
316+ Property {
317+ name: "status"
318+ type: "unity::shell::scopes::ScopeInterface::Status"
319+ isReadonly: true
320+ }
321+ Signal { name: "detailsChanged" }
283 Signal { name: "showDash" }
322 Signal { name: "showDash" }
284 Signal { name: "hideDash" }
323 Signal { name: "hideDash" }
285 Signal {
324 Signal {
@@ -298,10 +337,6 @@ Module {
298 name: "openScope"
337 name: "openScope"
299 Parameter { name: "scope"; type: "unity::shell::scopes::ScopeInterface"; isPointer: true }
338 Parameter { name: "scope"; type: "unity::shell::scopes::ScopeInterface"; isPointer: true }
300 }
339 }
301− Signal {
302− name: "activateApplication"
303− Parameter { name: "desktop"; type: "string" }
304− }
305 Method {
340 Method {
306 name: "activate"
341 name: "activate"
307 Parameter { name: "result"; type: "QVariant" }
342 Parameter { name: "result"; type: "QVariant" }
@@ -317,14 +352,25 @@ Module {
317 Parameter { name: "scope"; type: "unity::shell::scopes::ScopeInterface"; isPointer: true }
352 Parameter { name: "scope"; type: "unity::shell::scopes::ScopeInterface"; isPointer: true }
318 }
353 }
319 Method {
354 Method {
320− name: "getDepartment"
355+ name: "getNavigation"
321− type: "unity::shell::scopes::DepartmentInterface*"
356+ type: "unity::shell::scopes::NavigationInterface*"
322− Parameter { name: "departmentId"; type: "string" }
357+ Parameter { name: "navigationId"; type: "string" }
358+ }
359+ Method {
360+ name: "getAltNavigation"
361+ type: "unity::shell::scopes::NavigationInterface*"
362+ Parameter { name: "altNavigationId"; type: "string" }
323 }
363 }
324 Method {
364 Method {
325− name: "loadDepartment"
365+ name: "setNavigationState"
326− Parameter { name: "departmentId"; type: "string" }
366+ Parameter { name: "navId"; type: "string" }
367+ Parameter { name: "altNavigation"; type: "bool" }
327 }
368 }
369+ Method {
370+ name: "performQuery"
371+ Parameter { name: "cannedQuery"; type: "string" }
372+ }
373+ Method { name: "refresh" }
328 }
374 }
329 Component {
375 Component {
330 name: "unity::shell::scopes::ScopesInterface"
376 name: "unity::shell::scopes::ScopesInterface"
@@ -334,11 +380,17 @@ Module {
334 values: {
380 values: {
335 "RoleScope": 0,
381 "RoleScope": 0,
336 "RoleId": 1,
382 "RoleId": 1,
337− "RoleVisible": 2,
338− "RoleTitle": 3
383+ "RoleTitle": 2
339 }
384 }
340 }
385 }
341 Property { name: "loaded"; type: "bool"; isReadonly: true }
386 Property { name: "loaded"; type: "bool"; isReadonly: true }
387+ Property { name: "count"; type: "int"; isReadonly: true }
388+ Property {
389+ name: "overviewScope"
390+ type: "unity::shell::scopes::ScopeInterface"
391+ isReadonly: true
392+ isPointer: true
393+ }
342 Method {
394 Method {
343 name: "getScope"
395 name: "getScope"
344 type: "unity::shell::scopes::ScopeInterface*"
396 type: "unity::shell::scopes::ScopeInterface*"
tests/mocks/Unity/fake_department.cpp → tests/mocks/Unity/fake_navigation.cpprenamed+32−40
@@ -14,14 +14,15 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
15 */
16
16
17−#include "fake_department.h"
17+#include "fake_navigation.h"
18
18
19#include "fake_scope.h"
19#include "fake_scope.h"
20
20
21+#include <QDebug>
21#include <QTimer>
22#include <QTimer>
22
23
23−Department::Department(const QString& departmentId, const QString& label, const QString& allLabel, const QString& parentId, const QString& parentLabel, Scope* scope)
24+Navigation::Navigation(const QString& navigationId, const QString& label, const QString& allLabel, const QString& parentId, const QString& parentLabel, Scope* scope)
24− : m_departmentId(departmentId)
25+ : m_navigationId(navigationId)
25 , m_label(label)
26 , m_label(label)
26 , m_allLabel(allLabel)
27 , m_allLabel(allLabel)
27 , m_parentId(parentId)
28 , m_parentId(parentId)
@@ -30,96 +31,87 @@ Department::Department(const QString& departmentId, const QString& label, const
30 , m_scope(scope)
31 , m_scope(scope)
31{
32{
32 QTimer::singleShot(1500, this, SLOT(slotLoaded()));
33 QTimer::singleShot(1500, this, SLOT(slotLoaded()));
33− connect(scope, SIGNAL(currentDepartmentIdChanged()), this, SLOT(slotCurrentDepartmentChanged()));
34+ connect(scope, SIGNAL(currentNavigationIdChanged()), this, SLOT(slotCurrentNavigationChanged()));
34}
35}
35
36
36−QString Department::departmentId() const
37+QString Navigation::navigationId() const
37{
38{
38− return m_departmentId;
39+ return m_navigationId;
39}
40}
40
41
41−QString Department::label() const
42+QString Navigation::label() const
42{
43{
43 return m_label;
44 return m_label;
44}
45}
45
46
46−QString Department::allLabel() const
47+QString Navigation::allLabel() const
47{
48{
48 return m_allLabel;
49 return m_allLabel;
49}
50}
50
51
51−QString Department::parentDepartmentId() const
52+QString Navigation::parentNavigationId() const
52{
53{
53 return m_parentId;
54 return m_parentId;
54}
55}
55
56
56−QString Department::parentLabel() const
57+QString Navigation::parentLabel() const
57{
58{
58 return m_parentLabel;
59 return m_parentLabel;
59}
60}
60
61
61−void Department::slotLoaded()
62+void Navigation::slotLoaded()
62{
63{
63 m_loaded = true;
64 m_loaded = true;
64 Q_EMIT loadedChanged();
65 Q_EMIT loadedChanged();
65}
66}
66
67
67−bool Department::loaded() const
68+bool Navigation::loaded() const
68{
69{
69 return m_loaded;
70 return m_loaded;
70}
71}
71
72
72−int Department::count() const
73+int Navigation::count() const
73{
74{
74 return rowCount();
75 return rowCount();
75}
76}
76
77
77−bool Department::isRoot() const
78+bool Navigation::isRoot() const
78{
79{
79− return m_departmentId == "root";
80+ return m_navigationId == "root" || m_navigationId == "altroot";
80}
81}
81
82
82−int Department::rowCount(const QModelIndex & /*parent*/) const
83+bool Navigation::hidden() const
83{
84{
84− if (!m_loaded || m_departmentId.startsWith("child") || m_departmentId == "middle3")
85+ return m_navigationId == "altroot";
85− return 0;
86− else
87− return 8;
88}
86}
89
87
90−QHash<int, QByteArray> Department::roleNames() const
88+int Navigation::rowCount(const QModelIndex & /*parent*/) const
91{
89{
92− QHash<int, QByteArray> res;
90+ if (!m_loaded || m_navigationId.startsWith("child") || m_navigationId == "middle3")
93− res[RoleDepartmentId] = "departmentId";
91+ return 0;
94− res[RoleLabel] = "label";
92+ else
95− res[RoleHasChildren] = "hasChildren";
96− res[RoleIsActive] = "isActive";
97− return res;
93+ return 8;
98}
94}
99
95
100−QVariant Department::data(const QModelIndex &index, int role) const
96+QVariant Navigation::data(const QModelIndex &index, int role) const
101{
97{
102 switch (role) {
98 switch (role) {
103− case RoleDepartmentId:
99+ case RoleNavigationId:
104− if (m_departmentId == "root")
100+ if (m_navigationId == "root")
105 return QString("middle%1").arg(index.row());
101 return QString("middle%1").arg(index.row());
106− else if (m_departmentId.startsWith("middle"))
102+ else if (m_navigationId.startsWith("middle"))
107− return QString("child%1%2").arg(m_departmentId).arg(index.row());
103+ return QString("child%1%2").arg(m_navigationId).arg(index.row());
108− break;
109 case RoleLabel:
104 case RoleLabel:
110− return QString("%1Child%2").arg(m_departmentId).arg(index.row());
105+ return QString("%1Child%2").arg(m_navigationId).arg(index.row());
111− break;
112 case RoleHasChildren:
106 case RoleHasChildren:
113− return m_departmentId == "root" && index.row() != 3;
107+ return m_navigationId == "root" && index.row() != 3;
114− break;
115 case RoleIsActive:
108 case RoleIsActive:
116− return m_scope->currentDepartmentId() == data(index, RoleDepartmentId);
109+ return m_scope->currentNavigationId() == data(index, RoleNavigationId);
117− break;
118 }
110 }
119 return QVariant();
111 return QVariant();
120}
112}
121
113
122−void Department::slotCurrentDepartmentChanged()
114+void Navigation::slotCurrentNavigationChanged()
123{
115{
124 // This is wasteful, should only emit it if really something changed in this
116 // This is wasteful, should only emit it if really something changed in this
125 // deparment, but this is a mock, so no need to optimize
117 // deparment, but this is a mock, so no need to optimize
tests/mocks/Unity/fake_department.h → tests/mocks/Unity/fake_navigation.hrenamed+13−13
@@ -14,48 +14,48 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
15 */
16
16
17−#ifndef FAKE_DEPARTMENT_H
17+#ifndef FAKE_NAVIGATION_H
18−#define FAKE_DEPARTMENT_H
18+#define FAKE_NAVIGATION_H
19
19
20−#include <unity/shell/scopes/DepartmentInterface.h>
20+#include <unity/shell/scopes/NavigationInterface.h>
21
21
22class Scope;
22class Scope;
23
23
24−class Department : public unity::shell::scopes::DepartmentInterface
24+class Navigation : public unity::shell::scopes::NavigationInterface
25{
25{
26 Q_OBJECT
26 Q_OBJECT
27
27
28public:
28public:
29− Department(const QString& departmentId, const QString& label, const QString& allLabel, const QString& parentId, const QString& parentLabel, Scope* scope);
29+ Navigation(const QString& navigationId, const QString& label, const QString& allLabel, const QString& parentId, const QString& parentLabel, Scope* scope);
30
30
31− QString departmentId() const override;
31+ QString navigationId() const override;
32 QString label() const override;
32 QString label() const override;
33 QString allLabel() const override;
33 QString allLabel() const override;
34− QString parentDepartmentId() const override;
34+ QString parentNavigationId() const override;
35 QString parentLabel() const override;
35 QString parentLabel() const override;
36 bool loaded() const override;
36 bool loaded() const override;
37− int count() const override;
38 bool isRoot() const override;
37 bool isRoot() const override;
38+ bool hidden() const override;
39+ int count() const override;
39
40
40 int rowCount(const QModelIndex &parent = QModelIndex()) const override;
41 int rowCount(const QModelIndex &parent = QModelIndex()) const override;
41− QHash<int, QByteArray> roleNames() const;
42 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
42 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
43
43
44public Q_SLOTS:
44public Q_SLOTS:
45− void slotCurrentDepartmentChanged();
45+ void slotCurrentNavigationChanged();
46
46
47private Q_SLOTS:
47private Q_SLOTS:
48 void slotLoaded();
48 void slotLoaded();
49
49
50private:
50private:
51− QString m_departmentId;
51+ QString m_navigationId;
52 QString m_label;
52 QString m_label;
53 QString m_allLabel;
53 QString m_allLabel;
54 QString m_parentId;
54 QString m_parentId;
55 QString m_parentLabel;
55 QString m_parentLabel;
56 bool m_loaded;
56 bool m_loaded;
57− QString m_currentDepartment;
57+ QString m_currentNavigation;
58 Scope *m_scope;
58 Scope *m_scope;
59};
59};
60
60
61−#endif // FAKE_DEPARTMENT_H
61+#endif // FAKE_NAVIGATION_H
tests/mocks/Unity/fake_scope.cpp+65−17
@@ -14,24 +14,26 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
15 */
16
16
17+#include <QDebug>
17#include <QUrl>
18#include <QUrl>
18
19
19#include "fake_scope.h"
20#include "fake_scope.h"
20−#include "fake_department.h"
21+#include "fake_navigation.h"
21#include "fake_resultsmodel.h"
22#include "fake_resultsmodel.h"
22
23
23Scope::Scope(QObject* parent) : Scope(QString(), QString(), false, parent)
24Scope::Scope(QObject* parent) : Scope(QString(), QString(), false, parent)
24{
25{
25}
26}
26
27
27−Scope::Scope(QString const& id, QString const& name, bool visible, QObject* parent, int categories)
28+Scope::Scope(QString const& id, QString const& name, bool favorite, QObject* parent, int categories)
28 : unity::shell::scopes::ScopeInterface(parent)
29 : unity::shell::scopes::ScopeInterface(parent)
29 , m_id(id)
30 , m_id(id)
30 , m_name(name)
31 , m_name(name)
31− , m_visible(visible)
32 , m_searching(false)
32 , m_searching(false)
33+ , m_favorite(favorite)
33 , m_isActive(false)
34 , m_isActive(false)
34− , m_currentDeparment("root")
35+ , m_currentNavigationId("root")
36+ , m_currentAltNavigationId("altroot")
35 , m_previewRendererName("preview-generic")
37 , m_previewRendererName("preview-generic")
36 , m_categories(new Categories(categories, this))
38 , m_categories(new Categories(categories, this))
37{
39{
@@ -77,6 +79,11 @@ bool Scope::searchInProgress() const
77 return m_searching;
79 return m_searching;
78}
80}
79
81
82+bool Scope::favorite() const
83+{
84+ return m_favorite;
85+}
86+
80unity::shell::scopes::CategoriesInterface* Scope::categories() const
87unity::shell::scopes::CategoriesInterface* Scope::categories() const
81{
88{
82 return m_categories;
89 return m_categories;
@@ -97,11 +104,6 @@ QString Scope::formFactor() const
97 return m_formFactor;
104 return m_formFactor;
98}
105}
99
106
100−bool Scope::visible() const
101−{
102− return m_visible;
103−}
104−
105bool Scope::isActive() const
107bool Scope::isActive() const
106{
108{
107 return m_isActive;
109 return m_isActive;
@@ -131,6 +133,13 @@ void Scope::setActive(const bool active)
131 }
133 }
132}
134}
133
135
136+void Scope::setFavorite(const bool favorite)
137+{
138+ if (favorite != m_favorite) {
139+ m_favorite = favorite;
140+ Q_EMIT favoriteChanged();
141+ }
142+}
134void Scope::setSearchInProgress(const bool inProg)
143void Scope::setSearchInProgress(const bool inProg)
135{
144{
136 if (inProg != m_searching) {
145 if (inProg != m_searching) {
@@ -170,16 +179,31 @@ void Scope::closeScope(unity::shell::scopes::ScopeInterface* /*scope*/)
170 qFatal("Scope::closeScope is not implemented");
179 qFatal("Scope::closeScope is not implemented");
171}
180}
172
181
173−QString Scope::currentDepartmentId() const
182+QString Scope::currentNavigationId() const
183+{
184+ return m_currentNavigationId;
185+}
186+
187+bool Scope::hasNavigation() const
188+{
189+ return true;
190+}
191+
192+QString Scope::currentAltNavigationId() const
174{
193{
175− return m_currentDeparment;
194+ return m_currentAltNavigationId;
176}
195}
177
196
178−bool Scope::hasDepartments() const
197+bool Scope::hasAltNavigation() const
179{
198{
180 return true;
199 return true;
181}
200}
182
201
202+Scope::Status Scope::status() const
203+{
204+ return Status::Okay;
205+}
206+
183QVariantMap Scope::customizations() const
207QVariantMap Scope::customizations() const
184{
208{
185 QVariantMap m, h;
209 QVariantMap m, h;
@@ -196,7 +220,12 @@ QVariantMap Scope::customizations() const
196 return m;
220 return m;
197}
221}
198
222
223+void Scope::refresh()
224+{
225+ qDebug() << "Scope::refresh is currently not implmented in the fake scopes plugin";
226+}
227+
199−unity::shell::scopes::DepartmentInterface* Scope::getDepartment(const QString& id)
228+unity::shell::scopes::NavigationInterface* Scope::getNavigation(const QString& id)
200{
229{
201 if (id.isEmpty())
230 if (id.isEmpty())
202 return nullptr;
231 return nullptr;
@@ -210,11 +239,30 @@ unity::shell::scopes::DepartmentInterface* Scope::getDepartment(const QString& i
210 parentId = id.mid(5, 7);
239 parentId = id.mid(5, 7);
211 parentLabel = parentId;
240 parentLabel = parentId;
212 }
241 }
242+ return new Navigation(id, id, "all"+id, parentId, parentLabel, this);
243+}
244+
245+unity::shell::scopes::NavigationInterface* Scope::getAltNavigation(QString const& id)
246+{
247+ if (id.isEmpty())
248+ return nullptr;
249+
250+ QString parentId;
251+ QString parentLabel;
252+ if (id.startsWith("altmiddle")) {
253+ parentId = "altroot";
254+ parentLabel = "altroot";
255+ }
213− return new Department(id, id, "all"+id, parentId, parentLabel, this);
256+ return new Navigation(id, id, "all"+id, parentId, parentLabel, this);
214}
257}
215
258
216−void Scope::loadDepartment(const QString& id)
259+void Scope::setNavigationState(const QString &navigationId, bool isAltNavigation)
217{
260{
218− m_currentDeparment = id;
261+ if (isAltNavigation) {
219− Q_EMIT currentDepartmentIdChanged();
262+ m_currentAltNavigationId = navigationId;
263+ Q_EMIT currentAltNavigationIdChanged();
264+ } else {
265+ m_currentNavigationId = navigationId;
266+ Q_EMIT currentNavigationIdChanged();
267+ }
220}
268}
tests/mocks/Unity/fake_scope.h+16−8
@@ -30,7 +30,7 @@ class Scope : public unity::shell::scopes::ScopeInterface
30
30
31public:
31public:
32 Scope(QObject* parent = 0);
32 Scope(QObject* parent = 0);
33− Scope(QString const& id, QString const& name, bool visible, QObject* parent = 0, int categories = 20);
33+ Scope(QString const& id, QString const& name, bool favorite, QObject* parent = 0, int categories = 20);
34
34
35 /* getters */
35 /* getters */
36 QString id() const override;
36 QString id() const override;
@@ -38,9 +38,9 @@ public:
38 QString iconHint() const override;
38 QString iconHint() const override;
39 QString description() const override;
39 QString description() const override;
40 QString searchHint() const override;
40 QString searchHint() const override;
41− bool visible() const override;
42 QString shortcut() const override;
41 QString shortcut() const override;
43 bool searchInProgress() const override;
42 bool searchInProgress() const override;
43+ bool favorite() const override;
44 unity::shell::scopes::CategoriesInterface* categories() const override;
44 unity::shell::scopes::CategoriesInterface* categories() const override;
45 QString searchQuery() const override;
45 QString searchQuery() const override;
46 QString noResultsHint() const override;
46 QString noResultsHint() const override;
@@ -53,6 +53,7 @@ public:
53 void setNoResultsHint(const QString& hint) override;
53 void setNoResultsHint(const QString& hint) override;
54 void setFormFactor(const QString& form_factor) override;
54 void setFormFactor(const QString& form_factor) override;
55 void setActive(const bool) override;
55 void setActive(const bool) override;
56+ void setFavorite(const bool) override;
56 Q_INVOKABLE void setSearchInProgress(const bool inProg); // This is not invokable in the Interface, here for testing benefits
57 Q_INVOKABLE void setSearchInProgress(const bool inProg); // This is not invokable in the Interface, here for testing benefits
57
58
58 Q_INVOKABLE void activate(QVariant const& result) override;
59 Q_INVOKABLE void activate(QVariant const& result) override;
@@ -60,14 +61,20 @@ public:
60 Q_INVOKABLE void cancelActivation() override;
61 Q_INVOKABLE void cancelActivation() override;
61 Q_INVOKABLE void closeScope(unity::shell::scopes::ScopeInterface* scope) override;
62 Q_INVOKABLE void closeScope(unity::shell::scopes::ScopeInterface* scope) override;
62
63
63− QString currentDepartmentId() const override;
64+ QString currentNavigationId() const override;
64− bool hasDepartments() const override;
65+ bool hasNavigation() const override;
65− Q_INVOKABLE unity::shell::scopes::DepartmentInterface* getDepartment(const QString& id) override;
66+ QString currentAltNavigationId() const override;
67+ bool hasAltNavigation() const override;
68+ Q_INVOKABLE unity::shell::scopes::NavigationInterface* getNavigation(QString const& navigationId) override;
69+ Q_INVOKABLE unity::shell::scopes::NavigationInterface* getAltNavigation(QString const& altNavigationId) override;
66− Q_INVOKABLE void loadDepartment(const QString& id) override;
70+ Q_INVOKABLE void setNavigationState(const QString &navigationId, bool isAltNavigation) override;
67 Q_SIGNAL void performQuery(const QString& query) override;
71 Q_SIGNAL void performQuery(const QString& query) override;
68
72
73+ Status status() const override;
69 QVariantMap customizations() const override;
74 QVariantMap customizations() const override;
70
75
76+ Q_INVOKABLE void refresh() override;
77+
71protected:
78protected:
72
79
73 QString m_id;
80 QString m_id;
@@ -77,10 +84,11 @@ protected:
77 QString m_searchQuery;
84 QString m_searchQuery;
78 QString m_noResultsHint;
85 QString m_noResultsHint;
79 QString m_formFactor;
86 QString m_formFactor;
80− bool m_visible;
81 bool m_searching;
87 bool m_searching;
88+ bool m_favorite;
82 bool m_isActive;
89 bool m_isActive;
83− QString m_currentDeparment;
90+ QString m_currentNavigationId;
91+ QString m_currentAltNavigationId;
84
92
85 QString m_previewRendererName;
93 QString m_previewRendererName;
86
94
tests/mocks/Unity/fake_scopes.cpp+10−2
@@ -32,6 +32,11 @@ Scopes::Scopes(QObject *parent)
32 timer.setSingleShot(true);
32 timer.setSingleShot(true);
33 timer.setInterval(100);
33 timer.setInterval(100);
34 QObject::connect(&timer, SIGNAL(timeout()), this, SLOT(updateScopes()));
34 QObject::connect(&timer, SIGNAL(timeout()), this, SLOT(updateScopes()));
35+
36+ QObject::connect(this, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SIGNAL(countChanged()));
37+ QObject::connect(this, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SIGNAL(countChanged()));
38+ QObject::connect(this, SIGNAL(modelReset()), this, SIGNAL(countChanged()));
39+
35 load();
40 load();
36}
41}
37
42
@@ -92,8 +97,6 @@ QVariant Scopes::data(const QModelIndex& index, int role) const
92 return QVariant::fromValue(scope);
97 return QVariant::fromValue(scope);
93 } else if (role == Scopes::RoleId) {
98 } else if (role == Scopes::RoleId) {
94 return QVariant::fromValue(scope->id());
99 return QVariant::fromValue(scope->id());
95− } else if (role == Scopes::RoleVisible) {
96− return QVariant::fromValue(scope->visible());
97 } else if (role == Scopes::RoleTitle) {
100 } else if (role == Scopes::RoleTitle) {
98 return QVariant::fromValue(scope->name());
101 return QVariant::fromValue(scope->name());
99 } else {
102 } else {
@@ -125,6 +128,11 @@ bool Scopes::loaded() const
125 return m_loaded;
128 return m_loaded;
126}
129}
127
130
131+int Scopes::count() const
132+{
133+ return rowCount();
134+}
135+
128unity::shell::scopes::ScopeInterface* Scopes::overviewScope() const
136unity::shell::scopes::ScopeInterface* Scopes::overviewScope() const
129{
137{
130 return nullptr;
138 return nullptr;
tests/mocks/Unity/fake_scopes.h+1
@@ -50,6 +50,7 @@ public:
50 QModelIndex parent ( const QModelIndex & index ) const;
50 QModelIndex parent ( const QModelIndex & index ) const;
51
51
52 bool loaded() const override;
52 bool loaded() const override;
53+ int count() const override;
53 unity::shell::scopes::ScopeInterface* overviewScope() const override;
54 unity::shell::scopes::ScopeInterface* overviewScope() const override;
54
55
55private Q_SLOTS:
56private Q_SLOTS:
tests/mocks/Unity/fake_unity_plugin.cpp+2−2
@@ -22,7 +22,7 @@
22// local
22// local
23#include "fake_scopes.h"
23#include "fake_scopes.h"
24#include "fake_categories.h"
24#include "fake_categories.h"
25−#include "fake_department.h"
25+#include "fake_navigation.h"
26#include "fake_previewmodel.h"
26#include "fake_previewmodel.h"
27#include "fake_previewwidgetmodel.h"
27#include "fake_previewwidgetmodel.h"
28#include "fake_resultsmodel.h"
28#include "fake_resultsmodel.h"
@@ -43,7 +43,7 @@ void FakeUnityPlugin::registerTypes(const char *uri)
43 qmlRegisterType<Scopes>(uri, 0, 2, "Scopes");
43 qmlRegisterType<Scopes>(uri, 0, 2, "Scopes");
44 qmlRegisterType<Scope>(uri, 0, 2, "MockScope");
44 qmlRegisterType<Scope>(uri, 0, 2, "MockScope");
45 qmlRegisterUncreatableType<unity::shell::scopes::ScopeInterface>(uri, 0, 2, "Scope", "Can't create Scope object in QML.");
45 qmlRegisterUncreatableType<unity::shell::scopes::ScopeInterface>(uri, 0, 2, "Scope", "Can't create Scope object in QML.");
46− qmlRegisterUncreatableType<unity::shell::scopes::DepartmentInterface>(uri, 0, 2, "Department", "Can't create Department object in QML.");
46+ qmlRegisterUncreatableType<unity::shell::scopes::NavigationInterface>(uri, 0, 2, "Navigation", "Can't create Navigation object in QML.");
47 qmlRegisterUncreatableType<unity::shell::scopes::CategoriesInterface>(uri, 0, 2, "Categories", "Can't create Categories object in QML.");
47 qmlRegisterUncreatableType<unity::shell::scopes::CategoriesInterface>(uri, 0, 2, "Categories", "Can't create Categories object in QML.");
48 qmlRegisterUncreatableType<unity::shell::scopes::PreviewModelInterface>(uri, 0, 2, "PreviewModel", "Can't create new PreviewModel in QML. Get them from PreviewStack instance.");
48 qmlRegisterUncreatableType<unity::shell::scopes::PreviewModelInterface>(uri, 0, 2, "PreviewModel", "Can't create new PreviewModel in QML. Get them from PreviewStack instance.");
49 qmlRegisterUncreatableType<ResultsModel>(uri, 0, 2, "ResultsModel", "Can't create ResultsModel object in QML.");
49 qmlRegisterUncreatableType<ResultsModel>(uri, 0, 2, "ResultsModel", "Can't create ResultsModel object in QML.");
tests/qmltests/Dash/tst_Dash.qml+5−9
@@ -64,10 +64,10 @@ Item {
64
64
65 function get_scope_data() {
65 function get_scope_data() {
66 return [
66 return [
67− { tag: "MockScope1", visualIndex: 0, shouldBeVisible: true },
67+ { tag: "MockScope1", visualIndex: 0 },
68− { tag: "MockScope2", visualIndex: -1, shouldBeVisible: false },
68+ { tag: "MockScope2", visualIndex: 1 },
69− { tag: "clickscope", visualIndex: 1, shouldBeVisible: true },
69+ { tag: "clickscope", visualIndex: 2 },
70− { tag: "MockScope5", visualIndex: 2, shouldBeVisible: true },
70+ { tag: "MockScope5", visualIndex: 3 },
71 ]
71 ]
72 }
72 }
73
73
@@ -76,10 +76,6 @@ Item {
76 }
76 }
77
77
78 function test_show_scope_on_load(data) {
78 function test_show_scope_on_load(data) {
79− if (data.shouldBeVisible == false) {
80− console.log("Not testing " + data.tag + ": not visible");
81− return;
82− }
83 var dashContentList = findChild(dash, "dashContentList");
79 var dashContentList = findChild(dash, "dashContentList");
84
80
85 dash.showScopeOnLoaded = data.tag
81 dash.showScopeOnLoaded = data.tag
@@ -87,7 +83,7 @@ Item {
87 tryCompare(dashContentList, "count", 0);
83 tryCompare(dashContentList, "count", 0);
88 scopes.load();
84 scopes.load();
89 tryCompare(scopes, "loaded", true);
85 tryCompare(scopes, "loaded", true);
90− tryCompare(dashContentList, "count", 4);
86+ tryCompare(dashContentList, "count", 5);
91
87
92 verify(dashContentList != undefined);
88 verify(dashContentList != undefined);
93 tryCompare(dashContentList, "currentIndex", data.visualIndex);
89 tryCompare(dashContentList, "currentIndex", data.visualIndex);
tests/qmltests/Dash/tst_DashContent.qml+93−96
@@ -43,9 +43,6 @@ Item {
43 id: dashContent
43 id: dashContent
44 anchors.fill: parent
44 anchors.fill: parent
45
45
46− model: SortFilterProxyModel {
47− model: scopesModel
48− }
49 scopes : scopesModel
46 scopes : scopesModel
50 }
47 }
51
48
@@ -268,119 +265,119 @@ Item {
268 verify(carouselLV.tileWidth / carouselLV.tileHeight == cardTool.components["art"]["aspect-ratio"]);
265 verify(carouselLV.tileWidth / carouselLV.tileHeight == cardTool.components["art"]["aspect-ratio"]);
269 }
266 }
270
267
271− function test_departments() {
268+ function test_navigations() {
272 var dashContentList = findChild(dashContent, "dashContentList");
269 var dashContentList = findChild(dashContent, "dashContentList");
273− tryCompareFunction(function() { return findChild(dashContentList.currentItem, "dashDepartments") != null; }, true);
270+ tryCompareFunction(function() { return findChild(dashContentList.currentItem, "dashNavigation") != null; }, true);
274− var dashDepartments = findChild(dashContentList.currentItem, "dashDepartments");
271+ var dashNavigation = findChild(dashContentList.currentItem, "dashNavigation");
275− tryCompare(dashDepartments, "visible", true);
272+ tryCompare(dashNavigation, "visible", true);
276− compare(dashDepartments.showList, false);
273+ compare(dashNavigation.showList, false);
277− waitForRendering(dashDepartments);
274+ waitForRendering(dashNavigation);
278− mouseClick(dashDepartments, 0, 0);
275+ mouseClick(dashNavigation, 0, 0);
279− compare(dashDepartments.showList, true);
276+ compare(dashNavigation.showList, true);
280−
277+
281− var departmentListView = findChild(dashDepartments, "departmentListView");
278+ var navigationListView = findChild(dashNavigation, "navigationListView");
282− compare(departmentListView.count, 1);
279+ compare(navigationListView.count, 1);
283− tryCompare(departmentListView.currentItem.department, "loaded", true);
280+ tryCompare(navigationListView.currentItem.navigation, "loaded", true);
284−
281+
285− waitForRendering(departmentListView);
282+ waitForRendering(navigationListView);
286− waitForRendering(departmentListView.currentItem);
283+ waitForRendering(navigationListView.currentItem);
287−
284+
288− var allButton = findChild(dashDepartments, "allButton");
285+ var allButton = findChild(dashNavigation, "allButton");
289 compare(allButton.visible, false);
286 compare(allButton.visible, false);
290
287
291− var department = findChild(dashDepartments, "department0child3");
288+ var navigation = findChild(dashNavigation, "navigation0child3");
292− mouseClick(department, 0, 0);
289+ mouseClick(navigation, 0, 0);
293− compare(dashDepartments.showList, false);
290+ compare(dashNavigation.showList, false);
294− tryCompare(dashDepartments.currentDepartment, "departmentId", "middle3");
291+ tryCompare(dashNavigation.currentNavigation, "navigationId", "middle3");
295− tryCompare(departmentListView.currentItem.department, "departmentId", "root");
292+ tryCompare(navigationListView.currentItem.navigation, "navigationId", "root");
296
293
297− mouseClick(dashDepartments, 0, 0);
294+ mouseClick(dashNavigation, 0, 0);
298− compare(dashDepartments.showList, true);
295+ compare(dashNavigation.showList, true);
299− waitForRendering(departmentListView);
296+ waitForRendering(navigationListView);
300− waitForRendering(departmentListView.currentItem);
297+ waitForRendering(navigationListView.currentItem);
301 compare(allButton.visible, true);
298 compare(allButton.visible, true);
302
299
303 mouseClick(allButton, 0, 0);
300 mouseClick(allButton, 0, 0);
304− compare(dashDepartments.showList, false);
301+ compare(dashNavigation.showList, false);
305− tryCompare(dashDepartments.currentDepartment, "departmentId", "root");
302+ tryCompare(dashNavigation.currentNavigation, "navigationId", "root");
306− tryCompare(departmentListView.currentItem.department, "departmentId", "root");
303+ tryCompare(navigationListView.currentItem.navigation, "navigationId", "root");
307−
304+
308− mouseClick(dashDepartments, 0, 0);
305+ mouseClick(dashNavigation, 0, 0);
309− compare(dashDepartments.showList, true);
306+ compare(dashNavigation.showList, true);
310− waitForRendering(departmentListView);
307+ waitForRendering(navigationListView);
311− waitForRendering(departmentListView.currentItem);
308+ waitForRendering(navigationListView.currentItem);
312 compare(allButton.visible, false);
309 compare(allButton.visible, false);
313
310
314− department = findChild(dashDepartments, "department0child2");
311+ navigation = findChild(dashNavigation, "navigation0child2");
315− mouseClick(department, 0, 0);
312+ mouseClick(navigation, 0, 0);
316− compare(dashDepartments.showList, true);
313+ compare(dashNavigation.showList, true);
317− tryCompare(dashDepartments.currentDepartment, "departmentId", "middle2");
314+ tryCompare(dashNavigation.currentNavigation, "navigationId", "middle2");
318− tryCompare(departmentListView.currentItem.department, "departmentId", "middle2");
315+ tryCompare(navigationListView.currentItem.navigation, "navigationId", "middle2");
319
316
320− var departmentList1 = findChild(dashDepartments, "department1");
317+ var navigationList1 = findChild(dashNavigation, "navigation1");
321− allButton = findChild(departmentList1, "allButton");
318+ allButton = findChild(navigationList1, "allButton");
322− var backButton = findChild(findChild(departmentList1, "department1"), "backButton");
319+ var backButton = findChild(findChild(navigationList1, "navigation1"), "backButton");
323 compare(allButton.visible, true);
320 compare(allButton.visible, true);
324 compare(backButton.visible, true);
321 compare(backButton.visible, true);
325
322
326− tryCompare(departmentListView, "contentX", departmentList1.x);
323+ tryCompare(navigationListView, "contentX", navigationList1.x);
327− waitForRendering(departmentListView);
324+ waitForRendering(navigationListView);
328 mouseClick(allButton, 0, 0);
325 mouseClick(allButton, 0, 0);
329− compare(dashDepartments.showList, false);
326+ compare(dashNavigation.showList, false);
330− tryCompare(dashDepartments.currentDepartment, "departmentId", "middle2");
327+ tryCompare(dashNavigation.currentNavigation, "navigationId", "middle2");
331− tryCompare(departmentListView.currentItem.department, "departmentId", "middle2");
328+ tryCompare(navigationListView.currentItem.navigation, "navigationId", "middle2");
332−
329+
333− mouseClick(dashDepartments, 0, 0);
330+ mouseClick(dashNavigation, 0, 0);
334− compare(dashDepartments.showList, true);
331+ compare(dashNavigation.showList, true);
335− waitForRendering(departmentListView);
332+ waitForRendering(navigationListView);
336− waitForRendering(departmentListView.currentItem);
333+ waitForRendering(navigationListView.currentItem);
337 compare(allButton.visible, true);
334 compare(allButton.visible, true);
338 compare(backButton.visible, true);
335 compare(backButton.visible, true);
339
336
340− tryCompare(departmentList1.department, "loaded", true);
337+ tryCompare(navigationList1.navigation, "loaded", true);
341− department = findChild(dashDepartments, "department1child2");
338+ navigation = findChild(dashNavigation, "navigation1child2");
342− mouseClick(department, 0, 0);
339+ mouseClick(navigation, 0, 0);
343− compare(dashDepartments.showList, false);
340+ compare(dashNavigation.showList, false);
344− tryCompare(dashDepartments.currentDepartment, "departmentId", "childmiddle22");
341+ tryCompare(dashNavigation.currentNavigation, "navigationId", "childmiddle22");
345− tryCompare(departmentListView.currentItem.department, "departmentId", "middle2");
342+ tryCompare(navigationListView.currentItem.navigation, "navigationId", "middle2");
346−
343+
347− mouseClick(dashDepartments, 0, 0);
344+ mouseClick(dashNavigation, 0, 0);
348− compare(dashDepartments.showList, true);
345+ compare(dashNavigation.showList, true);
349− waitForRendering(departmentListView);
346+ waitForRendering(navigationListView);
350− waitForRendering(departmentListView.currentItem);
347+ waitForRendering(navigationListView.currentItem);
351−
348+
352− tryCompare(departmentList1.department, "loaded", true);
349+ tryCompare(navigationList1.navigation, "loaded", true);
353− department = findChild(dashDepartments, "department1child3");
350+ navigation = findChild(dashNavigation, "navigation1child3");
354− mouseClick(department, 0, 0);
351+ mouseClick(navigation, 0, 0);
355− compare(dashDepartments.showList, false);
352+ compare(dashNavigation.showList, false);
356− tryCompare(dashDepartments.currentDepartment, "departmentId", "childmiddle23");
353+ tryCompare(dashNavigation.currentNavigation, "navigationId", "childmiddle23");
357− tryCompare(departmentListView.currentItem.department, "departmentId", "middle2");
354+ tryCompare(navigationListView.currentItem.navigation, "navigationId", "middle2");
358−
355+
359− mouseClick(dashDepartments, 0, 0);
356+ mouseClick(dashNavigation, 0, 0);
360− compare(dashDepartments.showList, true);
357+ compare(dashNavigation.showList, true);
361− waitForRendering(departmentListView);
358+ waitForRendering(navigationListView);
362− waitForRendering(departmentListView.currentItem);
359+ waitForRendering(navigationListView.currentItem);
363 mouseClick(backButton, 0, 0);
360 mouseClick(backButton, 0, 0);
364
361
365− tryCompare(dashDepartments.currentDepartment, "departmentId", "root");
362+ tryCompare(dashNavigation.currentNavigation, "navigationId", "root");
366− tryCompare(departmentListView.currentItem.department, "departmentId", "root");
363+ tryCompare(navigationListView.currentItem.navigation, "navigationId", "root");
367− compare(dashDepartments.showList, true);
364+ compare(dashNavigation.showList, true);
368− mouseClick(dashDepartments, 0, 0);
365+ mouseClick(dashNavigation, 0, 0);
369− compare(dashDepartments.showList, false);
366+ compare(dashNavigation.showList, false);
370−
367+
371− mouseClick(dashDepartments, 0, 0);
368+ mouseClick(dashNavigation, 0, 0);
372− compare(dashDepartments.showList, true);
369+ compare(dashNavigation.showList, true);
373− tryCompare(departmentListView.currentItem.department, "loaded", true);
370+ tryCompare(navigationListView.currentItem.navigation, "loaded", true);
374− department = findChild(dashDepartments, "department0child2");
371+ navigation = findChild(dashNavigation, "navigation0child2");
375− mouseClick(department, 0, 0);
372+ mouseClick(navigation, 0, 0);
376− compare(dashDepartments.showList, true);
373+ compare(dashNavigation.showList, true);
377− departmentList1 = findChild(dashDepartments, "department1");
374+ navigationList1 = findChild(dashNavigation, "navigation1");
378− compare(departmentList1.department.loaded, false);
375+ compare(navigationList1.navigation.loaded, false);
379− tryCompare(dashDepartments.currentDepartment, "departmentId", "middle2");
376+ tryCompare(dashNavigation.currentNavigation, "navigationId", "middle2");
380− allButton = findChild(departmentList1, "allButton");
377+ allButton = findChild(navigationList1, "allButton");
381− tryCompare(dashDepartments.currentDepartment, "departmentId", "middle2");
378+ tryCompare(dashNavigation.currentNavigation, "navigationId", "middle2");
382 mouseClick(allButton, 0, 0);
379 mouseClick(allButton, 0, 0);
383− tryCompare(dashDepartments.currentDepartment, "departmentId", "middle2");
380+ tryCompare(dashNavigation.currentNavigation, "navigationId", "middle2");
384 }
381 }
385 }
382 }
386}
383}