Merge lp:~cimi/unity8/scope-settings into lp:unity8

Proposed by Andrea Cimitan
Status: Superseded
Proposed branch: lp:~cimi/unity8/scope-settings
Merge into: lp:unity8
Diff against target: 4142 lines (+2536/-286)
48 files modified
data/unity8-dash.conf (+1/-1)
plugins/Dash/CardCreator.js (+3/-2)
plugins/Dash/ScopeStyle.qml (+3/-2)
plugins/Dash/listviewwithpageheader.cpp (+10/-2)
plugins/Dash/listviewwithpageheader.h (+3/-0)
po/hu.po (+69/-33)
po/sl.po (+67/-31)
po/unity8.pot (+80/-44)
qml/Components/PageHeader.qml (+13/-1)
qml/Components/ResponsiveGridView.qml (+3/-3)
qml/Dash/CardCarousel.qml (+2/-2)
qml/Dash/CardGrid.qml (+13/-2)
qml/Dash/CardVerticalJournal.qml (+1/-1)
qml/Dash/Dash.qml (+171/-13)
qml/Dash/DashBackground.qml (+24/-0)
qml/Dash/DashContent.qml (+10/-4)
qml/Dash/DashRenderer.qml (+3/-1)
qml/Dash/GenericScopeView.qml (+168/-64)
qml/Dash/PreviewListView.qml (+4/-2)
qml/Dash/ScopeSettings/ScopeSetting.qml (+36/-0)
qml/Dash/ScopeSettings/ScopeSettingLabel.qml (+51/-0)
qml/Dash/ScopeSettings/ScopeSettingList.qml (+37/-0)
qml/Dash/ScopeSettings/ScopeSettingNumber.qml (+52/-0)
qml/Dash/ScopeSettings/ScopeSettingSwitch.qml (+48/-0)
qml/Dash/ScopeSettings/ScopeSettingWidgetFactory.qml (+55/-0)
qml/Dash/ScopeSettings/ScopeSettings.qml (+35/-0)
qml/Dash/ScopeSettingsPage.qml (+54/-0)
qml/Dash/ScopesOverview.qml (+533/-0)
qml/Dash/ScopesOverviewAll.qml (+54/-0)
qml/Dash/ScopesOverviewFavorites.qml (+73/-0)
qml/Dash/ScopesOverviewTab.qml (+74/-0)
tests/autopilot/unity8/shell/tests/test_emulators.py (+1/-1)
tests/mocks/Unity/CMakeLists.txt (+1/-0)
tests/mocks/Unity/fake_resultsmodel.cpp (+2/-1)
tests/mocks/Unity/fake_scope.cpp (+17/-5)
tests/mocks/Unity/fake_scope.h (+6/-3)
tests/mocks/Unity/fake_scopes.cpp (+46/-7)
tests/mocks/Unity/fake_scopes.h (+8/-1)
tests/mocks/Unity/fake_scopesoverview.cpp (+281/-0)
tests/mocks/Unity/fake_scopesoverview.h (+104/-0)
tests/plugins/Dash/cardcreator/2.res (+2/-2)
tests/plugins/Dash/cardcreator/5.res (+8/-6)
tests/plugins/Dash/cardcreator/7.res (+4/-4)
tests/plugins/Dash/tst_ScopeStyle.qml (+1/-1)
tests/qmltests/Dash/ScopeSettings/tst_ScopeSettingSwitch.qml (+33/-0)
tests/qmltests/Dash/tst_Dash.qml (+229/-7)
tests/qmltests/Dash/tst_DashContent.qml (+7/-6)
tests/qmltests/Dash/tst_GenericScopeView.qml (+36/-34)
To merge this branch: bzr merge lp:~cimi/unity8/scope-settings
Reviewer Review Type Date Requested Status
PS Jenkins bot (community) continuous-integration Needs Fixing
Unity Team Pending
Review via email: mp+229995@code.launchpad.net

Commit message

WIP but let's jenkins build the packages

Description of the change

WIP but let's jenkins build the packages

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
lp:~cimi/unity8/scope-settings updated
1112. By Andrea Cimitan

Merged dash overview

1113. By Andrea Cimitan

Remerged

1114. By Andrea Cimitan

Whitespaces

1115. By Andrea Cimitan

Add small tests

1116. By Andrea Cimitan

Added more tests

1117. By Andrea Cimitan

Merge trunk

1118. By Andrea Cimitan

Added fake settings

1119. By Andrea Cimitan

Moar fixes

1120. By Andrea Cimitan

Added tests for settings open close

1121. By Andrea Cimitan

Update ScopeSettingBoolean

1122. By Andrea Cimitan

Merge el trunko

1123. By Andrea Cimitan

Force focus properly

1124. By Andrea Cimitan

Merged horizontal list

1125. By Andrea Cimitan

Fix issue with initial count for preview

1126. By Andrea Cimitan

Should not feature overview in settings page

1127. By Andrea Cimitan

Workaround test

1128. By Andrea Cimitan

Properly fix tests

1129. By Andrea Cimitan

Better the string test too

1130. By Andrea Cimitan

Fix issue with preview in scope overview

1131. By Andrea Cimitan

[ CI bot ]
* Resync trunk
[ Michał Sawicz ]
* Fix dash overview test and prevent crash in mock ApplicationInfo's
  d'tor. tryCompareFunction didn't work because .item threw.
[ Michael Terry ]
* Bring dialer to front on incoming call even when device is locked
  (LP: #1354532)
[ CI bot ]
* Resync trunk
[ Michał Sawicz ]
* Use palette's baseText for text colour in dash.
* Update qmltypes definitions
* Move PageHeader out of qml/Components into qml/Dash
* Reshuffle and update dependencies
* Fix cardtool test and make card creator output debugging info on
  errors.
* Support previews for scopes in overview and hook up preview
  processing to activity indicator.
* Fix notifications indicator title
* Fix horizontal list activation and add test for it.
[ Ying-Chun Liu ]
* Add button colors and i18n for power off dialog. (LP: #1354506)
[ Mirco Müller ]
* Force plain-text rendering for summary- and body-text. (LP:
  #1335787)

1132. By Andrea Cimitan

More stuff addressed

1133. By Andrea Cimitan

Fixed tests

1134. By Andrea Cimitan

[ CI bot ]
* Resync trunk
[ Nick Dedekind ]
* Fixed CachedUnityMenuModel destruction unhinging indicators. (LP:
  #1328646)
[ Mirco Müller ]
* Temporarily disable any opacity-animation for notifications to
  unblock the train due to LP: 1354406. (LP: #1354406)

1135. By Andrea Cimitan

Removed previewShown and settingsShown properties

1136. By Andrea Cimitan

More changes requested

1137. By Andrea Cimitan

More fixes

1138. By Andrea Cimitan

More changes, still doesn't work

1139. By Andrea Cimitan

More changes to review

1140. By Andrea Cimitan

Fix tests with refactor

1141. By Andrea Cimitan

Another thing addressed

1142. By Andrea Cimitan

Changes according to review

1143. By Andrea Cimitan

merged trunk

1144. By Andrea Cimitan

More changes

1145. By Andrea Cimitan

Fixed tests

1146. By Andrea Cimitan

Test initialValue

1147. By Andrea Cimitan

Other approach to test

1148. By Andrea Cimitan

New approach to test

1149. By Andrea Cimitan

merged lp:~unity-team/unity8/alt_nav_support

Unmerged revisions

1149. By Andrea Cimitan

merged lp:~unity-team/unity8/alt_nav_support

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'data/unity8-dash.conf'
--- data/unity8-dash.conf 2014-07-29 11:35:10 +0000
+++ data/unity8-dash.conf 2014-08-08 20:44:52 +0000
@@ -13,7 +13,7 @@
13pre-start script13pre-start script
14 if [ -z "$UNITY_SCOPES_LIST" ]; then14 if [ -z "$UNITY_SCOPES_LIST" ]; then
15 # FIXME: remove once we have this in dconf15 # FIXME: remove once we have this in dconf
16 initctl set-env UNITY_SCOPES_LIST="scopes;clickscope;musicaggregator;videoaggregator"16 initctl set-env UNITY_SCOPES_LIST="clickscope;musicaggregator;videoaggregator"
17 fi17 fi
1818
19 initctl emit scope-ui-starting19 initctl emit scope-ui-starting
2020
=== modified file 'plugins/Dash/CardCreator.js'
--- plugins/Dash/CardCreator.js 2014-08-06 19:39:39 +0000
+++ plugins/Dash/CardCreator.js 2014-08-08 20:44:52 +0000
@@ -108,6 +108,7 @@
108 sourceComponent: ShaderEffect { \n\108 sourceComponent: ShaderEffect { \n\
109 id: overlay; \n\109 id: overlay; \n\
110 height: (fixedHeaderHeight > 0 ? fixedHeaderHeight : headerHeight) + units.gu(2); \n\110 height: (fixedHeaderHeight > 0 ? fixedHeaderHeight : headerHeight) + units.gu(2); \n\
111 property real luminance: 0.2126 * overlayColor.r + 0.7152 * overlayColor.g + 0.0722 * overlayColor.b; \n\
111 property color overlayColor: cardData && cardData["overlayColor"] || "#99000000"; \n\112 property color overlayColor: cardData && cardData["overlayColor"] || "#99000000"; \n\
112 property var source: ShaderEffectSource { \n\113 property var source: ShaderEffectSource { \n\
113 id: shaderSource; \n\114 id: shaderSource; \n\
@@ -446,13 +447,13 @@
446 mascotCode = kMascotImageCode.arg(anchors).arg(mascotImageVisible);447 mascotCode = kMascotImageCode.arg(anchors).arg(mascotImageVisible);
447 }448 }
448449
449 var summaryColorWithBackground = 'backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < 0.7 ? "white" : (root.scopeStyle ? root.scopeStyle.foreground : "grey")';450 var summaryColorWithBackground = 'backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < (root.scopeStyle ? root.scopeStyle.threshold : 0.7) ? (root.scopeStyle ? root.scopeStyle.light : "white") : (root.scopeStyle ? root.scopeStyle.dark : "grey")';
450451
451 var titleSubtitleCode = "";452 var titleSubtitleCode = "";
452 if (hasTitle) {453 if (hasTitle) {
453 var color;454 var color;
454 if (headerAsOverlay) {455 if (headerAsOverlay) {
455 color = '"white"';456 color = 'overlayLoader.item.luminance < (root.scopeStyle ? root.scopeStyle.threshold : 0.7) ? (root.scopeStyle ? root.scopeStyle.light : "white") : (root.scopeStyle ? root.scopeStyle.dark : "grey")';
456 } else if (hasSummary) {457 } else if (hasSummary) {
457 color = 'summary.color';458 color = 'summary.color';
458 } else if (hasBackground) {459 } else if (hasBackground) {
459460
=== modified file 'plugins/Dash/ScopeStyle.qml'
--- plugins/Dash/ScopeStyle.qml 2014-07-25 11:42:06 +0000
+++ plugins/Dash/ScopeStyle.qml 2014-08-08 20:44:52 +0000
@@ -49,9 +49,10 @@
4949
50 /*! \brief Luminance threshold for switching between fore and background color50 /*! \brief Luminance threshold for switching between fore and background color
5151
52 \note If background colour is not fully opaque, it's not taken into account.52 \note If background colour is not fully opaque, the defaultLightLuminance it's taken into account instead of it.
53 */53 */
54 readonly property real threshold: background.a !== 1.0 ? foregroundLuminance : (foregroundLuminance + backgroundLuminance) / 254 readonly property real threshold: background.a !== 1.0 ? (foregroundLuminance + d.defaultLightLuminance) / 2
55 : (foregroundLuminance + backgroundLuminance) / 2
5556
56 /*! \brief The lighter of foreground and background colors57 /*! \brief The lighter of foreground and background colors
5758
5859
=== modified file 'plugins/Dash/listviewwithpageheader.cpp'
--- plugins/Dash/listviewwithpageheader.cpp 2014-07-25 10:47:08 +0000
+++ plugins/Dash/listviewwithpageheader.cpp 2014-08-08 20:44:52 +0000
@@ -330,6 +330,11 @@
330 return m_topSectionItem ? m_topSectionItem->height() : 0;330 return m_topSectionItem ? m_topSectionItem->height() : 0;
331}331}
332332
333qreal ListViewWithPageHeader::headerItemShownHeight() const
334{
335 return m_headerItemShownHeight;
336}
337
333void ListViewWithPageHeader::positionAtBeginning()338void ListViewWithPageHeader::positionAtBeginning()
334{339{
335 if (m_delegateModel->count() <= 0)340 if (m_delegateModel->count() <= 0)
@@ -396,6 +401,7 @@
396 firstItem->setY(firstItem->y() - m_headerItemShownHeight);401 firstItem->setY(firstItem->y() - m_headerItemShownHeight);
397 layout();402 layout();
398 }403 }
404 Q_EMIT headerItemShownHeightChanged();
399 }405 }
400 m_contentYAnimation->setTo(to);406 m_contentYAnimation->setTo(to);
401 contentYAnimationType = ContentYAnimationShowHeader;407 contentYAnimationType = ContentYAnimationShowHeader;
@@ -544,6 +550,7 @@
544 m_headerItem->setY(-m_minYExtent);550 m_headerItem->setY(-m_minYExtent);
545 }551 }
546 }552 }
553 Q_EMIT headerItemShownHeightChanged();
547 } else {554 } else {
548 // Stick the header item to the top when dragging down555 // Stick the header item to the top when dragging down
549 m_headerItem->setY(contentY());556 m_headerItem->setY(contentY());
@@ -822,8 +829,8 @@
822 ListItem *nextItem = itemAtIndex(modelIndex + 1);829 ListItem *nextItem = itemAtIndex(modelIndex + 1);
823 if (nextItem) {830 if (nextItem) {
824 listItem->setY(nextItem->y() - listItem->height());831 listItem->setY(nextItem->y() - listItem->height());
825 } else if (modelIndex == 0 && m_headerItem) {832 } else if (modelIndex == 0) {
826 listItem->setY(m_headerItem->height());833 listItem->setY(m_headerItem ? m_headerItem->height() : 0);
827 } else if (!m_visibleItems.isEmpty()) {834 } else if (!m_visibleItems.isEmpty()) {
828 lostItem = true;835 lostItem = true;
829 }836 }
@@ -1096,6 +1103,7 @@
1096 m_headerItemShownHeight = qBound(static_cast<qreal>(0.), m_headerItemShownHeight, newHeaderHeight);1103 m_headerItemShownHeight = qBound(static_cast<qreal>(0.), m_headerItemShownHeight, newHeaderHeight);
1097 updateClipItem();1104 updateClipItem();
1098 adjustMinYExtent();1105 adjustMinYExtent();
1106 Q_EMIT headerItemShownHeightChanged();
1099 } else {1107 } else {
1100 if (oldHeaderY + oldHeaderHeight > contentY()) {1108 if (oldHeaderY + oldHeaderHeight > contentY()) {
1101 // If the header is shown because its position1109 // If the header is shown because its position
11021110
=== modified file 'plugins/Dash/listviewwithpageheader.h'
--- plugins/Dash/listviewwithpageheader.h 2014-06-12 14:08:54 +0000
+++ plugins/Dash/listviewwithpageheader.h 2014-08-08 20:44:52 +0000
@@ -53,6 +53,7 @@
53 Q_PROPERTY(QString sectionProperty READ sectionProperty WRITE setSectionProperty NOTIFY sectionPropertyChanged)53 Q_PROPERTY(QString sectionProperty READ sectionProperty WRITE setSectionProperty NOTIFY sectionPropertyChanged)
54 Q_PROPERTY(bool forceNoClip READ forceNoClip WRITE setForceNoClip NOTIFY forceNoClipChanged)54 Q_PROPERTY(bool forceNoClip READ forceNoClip WRITE setForceNoClip NOTIFY forceNoClipChanged)
55 Q_PROPERTY(int stickyHeaderHeight READ stickyHeaderHeight NOTIFY stickyHeaderHeightChanged)55 Q_PROPERTY(int stickyHeaderHeight READ stickyHeaderHeight NOTIFY stickyHeaderHeightChanged)
56 Q_PROPERTY(qreal headerItemShownHeight READ headerItemShownHeight NOTIFY headerItemShownHeightChanged)
5657
57 friend class ListViewWithPageHeaderTest;58 friend class ListViewWithPageHeaderTest;
58 friend class ListViewWithPageHeaderTestSection;59 friend class ListViewWithPageHeaderTestSection;
@@ -81,6 +82,7 @@
81 void setForceNoClip(bool noClip);82 void setForceNoClip(bool noClip);
8283
83 int stickyHeaderHeight() const;84 int stickyHeaderHeight() const;
85 qreal headerItemShownHeight() const;
8486
85 Q_INVOKABLE void positionAtBeginning();87 Q_INVOKABLE void positionAtBeginning();
86 Q_INVOKABLE void showHeader();88 Q_INVOKABLE void showHeader();
@@ -100,6 +102,7 @@
100 void sectionPropertyChanged();102 void sectionPropertyChanged();
101 void forceNoClipChanged();103 void forceNoClipChanged();
102 void stickyHeaderHeightChanged();104 void stickyHeaderHeightChanged();
105 void headerItemShownHeightChanged();
103106
104protected:107protected:
105 void componentComplete() override;108 void componentComplete() override;
106109
=== modified file 'po/hu.po'
--- po/hu.po 2014-08-08 07:07:33 +0000
+++ po/hu.po 2014-08-08 20:44:52 +0000
@@ -6,11 +6,12 @@
6msgid ""6msgid ""
7msgstr ""7msgstr ""
8"Project-Id-Version: unity\n"8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"9"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-07-11 14:59+0200\n"10"POT-Creation-Date: 2014-08-05 19:54+0200\n"
11"PO-Revision-Date: 2014-08-06 07:41+0000\n"11"PO-Revision-Date: 2014-08-06 07:41+0000\n"
12"Last-Translator: Richard Somlói <ricsipontaz@gmail.com>\n"12"Last-Translator: Richard Somlói <ricsipontaz@gmail.com>\n"
13"Language-Team: Hungarian <hu@li.org>\n"13"Language-Team: Hungarian <hu@li.org>\n"
14"Language: hu\n"
14"MIME-Version: 1.0\n"15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"17"Content-Transfer-Encoding: 8bit\n"
@@ -26,70 +27,86 @@
26msgid "Unpin shortcut"27msgid "Unpin shortcut"
27msgstr "Indító feloldása"28msgstr "Indító feloldása"
2829
30#: qml/Components/Dialogs.qml:142
31msgid "Are you sure you would like to turn power off?"
32msgstr ""
33
34#: qml/Components/Dialogs.qml:144
35msgid "Power off"
36msgstr ""
37
38#: qml/Components/Dialogs.qml:153
39msgid "Restart"
40msgstr ""
41
42#: qml/Components/Dialogs.qml:162
43msgid "Cancel"
44msgstr ""
45
29#: qml/Components/EdgeDemoOverlay.qml:15146#: qml/Components/EdgeDemoOverlay.qml:151
30msgid "Skip intro"47msgid "Skip intro"
31msgstr "A bemutató kihagyása"48msgstr "A bemutató kihagyása"
3249
33#: qml/Components/EdgeDemo.qml:11350#: qml/Components/EdgeDemo.qml:112
34msgid "Right edge"51msgid "Right edge"
35msgstr "Jobb szél"52msgstr "Jobb szél"
3653
37#: qml/Components/EdgeDemo.qml:11454#: qml/Components/EdgeDemo.qml:113
38msgid "Try swiping from the right edge to unlock the phone"55msgid "Try swiping from the right edge to unlock the phone"
39msgstr "A telefon feloldásához csúsztassa ujját a jobb szélről"56msgstr "A telefon feloldásához csúsztassa ujját a jobb szélről"
4057
41#: qml/Components/EdgeDemo.qml:14558#: qml/Components/EdgeDemo.qml:144
42msgid "Top edge"59msgid "Top edge"
43msgstr "Felső szél"60msgstr "Felső szél"
4461
45#: qml/Components/EdgeDemo.qml:14662#: qml/Components/EdgeDemo.qml:145
46msgid "Try swiping from the top edge to access the indicators"63msgid "Try swiping from the top edge to access the indicators"
47msgstr "Az állapotmenük eléréséhez csúsztassa ujját a felső szélről"64msgstr "Az állapotmenük eléréséhez csúsztassa ujját a felső szélről"
4865
49#: qml/Components/EdgeDemo.qml:17166#: qml/Components/EdgeDemo.qml:170
50msgid "Close"67msgid "Close"
51msgstr "Bezárás"68msgstr "Bezárás"
5269
53#: qml/Components/EdgeDemo.qml:17270#: qml/Components/EdgeDemo.qml:171
54msgid "Swipe up again to close the settings screen"71msgid "Swipe up again to close the settings screen"
55msgstr "A beállítások bezárásához csúsztassa ujját újra felfelé"72msgstr "A beállítások bezárásához csúsztassa ujját újra felfelé"
5673
57#: qml/Components/EdgeDemo.qml:19974#: qml/Components/EdgeDemo.qml:198
58msgid "Left edge"75msgid "Left edge"
59msgstr "Bal szél"76msgstr "Bal szél"
6077
61#: qml/Components/EdgeDemo.qml:20078#: qml/Components/EdgeDemo.qml:199
62msgid "Swipe from the left to reveal the launcher for quick access to apps"79msgid "Swipe from the left to reveal the launcher for quick access to apps"
63msgstr ""80msgstr ""
64"Csúsztassa ujját a bal szélről az indítón található alkalmazások gyors "81"Csúsztassa ujját a bal szélről az indítón található alkalmazások gyors "
65"eléréséhez"82"eléréséhez"
6683
67#: qml/Components/EdgeDemo.qml:22784#: qml/Components/EdgeDemo.qml:226
68msgid "Well done"85msgid "Well done"
69msgstr "Rendben"86msgstr "Rendben"
7087
71#: qml/Components/EdgeDemo.qml:22888#: qml/Components/EdgeDemo.qml:227
72msgid ""89msgid ""
73"You have now mastered the edge gestures and can start using the "90"You have now mastered the edge gestures and can start using the "
74"phone<br><br>Tap on the screen to start"91"phone<br><br>Tap on the screen to start"
75msgstr ""92msgstr ""
76"Elsajátította a gesztusokat, és megkezdheti a telefon "93"Elsajátította a gesztusokat, és megkezdheti a telefon használatát."
77"használatát.<br><br>Koppintson a képernyőre a kezdéshez."94"<br><br>Koppintson a képernyőre a kezdéshez."
7895
79#: qml/Components/Lockscreen.qml:21496#: qml/Components/Lockscreen.qml:220
80msgid "Emergency Call"97msgid "Emergency Call"
81msgstr "Vészhívás"98msgstr "Vészhívás"
8299
83#: qml/Components/Lockscreen.qml:231100#: qml/Components/Lockscreen.qml:243
84msgid "OK"101msgid "OK"
85msgstr "Ok"102msgstr "Ok"
86103
87#: qml/Components/PassphraseLockscreen.qml:60104#: qml/Components/PassphraseLockscreen.qml:62
88#, qt-format105#, qt-format
89msgid "Hello %1"106msgid "Hello %1"
90msgstr "Üdv %1"107msgstr "Üdv %1"
91108
92#: qml/Components/PassphraseLockscreen.qml:60109#: qml/Components/PassphraseLockscreen.qml:62
93msgid "Hello"110msgid "Hello"
94msgstr "Üdvözöljük"111msgstr "Üdvözöljük"
95112
@@ -105,15 +122,11 @@
105msgid "See more"122msgid "See more"
106msgstr "Több"123msgstr "Több"
107124
108#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330125#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:354
109msgid "See less"126msgid "See less"
110msgstr "Kevesebb"127msgstr "Kevesebb"
111128
112#: qml/Dash/DashApps.qml:37129#: qml/Dash/GenericScopeView.qml:354
113msgid "Recent"
114msgstr "Legutóbbi"
115
116#: qml/Dash/GenericScopeView.qml:330
117msgid "See all"130msgid "See all"
118msgstr "Összes megtekintése"131msgstr "Összes megtekintése"
119132
@@ -137,6 +150,26 @@
137msgid "Send"150msgid "Send"
138msgstr "Küldés"151msgstr "Küldés"
139152
153#: qml/Dash/ScopesOverview.qml:187
154msgid "Manage Dash"
155msgstr ""
156
157#: qml/Dash/ScopesOverview.qml:392
158msgid "Done"
159msgstr ""
160
161#: qml/Dash/ScopesOverview.qml:418
162msgid "Store"
163msgstr ""
164
165#: qml/Dash/ScopesOverviewTab.qml:36
166msgid "Favorites"
167msgstr ""
168
169#: qml/Dash/ScopesOverviewTab.qml:54
170msgid "All"
171msgstr ""
172
140#: qml/Greeter/Greeter.qml:157173#: qml/Greeter/Greeter.qml:157
141msgid "Swipe to unlock"174msgid "Swipe to unlock"
142msgstr "Csúsztasson a feloldáshoz"175msgstr "Csúsztasson a feloldáshoz"
@@ -161,11 +194,11 @@
161msgid "Speaking..."194msgid "Speaking..."
162msgstr "Beszéd…"195msgstr "Beszéd…"
163196
164#: qml/Notifications/NotificationMenuItemFactory.qml:91197#: qml/Notifications/NotificationMenuItemFactory.qml:97
165msgid "Show password"198msgid "Show password"
166msgstr "Jelszó megjelenítése"199msgstr "Jelszó megjelenítése"
167200
168#: qml/Notifications/NotificationMenuItemFactory.qml:103201#: qml/Notifications/NotificationMenuItemFactory.qml:112
169msgid "Please enter SIM PIN"202msgid "Please enter SIM PIN"
170msgstr "Adja meg a SIM PIN kódját"203msgstr "Adja meg a SIM PIN kódját"
171204
@@ -177,27 +210,27 @@
177msgid "Conference"210msgid "Conference"
178msgstr "Konferencia"211msgstr "Konferencia"
179212
180#: qml/Panel/Indicators/MenuItemFactory.qml:583213#: qml/Panel/Indicators/MenuItemFactory.qml:577
181msgid "In queue…"214msgid "In queue…"
182msgstr "Sorban…"215msgstr "Sorban…"
183216
184#: qml/Panel/Indicators/MenuItemFactory.qml:587217#: qml/Panel/Indicators/MenuItemFactory.qml:581
185msgid "Downloading"218msgid "Downloading"
186msgstr "Letöltés"219msgstr "Letöltés"
187220
188#: qml/Panel/Indicators/MenuItemFactory.qml:589221#: qml/Panel/Indicators/MenuItemFactory.qml:583
189msgid "Paused, tap to resume"222msgid "Paused, tap to resume"
190msgstr "Szüneteltetve, koppintson a folytatáshoz"223msgstr "Szüneteltetve, koppintson a folytatáshoz"
191224
192#: qml/Panel/Indicators/MenuItemFactory.qml:591225#: qml/Panel/Indicators/MenuItemFactory.qml:585
193msgid "Canceled"226msgid "Canceled"
194msgstr "Megszakítva"227msgstr "Megszakítva"
195228
196#: qml/Panel/Indicators/MenuItemFactory.qml:593229#: qml/Panel/Indicators/MenuItemFactory.qml:587
197msgid "Finished"230msgid "Finished"
198msgstr "Befejeződött"231msgstr "Befejeződött"
199232
200#: qml/Panel/Indicators/MenuItemFactory.qml:595233#: qml/Panel/Indicators/MenuItemFactory.qml:589
201msgid "Failed, tap to retry"234msgid "Failed, tap to retry"
202msgstr "Sikertelen, koppintson az újrapróbáláshoz"235msgstr "Sikertelen, koppintson az újrapróbáláshoz"
203236
@@ -205,7 +238,10 @@
205msgid "Search"238msgid "Search"
206msgstr "Keresés"239msgstr "Keresés"
207240
208#: qml/Shell.qml:359241#: qml/Shell.qml:256
209#, qt-format242#, qt-format
210msgid "Please enter %1"243msgid "Please enter %1"
211msgstr "Adja meg a következőt: %1"244msgstr "Adja meg a következőt: %1"
245
246#~ msgid "Recent"
247#~ msgstr "Legutóbbi"
212248
=== modified file 'po/sl.po'
--- po/sl.po 2014-08-08 07:07:33 +0000
+++ po/sl.po 2014-08-08 20:44:52 +0000
@@ -6,11 +6,12 @@
6msgid ""6msgid ""
7msgstr ""7msgstr ""
8"Project-Id-Version: unity\n"8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"9"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-07-11 14:59+0200\n"10"POT-Creation-Date: 2014-08-05 19:54+0200\n"
11"PO-Revision-Date: 2014-08-06 06:11+0000\n"11"PO-Revision-Date: 2014-08-06 06:11+0000\n"
12"Last-Translator: Damir Jerovšek <Unknown>\n"12"Last-Translator: Damir Jerovšek <Unknown>\n"
13"Language-Team: Slovenian <sl@li.org>\n"13"Language-Team: Slovenian <sl@li.org>\n"
14"Language: sl\n"
14"MIME-Version: 1.0\n"15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"17"Content-Transfer-Encoding: 8bit\n"
@@ -26,49 +27,65 @@
26msgid "Unpin shortcut"27msgid "Unpin shortcut"
27msgstr "Odpni bližnjico"28msgstr "Odpni bližnjico"
2829
30#: qml/Components/Dialogs.qml:142
31msgid "Are you sure you would like to turn power off?"
32msgstr ""
33
34#: qml/Components/Dialogs.qml:144
35msgid "Power off"
36msgstr ""
37
38#: qml/Components/Dialogs.qml:153
39msgid "Restart"
40msgstr ""
41
42#: qml/Components/Dialogs.qml:162
43msgid "Cancel"
44msgstr ""
45
29#: qml/Components/EdgeDemoOverlay.qml:15146#: qml/Components/EdgeDemoOverlay.qml:151
30msgid "Skip intro"47msgid "Skip intro"
31msgstr "Preskoči uvod"48msgstr "Preskoči uvod"
3249
33#: qml/Components/EdgeDemo.qml:11350#: qml/Components/EdgeDemo.qml:112
34msgid "Right edge"51msgid "Right edge"
35msgstr "Desni rob"52msgstr "Desni rob"
3653
37#: qml/Components/EdgeDemo.qml:11454#: qml/Components/EdgeDemo.qml:113
38msgid "Try swiping from the right edge to unlock the phone"55msgid "Try swiping from the right edge to unlock the phone"
39msgstr "Poskusite povleči od desnega roba za odklep telefona"56msgstr "Poskusite povleči od desnega roba za odklep telefona"
4057
41#: qml/Components/EdgeDemo.qml:14558#: qml/Components/EdgeDemo.qml:144
42msgid "Top edge"59msgid "Top edge"
43msgstr "Zgornji rob"60msgstr "Zgornji rob"
4461
45#: qml/Components/EdgeDemo.qml:14662#: qml/Components/EdgeDemo.qml:145
46msgid "Try swiping from the top edge to access the indicators"63msgid "Try swiping from the top edge to access the indicators"
47msgstr "Poskusite povleči od zgornjega roba za dostop do kazalnikov"64msgstr "Poskusite povleči od zgornjega roba za dostop do kazalnikov"
4865
49#: qml/Components/EdgeDemo.qml:17166#: qml/Components/EdgeDemo.qml:170
50msgid "Close"67msgid "Close"
51msgstr "Zapri"68msgstr "Zapri"
5269
53#: qml/Components/EdgeDemo.qml:17270#: qml/Components/EdgeDemo.qml:171
54msgid "Swipe up again to close the settings screen"71msgid "Swipe up again to close the settings screen"
55msgstr "Povlecite ponovno navzgor za zaprtje zaslona z nastavitvami"72msgstr "Povlecite ponovno navzgor za zaprtje zaslona z nastavitvami"
5673
57#: qml/Components/EdgeDemo.qml:19974#: qml/Components/EdgeDemo.qml:198
58msgid "Left edge"75msgid "Left edge"
59msgstr "Levi rob"76msgstr "Levi rob"
6077
61#: qml/Components/EdgeDemo.qml:20078#: qml/Components/EdgeDemo.qml:199
62msgid "Swipe from the left to reveal the launcher for quick access to apps"79msgid "Swipe from the left to reveal the launcher for quick access to apps"
63msgstr ""80msgstr ""
64"Poskusite povleči od leve za razkritje zaganjalnika za hiter dostop do "81"Poskusite povleči od leve za razkritje zaganjalnika za hiter dostop do "
65"programov"82"programov"
6683
67#: qml/Components/EdgeDemo.qml:22784#: qml/Components/EdgeDemo.qml:226
68msgid "Well done"85msgid "Well done"
69msgstr "Odlično"86msgstr "Odlično"
7087
71#: qml/Components/EdgeDemo.qml:22888#: qml/Components/EdgeDemo.qml:227
72msgid ""89msgid ""
73"You have now mastered the edge gestures and can start using the "90"You have now mastered the edge gestures and can start using the "
74"phone<br><br>Tap on the screen to start"91"phone<br><br>Tap on the screen to start"
@@ -76,20 +93,20 @@
76"Sedaj, ko ste osvojili poteze robov, lahko začnete uporabljati "93"Sedaj, ko ste osvojili poteze robov, lahko začnete uporabljati "
77"telefon<br><br>Tapnite na zaslon za začetek"94"telefon<br><br>Tapnite na zaslon za začetek"
7895
79#: qml/Components/Lockscreen.qml:21496#: qml/Components/Lockscreen.qml:220
80msgid "Emergency Call"97msgid "Emergency Call"
81msgstr "Klic v sili"98msgstr "Klic v sili"
8299
83#: qml/Components/Lockscreen.qml:231100#: qml/Components/Lockscreen.qml:243
84msgid "OK"101msgid "OK"
85msgstr "V REDU"102msgstr "V REDU"
86103
87#: qml/Components/PassphraseLockscreen.qml:60104#: qml/Components/PassphraseLockscreen.qml:62
88#, qt-format105#, qt-format
89msgid "Hello %1"106msgid "Hello %1"
90msgstr "Pozdravljeni, %1"107msgstr "Pozdravljeni, %1"
91108
92#: qml/Components/PassphraseLockscreen.qml:60109#: qml/Components/PassphraseLockscreen.qml:62
93msgid "Hello"110msgid "Hello"
94msgstr "Pozdravljeni"111msgstr "Pozdravljeni"
95112
@@ -105,15 +122,11 @@
105msgid "See more"122msgid "See more"
106msgstr "Pokaži več"123msgstr "Pokaži več"
107124
108#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330125#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:354
109msgid "See less"126msgid "See less"
110msgstr "Pokaži manj"127msgstr "Pokaži manj"
111128
112#: qml/Dash/DashApps.qml:37129#: qml/Dash/GenericScopeView.qml:354
113msgid "Recent"
114msgstr "Nedavno"
115
116#: qml/Dash/GenericScopeView.qml:330
117msgid "See all"130msgid "See all"
118msgstr "Ogled vsega"131msgstr "Ogled vsega"
119132
@@ -137,6 +150,26 @@
137msgid "Send"150msgid "Send"
138msgstr "Pošlji"151msgstr "Pošlji"
139152
153#: qml/Dash/ScopesOverview.qml:187
154msgid "Manage Dash"
155msgstr ""
156
157#: qml/Dash/ScopesOverview.qml:392
158msgid "Done"
159msgstr ""
160
161#: qml/Dash/ScopesOverview.qml:418
162msgid "Store"
163msgstr ""
164
165#: qml/Dash/ScopesOverviewTab.qml:36
166msgid "Favorites"
167msgstr ""
168
169#: qml/Dash/ScopesOverviewTab.qml:54
170msgid "All"
171msgstr ""
172
140#: qml/Greeter/Greeter.qml:157173#: qml/Greeter/Greeter.qml:157
141msgid "Swipe to unlock"174msgid "Swipe to unlock"
142msgstr "Podrsajte za odklenitev"175msgstr "Podrsajte za odklenitev"
@@ -161,11 +194,11 @@
161msgid "Speaking..."194msgid "Speaking..."
162msgstr "Govorjenje ..."195msgstr "Govorjenje ..."
163196
164#: qml/Notifications/NotificationMenuItemFactory.qml:91197#: qml/Notifications/NotificationMenuItemFactory.qml:97
165msgid "Show password"198msgid "Show password"
166msgstr "Pokaži geslo"199msgstr "Pokaži geslo"
167200
168#: qml/Notifications/NotificationMenuItemFactory.qml:103201#: qml/Notifications/NotificationMenuItemFactory.qml:112
169msgid "Please enter SIM PIN"202msgid "Please enter SIM PIN"
170msgstr "Vnesite PIN kartice SIM"203msgstr "Vnesite PIN kartice SIM"
171204
@@ -177,27 +210,27 @@
177msgid "Conference"210msgid "Conference"
178msgstr "Konferenca"211msgstr "Konferenca"
179212
180#: qml/Panel/Indicators/MenuItemFactory.qml:583213#: qml/Panel/Indicators/MenuItemFactory.qml:577
181msgid "In queue…"214msgid "In queue…"
182msgstr "V vrsti ..."215msgstr "V vrsti ..."
183216
184#: qml/Panel/Indicators/MenuItemFactory.qml:587217#: qml/Panel/Indicators/MenuItemFactory.qml:581
185msgid "Downloading"218msgid "Downloading"
186msgstr "Prejemanje"219msgstr "Prejemanje"
187220
188#: qml/Panel/Indicators/MenuItemFactory.qml:589221#: qml/Panel/Indicators/MenuItemFactory.qml:583
189msgid "Paused, tap to resume"222msgid "Paused, tap to resume"
190msgstr "Premor, tapnite za nadaljevanje"223msgstr "Premor, tapnite za nadaljevanje"
191224
192#: qml/Panel/Indicators/MenuItemFactory.qml:591225#: qml/Panel/Indicators/MenuItemFactory.qml:585
193msgid "Canceled"226msgid "Canceled"
194msgstr "Preklicano"227msgstr "Preklicano"
195228
196#: qml/Panel/Indicators/MenuItemFactory.qml:593229#: qml/Panel/Indicators/MenuItemFactory.qml:587
197msgid "Finished"230msgid "Finished"
198msgstr "Končano"231msgstr "Končano"
199232
200#: qml/Panel/Indicators/MenuItemFactory.qml:595233#: qml/Panel/Indicators/MenuItemFactory.qml:589
201msgid "Failed, tap to retry"234msgid "Failed, tap to retry"
202msgstr "Spodletelo, tapnite za ponovni poskus"235msgstr "Spodletelo, tapnite za ponovni poskus"
203236
@@ -205,7 +238,10 @@
205msgid "Search"238msgid "Search"
206msgstr "Iskanje"239msgstr "Iskanje"
207240
208#: qml/Shell.qml:359241#: qml/Shell.qml:256
209#, qt-format242#, qt-format
210msgid "Please enter %1"243msgid "Please enter %1"
211msgstr "Vnesite %1"244msgstr "Vnesite %1"
245
246#~ msgid "Recent"
247#~ msgstr "Nedavno"
212248
=== modified file 'po/unity8.pot'
--- po/unity8.pot 2014-07-11 14:20:12 +0000
+++ po/unity8.pot 2014-08-08 20:44:52 +0000
@@ -8,7 +8,7 @@
8msgstr ""8msgstr ""
9"Project-Id-Version: unity8\n"9"Project-Id-Version: unity8\n"
10"Report-Msgid-Bugs-To: \n"10"Report-Msgid-Bugs-To: \n"
11"POT-Creation-Date: 2014-07-11 14:59+0200\n"11"POT-Creation-Date: 2014-08-08 11:17+0200\n"
12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14"Language-Team: LANGUAGE <LL@li.org>\n"14"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -26,66 +26,82 @@
26msgid "Unpin shortcut"26msgid "Unpin shortcut"
27msgstr ""27msgstr ""
2828
29#: qml/Components/Dialogs.qml:142
30msgid "Are you sure you would like to turn power off?"
31msgstr ""
32
33#: qml/Components/Dialogs.qml:144
34msgid "Power off"
35msgstr ""
36
37#: qml/Components/Dialogs.qml:153
38msgid "Restart"
39msgstr ""
40
41#: qml/Components/Dialogs.qml:162
42msgid "Cancel"
43msgstr ""
44
29#: qml/Components/EdgeDemoOverlay.qml:15145#: qml/Components/EdgeDemoOverlay.qml:151
30msgid "Skip intro"46msgid "Skip intro"
31msgstr ""47msgstr ""
3248
49#: qml/Components/EdgeDemo.qml:112
50msgid "Right edge"
51msgstr ""
52
33#: qml/Components/EdgeDemo.qml:11353#: qml/Components/EdgeDemo.qml:113
34msgid "Right edge"
35msgstr ""
36
37#: qml/Components/EdgeDemo.qml:114
38msgid "Try swiping from the right edge to unlock the phone"54msgid "Try swiping from the right edge to unlock the phone"
39msgstr ""55msgstr ""
4056
57#: qml/Components/EdgeDemo.qml:144
58msgid "Top edge"
59msgstr ""
60
41#: qml/Components/EdgeDemo.qml:14561#: qml/Components/EdgeDemo.qml:145
42msgid "Top edge"
43msgstr ""
44
45#: qml/Components/EdgeDemo.qml:146
46msgid "Try swiping from the top edge to access the indicators"62msgid "Try swiping from the top edge to access the indicators"
47msgstr ""63msgstr ""
4864
65#: qml/Components/EdgeDemo.qml:170
66msgid "Close"
67msgstr ""
68
49#: qml/Components/EdgeDemo.qml:17169#: qml/Components/EdgeDemo.qml:171
50msgid "Close"
51msgstr ""
52
53#: qml/Components/EdgeDemo.qml:172
54msgid "Swipe up again to close the settings screen"70msgid "Swipe up again to close the settings screen"
55msgstr ""71msgstr ""
5672
73#: qml/Components/EdgeDemo.qml:198
74msgid "Left edge"
75msgstr ""
76
57#: qml/Components/EdgeDemo.qml:19977#: qml/Components/EdgeDemo.qml:199
58msgid "Left edge"
59msgstr ""
60
61#: qml/Components/EdgeDemo.qml:200
62msgid "Swipe from the left to reveal the launcher for quick access to apps"78msgid "Swipe from the left to reveal the launcher for quick access to apps"
63msgstr ""79msgstr ""
6480
81#: qml/Components/EdgeDemo.qml:226
82msgid "Well done"
83msgstr ""
84
65#: qml/Components/EdgeDemo.qml:22785#: qml/Components/EdgeDemo.qml:227
66msgid "Well done"
67msgstr ""
68
69#: qml/Components/EdgeDemo.qml:228
70msgid ""86msgid ""
71"You have now mastered the edge gestures and can start using the "87"You have now mastered the edge gestures and can start using the "
72"phone<br><br>Tap on the screen to start"88"phone<br><br>Tap on the screen to start"
73msgstr ""89msgstr ""
7490
75#: qml/Components/Lockscreen.qml:21491#: qml/Components/Lockscreen.qml:220
76msgid "Emergency Call"92msgid "Emergency Call"
77msgstr ""93msgstr ""
7894
79#: qml/Components/Lockscreen.qml:23195#: qml/Components/Lockscreen.qml:243
80msgid "OK"96msgid "OK"
81msgstr ""97msgstr ""
8298
83#: qml/Components/PassphraseLockscreen.qml:6099#: qml/Components/PassphraseLockscreen.qml:62
84#, qt-format100#, qt-format
85msgid "Hello %1"101msgid "Hello %1"
86msgstr ""102msgstr ""
87103
88#: qml/Components/PassphraseLockscreen.qml:60104#: qml/Components/PassphraseLockscreen.qml:62
89msgid "Hello"105msgid "Hello"
90msgstr ""106msgstr ""
91107
@@ -97,19 +113,11 @@
97msgid "DONE"113msgid "DONE"
98msgstr ""114msgstr ""
99115
100#: qml/Components/SeeMore.qml:35116#: qml/Dash/GenericScopeView.qml:358
101msgid "See more"
102msgstr ""
103
104#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
105msgid "See less"117msgid "See less"
106msgstr ""118msgstr ""
107119
108#: qml/Dash/DashApps.qml:37120#: qml/Dash/GenericScopeView.qml:358
109msgid "Recent"
110msgstr ""
111
112#: qml/Dash/GenericScopeView.qml:330
113msgid "See all"121msgid "See all"
114msgstr ""122msgstr ""
115123
@@ -133,6 +141,26 @@
133msgid "Send"141msgid "Send"
134msgstr ""142msgstr ""
135143
144#: qml/Dash/ScopesOverview.qml:200
145msgid "Manage Dash"
146msgstr ""
147
148#: qml/Dash/ScopesOverview.qml:405
149msgid "Done"
150msgstr ""
151
152#: qml/Dash/ScopesOverview.qml:431
153msgid "Store"
154msgstr ""
155
156#: qml/Dash/ScopesOverviewTab.qml:36
157msgid "Favorites"
158msgstr ""
159
160#: qml/Dash/ScopesOverviewTab.qml:54
161msgid "All"
162msgstr ""
163
136#: qml/Greeter/Greeter.qml:157164#: qml/Greeter/Greeter.qml:157
137msgid "Swipe to unlock"165msgid "Swipe to unlock"
138msgstr ""166msgstr ""
@@ -157,11 +185,11 @@
157msgid "Speaking..."185msgid "Speaking..."
158msgstr ""186msgstr ""
159187
160#: qml/Notifications/NotificationMenuItemFactory.qml:91188#: qml/Notifications/NotificationMenuItemFactory.qml:100
161msgid "Show password"189msgid "Show password"
162msgstr ""190msgstr ""
163191
164#: qml/Notifications/NotificationMenuItemFactory.qml:103192#: qml/Notifications/NotificationMenuItemFactory.qml:115
165msgid "Please enter SIM PIN"193msgid "Please enter SIM PIN"
166msgstr ""194msgstr ""
167195
@@ -173,35 +201,43 @@
173msgid "Conference"201msgid "Conference"
174msgstr ""202msgstr ""
175203
176#: qml/Panel/Indicators/MenuItemFactory.qml:583204#: qml/Panel/Indicators/MenuItemFactory.qml:651
177msgid "In queue…"205msgid "In queue…"
178msgstr ""206msgstr ""
179207
180#: qml/Panel/Indicators/MenuItemFactory.qml:587208#: qml/Panel/Indicators/MenuItemFactory.qml:655
181msgid "Downloading"209msgid "Downloading"
182msgstr ""210msgstr ""
183211
184#: qml/Panel/Indicators/MenuItemFactory.qml:589212#: qml/Panel/Indicators/MenuItemFactory.qml:657
185msgid "Paused, tap to resume"213msgid "Paused, tap to resume"
186msgstr ""214msgstr ""
187215
188#: qml/Panel/Indicators/MenuItemFactory.qml:591216#: qml/Panel/Indicators/MenuItemFactory.qml:659
189msgid "Canceled"217msgid "Canceled"
190msgstr ""218msgstr ""
191219
192#: qml/Panel/Indicators/MenuItemFactory.qml:593220#: qml/Panel/Indicators/MenuItemFactory.qml:661
193msgid "Finished"221msgid "Finished"
194msgstr ""222msgstr ""
195223
196#: qml/Panel/Indicators/MenuItemFactory.qml:595224#: qml/Panel/Indicators/MenuItemFactory.qml:663
197msgid "Failed, tap to retry"225msgid "Failed, tap to retry"
198msgstr ""226msgstr ""
199227
228#: qml/Panel/Indicators/ModemInfoItem.qml:105
229msgid "Unlock SIM"
230msgstr ""
231
232#: qml/Panel/Indicators/RoamingIndication.qml:27
233msgid "Roaming"
234msgstr ""
235
200#: qml/Panel/SearchIndicator.qml:27236#: qml/Panel/SearchIndicator.qml:27
201msgid "Search"237msgid "Search"
202msgstr ""238msgstr ""
203239
204#: qml/Shell.qml:359240#: qml/Shell.qml:256
205#, qt-format241#, qt-format
206msgid "Please enter %1"242msgid "Please enter %1"
207msgstr ""243msgstr ""
208244
=== modified file 'qml/Components/PageHeader.qml'
--- qml/Components/PageHeader.qml 2014-08-06 19:39:30 +0000
+++ qml/Components/PageHeader.qml 2014-08-08 20:44:52 +0000
@@ -24,14 +24,16 @@
24Item {24Item {
25 id: root25 id: root
26 objectName: "pageHeader"26 objectName: "pageHeader"
27 implicitHeight: headerContainer.height + units.gu(2) + bottomContainer.height27 implicitHeight: headerContainer.height + bottomContainer.height + (showSignatureLine ? units.gu(2) : 0)
2828
29 property bool showBackButton: false29 property bool showBackButton: false
30 property string title30 property string title
3131
32 property bool searchEntryEnabled: false32 property bool searchEntryEnabled: false
33 property bool settingsEnabled: false
33 property ListModel searchHistory: SearchHistoryModel34 property ListModel searchHistory: SearchHistoryModel
34 property alias searchQuery: searchTextField.text35 property alias searchQuery: searchTextField.text
36 property alias showSignatureLine: bottomBorder.visible
3537
36 property alias bottomItem: bottomContainer.children38 property alias bottomItem: bottomContainer.children
37 property int paginationCount: 039 property int paginationCount: 0
@@ -44,6 +46,8 @@
4446
45 signal backClicked()47 signal backClicked()
4648
49 signal settingsClicked()
50
47 onScopeStyleChanged: refreshLogo()51 onScopeStyleChanged: refreshLogo()
48 onSearchQueryChanged: {52 onSearchQueryChanged: {
49 // Make sure we are at the search page if the search query changes behind our feet53 // Make sure we are at the search page if the search query changes behind our feet
@@ -251,12 +255,20 @@
251255
252 actions: [256 actions: [
253 Action {257 Action {
258 objectName: "search"
254 iconName: "search"259 iconName: "search"
255 visible: root.searchEntryEnabled260 visible: root.searchEntryEnabled
256 onTriggered: {261 onTriggered: {
257 headerContainer.showSearch = true;262 headerContainer.showSearch = true;
258 searchTextField.forceActiveFocus();263 searchTextField.forceActiveFocus();
259 }264 }
265 },
266 Action {
267 iconName: "settings"
268 visible: root.settingsEnabled
269 onTriggered: {
270 root.settingsClicked()
271 }
260 }272 }
261 ]273 ]
262 }274 }
263275
=== modified file 'qml/Components/ResponsiveGridView.qml'
--- qml/Components/ResponsiveGridView.qml 2014-07-11 12:12:50 +0000
+++ qml/Components/ResponsiveGridView.qml 2014-08-08 20:44:52 +0000
@@ -34,7 +34,7 @@
34 readonly property int cellWidth: gridView.cellWidth34 readonly property int cellWidth: gridView.cellWidth
35 readonly property int cellHeight: gridView.cellHeight35 readonly property int cellHeight: gridView.cellHeight
36 readonly property int totalContentHeight: {36 readonly property int totalContentHeight: {
37 return contentHeightForRows(Math.ceil(gridView.model.count / columns))37 return contentHeightForRows(Math.ceil(gridView.model.count / columns), cellHeight)
38 }38 }
39 property alias interactive: gridView.interactive39 property alias interactive: gridView.interactive
40 readonly property alias flicking: gridView.flicking40 readonly property alias flicking: gridView.flicking
@@ -47,8 +47,8 @@
47 property alias cacheBuffer: gridView.cacheBuffer47 property alias cacheBuffer: gridView.cacheBuffer
48 readonly property alias currentItem: gridView.currentItem48 readonly property alias currentItem: gridView.currentItem
4949
50 function contentHeightForRows(rows) {50 function contentHeightForRows(rows, height) {
51 return rows * cellHeight;51 return rows * height
52 }52 }
5353
54 GridView {54 GridView {
5555
=== removed directory 'qml/Dash/Apps'
=== modified file 'qml/Dash/CardCarousel.qml'
--- qml/Dash/CardCarousel.qml 2014-07-11 12:13:08 +0000
+++ qml/Dash/CardCarousel.qml 2014-08-08 20:44:52 +0000
@@ -48,8 +48,8 @@
4848
49 objectName: "carouselDelegate" + index49 objectName: "carouselDelegate" + index
5050
51 function clicked() { cardCarousel.clicked(index, model.result) }51 function clicked() { cardCarousel.clicked(index, model.result, loader.item, model) }
52 function pressAndHold() { cardCarousel.pressAndHold(index, model.result) }52 function pressAndHold() { cardCarousel.pressAndHold(index) }
5353
54 sourceComponent: cardTool.cardComponent54 sourceComponent: cardTool.cardComponent
55 onLoaded: {55 onLoaded: {
5656
=== modified file 'qml/Dash/CardGrid.qml'
--- qml/Dash/CardGrid.qml 2014-07-18 11:35:47 +0000
+++ qml/Dash/CardGrid.qml 2014-08-08 20:44:52 +0000
@@ -26,10 +26,20 @@
26 }26 }
2727
28 expandedHeight: grid.totalContentHeight28 expandedHeight: grid.totalContentHeight
29 collapsedHeight: Math.min(grid.contentHeightForRows(collapsedRows), expandedHeight)29 collapsedHeight: Math.min(grid.contentHeightForRows(collapsedRows, grid.cellHeight), expandedHeight)
30 collapsedItemCount: collapsedRows * grid.columns30 collapsedItemCount: collapsedRows * grid.columns
31 originY: grid.originY31 originY: grid.originY
3232
33 function cardPosition(index) {
34 var pos = {};
35 var row = Math.floor(index / grid.columns);
36 var column = index % grid.columns;
37 // Bit sad this is not symmetrical
38 pos.x = column * grid.cellWidth + grid.margins;
39 pos.y = row * grid.cellHeight;
40 return pos;
41 }
42
33 ResponsiveGridView {43 ResponsiveGridView {
34 id: grid44 id: grid
35 anchors.fill: parent45 anchors.fill: parent
@@ -53,6 +63,7 @@
53 item.objectName = "delegate" + index;63 item.objectName = "delegate" + index;
54 item.width = Qt.binding(function() { return cardTool.cardWidth; });64 item.width = Qt.binding(function() { return cardTool.cardWidth; });
55 item.height = Qt.binding(function() { return cardTool.cardHeight; });65 item.height = Qt.binding(function() { return cardTool.cardHeight; });
66 item.fixedHeaderHeight = Qt.binding(function() { return cardTool.headerHeight; });
56 item.fixedArtShapeSize = Qt.binding(function() { return cardTool.artShapeSize; });67 item.fixedArtShapeSize = Qt.binding(function() { return cardTool.artShapeSize; });
57 item.cardData = Qt.binding(function() { return model; });68 item.cardData = Qt.binding(function() { return model; });
58 item.template = Qt.binding(function() { return cardTool.template; });69 item.template = Qt.binding(function() { return cardTool.template; });
@@ -62,7 +73,7 @@
62 }73 }
63 Connections {74 Connections {
64 target: loader.item75 target: loader.item
65 onClicked: root.clicked(index, result)76 onClicked: root.clicked(index, result, loader.item, model)
66 onPressAndHold: root.pressAndHold(index)77 onPressAndHold: root.pressAndHold(index)
67 }78 }
68 }79 }
6980
=== modified file 'qml/Dash/CardVerticalJournal.qml'
--- qml/Dash/CardVerticalJournal.qml 2014-07-22 12:17:34 +0000
+++ qml/Dash/CardVerticalJournal.qml 2014-08-08 20:44:52 +0000
@@ -61,7 +61,7 @@
61 }61 }
62 Connections {62 Connections {
63 target: loader.item63 target: loader.item
64 onClicked: root.clicked(index, result)64 onClicked: root.clicked(index, result, loader.item, model)
65 onPressAndHold: root.pressAndHold(index)65 onPressAndHold: root.pressAndHold(index)
66 }66 }
67 }67 }
6868
=== modified file 'qml/Dash/Dash.qml'
--- qml/Dash/Dash.qml 2014-08-06 19:39:30 +0000
+++ qml/Dash/Dash.qml 2014-08-08 20:44:52 +0000
@@ -16,6 +16,7 @@
1616
17import QtQuick 2.217import QtQuick 2.2
18import Ubuntu.Components 0.118import Ubuntu.Components 0.1
19import Ubuntu.Gestures 0.1
19import Unity 0.220import Unity 0.2
20import Utils 0.121import Utils 0.1
21import Unity.DashCommunicator 0.122import Unity.DashCommunicator 0.1
@@ -73,26 +74,104 @@
73 id: scopes74 id: scopes
74 }75 }
7576
76 Image {77 QtObject {
78 id: overviewController
79 objectName: "overviewController"
80
81 property alias enableAnimation: progressAnimation.enabled
82 property real progress: 0
83 Behavior on progress {
84 id: progressAnimation
85 UbuntuNumberAnimation { }
86 }
87 }
88
89 ScopesOverview {
90 id: scopesOverview
91 objectName: "scopesOverview"
77 anchors.fill: parent92 anchors.fill: parent
78 source: parent.width > parent.height ? "graphics/paper_landscape.png" : "graphics/paper_portrait.png"93 scope: scopes.overviewScope
79 fillMode: Image.PreserveAspectCrop94 progress: overviewController.progress
80 horizontalAlignment: Image.AlignRight95 scopeScale: scopeItem.scope ? 0.4 : (1 - overviewController.progress * 0.6)
81 verticalAlignment: Image.AlignTop96 visible: scopeScale != 1
97 currentIndex: dashContent.currentIndex
98 onDone: {
99 if (currentTab == 1) {
100 animateDashFromAll(dashContent.currentScopeId);
101 }
102 hide();
103 }
104 onFavoriteSelected: {
105 setCurrentScope(scopeId, false, false);
106 dashContentCache.scheduleUpdate();
107 hide();
108 }
109 onAllFavoriteSelected: {
110 setCurrentScope(scopeId, false, false);
111 dashContentCache.scheduleUpdate();
112 animateDashFromAll(dashContent.currentScopeId);
113 hide();
114 }
115 onSearchSelected: {
116 var scopeIndex = -1;
117 for (var i = 0; i < scopes.count; ++i) {
118 if (scopes.getScope(i).id == scopeId) {
119 scopeIndex = i;
120 break;
121 }
122 }
123 if (scopeIndex >= 0) {
124 // Is a favorite one
125 setCurrentScope(scopeId, false, false);
126 dashContentCache.scheduleUpdate();
127 showDashFromPos(pos, size);
128 hide();
129 } else {
130 // Is not a favorite one, activate and get openScope
131 scope.activate(result);
132 }
133 }
134 function hide() {
135 overviewController.enableAnimation = true;
136 overviewController.progress = 0;
137 }
138 onProgressChanged: {
139 if (progress == 0) {
140 currentTab = scopeItem.scope ? 1 : 0;
141 }
142 }
143 }
144
145 ShaderEffectSource {
146 id: dashContentCache
147 parent: scopesOverview.dashItemEater
148 z: 1
149 sourceItem: dashContent
150 height: sourceItem.height
151 width: sourceItem.width
152 opacity: 1 - overviewController.progress
153 visible: overviewController.progress != 0 && scopeItem.scope === null
154 live: false
82 }155 }
83156
84 DashContent {157 DashContent {
85 id: dashContent158 id: dashContent
159
160 property var scopeThatOpenedScope: null
161
86 objectName: "dashContent"162 objectName: "dashContent"
87 width: parent.width163 width: dash.width
88 height: parent.height164 height: dash.height
89 scopes: scopes165 scopes: scopes
90 visible: x != -width166 visible: !scopesOverview.showingNonFavoriteScope && x != -width
91 onGotoScope: {167 onGotoScope: {
92 dash.setCurrentScope(scopeId, true, false);168 dash.setCurrentScope(scopeId, true, false);
93 }169 }
94 onOpenScope: {170 onOpenScope: {
171 scopeThatOpenedScope = currentScope;
95 scopeItem.scope = scope;172 scopeItem.scope = scope;
173 scopesOverview.currentTab = 1;
174 scopesOverview.ensureAllScopeVisible(scope.id);
96 x = -width;175 x = -width;
97 }176 }
98 onScopeLoaded: {177 onScopeLoaded: {
@@ -102,25 +181,63 @@
102 }181 }
103 }182 }
104 scale: dash.contentScale183 scale: dash.contentScale
105 clip: scale != 1.0 || scopeItem.visible184 clip: scale != 1.0 || scopeItem.visible || overviewController.progress != 0
106 Behavior on x {185 Behavior on x {
107 UbuntuNumberAnimation {186 UbuntuNumberAnimation {
187 duration: overviewController.progress != 0 ? 0 : UbuntuAnimation.FastDuration
108 onRunningChanged: {188 onRunningChanged: {
109 if (!running && dashContent.x == 0) {189 if (!running && dashContent.x == 0) {
110 dashContent.closeScope(scopeItem.scope);190 dashContent.scopeThatOpenedScope.closeScope(scopeItem.scope);
111 scopeItem.scope = null;191 scopeItem.scope = null;
192 if (overviewController.progress == 0) {
193 // Set tab to Favorites only if we are not showing the overview
194 scopesOverview.currentTab = 0;
195 }
112 }196 }
113 }197 }
114 }198 }
115 }199 }
200
201 enabled: overviewController.progress == 0
202 opacity: enabled ? 1 : 0
203 }
204
205 DashBackground
206 {
207 anchors.fill: scopeItem
208 visible: scopeItem.visible
209 parent: scopeItem.parent
210 scale: scopeItem.scale
211 opacity: scopeItem.opacity
116 }212 }
117213
118 GenericScopeView {214 GenericScopeView {
119 id: scopeItem215 id: scopeItem
120 anchors.left: dashContent.right216 objectName: "dashTempScopeItem"
217
218 readonly property real targetOverviewScale: {
219 if (scopesOverview.currentTab == 0) {
220 return 0.4;
221 } else {
222 return scopesOverview.allCardSize.width / scopeItem.width;
223 }
224 }
225 readonly property real overviewProgressScale: (1 - overviewController.progress * (1 - targetOverviewScale))
226 readonly property var targetOverviewPosition: scope ? scopesOverview.allScopeCardPosition(scope.id) : null
227 readonly property real overviewProgressX: scope && scopesOverview.currentTab == 1 && targetOverviewPosition ?
228 overviewController.progress * (targetOverviewPosition.x - (width - scopesOverview.allCardSize.width) / 2)
229 : 0
230 readonly property real overviewProgressY: scope && scopesOverview.currentTab == 1 && targetOverviewPosition ?
231 overviewController.progress * (targetOverviewPosition.y - (height - scopesOverview.allCardSize.height) / 2)
232 : 0
233
234 x: overviewController.progress == 0 ? dashContent.x + width : overviewProgressX
235 y: overviewController.progress == 0 ? dashContent.y : overviewProgressY
121 width: parent.width236 width: parent.width
122 height: parent.height237 height: parent.height
123 scale: dash.contentScale238 scale: dash.contentScale * overviewProgressScale
239 enabled: opacity == 1
240 opacity: 1 - overviewController.progress
124 clip: scale != 1.0241 clip: scale != 1.0
125 visible: scope != null242 visible: scope != null
126 hasBackAction: true243 hasBackAction: true
@@ -154,7 +271,7 @@
154 opacity: 0271 opacity: 0
155 visible: opacity > 0272 visible: opacity > 0
156273
157 readonly property bool processing: dashContent.processing || scopeItem.processing274 readonly property bool processing: dashContent.processing || scopeItem.processing || scopesOverview.processing
158275
159 Behavior on opacity {276 Behavior on opacity {
160 UbuntuNumberAnimation { duration: UbuntuAnimation.FastDuration }277 UbuntuNumberAnimation { duration: UbuntuAnimation.FastDuration }
@@ -207,4 +324,45 @@
207 }324 }
208 }325 }
209326
327 Image {
328 source: "graphics/overview_hint.png"
329 anchors.horizontalCenter: parent.horizontalCenter
330 opacity: (scopeItem.scope ? scopeItem.pageHeaderTotallyVisible : dashContent.pageHeaderTotallyVisible) &&
331 (overviewDragHandle.enabled || overviewController.progress != 0) ? 1 : 0
332 Behavior on opacity {
333 enabled: overviewController.progress == 0
334 UbuntuNumberAnimation {}
335 }
336 y: parent.height - height * (1 - overviewController.progress * 4)
337 }
338
339 EdgeDragArea {
340 id: overviewDragHandle
341 objectName: "overviewDragHandle"
342 z: 1
343 direction: Direction.Upwards
344 enabled: !dashContent.previewShown &&
345 dashContent.currentScope &&
346 dashContent.currentScope.searchQuery == "" &&
347 (overviewController.progress == 0 || dragging)
348
349 readonly property real fullMovement: units.gu(20)
350
351 anchors { left: parent.left; right: parent.right; bottom: parent.bottom }
352 height: units.gu(2)
353
354 onSceneDistanceChanged: {
355 if (overviewController.enableAnimation) {
356 dashContentCache.scheduleUpdate();
357 }
358 overviewController.enableAnimation = false;
359 overviewController.progress = Math.max(0, Math.min(1, sceneDistance / fullMovement));
360 }
361
362 onDraggingChanged: {
363 overviewController.enableAnimation = true;
364 overviewController.progress = (overviewController.progress > 0.7) ? 1 : 0;
365 }
366 }
367
210}368}
211369
=== added file 'qml/Dash/DashBackground.qml'
--- qml/Dash/DashBackground.qml 1970-01-01 00:00:00 +0000
+++ qml/Dash/DashBackground.qml 2014-08-08 20:44:52 +0000
@@ -0,0 +1,24 @@
1/*
2 * Copyright (C) 2013, 2014 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
17import QtQuick 2.0
18
19Image {
20 source: anchors.fill.width > anchors.fill.height ? "graphics/paper_landscape.png" : "graphics/paper_portrait.png"
21 fillMode: Image.PreserveAspectCrop
22 horizontalAlignment: Image.AlignRight
23 verticalAlignment: Image.AlignTop
24}
025
=== modified file 'qml/Dash/DashContent.qml'
--- qml/Dash/DashContent.qml 2014-08-06 19:39:30 +0000
+++ qml/Dash/DashContent.qml 2014-08-08 20:44:52 +0000
@@ -25,8 +25,14 @@
2525
26 property alias scopes: dashContentList.model26 property alias scopes: dashContentList.model
27 readonly property alias currentIndex: dashContentList.currentIndex27 readonly property alias currentIndex: dashContentList.currentIndex
28 readonly property string currentScopeId: dashContentList.currentItem ? dashContentList.currentItem.scopeId : ""
29 readonly property var currentScope: dashContentList.currentItem ? dashContentList.currentItem.theScope : null
30 readonly property bool previewShown: dashContentList.currentItem && dashContentList.currentItem.item ?
31 dashContentList.currentItem.item.previewShown : false
28 readonly property bool processing: dashContentList.currentItem && dashContentList.currentItem.item32 readonly property bool processing: dashContentList.currentItem && dashContentList.currentItem.item
29 && dashContentList.currentItem.item.processing || false33 && dashContentList.currentItem.item.processing || false
34 readonly property bool pageHeaderTotallyVisible: dashContentList.currentItem && dashContentList.currentItem.item
35 && dashContentList.currentItem.item.pageHeaderTotallyVisible || false
3036
31 signal scopeLoaded(string scopeId)37 signal scopeLoaded(string scopeId)
32 signal gotoScope(string scopeId)38 signal gotoScope(string scopeId)
@@ -77,15 +83,15 @@
77 }83 }
78 }84 }
7985
80 function closeScope(scope) {
81 dashContentList.currentItem.theScope.closeScope(scope)
82 }
83
84 Item {86 Item {
85 id: dashContentListHolder87 id: dashContentListHolder
8688
87 anchors.fill: parent89 anchors.fill: parent
8890
91 DashBackground {
92 anchors.fill: parent
93 }
94
89 ListView {95 ListView {
90 id: dashContentList96 id: dashContentList
91 objectName: "dashContentList"97 objectName: "dashContentList"
9298
=== modified file 'qml/Dash/DashRenderer.qml'
--- qml/Dash/DashRenderer.qml 2014-07-22 12:17:34 +0000
+++ qml/Dash/DashRenderer.qml 2014-08-08 20:44:52 +0000
@@ -41,7 +41,9 @@
41 /// Emitted when the user clicked on an item41 /// Emitted when the user clicked on an item
42 /// @param index is the index of the clicked item42 /// @param index is the index of the clicked item
43 /// @param result result model of the cliked item, used for activation43 /// @param result result model of the cliked item, used for activation
44 signal clicked(int index, var result)44 /// @param item item that has been clicked
45 /// @param itemModel model of the item
46 signal clicked(int index, var result, var item, var itemModel)
4547
46 /// Emitted when the user pressed and held on an item48 /// Emitted when the user pressed and held on an item
47 /// @param index is the index of the held item49 /// @param index is the index of the held item
4850
=== modified file 'qml/Dash/GenericScopeView.qml'
--- qml/Dash/GenericScopeView.qml 2014-08-06 19:39:30 +0000
+++ qml/Dash/GenericScopeView.qml 2014-08-08 20:44:52 +0000
@@ -25,7 +25,7 @@
25FocusScope {25FocusScope {
26 id: scopeView26 id: scopeView
2727
28 readonly property alias navigationShown: dashNavigation.showList28 readonly property bool navigationShown: pageHeaderLoader.item ? pageHeaderLoader.item.bottomItem[0].showList : false
29 property var scope: null29 property var scope: null
30 property SortFilterProxyModel categories: categoryFilter30 property SortFilterProxyModel categories: categoryFilter
31 property bool isCurrent: false31 property bool isCurrent: false
@@ -33,14 +33,18 @@
33 property bool hasBackAction: false33 property bool hasBackAction: false
34 property bool enableHeightBehaviorOnNextCreation: false34 property bool enableHeightBehaviorOnNextCreation: false
35 property var categoryView: categoryView35 property var categoryView: categoryView
36 property alias paginationCount: pageHeader.paginationCount36 property bool showPageHeader: true
37 property alias paginationIndex: pageHeader.paginationIndex37 readonly property alias previewShown: subPageLoader.previewShown
38 readonly property alias settingsShown: subPageLoader.settingsShown
39 property int paginationCount: 0
40 property int paginationIndex: 0
41 property alias pageHeaderTotallyVisible: categoryView.pageHeaderTotallyVisible
3842
39 property var scopeStyle: ScopeStyle {43 property var scopeStyle: ScopeStyle {
40 style: scope ? scope.customizations : {}44 style: scope ? scope.customizations : {}
41 }45 }
4246
43 readonly property bool processing: scope ? scope.searchInProgress || previewListView.processing : false47 readonly property bool processing: scope ? scope.searchInProgress || subPageLoader.processing : false
4448
45 signal backClicked()49 signal backClicked()
4650
@@ -53,13 +57,42 @@
53 }57 }
5458
55 function closePreview() {59 function closePreview() {
56 previewListView.open = false;60 subPageLoader.closeSubPage()
61 }
62
63 function itemClicked(index, result, item, itemModel, resultsModel, limitedCategoryItemCount) {
64 if (scope.id === "scopes" || scope.id == "clickscope") {
65 // TODO Technically it is possible that calling activate() will make the scope emit
66 // previewRequested so that we show a preview but there's no scope that does that yet
67 // so it's not implemented
68 scope.activate(result)
69 } else {
70 openPreview(index, resultsModel, limitedCategoryItemCount);
71 }
72 }
73
74 function itemPressedAndHeld(index, resultsModel, limitedCategoryItemCount) {
75 openPreview(index, resultsModel, limitedCategoryItemCount);
76 }
77
78 function openPreview(index, resultsModel, limitedCategoryItemCount) {
79 if (limitedCategoryItemCount > 0) {
80 previewLimitModel.model = resultsModel;
81 previewLimitModel.limit = limitedCategoryItemCount;
82 subPageLoader.model = previewLimitModel;
83 } else {
84 subPageLoader.model = resultsModel;
85 }
86 subPageLoader.currentIndex = -1;
87 subPageLoader.currentIndex = index;
88 subPageLoader.subPage = "preview";
89 subPageLoader.openSubPage();
57 }90 }
5891
59 Binding {92 Binding {
60 target: scope93 target: scope
61 property: "isActive"94 property: "isActive"
62 value: isCurrent && !previewListView.open95 value: isCurrent && !subPageLoader.open
63 }96 }
6497
65 SortFilterProxyModel {98 SortFilterProxyModel {
@@ -72,28 +105,30 @@
72 }105 }
73106
74 onIsCurrentChanged: {107 onIsCurrentChanged: {
75 pageHeader.resetSearch();108 if (showPageHeader) {
76 previewListView.open = false;109 pageHeaderLoader.item.resetSearch();
110 }
111 subPageLoader.closeSubPage();
77 }112 }
78113
79 Binding {114 Binding {
80 target: scopeView.scope115 target: scopeView.scope
81 property: "searchQuery"116 property: "searchQuery"
82 value: pageHeader.searchQuery117 value: pageHeaderLoader.item ? pageHeaderLoader.item.searchQuery : ""
83 when: isCurrent118 when: isCurrent && showPageHeader
84 }119 }
85120
86 Binding {121 Binding {
87 target: pageHeader122 target: pageHeaderLoader.item
88 property: "searchQuery"123 property: "searchQuery"
89 value: scopeView.scope ? scopeView.scope.searchQuery : ""124 value: scopeView.scope ? scopeView.scope.searchQuery : ""
90 when: isCurrent125 when: isCurrent && showPageHeader
91 }126 }
92127
93 Connections {128 Connections {
94 target: scopeView.scope129 target: scopeView.scope
95 onShowDash: previewListView.open = false;130 onShowDash: subPageLoader.closeSubPage()
96 onHideDash: previewListView.open = false;131 onHideDash: subPageLoader.closeSubPage()
97 }132 }
98133
99 Rectangle {134 Rectangle {
@@ -106,18 +141,21 @@
106 id: categoryView141 id: categoryView
107 objectName: "categoryListView"142 objectName: "categoryListView"
108143
109 x: previewListView.open ? -width : 0144 x: subPageLoader.open ? -width : 0
110 Behavior on x { UbuntuNumberAnimation { } }145 Behavior on x { UbuntuNumberAnimation { } }
111 width: parent.width146 width: parent.width
112 height: parent.height147 height: parent.height
113148
114 model: scopeView.categories149 model: scopeView.categories
115 forceNoClip: previewListView.open150 forceNoClip: subPageLoader.open
116 pixelAligned: true151 pixelAligned: true
117 interactive: !dashNavigation.showList152 interactive: !navigationShown
118153
119 property string expandedCategoryId: ""154 property string expandedCategoryId: ""
120155
156 readonly property bool pageHeaderTotallyVisible: scopeView.showPageHeader &&
157 ((headerItemShownHeight == 0 && categoryView.contentY <= categoryView.originY) || (headerItemShownHeight == pageHeaderLoader.item.height))
158
121 delegate: ListItems.Base {159 delegate: ListItems.Base {
122 id: baseItem160 id: baseItem
123 objectName: "dashCategory" + category161 objectName: "dashCategory" + category
@@ -223,28 +261,19 @@
223 Connections {261 Connections {
224 target: rendererLoader.item262 target: rendererLoader.item
225 onClicked: {263 onClicked: {
226 if (scopeView.scope.id === "scopes" || scopeView.scope.id == "clickscope") {264 scopeView.itemClicked(index, result, item, itemModel, target.model, categoryItemCount());
227 // TODO Technically it is possible that calling activate() will make the scope emit265 }
228 // previewRequested so that we show a preview but there's no scope that does that yet266
229 // so it's not implemented267 onPressAndHold: {
230 scopeView.scope.activate(result)268 scopeView.itemPressedAndHeld(index, target.model, categoryItemCount());
231 } else {269 }
232 openPreview(index);270
233 }271 function categoryItemCount() {
234 }272 var categoryItemCount = -1;
235 onPressAndHold: openPreview(index)
236
237 function openPreview(index) {
238 if (!rendererLoader.expanded && !seeAllLabel.visible && target.collapsedItemCount > 0) {273 if (!rendererLoader.expanded && !seeAllLabel.visible && target.collapsedItemCount > 0) {
239 previewLimitModel.model = target.model;274 categoryItemCount = target.collapsedItemCount;
240 previewLimitModel.limit = target.collapsedItemCount;
241 previewListView.model = previewLimitModel;
242 } else {
243 previewListView.model = target.model;
244 }275 }
245 previewListView.currentIndex = -1;276 return categoryItemCount;
246 previewListView.currentIndex = index;
247 previewListView.open = true;
248 }277 }
249 }278 }
250 Connections {279 Connections {
@@ -260,10 +289,10 @@
260 // If the filter animation will be seen start it, otherwise, just flip the switch289 // If the filter animation will be seen start it, otherwise, just flip the switch
261 var shrinkingVisible = !shouldExpand && y + item.collapsedHeight + seeAll.height < categoryView.height;290 var shrinkingVisible = !shouldExpand && y + item.collapsedHeight + seeAll.height < categoryView.height;
262 var growingVisible = shouldExpand && y + height < categoryView.height;291 var growingVisible = shouldExpand && y + height < categoryView.height;
263 if (!previewListView.open || shouldExpand) {292 if (!subPageLoader.open || shouldExpand) {
264 var animate = shrinkingVisible || growingVisible;293 var animate = shrinkingVisible || growingVisible;
265 baseItem.expand(shouldExpand, animate)294 baseItem.expand(shouldExpand, animate)
266 if (shouldExpand && !previewListView.open) {295 if (shouldExpand && !subPageLoader.open) {
267 categoryView.maximizeVisibleArea(index, item.expandedHeight + seeAll.height);296 categoryView.maximizeVisibleArea(index, item.expandedHeight + seeAll.height);
268 }297 }
269 }298 }
@@ -380,26 +409,41 @@
380 }409 }
381 }410 }
382411
383 pageHeader: PageHeader {412 pageHeader: scopeView.showPageHeader ? pageHeaderLoader : null
384 id: pageHeader413 Loader {
385 objectName: "scopePageHeader"414 id: pageHeaderLoader
386 width: parent.width415 width: parent.width
387 title: scopeView.scope ? scopeView.scope.name : ""416 sourceComponent: scopeView.showPageHeader ? pageHeaderComponent : undefined
388 showBackButton: scopeView.hasBackAction417 Component {
389 searchEntryEnabled: true418 id: pageHeaderComponent
390 scopeStyle: scopeView.scopeStyle419 PageHeader {
391420 objectName: "scopePageHeader"
392 bottomItem: DashNavigation {421 width: parent.width
393 id: dashNavigation422 title: scopeView.scope ? scopeView.scope.name : ""
394 scope: scopeView.scope423 showBackButton: scopeView.hasBackAction
395 width: parent.width <= units.gu(60) ? parent.width : units.gu(40)424 searchEntryEnabled: true
396 anchors.right: parent.right425 settingsEnabled: scopeView.scope ? scopeView.scope.settings && scopeView.scope.settings.count > 0 : false
397 windowHeight: scopeView.height426 scopeStyle: scopeView.scopeStyle
398 windowWidth: scopeView.width427 paginationCount: scopeView.paginationCount
399 scopeStyle: scopeView.scopeStyle428 paginationIndex: scopeView.paginationIndex
429
430 bottomItem: DashNavigation {
431 scope: scopeView.scope
432 width: parent.width <= units.gu(60) ? parent.width : units.gu(40)
433 anchors.right: parent.right
434 windowHeight: scopeView.height
435 windowWidth: scopeView.width
436 scopeStyle: scopeView.scopeStyle
437 }
438
439 onBackClicked: scopeView.backClicked()
440
441 onSettingsClicked: {
442 subPageLoader.subPage = "settings";
443 subPageLoader.openSubPage();
444 }
445 }
400 }446 }
401
402 onBackClicked: scopeView.backClicked()
403 }447 }
404 }448 }
405449
@@ -407,19 +451,79 @@
407 id: previewLimitModel451 id: previewLimitModel
408 }452 }
409453
410 PreviewListView {454 Loader {
411 id: previewListView455 id: subPageLoader
412 objectName: "previewListView"456 objectName: "subPageLoader"
413 visible: x != width457 visible: x != width
414 scope: scopeView.scope
415 scopeStyle: scopeView.scopeStyle
416 width: parent.width458 width: parent.width
417 height: parent.height459 height: parent.height
418 anchors.left: categoryView.right460 anchors.left: categoryView.right
419461
462 property bool open: false
463 property var scope: scopeView.scope
464 property var scopeStyle: scopeView.scopeStyle
465 property int currentIndex: -1
466 property var model: null
467
468 readonly property bool processing: status === Loader.Ready && item.hasOwnProperty("processing") ? item.processing : false
469 readonly property int count: status === Loader.Ready && item.hasOwnProperty("count") ? item.count : 0
470 readonly property var currentItem: status === Loader.Ready && item.hasOwnProperty("currentItem") ? item.currentItem : false
471
472 property string subPage: ""
473 readonly property bool previewShown: open && subPage == "preview"
474 readonly property bool settingsShown: open && subPage == "settings"
475
476 function updateBindings() {
477 if (status === Loader.Ready) {
478 item.scope = Qt.binding(function() { return subPageLoader.scope } )
479 item.scopeStyle = Qt.binding(function() { return subPageLoader.scopeStyle } )
480 if (item.hasOwnProperty("open")) item.open = Qt.binding(function() { return subPageLoader.open } )
481 if (item.hasOwnProperty("currentIndex")) item.currentIndex = Qt.binding(function() { return subPageLoader.currentIndex } )
482 if (item.hasOwnProperty("model")) item.model = Qt.binding(function() { return subPageLoader.model } )
483 }
484 }
485
486 function updateSource() {
487 switch (subPage) {
488 case "preview": source = "PreviewListView.qml"; break;
489 case "settings": source = "ScopeSettingsPage.qml"; break;
490 default: source = ""; break;
491 }
492 }
493
494 function openSubPage() {
495 // FIXME adding the following check before opening makes more sense to me,
496 // but it doesn't seem to work in qmltestrunner::GenericScopeView::test_previewOpenClose()
497 // if (!visible && status === Loader.Ready), x is different to width.
498 // Let's just check status for now.
499 if (status === Loader.Ready) open = true;
500 }
501
502 function closeSubPage() {
503 open = false;
504 subPage = "";
505 }
506
507 onSubPageChanged: {
508 // let's update the source only when the loader is not visible
509 if (!visible) updateSource();
510 }
511
512 onVisibleChanged: {
513 // let's update the source only when the loader is not visible
514 if (!visible) updateSource();
515 }
516
517 onLoaded: updateBindings()
518
420 onOpenChanged: {519 onOpenChanged: {
421 pageHeader.unfocus();520 if (open) updateBindings();
521 pageHeaderLoader.item.unfocus();
522 }
523
524 Connections {
525 target: subPageLoader.item
526 onBackClicked: subPageLoader.closeSubPage()
422 }527 }
423 }528 }
424
425}529}
426530
=== modified file 'qml/Dash/PreviewListView.qml'
--- qml/Dash/PreviewListView.qml 2014-07-30 15:46:44 +0000
+++ qml/Dash/PreviewListView.qml 2014-08-08 20:44:52 +0000
@@ -35,6 +35,8 @@
35 readonly property bool processing: currentItem && (!currentItem.previewModel.loaded35 readonly property bool processing: currentItem && (!currentItem.previewModel.loaded
36 || currentItem.previewModel.processingAction)36 || currentItem.previewModel.processingAction)
3737
38 signal backClicked()
39
38 PageHeader {40 PageHeader {
39 id: header41 id: header
40 objectName: "pageHeader"42 objectName: "pageHeader"
@@ -44,7 +46,7 @@
44 searchEntryEnabled: false46 searchEntryEnabled: false
45 scopeStyle: root.scopeStyle47 scopeStyle: root.scopeStyle
4648
47 onBackClicked: root.open = false49 onBackClicked: root.backClicked()
48 }50 }
4951
50 ListView {52 ListView {
@@ -108,7 +110,7 @@
108 anchors {110 anchors {
109 left: parent.left111 left: parent.left
110 right: parent.right112 right: parent.right
111 top: pageHeader.bottom113 top: header.bottom
112 bottom: parent.bottom114 bottom: parent.bottom
113 }115 }
114116
115117
=== added directory 'qml/Dash/ScopeSettings'
=== added file 'qml/Dash/ScopeSettings/ScopeSetting.qml'
--- qml/Dash/ScopeSettings/ScopeSetting.qml 1970-01-01 00:00:00 +0000
+++ qml/Dash/ScopeSettings/ScopeSetting.qml 2014-08-08 20:44:52 +0000
@@ -0,0 +1,36 @@
1/*
2 * Copyright (C) 2014 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
17import QtQuick 2.2
18import Ubuntu.Components 1.1
19
20/*! Interface for settings widgets. */
21
22Item {
23 //! The ScopeStyle component.
24 property var scopeStyle: null
25
26 //! Variable used to contain widget's data
27 property var widgetData: null
28
29 readonly property real __margins: units.gu(2)
30
31 /*! \brief This signal should be emitted when a setting action was triggered.
32 *
33 * \param new value
34 */
35 signal triggered(var value)
36}
037
=== added file 'qml/Dash/ScopeSettings/ScopeSettingLabel.qml'
--- qml/Dash/ScopeSettings/ScopeSettingLabel.qml 1970-01-01 00:00:00 +0000
+++ qml/Dash/ScopeSettings/ScopeSettingLabel.qml 2014-08-08 20:44:52 +0000
@@ -0,0 +1,51 @@
1/*
2 * Copyright (C) 2014 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
17import QtQuick 2.2
18import Ubuntu.Components 1.1
19
20ScopeSetting {
21 id: root
22 implicitHeight: units.gu(6)
23
24 Label {
25 anchors {
26 left: parent.left
27 leftMargin: __margins
28 right: control.left
29 rightMargin: units.gu(1)
30 verticalCenter: parent.verticalCenter
31 }
32 text: widgetData.displayName
33 elide: Text.ElideMiddle
34 color: scopeStyle ? scopeStyle.foreground : "grey"
35 }
36
37 TextField {
38 id: control
39 anchors {
40 right: parent.right
41 rightMargin: __margins
42 verticalCenter: parent.verticalCenter
43 }
44 text: widgetData.value
45
46 onTriggered: root.triggered(text)
47 onActiveFocusChanged: {
48 if (!activeFocus) root.triggered(text);
49 }
50 }
51}
052
=== added file 'qml/Dash/ScopeSettings/ScopeSettingList.qml'
--- qml/Dash/ScopeSettings/ScopeSettingList.qml 1970-01-01 00:00:00 +0000
+++ qml/Dash/ScopeSettings/ScopeSettingList.qml 2014-08-08 20:44:52 +0000
@@ -0,0 +1,37 @@
1/*
2 * Copyright (C) 2014 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
17import QtQuick 2.2
18import Ubuntu.Components 1.1
19
20ScopeSetting {
21 id: root
22 implicitHeight: optionSelector.implicitHeight
23
24 OptionSelector {
25 id: optionSelector
26 anchors {
27 left: parent.left
28 right: parent.right
29 top: parent.top
30 margins: __margins
31 }
32 text: widgetData.displayName
33 model: widgetData.properties["values"]
34
35 onSelectedIndexChanged: root.triggered(selectedIndex)
36 }
37}
038
=== added file 'qml/Dash/ScopeSettings/ScopeSettingNumber.qml'
--- qml/Dash/ScopeSettings/ScopeSettingNumber.qml 1970-01-01 00:00:00 +0000
+++ qml/Dash/ScopeSettings/ScopeSettingNumber.qml 2014-08-08 20:44:52 +0000
@@ -0,0 +1,52 @@
1/*
2 * Copyright (C) 2014 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
17import QtQuick 2.2
18import Ubuntu.Components 1.1
19
20ScopeSetting {
21 id: root
22 implicitHeight: units.gu(6)
23
24 Label {
25 anchors {
26 left: parent.left
27 leftMargin: __margins
28 right: control.left
29 rightMargin: units.gu(1)
30 verticalCenter: parent.verticalCenter
31 }
32 text: widgetData.displayName
33 elide: Text.ElideMiddle
34 color: scopeStyle ? scopeStyle.foreground : "grey"
35 }
36
37 TextField {
38 id: control
39 anchors {
40 right: parent.right
41 rightMargin: __margins
42 verticalCenter: parent.verticalCenter
43 }
44 text: widgetData.value
45 validator: DoubleValidator {}
46
47 onTriggered: root.triggered(text)
48 onActiveFocusChanged: {
49 if (!activeFocus) root.triggered(text);
50 }
51 }
52}
053
=== added file 'qml/Dash/ScopeSettings/ScopeSettingSwitch.qml'
--- qml/Dash/ScopeSettings/ScopeSettingSwitch.qml 1970-01-01 00:00:00 +0000
+++ qml/Dash/ScopeSettings/ScopeSettingSwitch.qml 2014-08-08 20:44:52 +0000
@@ -0,0 +1,48 @@
1/*
2 * Copyright (C) 2014 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
17import QtQuick 2.2
18import Ubuntu.Components 1.1
19
20ScopeSetting {
21 id: root
22 implicitHeight: units.gu(6)
23
24 Label {
25 anchors {
26 left: parent.left
27 leftMargin: __margins
28 right: control.left
29 rightMargin: units.gu(1)
30 verticalCenter: parent.verticalCenter
31 }
32 text: widgetData.displayName
33 elide: Text.ElideMiddle
34 color: scopeStyle ? scopeStyle.foreground : "grey"
35 }
36
37 Switch {
38 id: control
39 anchors {
40 right: parent.right
41 rightMargin: __margins
42 verticalCenter: parent.verticalCenter
43 }
44 checked: widgetData.value
45
46 onTriggered: root.triggered(checked)
47 }
48}
049
=== added file 'qml/Dash/ScopeSettings/ScopeSettingWidgetFactory.qml'
--- qml/Dash/ScopeSettings/ScopeSettingWidgetFactory.qml 1970-01-01 00:00:00 +0000
+++ qml/Dash/ScopeSettings/ScopeSettingWidgetFactory.qml 2014-08-08 20:44:52 +0000
@@ -0,0 +1,55 @@
1/*
2 * Copyright (C) 2014 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
17import QtQuick 2.2
18
19//! \brief This component loads the widgets based on type.
20
21Loader {
22 id: root
23
24 //! The ScopeStyle component.
25 property var scopeStyle: null
26
27 //! Variable used to contain widget's data
28 property var widgetData: null
29
30 //! Triggered signal forwarded from the widgets.
31 signal triggered(var value)
32
33 source: widgetSource
34
35 //! \cond private
36 property url widgetSource: {
37 switch (widgetData.type) {
38 case "boolean": return "ScopeSettingSwitch.qml";
39 case "list": return "ScopeSettingSwitch.qml";
40 case "number": return "ScopeSettingNumber.qml";
41 case "string": return "ScopeSettingLabel.qml";
42 default: return "";
43 }
44 }
45 //! \endcond
46
47 onLoaded: {
48 item.widgetData = Qt.binding(function() { return root.widgetData } )
49 }
50
51 Connections {
52 target: root.item
53 onTriggered: root.triggered(value)
54 }
55}
056
=== added file 'qml/Dash/ScopeSettings/ScopeSettings.qml'
--- qml/Dash/ScopeSettings/ScopeSettings.qml 1970-01-01 00:00:00 +0000
+++ qml/Dash/ScopeSettings/ScopeSettings.qml 2014-08-08 20:44:52 +0000
@@ -0,0 +1,35 @@
1/*
2 * Copyright (C) 2014 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
17import QtQuick 2.2
18import Ubuntu.Components 1.1
19
20ListView {
21 //! The ScopeStyle component.
22 property var scopeStyle: null
23
24 orientation: ListView.Vertical
25
26 delegate: ScopeSettingWidgetFactory {
27 objectName: "scopeSettingItem" + index
28 width: root.width
29 widgetData: model
30 scopeStyle: root.scopeStyle
31
32 onTriggered: model.value = value;
33 }
34}
35
036
=== added file 'qml/Dash/ScopeSettingsPage.qml'
--- qml/Dash/ScopeSettingsPage.qml 1970-01-01 00:00:00 +0000
+++ qml/Dash/ScopeSettingsPage.qml 2014-08-08 20:44:52 +0000
@@ -0,0 +1,54 @@
1/*
2 * Copyright (C) 2014 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
17import QtQuick 2.2
18import Ubuntu.Components 1.1
19import Unity 0.2
20import "../Components"
21import "ScopeSettings"
22
23Item {
24 id: root
25
26 property var scope: null
27 property var scopeStyle: null
28
29 signal backClicked()
30
31 PageHeader {
32 id: header
33 objectName: "pageHeader"
34 width: parent.width
35 title: scope ? scope.name : ""
36 showBackButton: true
37 searchEntryEnabled: false
38 scopeStyle: root.scopeStyle || undefined
39
40 onBackClicked: root.backClicked()
41 }
42
43 ScopeSettings {
44 id: scopeSettings
45 objectName: "scopeSettings"
46 anchors {
47 top: header.bottom
48 bottom: parent.bottom
49 left: parent.left
50 right: parent.right
51 }
52 model: root.scope ? root.scope.settings : null
53 }
54}
055
=== added file 'qml/Dash/ScopesOverview.qml'
--- qml/Dash/ScopesOverview.qml 1970-01-01 00:00:00 +0000
+++ qml/Dash/ScopesOverview.qml 2014-08-08 20:44:52 +0000
@@ -0,0 +1,533 @@
1/*
2 * Copyright (C) 2014 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
17import QtQuick 2.0
18import Dash 0.1
19import Ubuntu.Components 0.1
20import "../Components"
21
22Item {
23 id: root
24
25 // Properties set by parent
26 property real progress: 0
27 property var scope: null
28 property int currentIndex: 0
29 property real scopeScale: 1
30
31 // Properties set and used by parent
32 property alias currentTab: tabBar.currentTab
33
34 // Properties used by parent
35 readonly property bool processing: searchResultsViewer.processing || tempScopeItem.processing
36 property bool growingDashFromPos: false
37 readonly property bool searching: scope && scope.searchQuery == ""
38 readonly property bool showingNonFavoriteScope: tempScopeItem.scope != null
39 readonly property var dashItemEater: {
40 if (!forceXYScalerEater && tabBar.currentTab == 0 && middleItems.count > 0) {
41 var loaderItem = middleItems.itemAt(0).item;
42 return loaderItem && loaderItem.currentItem ? loaderItem.currentItem : null;
43 }
44 return scopesOverviewXYScaler;
45 }
46 readonly property size allCardSize: {
47 if (middleItems.count > 1) {
48 var loaderItem = middleItems.itemAt(1).item;
49 if (loaderItem) {
50 var cardTool = loaderItem.cardTool;
51 return Qt.size(cardTool.cardWidth, cardTool.cardHeight);
52 }
53 }
54 return Qt.size(0, 0);
55 }
56
57 // Internal properties
58 property bool forceXYScalerEater: false
59
60 signal done()
61 signal favoriteSelected(var scopeId)
62 signal allFavoriteSelected(var scopeId)
63 signal searchSelected(var scopeId, var result, var pos, var size)
64
65 Connections {
66 target: scope
67 onOpenScope: {
68 var itemPos = scopesOverviewXYScaler.restorePosition;
69 var itemSize = scopesOverviewXYScaler.restoreSize;
70 scopesOverviewXYScaler.scale = itemSize.width / scopesOverviewXYScaler.width;
71 if (itemPos) {
72 scopesOverviewXYScaler.x = itemPos.x -(scopesOverviewXYScaler.width - scopesOverviewXYScaler.width * scopesOverviewXYScaler.scale) / 2;
73 scopesOverviewXYScaler.y = itemPos.y -(scopesOverviewXYScaler.height - scopesOverviewXYScaler.height * scopesOverviewXYScaler.scale) / 2;
74 } else {
75 scopesOverviewXYScaler.x = 0;
76 scopesOverviewXYScaler.y = 0;
77 }
78 scopesOverviewXYScaler.opacity = 0;
79 tempScopeItem.scope = scope;
80 middleItems.overrideOpacity = 0;
81 scopesOverviewXYScaler.scale = 1;
82 scopesOverviewXYScaler.x = 0;
83 scopesOverviewXYScaler.y = 0;
84 scopesOverviewXYScaler.opacity = 1;
85 }
86 onGotoScope: {
87 if (tabBar.currentTab == 0) {
88 root.favoriteSelected(scopeId);
89 } else {
90 root.allFavoriteSelected(scopeId);
91 }
92 }
93 }
94
95 Binding {
96 target: scope
97 property: "isActive"
98 value: progress === 1
99 }
100
101 function animateDashFromAll(scopeId) {
102 var currentScopePos = allScopeCardPosition(scopeId);
103 if (currentScopePos) {
104 showDashFromPos(currentScopePos, allCardSize);
105 } else {
106 console.log("Warning: Could not find Dash OverView All card position for scope", dashContent.currentScopeId);
107 }
108 }
109
110 function showDashFromPos(itemPos, itemSize) {
111 scopesOverviewXYScaler.scale = itemSize.width / scopesOverviewXYScaler.width;
112 scopesOverviewXYScaler.x = itemPos.x -(scopesOverviewXYScaler.width - scopesOverviewXYScaler.width * scopesOverviewXYScaler.scale) / 2;
113 scopesOverviewXYScaler.y = itemPos.y -(scopesOverviewXYScaler.height - scopesOverviewXYScaler.height * scopesOverviewXYScaler.scale) / 2;
114 scopesOverviewXYScaler.opacity = 0;
115 root.growingDashFromPos = true;
116 scopesOverviewXYScaler.scale = 1;
117 scopesOverviewXYScaler.x = 0;
118 scopesOverviewXYScaler.y = 0;
119 scopesOverviewXYScaler.opacity = 1;
120 }
121
122 function allScopeCardPosition(scopeId) {
123 if (middleItems.count > 1) {
124 var loaderItem = middleItems.itemAt(1).item;
125 if (loaderItem) {
126 var pos = loaderItem.scopeCardPosition(scopeId);
127 return loaderItem.mapToItem(null, pos.x, pos.y);
128 }
129 }
130 }
131
132 function ensureAllScopeVisible(scopeId) {
133 if (middleItems.count > 1) {
134 var loaderItem = middleItems.itemAt(1).item;
135 if (loaderItem) {
136 var pos = loaderItem.scopeCardPosition(scopeId);
137 loaderItem.contentY = Math.min(pos.y, loaderItem.contentHeight - loaderItem.height);
138 }
139 }
140 }
141
142 onProgressChanged: {
143 if (progress == 0) {
144 pageHeader.resetSearch();
145 pageHeader.unfocus(); // Shouldn't the previous call do this too?
146 }
147 }
148
149 ScopeStyle {
150 id: overviewScopeStyle
151 style: { "foreground-color" : "white", "background-color" : "transparent" }
152 }
153
154 DashBackground {
155 anchors.fill: parent
156 source: "graphics/dark_background.jpg"
157 }
158
159 Connections {
160 target: pageHeader
161 onSearchQueryChanged: {
162 // Need this in order, otherwise something gets unhappy in rendering
163 // of the overlay in carousels because the parent of the dash dies for
164 // a moment, this way we make sure it's reparented first
165 // by forceXYScalerEater making dashItemEater return scopesOverviewXYScaler
166 // before we kill the previous parent by scope.searchQuery
167 root.forceXYScalerEater = true;
168 root.scope.searchQuery = pageHeader.searchQuery;
169 root.forceXYScalerEater = false;
170 }
171 }
172
173 Binding {
174 target: pageHeader
175 property: "searchQuery"
176 value: scope ? scope.searchQuery : ""
177 }
178
179 Item {
180 id: scopesOverviewContent
181 x: previewListView.open ? -width : 0
182 Behavior on x { UbuntuNumberAnimation { } }
183 width: parent.width
184 height: parent.height
185
186 PageHeader {
187 id: pageHeader
188 objectName: "scopesOverviewPageHeader"
189
190 readonly property real yDisplacement: pageHeader.height + tabBar.height + tabBar.anchors.margins
191
192 y: {
193 if (root.progress < 0.5) {
194 return -yDisplacement;
195 } else {
196 return -yDisplacement + (root.progress - 0.5) * yDisplacement * 2;
197 }
198 }
199 width: parent.width
200 clip: true
201 title: i18n.tr("Manage Dash")
202 scopeStyle: overviewScopeStyle
203 showSignatureLine: false
204 searchEntryEnabled: true
205 }
206
207 ScopesOverviewTab {
208 id: tabBar
209 anchors {
210 left: parent.left
211 right: parent.right
212 top: pageHeader.bottom
213 margins: units.gu(2)
214 }
215 height: units.gu(4)
216
217 enabled: opacity == 1
218 opacity: !scope || scope.searchQuery == "" ? 1 : 0
219 Behavior on opacity { UbuntuNumberAnimation { } }
220 }
221
222 Repeater {
223 id: middleItems
224 objectName: "scopesOverviewRepeater"
225 property real overrideOpacity: -1
226 model: scope && scope.searchQuery == "" ? scope.categories : null
227 delegate: Loader {
228 id: loader
229 objectName: "scopesOverviewRepeaterChild" + index
230
231 height: {
232 if (index == 0) {
233 return root.height;
234 } else {
235 return root.height - pageHeader.height - tabBar.height - tabBar.anchors.margins - units.gu(2);
236 }
237 }
238 width: {
239 if (index == 0) {
240 return root.width / scopeScale;
241 } else {
242 return root.width;
243 }
244 }
245 x: {
246 if (index == 0) {
247 return (root.width - width) / 2;
248 } else {
249 return 0;
250 }
251 }
252 anchors {
253 bottom: scopesOverviewContent.bottom
254 }
255
256 scale: index == 0 ? scopeScale : 1
257
258 opacity: {
259 if (middleItems.overrideOpacity >= 0)
260 return middleItems.overrideOpacity;
261
262 if (tabBar.currentTab != index)
263 return 0;
264
265 return index == 0 ? 1 : root.progress;
266 }
267 Behavior on opacity {
268 enabled: root.progress == 1
269 UbuntuNumberAnimation { }
270 }
271 enabled: opacity == 1
272
273 clip: index == 1
274
275 CardTool {
276 id: cardTool
277 objectName: "cardTool"
278 count: results.count
279 template: model.renderer
280 components: model.components
281 viewWidth: parent.width
282 }
283
284 source: {
285 if (index == 0 && categoryId == "favorites") return "ScopesOverviewFavorites.qml";
286 else if (index == 1 && categoryId == "all") return "ScopesOverviewAll.qml";
287 else return "";
288 }
289
290 onLoaded: {
291 item.model = Qt.binding(function() { return results; });
292 item.cardTool = cardTool;
293 if (index == 0) {
294 item.scopeWidth = Qt.binding(function() { return root.width; });
295 item.scopeHeight = Qt.binding(function() { return root.height; });
296 item.appliedScale = Qt.binding(function() { return loader.scale });
297 item.currentIndex = Qt.binding(function() { return root.currentIndex });
298 } else if (index == 1) {
299 item.extraHeight = bottomBar.height;
300 }
301 }
302
303 Connections {
304 target: loader.item
305 onClicked: {
306 pageHeader.unfocus();
307 if (tabBar.currentTab == 0) {
308 root.favoriteSelected(itemModel.scopeId);
309 } else {
310 var favoriteScopesItem = middleItems.itemAt(0).item;
311 var scopeIndex = favoriteScopesItem.model.scopeIndex(itemModel.scopeId);
312 if (scopeIndex >= 0) {
313 root.allFavoriteSelected(itemModel.scopeId);
314 } else {
315 // Will result in an openScope from root.scope
316 scopesOverviewXYScaler.restorePosition = item.mapToItem(null, 0, 0);
317 scopesOverviewXYScaler.restoreSize = allCardSize;
318 root.scope.activate(result);
319 }
320 }
321 }
322 onPressAndHold: {
323 // Preview can call openScope so make sure restorePosition and restoreSize are set
324 scopesOverviewXYScaler.restorePosition = undefined;
325 scopesOverviewXYScaler.restoreSize = allCardSize;
326
327 previewListView.model = target.model;
328 previewListView.currentIndex = -1;
329 previewListView.currentIndex = index;
330 previewListView.open = true;
331 }
332 }
333 }
334 }
335
336 GenericScopeView {
337 id: searchResultsViewer
338 objectName: "searchResultsViewer"
339 anchors {
340 top: pageHeader.bottom
341 right: parent.right
342 left: parent.left
343 bottom: parent.bottom
344 }
345 scope: root.scope && root.scope.searchQuery != "" ? root.scope : null
346 scopeStyle: overviewScopeStyle
347 enabled: opacity == 1
348 showPageHeader: false
349 clip: true
350 opacity: searchResultsViewer.scope ? 1 : 0
351 isCurrent: true
352 Behavior on opacity { UbuntuNumberAnimation { } }
353
354 function itemClicked(index, result, item, itemModel, resultsModel, limitedCategoryItemCount) {
355 pageHeader.unfocus();
356 pageHeader.closePopup();
357 if (itemModel.scopeId) {
358 // This can end up in openScope so save restorePosition and restoreSize
359 scopesOverviewXYScaler.restorePosition = item.mapToItem(null, 0, 0);
360 scopesOverviewXYScaler.restoreSize = Qt.size(item.width, item.height);
361 root.searchSelected(itemModel.scopeId, result, item.mapToItem(null, 0, 0), Qt.size(item.width, item.height));
362 } else {
363 // Not a scope, just activate it
364 searchResultsViewer.scope.activate(result);
365 }
366 }
367
368 function itemPressedAndHeld(index, resultsModel, limitedCategoryItemCount) {
369 // Do nothing
370 }
371 }
372
373 Rectangle {
374 id: bottomBar
375 color: "black"
376 height: units.gu(8)
377 width: parent.width
378 enabled: opacity == 1
379 opacity: scope && scope.searchQuery == "" ? 1 : 0
380 Behavior on opacity { UbuntuNumberAnimation { } }
381 y: {
382 if (root.progress < 0.5) {
383 return parent.height;
384 } else {
385 return parent.height - (root.progress - 0.5) * height * 2;
386 }
387 }
388
389 AbstractButton {
390 objectName: "scopesOverviewDoneButton"
391 width: Math.max(label.width + units.gu(2), units.gu(10))
392 height: units.gu(4)
393 anchors {
394 left: parent.left
395 leftMargin: units.gu(2)
396 verticalCenter: parent.verticalCenter
397 }
398 Rectangle {
399 anchors.fill: parent
400 border.color: "white"
401 border.width: units.dp(1)
402 radius: units.dp(10)
403 color: parent.pressed ? "gray" : "transparent"
404 }
405 Label {
406 id: label
407 anchors.centerIn: parent
408 text: i18n.tr("Done")
409 color: parent.pressed ? "black" : "white"
410 }
411 onClicked: root.done();
412 }
413
414 AbstractButton {
415 objectName: "scopesOverviewStoreButton"
416 width: Math.max(storeLabel.width, units.gu(10))
417 height: units.gu(4)
418 anchors {
419 right: parent.right
420 verticalCenter: parent.verticalCenter
421 }
422 Icon {
423 id: storeImage
424 name: "ubuntu-store-symbolic"
425 color: "white"
426 anchors.horizontalCenter: parent.horizontalCenter
427 width: units.gu(2)
428 height: units.gu(2)
429 }
430 Label {
431 id: storeLabel
432 anchors.horizontalCenter: parent.horizontalCenter
433 anchors.top: storeImage.bottom
434 text: i18n.tr("Store")
435 color: "white"
436 }
437 onClicked: {
438 // Just zoom from the middle
439 scopesOverviewXYScaler.restorePosition = undefined;
440 scopesOverviewXYScaler.restoreSize = allCardSize;
441 scope.performQuery("scope://com.canonical.scopes.clickstore");
442 }
443 }
444 }
445 }
446
447 PreviewListView {
448 id: previewListView
449 objectName: "scopesOverviewPreviewListView"
450 scope: root.scope
451 scopeStyle: overviewScopeStyle
452 visible: x != width
453 width: parent.width
454 height: parent.height
455 anchors.left: scopesOverviewContent.right
456 }
457
458
459
460 Item {
461 id: scopesOverviewXYScaler
462 width: parent.width
463 height: parent.height
464
465 clip: scale != 1.0
466 enabled: scale == 1
467
468 property bool animationsEnabled: root.showingNonFavoriteScope || root.growingDashFromPos
469
470 property var restorePosition
471 property var restoreSize
472
473 Behavior on x {
474 enabled: scopesOverviewXYScaler.animationsEnabled
475 UbuntuNumberAnimation { }
476 }
477 Behavior on y {
478 enabled: scopesOverviewXYScaler.animationsEnabled
479 UbuntuNumberAnimation { }
480 }
481 Behavior on opacity {
482 enabled: scopesOverviewXYScaler.animationsEnabled
483 UbuntuNumberAnimation { }
484 }
485 Behavior on scale {
486 enabled: scopesOverviewXYScaler.animationsEnabled
487 UbuntuNumberAnimation {
488 onRunningChanged: {
489 if (!running) {
490 if (root.showingNonFavoriteScope && scopesOverviewXYScaler.scale != 1) {
491 root.scope.closeScope(tempScopeItem.scope);
492 tempScopeItem.scope = null;
493 } else if (root.growingDashFromPos) {
494 root.growingDashFromPos = false;
495 }
496 }
497 }
498 }
499 }
500
501 DashBackground {
502 anchors.fill: tempScopeItem
503 visible: tempScopeItem.visible
504 parent: tempScopeItem.parent
505 }
506
507 GenericScopeView {
508 id: tempScopeItem
509 objectName: "scopesOverviewTempScopeItem"
510
511 width: parent.width
512 height: parent.height
513 scale: dash.contentScale
514 clip: scale != 1.0
515 visible: scope != null
516 hasBackAction: true
517 isCurrent: visible
518 onBackClicked: {
519 var v = scopesOverviewXYScaler.restoreSize.width / tempScopeItem.width;
520 scopesOverviewXYScaler.scale = v;
521 if (scopesOverviewXYScaler.restorePosition) {
522 scopesOverviewXYScaler.x = scopesOverviewXYScaler.restorePosition.x -(tempScopeItem.width - tempScopeItem.width * v) / 2;
523 scopesOverviewXYScaler.y = scopesOverviewXYScaler.restorePosition.y -(tempScopeItem.height - tempScopeItem.height * v) / 2;
524 } else {
525 scopesOverviewXYScaler.x = 0;
526 scopesOverviewXYScaler.y = 0;
527 }
528 scopesOverviewXYScaler.opacity = 0;
529 middleItems.overrideOpacity = -1;
530 }
531 }
532 }
533}
0534
=== added file 'qml/Dash/ScopesOverviewAll.qml'
--- qml/Dash/ScopesOverviewAll.qml 1970-01-01 00:00:00 +0000
+++ qml/Dash/ScopesOverviewAll.qml 2014-08-08 20:44:52 +0000
@@ -0,0 +1,54 @@
1/*
2 * Copyright (C) 2014 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
17import QtQuick 2.0
18import Ubuntu.Components 0.1
19
20Flickable {
21 id: root
22
23 property alias model: cardGrid.model
24 property alias cardTool: cardGrid.cardTool
25
26 property real extraHeight: 0
27
28 signal clicked(int index, var result, var item, var itemModel)
29 signal pressAndHold(int index)
30
31 contentHeight: cardGrid.expandedHeight + extraHeight
32 contentWidth: cardGrid.width
33 flickableDirection: Flickable.VerticalFlick
34
35 function scopeCardPosition(scopeId) {
36 var index = model.scopeIndex(scopeId);
37 var pos = cardGrid.cardPosition(index);
38 pos.y = pos.y - root.contentY;
39 return pos;
40 }
41
42 CardGrid {
43 id: cardGrid
44 width: root.width
45 height: parent.height
46
47 onClicked: {
48 root.clicked(index, result, item, itemModel);
49 }
50 onPressAndHold: {
51 root.pressAndHold(index);
52 }
53 }
54}
055
=== added file 'qml/Dash/ScopesOverviewFavorites.qml'
--- qml/Dash/ScopesOverviewFavorites.qml 1970-01-01 00:00:00 +0000
+++ qml/Dash/ScopesOverviewFavorites.qml 2014-08-08 20:44:52 +0000
@@ -0,0 +1,73 @@
1/*
2 * Copyright (C) 2014 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
17import QtQuick 2.0
18
19Flickable {
20 id: root
21
22 signal clicked(int index, var result, var itemModel)
23 signal pressAndHold(int index)
24
25 property var cardTool: null
26 property real scopeHeight: 0
27 property real scopeWidth: 0
28 property real appliedScale: 1
29 property int currentIndex: -1
30 property var currentItem: currentIndex < repeater.count ? repeater.itemAt(currentIndex) : null
31
32 property alias model: repeater.model
33
34 contentHeight: height
35 contentWidth: repeater.count * root.scopeWidth + units.gu(2) / appliedScale * (repeater.count - 1)
36
37 contentX: {
38 var indexX = currentIndex * scopeWidth + units.gu(2) / appliedScale * currentIndex;
39 var newContentX = indexX - (width - scopeWidth) / 2;
40 newContentX = Math.min(Math.max(newContentX, 0), contentWidth - width);
41 return newContentX;
42 }
43
44 Repeater {
45 id: repeater
46 objectName: "scopesOverviewFavoritesRepeater"
47
48 delegate: Loader {
49 id: loader
50
51 x: index * root.scopeWidth + units.gu(2) / appliedScale * index
52 asynchronous: true
53
54 sourceComponent: cardTool.cardComponent
55 onLoaded: {
56 item.fixedArtShapeSize = Qt.binding(function() { return Qt.size(root.scopeWidth, root.scopeHeight); });
57 item.fixedHeaderHeight = Qt.binding(function() { return cardTool.headerHeight / appliedScale; });
58 item.fontScale = Qt.binding(function() { return 1 / appliedScale; });
59 item.height = Qt.binding(function() { return root.scopeHeight; });
60 item.width = Qt.binding(function() { return root.scopeWidth; });
61 item.cardData = Qt.binding(function() { return model; });
62 item.template = Qt.binding(function() { return cardTool.template; });
63 item.components = Qt.binding(function() { return cardTool.components; });
64 item.headerAlignment = Qt.binding(function() { return cardTool.headerAlignment; });
65 }
66
67 Connections {
68 target: loader.item
69 onClicked: root.clicked(index, result, model)
70 }
71 }
72 }
73}
074
=== added file 'qml/Dash/ScopesOverviewTab.qml'
--- qml/Dash/ScopesOverviewTab.qml 1970-01-01 00:00:00 +0000
+++ qml/Dash/ScopesOverviewTab.qml 2014-08-08 20:44:52 +0000
@@ -0,0 +1,74 @@
1/*
2 * Copyright (C) 2014 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
17import QtQuick 2.3
18import Ubuntu.Components 0.1
19
20Item {
21 id: root
22
23 property int currentTab: 0
24
25 AbstractButton {
26 id: tab1
27 height: parent.height
28 width: parent.width / 2
29 Rectangle {
30 anchors.fill: parent
31 color: root.currentTab == 0 && root.enabled ? "white" : "transparent"
32 radius: units.dp(10)
33 }
34 Label {
35 anchors.centerIn: parent
36 text: i18n.tr("Favorites")
37 color: root.currentTab == 0 && root.enabled ? "black" : "white"
38 }
39 onClicked: root.currentTab = 0
40 }
41 AbstractButton {
42 id: tab2
43 objectName: "scopesOverviewAllTabButton"
44 x: width
45 height: parent.height
46 width: parent.width / 2
47 Rectangle {
48 anchors.fill: parent
49 color: root.currentTab == 1 && root.enabled ? "white" : "transparent"
50 radius: units.dp(10)
51 }
52 Label {
53 anchors.centerIn: parent
54 text: i18n.tr("All")
55 color: root.currentTab == 1 && root.enabled ? "black" : "white"
56 }
57 onClicked: root.currentTab = 1
58 }
59 Rectangle {
60 id: centerPiece
61 width: root.enabled ? units.dp(10) : units.dp(1)
62 height: parent.height
63 color: "white"
64 x: root.currentTab == 1 ? tab2.x : tab2.x - width
65 }
66 Rectangle {
67 id: border
68 anchors.fill: parent
69 radius: units.dp(10)
70 color: "transparent"
71 border.color: centerPiece.color
72 border.width: units.dp(1)
73 }
74}
075
=== added file 'qml/Dash/graphics/dark_background.jpg'
1Binary files qml/Dash/graphics/dark_background.jpg 1970-01-01 00:00:00 +0000 and qml/Dash/graphics/dark_background.jpg 2014-08-08 20:44:52 +0000 differ76Binary files qml/Dash/graphics/dark_background.jpg 1970-01-01 00:00:00 +0000 and qml/Dash/graphics/dark_background.jpg 2014-08-08 20:44:52 +0000 differ
=== added file 'qml/Dash/graphics/overview_hint@27.png'
2Binary files qml/Dash/graphics/overview_hint@27.png 1970-01-01 00:00:00 +0000 and qml/Dash/graphics/overview_hint@27.png 2014-08-08 20:44:52 +0000 differ77Binary files qml/Dash/graphics/overview_hint@27.png 1970-01-01 00:00:00 +0000 and qml/Dash/graphics/overview_hint@27.png 2014-08-08 20:44:52 +0000 differ
=== modified file 'tests/autopilot/unity8/shell/tests/test_emulators.py'
--- tests/autopilot/unity8/shell/tests/test_emulators.py 2014-07-30 20:01:30 +0000
+++ tests/autopilot/unity8/shell/tests/test_emulators.py 2014-08-08 20:44:52 +0000
@@ -122,7 +122,7 @@
122 self._assert_scope_is_opened(scope, scope_id)122 self._assert_scope_is_opened(scope, scope_id)
123123
124 def test_open_generic_scope(self):124 def test_open_generic_scope(self):
125 scope_id = 'scopes'125 scope_id = 'musicaggregator'
126 scope = self.dash.open_scope(scope_id)126 scope = self.dash.open_scope(scope_id)
127 self._assert_scope_is_opened(scope, scope_id)127 self._assert_scope_is_opened(scope, scope_id)
128 self.assertIsInstance(scope, dash_emulators.GenericScopeView)128 self.assertIsInstance(scope, dash_emulators.GenericScopeView)
129129
=== modified file 'tests/mocks/Unity/CMakeLists.txt'
--- tests/mocks/Unity/CMakeLists.txt 2014-08-06 19:38:57 +0000
+++ tests/mocks/Unity/CMakeLists.txt 2014-08-08 20:44:52 +0000
@@ -22,6 +22,7 @@
22set(UnityQML_SOURCES22set(UnityQML_SOURCES
23 fake_scope.cpp23 fake_scope.cpp
24 fake_scopes.cpp24 fake_scopes.cpp
25 fake_scopesoverview.cpp
25 fake_categories.cpp26 fake_categories.cpp
26 fake_navigation.cpp27 fake_navigation.cpp
27 fake_resultsmodel.cpp28 fake_resultsmodel.cpp
2829
=== modified file 'tests/mocks/Unity/fake_resultsmodel.cpp'
--- tests/mocks/Unity/fake_resultsmodel.cpp 2014-05-20 10:29:20 +0000
+++ tests/mocks/Unity/fake_resultsmodel.cpp 2014-08-08 20:44:52 +0000
@@ -58,8 +58,9 @@
58 case RoleUri:58 case RoleUri:
59 case RoleCategoryId:59 case RoleCategoryId:
60 case RoleDndUri:60 case RoleDndUri:
61 return QString();
61 case RoleResult:62 case RoleResult:
62 return QString();63 return QString("Result.%1.%2").arg(m_categoryId).arg(index.row());
63 case RoleTitle:64 case RoleTitle:
64 return QString("Title.%1.%2").arg(m_categoryId).arg(index.row());65 return QString("Title.%1.%2").arg(m_categoryId).arg(index.row());
65 case RoleArt:66 case RoleArt:
6667
=== modified file 'tests/mocks/Unity/fake_scope.cpp'
--- tests/mocks/Unity/fake_scope.cpp 2014-08-06 10:03:55 +0000
+++ tests/mocks/Unity/fake_scope.cpp 2014-08-08 20:44:52 +0000
@@ -18,14 +18,16 @@
18#include <QUrl>18#include <QUrl>
1919
20#include "fake_scope.h"20#include "fake_scope.h"
21
21#include "fake_navigation.h"22#include "fake_navigation.h"
22#include "fake_resultsmodel.h"23#include "fake_resultsmodel.h"
24#include "fake_scopes.h"
2325
24Scope::Scope(QObject* parent) : Scope(QString(), QString(), false, parent)26Scope::Scope(Scopes* parent) : Scope(QString(), QString(), false, parent)
25{27{
26}28}
2729
28Scope::Scope(QString const& id, QString const& name, bool favorite, QObject* parent, int categories)30Scope::Scope(QString const& id, QString const& name, bool favorite, Scopes* parent, int categories)
29 : unity::shell::scopes::ScopeInterface(parent)31 : unity::shell::scopes::ScopeInterface(parent)
30 , m_id(id)32 , m_id(id)
31 , m_name(name)33 , m_name(name)
@@ -36,6 +38,7 @@
36 , m_currentAltNavigationId("altroot")38 , m_currentAltNavigationId("altroot")
37 , m_previewRendererName("preview-generic")39 , m_previewRendererName("preview-generic")
38 , m_categories(new Categories(categories, this))40 , m_categories(new Categories(categories, this))
41 , m_openScope(nullptr)
39{42{
40}43}
4144
@@ -158,7 +161,12 @@
158161
159void Scope::activate(QVariant const& result)162void Scope::activate(QVariant const& result)
160{163{
161 Q_UNUSED(result);164 qDebug() << "Called activate on scope" << m_id << "with result" << result;
165 if (result.toString() == "Result.2.2") {
166 Scopes *scopes = dynamic_cast<Scopes*>(parent());
167 m_openScope = scopes->getScopeFromAll("MockScope9");
168 Q_EMIT openScope(m_openScope);
169 }
162}170}
163171
164PreviewStack* Scope::preview(QVariant const& result)172PreviewStack* Scope::preview(QVariant const& result)
@@ -174,9 +182,13 @@
174{182{
175}183}
176184
177void Scope::closeScope(unity::shell::scopes::ScopeInterface* /*scope*/)185void Scope::closeScope(unity::shell::scopes::ScopeInterface* scope)
178{186{
179 qFatal("Scope::closeScope is not implemented");187 if (scope != m_openScope) {
188 qDebug() << scope << m_openScope;
189 qFatal("Scope::closeScope got wrong scope in closeScope");
190 }
191 m_openScope = nullptr;
180}192}
181193
182QString Scope::currentNavigationId() const194QString Scope::currentNavigationId() const
183195
=== modified file 'tests/mocks/Unity/fake_scope.h'
--- tests/mocks/Unity/fake_scope.h 2014-08-06 10:03:55 +0000
+++ tests/mocks/Unity/fake_scope.h 2014-08-08 20:44:52 +0000
@@ -24,13 +24,15 @@
2424
25#include <QTimer>25#include <QTimer>
2626
27class Scopes;
28
27class Scope : public unity::shell::scopes::ScopeInterface29class Scope : public unity::shell::scopes::ScopeInterface
28{30{
29 Q_OBJECT31 Q_OBJECT
3032
31public:33public:
32 Scope(QObject* parent = 0);34 Scope(Scopes* parent = 0);
33 Scope(QString const& id, QString const& name, bool favorite, QObject* parent = 0, int categories = 20);35 Scope(QString const& id, QString const& name, bool favorite, Scopes* parent = 0, int categories = 20);
3436
35 /* getters */37 /* getters */
36 QString id() const override;38 QString id() const override;
@@ -92,7 +94,8 @@
9294
93 QString m_previewRendererName;95 QString m_previewRendererName;
9496
95 Categories* m_categories;97 unity::shell::scopes::CategoriesInterface* m_categories;
98 unity::shell::scopes::ScopeInterface* m_openScope;
96};99};
97100
98#endif // FAKE_SCOPE_H101#endif // FAKE_SCOPE_H
99102
=== modified file 'tests/mocks/Unity/fake_scopes.cpp'
--- tests/mocks/Unity/fake_scopes.cpp 2014-08-06 19:38:57 +0000
+++ tests/mocks/Unity/fake_scopes.cpp 2014-08-08 20:44:52 +0000
@@ -18,6 +18,7 @@
1818
19// Self19// Self
20#include "fake_scopes.h"20#include "fake_scopes.h"
21#include "fake_scopesoverview.h"
2122
22// TODO: Implement remaining pieces, like Categories (i.e. LensView now gives warnings)23// TODO: Implement remaining pieces, like Categories (i.e. LensView now gives warnings)
2324
@@ -26,6 +27,7 @@
2627
27Scopes::Scopes(QObject *parent)28Scopes::Scopes(QObject *parent)
28 : unity::shell::scopes::ScopesInterface(parent)29 : unity::shell::scopes::ScopesInterface(parent)
30 , m_scopesOverview(nullptr)
29 , m_loaded(false)31 , m_loaded(false)
30 , timer(this)32 , timer(this)
31{33{
@@ -52,10 +54,17 @@
52 addScope(new Scope("clickscope", "Apps", true, this));54 addScope(new Scope("clickscope", "Apps", true, this));
53 addScope(new Scope("MockScope5", "Videos", true, this));55 addScope(new Scope("MockScope5", "Videos", true, this));
54 addScope(new Scope("SingleCategoryScope", "Single", true, this, 1));56 addScope(new Scope("SingleCategoryScope", "Single", true, this, 1));
57 addScope(new Scope("MockScope4", "MS4", true, this));
58 addScope(new Scope("MockScope6", "MS6", true, this));
59 addScope(new Scope("MockScope7", "MS7", false, this));
60 addScope(new Scope("MockScope8", "MS8", false, this));
61 addScope(new Scope("MockScope9", "MS9", false, this));
62 m_scopesOverview = new ScopesOverview(this);
5563
56 if (!m_loaded) {64 if (!m_loaded) {
57 m_loaded = true;65 m_loaded = true;
58 Q_EMIT loadedChanged();66 Q_EMIT loadedChanged();
67 Q_EMIT overviewScopeChanged();
59 }68 }
60}69}
6170
@@ -64,10 +73,13 @@
64 timer.stop();73 timer.stop();
65 if (m_scopes.size() > 0) {74 if (m_scopes.size() > 0) {
66 beginRemoveRows(QModelIndex(), 0, m_scopes.count()-1);75 beginRemoveRows(QModelIndex(), 0, m_scopes.count()-1);
67 qDeleteAll(m_scopes);76 qDeleteAll(m_allScopes);
77 m_allScopes.clear();
68 m_scopes.clear();78 m_scopes.clear();
69 endRemoveRows();79 endRemoveRows();
70 }80 }
81 delete m_scopesOverview;
82 m_scopesOverview = nullptr;
7183
72 if (m_loaded) {84 if (m_loaded) {
73 m_loaded = false;85 m_loaded = false;
@@ -113,8 +125,22 @@
113 return m_scopes[row];125 return m_scopes[row];
114}126}
115127
116unity::shell::scopes::ScopeInterface* Scopes::getScope(QString const&) const128unity::shell::scopes::ScopeInterface* Scopes::getScope(QString const &scope_id) const
117{129{
130 // According to mh3 Scopes::getScope should only return favorite scopes (i.e the ones in the model)
131 for (Scope *scope : m_scopes) {
132 if (scope->id() == scope_id)
133 return scope;
134 }
135 return nullptr;
136}
137
138Scope* Scopes::getScopeFromAll(const QString& scope_id) const
139{
140 for (Scope *scope : m_allScopes) {
141 if (scope->id() == scope_id)
142 return scope;
143 }
118 return nullptr;144 return nullptr;
119}145}
120146
@@ -135,13 +161,26 @@
135161
136unity::shell::scopes::ScopeInterface* Scopes::overviewScope() const162unity::shell::scopes::ScopeInterface* Scopes::overviewScope() const
137{163{
138 return nullptr;164 return m_scopesOverview;
165}
166
167QList<Scope*> Scopes::scopes() const
168{
169 return m_scopes;
170}
171
172QList<Scope*> Scopes::allScopes() const
173{
174 return m_allScopes;
139}175}
140176
141void Scopes::addScope(Scope* scope)177void Scopes::addScope(Scope* scope)
142{178{
143 int index = rowCount();179 int index = rowCount();
144 beginInsertRows(QModelIndex(), index, index);180 if (scope->favorite()) {
145 m_scopes.append(scope);181 beginInsertRows(QModelIndex(), index, index);
146 endInsertRows();182 m_scopes.append(scope);
183 endInsertRows();
184 }
185 m_allScopes.append(scope);
147}186}
148187
=== modified file 'tests/mocks/Unity/fake_scopes.h'
--- tests/mocks/Unity/fake_scopes.h 2014-08-06 19:38:57 +0000
+++ tests/mocks/Unity/fake_scopes.h 2014-08-08 20:44:52 +0000
@@ -53,11 +53,18 @@
53 int count() const override;53 int count() const override;
54 unity::shell::scopes::ScopeInterface* overviewScope() const override;54 unity::shell::scopes::ScopeInterface* overviewScope() const override;
5555
56 // This is used as part of implementation of the other C++ code, not API
57 QList<Scope*> scopes() const;
58 QList<Scope*> allScopes() const;
59 Scope* getScopeFromAll(const QString& scope_id) const;
60
56private Q_SLOTS:61private Q_SLOTS:
57 void updateScopes();62 void updateScopes();
5863
59private:64private:
60 QList<Scope*> m_scopes;65 QList<Scope*> m_scopes; // the favorite ones
66 QList<Scope*> m_allScopes;
67 Scope *m_scopesOverview;
61 bool m_loaded;68 bool m_loaded;
62 QTimer timer;69 QTimer timer;
63};70};
6471
=== added file 'tests/mocks/Unity/fake_scopesoverview.cpp'
--- tests/mocks/Unity/fake_scopesoverview.cpp 1970-01-01 00:00:00 +0000
+++ tests/mocks/Unity/fake_scopesoverview.cpp 2014-08-08 20:44:52 +0000
@@ -0,0 +1,281 @@
1/*
2 * Copyright (C) 2014 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 "fake_scopesoverview.h"
18
19#include "fake_scopes.h"
20
21#include <paths.h>
22
23ScopesOverview::ScopesOverview(Scopes* parent)
24 : Scope("scopesOverview", "Scopes Overview", false, parent)
25{
26 delete m_categories; // delete the usual categories, we're not going to use it
27 m_scopesOverviewCategories = new ScopesOverviewCategories(parent, this);
28 m_searchCategories = new ScopesOverviewSearchCategories(parent, this);
29 m_categories = m_scopesOverviewCategories;
30}
31
32void ScopesOverview::setSearchQuery(const QString& search_query)
33{
34 Scope::setSearchQuery(search_query);
35
36 auto origCategories = m_categories;
37 if (search_query.isEmpty()) m_categories = m_scopesOverviewCategories;
38 else m_categories = m_searchCategories;
39
40 if (m_categories != origCategories)
41 Q_EMIT categoriesChanged();
42}
43
44Q_INVOKABLE void ScopesOverview::activate(QVariant const& result)
45{
46 Scopes *scopes = dynamic_cast<Scopes*>(parent());
47 m_openScope = scopes->getScopeFromAll(result.toString());
48 Q_EMIT openScope(m_openScope);
49}
50
51ScopesOverviewCategories::ScopesOverviewCategories(Scopes *scopes, QObject* parent)
52 : unity::shell::scopes::CategoriesInterface(parent)
53 , m_scopes(scopes)
54{
55}
56
57int ScopesOverviewCategories::rowCount(const QModelIndex& /*parent*/) const
58{
59 return 2;
60}
61
62void ScopesOverviewCategories::addSpecialCategory(QString const&, QString const&, QString const&, QString const&, QObject*)
63{
64 qFatal("Using un-implemented ScopesOverviewCategories::addSpecialCategory");
65}
66
67bool ScopesOverviewCategories::overrideCategoryJson(QString const& /* categoryId */, QString const& /* json */)
68{
69 qFatal("Using un-implemented ScopesOverviewCategories::overrideCategoryJson");
70}
71
72QVariant
73ScopesOverviewCategories::data(const QModelIndex& index, int role) const
74{
75 if (!index.isValid()) {
76 return QVariant();
77 }
78
79 const QString categoryId = index.row() == 0 ? "favorites" : "all";
80
81 unity::shell::scopes::ResultsModelInterface *resultsModel = m_resultsModels[index.row()];
82 if (!resultsModel) {
83 QObject *that = const_cast<ScopesOverviewCategories*>(this);
84 QList<Scope*> scopes = index.row() == 0 ? m_scopes->scopes() : m_scopes->allScopes();
85 resultsModel = new ScopesOverviewResultsModel(scopes, categoryId, that);
86 m_resultsModels[index.row()] = resultsModel;
87 }
88 switch (role) {
89 case RoleCategoryId:
90 return categoryId;
91 case RoleName:
92 return index.row() == 0 ? "Favorites" : "All";
93 case RoleIcon:
94 return QVariant();
95 case RoleRawRendererTemplate:
96 qFatal("Using un-implemented RoleRawRendererTemplate Categories role");
97 return QVariant();
98 case RoleRenderer:
99 {
100 QVariantMap map;
101 map["category-layout"] = "grid";
102 map["card-size"] = "small";
103 map["overlay"] = true;
104 return map;
105 }
106 case RoleComponents:
107 {
108 QVariantMap map, artMap;
109 artMap["aspect-ratio"] = "0.5";
110 artMap["field"] = "art";
111 map["art"] = artMap;
112 map["title"] = "HOLA";
113 return map;
114 }
115 case RoleResults:
116 return QVariant::fromValue(resultsModel);
117 case RoleCount:
118 return resultsModel->rowCount();
119 case RoleHeaderLink:
120 return QString();
121 default:
122 qFatal("Using un-implemented Categories role");
123 return QVariant();
124 }
125}
126
127
128
129ScopesOverviewSearchCategories::ScopesOverviewSearchCategories(Scopes *scopes, QObject* parent)
130 : unity::shell::scopes::CategoriesInterface(parent)
131 , m_scopes(scopes)
132{
133}
134
135int ScopesOverviewSearchCategories::rowCount(const QModelIndex& /*parent*/) const
136{
137 return 2;
138}
139
140void ScopesOverviewSearchCategories::addSpecialCategory(QString const&, QString const&, QString const&, QString const&, QObject*)
141{
142 qFatal("Using un-implemented ScopesOverviewSearchCategories::addSpecialCategory");
143}
144
145bool ScopesOverviewSearchCategories::overrideCategoryJson(QString const& /* categoryId */, QString const& /* json */)
146{
147 qFatal("Using un-implemented ScopesOverviewSearchCategories::overrideCategoryJson");
148}
149
150QVariant
151ScopesOverviewSearchCategories::data(const QModelIndex& index, int role) const
152{
153 if (!index.isValid()) {
154 return QVariant();
155 }
156
157 const QString categoryId = index.row() == 0 ? "searchA" : "searchB";
158
159 unity::shell::scopes::ResultsModelInterface *resultsModel = m_resultsModels[index.row()];
160 if (!resultsModel) {
161 QObject *that = const_cast<ScopesOverviewSearchCategories*>(this);
162 QList<Scope *> scopes;
163 if (index.row() == 0) {
164 scopes << m_scopes->getScopeFromAll("clickscope") << nullptr << m_scopes->getScopeFromAll("MockScope2");
165 } else {
166 scopes << nullptr << m_scopes->getScopeFromAll("MockScope7") << nullptr << m_scopes->getScopeFromAll("MockScope1");
167 }
168 resultsModel = new ScopesOverviewResultsModel(scopes, categoryId, that);
169 m_resultsModels[index.row()] = resultsModel;
170 }
171 switch (role) {
172 case RoleCategoryId:
173 return categoryId;
174 case RoleName:
175 return index.row() == 0 ? "SearchA" : "SearchB";
176 case RoleIcon:
177 return QVariant();
178 case RoleRawRendererTemplate:
179 qFatal("Using un-implemented RoleRawRendererTemplate Categories role");
180 return QVariant();
181 case RoleRenderer:
182 {
183 QVariantMap map;
184 map["category-layout"] = "grid";
185 map["card-size"] = "small";
186 map["overlay"] = true;
187 return map;
188 }
189 case RoleComponents:
190 {
191 QVariantMap map, artMap;
192 artMap["aspect-ratio"] = "1";
193 artMap["field"] = "art";
194 map["art"] = artMap;
195 map["title"] = "HOLA";
196 return map;
197 }
198 case RoleResults:
199 return QVariant::fromValue(resultsModel);
200 case RoleCount:
201 return resultsModel->rowCount();
202 case RoleHeaderLink:
203 return QString();
204 default:
205 qFatal("Using un-implemented Categories role");
206 return QVariant();
207 }
208}
209
210
211ScopesOverviewResultsModel::ScopesOverviewResultsModel(const QList<Scope *> &scopes, const QString &categoryId, QObject* parent)
212 : unity::shell::scopes::ResultsModelInterface(parent)
213 , m_scopes(scopes)
214 , m_categoryId(categoryId)
215{
216}
217
218QString ScopesOverviewResultsModel::categoryId() const
219{
220 return m_categoryId;
221}
222
223void ScopesOverviewResultsModel::setCategoryId(QString const& /*id*/)
224{
225 qFatal("Calling un-implemented ScopesOverviewResultsModel::setCategoryId");
226}
227
228int ScopesOverviewResultsModel::scopeIndex(QString const& id) const
229{
230 const int scopeCount = count();
231 for (int i = 0; i < scopeCount; ++i) {
232 if (m_scopes[i]->id() == id)
233 return i;
234 }
235 return -1;
236}
237
238QHash<int, QByteArray> ScopesOverviewResultsModel::roleNames() const
239{
240 QHash<int, QByteArray> roles = unity::shell::scopes::ResultsModelInterface::roleNames();
241 roles[RoleBackground + 1] = "scopeId";
242 return roles;
243}
244
245int ScopesOverviewResultsModel::rowCount(const QModelIndex& parent) const
246{
247 Q_UNUSED(parent);
248
249 return m_scopes.count();
250}
251
252int ScopesOverviewResultsModel::count() const
253{
254 return rowCount();
255}
256
257QVariant
258ScopesOverviewResultsModel::data(const QModelIndex& index, int role) const
259{
260 unity::shell::scopes::ScopeInterface *scope = m_scopes[index.row()];
261 switch (role) {
262 case RoleUri:
263 case RoleCategoryId:
264 case RoleDndUri:
265 return QString();
266 case RoleResult:
267 return scope ? scope->id() : QString("Result.%1.%2").arg(categoryId()).arg(index.row());
268 case RoleTitle:
269 return scope ? scope->name() : QString("Title.%1.%2").arg(categoryId()).arg(index.row());
270 case RoleArt:
271 return qmlDirectory() + "graphics/applicationIcons/dash.png";
272 case RoleMascot:
273 case RoleEmblem:
274 case RoleSummary:
275 case RoleBackground + 1: // scopeId
276 return scope ? scope->id() : nullptr;
277 break;
278 default:
279 return QVariant();
280 }
281}
0282
=== added file 'tests/mocks/Unity/fake_scopesoverview.h'
--- tests/mocks/Unity/fake_scopesoverview.h 1970-01-01 00:00:00 +0000
+++ tests/mocks/Unity/fake_scopesoverview.h 2014-08-08 20:44:52 +0000
@@ -0,0 +1,104 @@
1/*
2 * Copyright (C) 2014 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 FAKE_SCOPESOVERVIEW_H
18#define FAKE_SCOPESOVERVIEW_H
19
20#include "fake_scope.h"
21#include <unity/shell/scopes/ResultsModelInterface.h>
22
23class Scopes;
24
25class ScopesOverview : public Scope
26{
27 Q_OBJECT
28
29public:
30 ScopesOverview(Scopes* parent = 0);
31
32 void setSearchQuery(const QString& search_query) override;
33 Q_INVOKABLE void activate(QVariant const& result) override;
34
35private:
36 unity::shell::scopes::CategoriesInterface *m_scopesOverviewCategories;
37 unity::shell::scopes::CategoriesInterface *m_searchCategories;
38};
39
40class ScopesOverviewCategories : public unity::shell::scopes::CategoriesInterface
41{
42 Q_OBJECT
43
44public:
45 ScopesOverviewCategories(Scopes *scopes, QObject* parent = 0);
46
47 QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
48 int rowCount(const QModelIndex& parent = QModelIndex()) const override;
49
50 Q_INVOKABLE void addSpecialCategory(QString const& categoryId, QString const& name, QString const& icon, QString const& rawTemplate, QObject* countObject) override;
51 Q_INVOKABLE bool overrideCategoryJson(QString const& categoryId, QString const& json) override;
52
53private:
54 mutable QHash<int, unity::shell::scopes::ResultsModelInterface*> m_resultsModels;
55
56 Scopes *m_scopes;
57};
58
59class ScopesOverviewSearchCategories : public unity::shell::scopes::CategoriesInterface
60{
61 Q_OBJECT
62
63public:
64 ScopesOverviewSearchCategories(Scopes *scopes, QObject* parent = 0);
65
66 QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
67 int rowCount(const QModelIndex& parent = QModelIndex()) const override;
68
69 Q_INVOKABLE void addSpecialCategory(QString const& categoryId, QString const& name, QString const& icon, QString const& rawTemplate, QObject* countObject) override;
70 Q_INVOKABLE bool overrideCategoryJson(QString const& categoryId, QString const& json) override;
71
72private:
73 mutable QHash<int, unity::shell::scopes::ResultsModelInterface*> m_resultsModels;
74
75 Scopes *m_scopes;
76};
77
78class ScopesOverviewResultsModel : public unity::shell::scopes::ResultsModelInterface
79{
80 Q_OBJECT
81
82public:
83 explicit ScopesOverviewResultsModel(const QList<Scope *> &scopes, const QString &categoryId, QObject* parent = 0);
84
85 int rowCount(const QModelIndex& parent = QModelIndex()) const override;
86 QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
87
88 /* getters */
89 QString categoryId() const override;
90 int count() const override;
91
92 /* setters */
93 void setCategoryId(QString const& id) override;
94
95 /* Special API */
96 Q_INVOKABLE int scopeIndex(QString const& id) const;
97 QHash<int, QByteArray> roleNames() const override;
98
99private:
100 QList<Scope *> m_scopes;
101 QString m_categoryId;
102};
103
104#endif // FAKE_SCOPESOVERVIEW_H
0105
=== modified file 'tests/plugins/Dash/cardcreator/2.res'
--- tests/plugins/Dash/cardcreator/2.res 2014-07-31 13:33:56 +0000
+++ tests/plugins/Dash/cardcreator/2.res 2014-08-08 20:44:52 +0000
@@ -89,7 +89,7 @@
89 wrapMode: Text.Wrap; 89 wrapMode: Text.Wrap;
90 maximumLineCount: 2; 90 maximumLineCount: 2;
91 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale); 91 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
92 color: backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < 0.7 ? "white" : (root.scopeStyle ? root.scopeStyle.foreground : "grey"); 92 color: backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < (root.scopeStyle ? root.scopeStyle.threshold : 0.7) ? (root.scopeStyle ? root.scopeStyle.light : "white") : (root.scopeStyle ? root.scopeStyle.dark : "grey");
93 visible: showHeader ; 93 visible: showHeader ;
94 text: root.title; 94 text: root.title;
95 font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal; 95 font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
@@ -104,7 +104,7 @@
104 elide: Text.ElideRight; 104 elide: Text.ElideRight;
105 fontSize: "small"; 105 fontSize: "small";
106 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale); 106 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
107 color: backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < 0.7 ? "white" : (root.scopeStyle ? root.scopeStyle.foreground : "grey"); 107 color: backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < (root.scopeStyle ? root.scopeStyle.threshold : 0.7) ? (root.scopeStyle ? root.scopeStyle.light : "white") : (root.scopeStyle ? root.scopeStyle.dark : "grey");
108 visible: titleLabel.visible && titleLabel.text; 108 visible: titleLabel.visible && titleLabel.text;
109 text: cardData && cardData["subtitle"] || ""; 109 text: cardData && cardData["subtitle"] || "";
110 font.weight: Font.Light; 110 font.weight: Font.Light;
111111
=== modified file 'tests/plugins/Dash/cardcreator/5.res'
--- tests/plugins/Dash/cardcreator/5.res 2014-08-05 22:51:17 +0000
+++ tests/plugins/Dash/cardcreator/5.res 2014-08-08 20:44:52 +0000
@@ -68,8 +68,9 @@
68 visible: showHeader && status == Loader.Ready; 68 visible: showHeader && status == Loader.Ready;
69 sourceComponent: ShaderEffect { 69 sourceComponent: ShaderEffect {
70 id: overlay; 70 id: overlay;
71 height: (fixedHeaderHeight > 0 ? fixedHeaderHeight : headerHeight) + units.gu(2); 71 height: (fixedHeaderHeight > 0 ? fixedHeaderHeight : headerHeight) + units.gu(2);
72 opacity: 0.6; 72 property real luminance: 0.2126 * overlayColor.r + 0.7152 * overlayColor.g + 0.0722 * overlayColor.b;
73 property color overlayColor: cardData && cardData["overlayColor"] || "#99000000";
73 property var source: ShaderEffectSource { 74 property var source: ShaderEffectSource {
74 id: shaderSource; 75 id: shaderSource;
75 sourceItem: artShapeLoader.item; 76 sourceItem: artShapeLoader.item;
@@ -90,15 +91,16 @@
90 varying highp vec2 coord; 91 varying highp vec2 coord;
91 uniform sampler2D source; 92 uniform sampler2D source;
92 uniform lowp float qt_Opacity; 93 uniform lowp float qt_Opacity;
94 uniform highp vec4 overlayColor;
93 void main() { 95 void main() {
94 lowp vec4 tex = texture2D(source, coord); 96 lowp vec4 tex = texture2D(source, coord);
95 gl_FragColor = vec4(0, 0, 0, tex.a) * qt_Opacity; 97 gl_FragColor = vec4(overlayColor.r, overlayColor.g, overlayColor.b, 1) * qt_Opacity * overlayColor.a * tex.a;
96 }"; 98 }";
97 } 99 }
98 }100 }
99readonly property int headerHeight: titleLabel.height + subtitleLabel.height + subtitleLabel.anchors.topMargin;101readonly property int headerHeight: titleLabel.height + subtitleLabel.height + subtitleLabel.anchors.topMargin;
100Label { 102Label {
101 id: titleLabel; 103 id: titleLabel;
102 objectName: "titleLabel"; 104 objectName: "titleLabel";
103 anchors { left: parent.left; 105 anchors { left: parent.left;
104 leftMargin: units.gu(1); 106 leftMargin: units.gu(1);
@@ -112,7 +114,7 @@
112 wrapMode: Text.Wrap; 114 wrapMode: Text.Wrap;
113 maximumLineCount: 2; 115 maximumLineCount: 2;
114 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale); 116 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
115 color: "white"; 117 color: overlayLoader.item.luminance < (root.scopeStyle ? root.scopeStyle.threshold : 0.7) ? (root.scopeStyle ? root.scopeStyle.light : "white") : (root.scopeStyle ? root.scopeStyle.dark : "grey");
116 visible: showHeader && overlayLoader.active; 118 visible: showHeader && overlayLoader.active;
117 text: root.title; 119 text: root.title;
118 font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal; 120 font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
@@ -131,7 +133,7 @@
131 elide: Text.ElideRight; 133 elide: Text.ElideRight;
132 fontSize: "small"; 134 fontSize: "small";
133 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale); 135 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
134 color: "white"; 136 color: overlayLoader.item.luminance < (root.scopeStyle ? root.scopeStyle.threshold : 0.7) ? (root.scopeStyle ? root.scopeStyle.light : "white") : (root.scopeStyle ? root.scopeStyle.dark : "grey");
135 visible: titleLabel.visible && titleLabel.text; 137 visible: titleLabel.visible && titleLabel.text;
136 text: cardData && cardData["subtitle"] || ""; 138 text: cardData && cardData["subtitle"] || "";
137 font.weight: Font.Light; 139 font.weight: Font.Light;
138140
=== modified file 'tests/plugins/Dash/cardcreator/7.res'
--- tests/plugins/Dash/cardcreator/7.res 2014-08-05 22:51:17 +0000
+++ tests/plugins/Dash/cardcreator/7.res 2014-08-08 20:44:52 +0000
@@ -90,7 +90,7 @@
90 wrapMode: Text.Wrap; 90 wrapMode: Text.Wrap;
91 maximumLineCount: 2; 91 maximumLineCount: 2;
92 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale); 92 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
93 color: backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < 0.7 ? "white" : (root.scopeStyle ? root.scopeStyle.foreground : "grey"); 93 color: backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < (root.scopeStyle ? root.scopeStyle.threshold : 0.7) ? (root.scopeStyle ? root.scopeStyle.light : "white") : (root.scopeStyle ? root.scopeStyle.dark : "grey");
94 visible: showHeader ; 94 visible: showHeader ;
95 text: root.title; 95 text: root.title;
96 font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal; 96 font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
@@ -104,7 +104,7 @@
104 elide: Text.ElideRight; 104 elide: Text.ElideRight;
105 fontSize: "small"; 105 fontSize: "small";
106 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale); 106 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
107 color: backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < 0.7 ? "white" : (root.scopeStyle ? root.scopeStyle.foreground : "grey"); 107 color: backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < (root.scopeStyle ? root.scopeStyle.threshold : 0.7) ? (root.scopeStyle ? root.scopeStyle.light : "white") : (root.scopeStyle ? root.scopeStyle.dark : "grey");
108 visible: titleLabel.visible && titleLabel.text; 108 visible: titleLabel.visible && titleLabel.text;
109 text: cardData && cardData["subtitle"] || ""; 109 text: cardData && cardData["subtitle"] || "";
110 font.weight: Font.Light; 110 font.weight: Font.Light;
@@ -115,8 +115,8 @@
115 id: attributesRow; 115 id: attributesRow;
116 objectName: "attributesRow"; 116 objectName: "attributesRow";
117 anchors { left: parent.left; right: parent.right } 117 anchors { left: parent.left; right: parent.right }
118 color: backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < 0.7 ? "white" : (root.scopeStyle ? root.scopeStyle.foreground : "grey"); 118 color: backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < (root.scopeStyle ? root.scopeStyle.threshold : 0.7) ? (root.scopeStyle ? root.scopeStyle.light : "white") : (root.scopeStyle ? root.scopeStyle.dark : "grey");
119 model: cardData["attributes"]; 119 model: cardData["attributes"];
120 }120 }
121 121
122 ]122 ]
123123
=== modified file 'tests/plugins/Dash/tst_ScopeStyle.qml'
--- tests/plugins/Dash/tst_ScopeStyle.qml 2014-07-25 11:42:06 +0000
+++ tests/plugins/Dash/tst_ScopeStyle.qml 2014-08-08 20:44:52 +0000
@@ -101,7 +101,7 @@
101101
102 function test_threshold_data() {102 function test_threshold_data() {
103 return [103 return [
104 { tag: "default", index: 0, threshold: 0.5020 },104 { tag: "default", index: 0, threshold: 0.7510 },
105 { tag: "red on black", index: 1, threshold: 0.1063 },105 { tag: "red on black", index: 1, threshold: 0.1063 },
106 { tag: "green on white", index: 2, threshold: 0.6795 },106 { tag: "green on white", index: 2, threshold: 0.6795 },
107 { tag: "blue on darkgrey", index: 3, threshold: 0.3675 },107 { tag: "blue on darkgrey", index: 3, threshold: 0.3675 },
108108
=== added directory 'tests/qmltests/Dash/ScopeSettings'
=== added file 'tests/qmltests/Dash/ScopeSettings/tst_ScopeSettingSwitch.qml'
--- tests/qmltests/Dash/ScopeSettings/tst_ScopeSettingSwitch.qml 1970-01-01 00:00:00 +0000
+++ tests/qmltests/Dash/ScopeSettings/tst_ScopeSettingSwitch.qml 2014-08-08 20:44:52 +0000
@@ -0,0 +1,33 @@
1/*
2 * Copyright 2014 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
17import QtQuick 2.0
18import QtTest 1.0
19import "../../../../qml/Dash/ScopeSettings"
20import Unity.Test 0.1 as UT
21
22Rectangle {
23 id: root
24 width: units.gu(60)
25 height: units.gu(80)
26
27 property var widgetData: {
28 "title": "THE TITLE",
29 "subtitle": "Something catchy",
30 "mascot": "../graphics/play_button.png"
31 }
32
33}
034
=== modified file 'tests/qmltests/Dash/tst_Dash.qml'
--- tests/qmltests/Dash/tst_Dash.qml 2014-08-06 14:50:25 +0000
+++ tests/qmltests/Dash/tst_Dash.qml 2014-08-08 20:44:52 +0000
@@ -20,8 +20,6 @@
20import Ubuntu.Components 0.120import Ubuntu.Components 0.1
21import Unity.Test 0.1 as UT21import Unity.Test 0.1 as UT
2222
23// TODO We don't have any tests for the overlay scope functionality.
24
25Item {23Item {
26 id: shell24 id: shell
27 width: units.gu(40)25 width: units.gu(40)
@@ -61,9 +59,9 @@
61 function get_scope_data() {59 function get_scope_data() {
62 return [60 return [
63 { tag: "MockScope1", visualIndex: 0 },61 { tag: "MockScope1", visualIndex: 0 },
64 { tag: "MockScope2", visualIndex: 1 },62 { tag: "MockScope2", visualIndex: -1 },
65 { tag: "clickscope", visualIndex: 2 },63 { tag: "clickscope", visualIndex: 1 },
66 { tag: "MockScope5", visualIndex: 3 },64 { tag: "MockScope5", visualIndex: 2 },
67 ]65 ]
68 }66 }
6967
@@ -79,10 +77,234 @@
79 tryCompare(dashContentList, "count", 0);77 tryCompare(dashContentList, "count", 0);
80 scopes.load();78 scopes.load();
81 tryCompare(scopes, "loaded", true);79 tryCompare(scopes, "loaded", true);
82 tryCompare(dashContentList, "count", 5);80 tryCompare(dashContentList, "count", 6);
8381
84 verify(dashContentList != undefined);82 verify(dashContentList != undefined);
85 tryCompare(dashContentList, "currentIndex", data.visualIndex);83 if (data.visualIndex == -1) {
84 tryCompare(dashContentList, "currentIndex", 0);
85 expectFail(data.tag, "non favorite scopes should not be visble in the scopes model");
86 compare(dashContentList.currentItem.scopeId, data.tag); // this should fail
87 } else {
88 tryCompare(dashContentList, "currentIndex", data.visualIndex);
89 compare(dashContentList.currentItem.scopeId, data.tag);
90 }
91 }
92
93 function test_dash_overview_show_select_same_favorite() {
94 // Wait for stuff to be loaded
95 tryCompare(scopes, "loaded", true);
96 var dashContentList = findChild(dash, "dashContentList");
97 tryCompare(dashContentList, "count", 6);
98 var mockScope1Loader = findChild(dash, "MockScope1 loader");
99 tryCompareFunction(function() { return mockScope1Loader.item != null; }, true);
100
101 // Show the overview
102 touchFlick(dash, dash.width / 2, dash.height - 1, dash.width / 2, dash.height - units.gu(18));
103 var overviewController = findInvisibleChild(dash, "overviewController");
104 tryCompare(overviewController, "progress", 1);
105
106 // Make sure tab is where it should
107 var scopesOverview = findChild(dash, "scopesOverview");
108 compare(scopesOverview.currentTab, 0);
109
110 // Make sure stuff is loaded
111 var scopesOverviewFavoritesRepeater = findChild(dash, "scopesOverviewFavoritesRepeater");
112 tryCompare(scopesOverviewFavoritesRepeater, "count", 6);
113 tryCompareFunction(function() { return scopesOverviewFavoritesRepeater.itemAt(0).item != null; }, true);
114 waitForRendering(scopesOverviewFavoritesRepeater.itemAt(0).item);
115
116 // Click in first item
117 mouseClick(scopesOverviewFavoritesRepeater.itemAt(0).item, 0, 0);
118
119 // Make sure animation went back
120 tryCompare(overviewController, "progress", 0);
121 compare(dashContentList.currentIndex, 0);
122 }
123
124 function test_dash_overview_show_select_different_favorite() {
125 // Wait for stuff to be loaded
126 tryCompare(scopes, "loaded", true);
127 var dashContentList = findChild(dash, "dashContentList");
128 tryCompare(dashContentList, "count", 6);
129 var mockScope1Loader = findChild(dash, "MockScope1 loader");
130 tryCompareFunction(function() { return mockScope1Loader.item != null; }, true);
131
132 // Show the overview
133 touchFlick(dash, dash.width / 2, dash.height - 1, dash.width / 2, dash.height - units.gu(18));
134 var overviewController = findInvisibleChild(dash, "overviewController");
135 tryCompare(overviewController, "progress", 1);
136
137 // Make sure tab is where it should
138 var scopesOverview = findChild(dash, "scopesOverview");
139 compare(scopesOverview.currentTab, 0);
140
141 // Make sure stuff is loaded
142 var scopesOverviewFavoritesRepeater = findChild(dash, "scopesOverviewFavoritesRepeater");
143 tryCompare(scopesOverviewFavoritesRepeater, "count", 6);
144 tryCompareFunction(function() { return scopesOverviewFavoritesRepeater.itemAt(0).item != null; }, true);
145 waitForRendering(scopesOverviewFavoritesRepeater.itemAt(1).item);
146
147 // Click in first item
148 mouseClick(scopesOverviewFavoritesRepeater.itemAt(1).item, 0, 0);
149
150 // Make sure animation went back
151 tryCompare(overviewController, "progress", 0);
152 compare(dashContentList.currentIndex, 1);
153 }
154
155 function test_dash_overview_all_temp_scope_done_from_all() {
156 // Wait for stuff to be loaded
157 tryCompare(scopes, "loaded", true);
158 var dashContentList = findChild(dash, "dashContentList");
159 tryCompare(dashContentList, "count", 6);
160 var mockScope1Loader = findChild(dash, "MockScope1 loader");
161 tryCompareFunction(function() { return mockScope1Loader.item != null; }, true);
162
163 // Show the overview
164 touchFlick(dash, dash.width / 2, dash.height - 1, dash.width / 2, dash.height - units.gu(18));
165 var overviewController = findInvisibleChild(dash, "overviewController");
166 tryCompare(overviewController, "progress", 1);
167
168 // Make sure tab is where it should
169 var scopesOverview = findChild(dash, "scopesOverview");
170 compare(scopesOverview.currentTab, 0);
171
172 // Make sure stuff is loaded
173 var scopesOverviewFavoritesRepeater = findChild(dash, "scopesOverviewFavoritesRepeater");
174 tryCompare(scopesOverviewFavoritesRepeater, "count", 6);
175 tryCompareFunction(function() { return scopesOverviewFavoritesRepeater.itemAt(0).item != null; }, true);
176 waitForRendering(scopesOverviewFavoritesRepeater.itemAt(1).item);
177
178 // Click on the all tab
179 var scopesOverviewAllTabButton = findChild(dash, "scopesOverviewAllTabButton");
180 mouseClick(scopesOverviewAllTabButton, 0, 0);
181
182 // Wait for all tab to be enabled (animation finish)
183 var scopesOverviewAllView = findChild(dash, "scopesOverviewRepeaterChild1");
184 tryCompare(scopesOverviewAllView, "enabled", true);
185
186 // Click on a temp scope
187 var tempScopeCard = findChild(scopesOverviewAllView, "delegate1");
188 mouseClick(tempScopeCard, 0, 0);
189
190 // Check the bottom edge (overview) is disabled from temp scope
191 var overviewDragHandle = findChild(dash, "overviewDragHandle");
192 compare(overviewDragHandle.enabled, false);
193
194 // Check temp scope is there
195 var scopesOverviewTempScopeItem = findChild(dash, "scopesOverviewTempScopeItem");
196 tryCompareFunction( function() { return scopesOverviewTempScopeItem.scope != null; }, true);
197 tryCompare(scopesOverviewTempScopeItem, "enabled", true);
198
199 // Go back
200 var scopesOverviewTempScopeItemHeader = findChild(scopesOverviewTempScopeItem, "scopePageHeader");
201 var backButton = findChild(findChild(scopesOverviewTempScopeItemHeader, "innerPageHeader"), "backButton");
202 mouseClick(backButton, 0, 0);
203
204 // Check temp scope is gone
205 var scopesOverviewTempScopeItem = findChild(dash, "scopesOverviewTempScopeItem");
206 tryCompareFunction( function() { return scopesOverviewTempScopeItem.scope == null; }, true);
207 tryCompare(scopesOverviewTempScopeItem, "enabled", false);
208
209 // Press on done
210 var scopesOverviewDoneButton = findChild(scopesOverview, "scopesOverviewDoneButton");
211 mouseClick(scopesOverviewDoneButton, 0, 0);
212
213 // Check the dash overview is gone
214 tryCompare(overviewController, "progress", 0);
215
216 // Original list is still on 0
217 compare(dashContentList.currentIndex, 0);
218 }
219
220 function test_temp_scope_dash_overview_all_search_temp_scope_favorite_from_all() {
221 // Wait for stuff to be loaded
222 tryCompare(scopes, "loaded", true);
223 var dashContentList = findChild(dash, "dashContentList");
224 tryCompare(dashContentList, "count", 6);
225 var mockScope1Loader = findChild(dash, "MockScope1 loader");
226 tryCompareFunction(function() { return mockScope1Loader.item != null; }, true);
227
228 // Swipe right to Apps scope
229 touchFlick(dash, dash.width - 1, units.gu(1), dash.width - units.gu(10), units.gu(1));
230 tryCompare(dashContentList, "contentX", dashContentList.width);
231 tryCompare(dashContentList, "currentIndex", 1);
232
233 // Click on card that opens temp scope
234 var categoryListView = findChild(dashContentList.currentItem, "categoryListView");
235 var dashCategory2 = findChild(categoryListView, "dashCategory2");
236 tryCompareFunction(function() {
237 var d = findChild(dashCategory2, "delegate2");
238 if (d) return true;
239 categoryListView.contentY += 100;
240 return false;
241 }, true);
242 var card2 = findChild(dashCategory2, "delegate2");
243 waitForRendering(card2);
244 mouseClick(card2, card2.width / 2, card2.height / 2);
245
246 // Wait for temp scope to be there
247 var dashTempScopeItem = findChild(dash, "dashTempScopeItem");
248 tryCompare(dashTempScopeItem, "x", 0);
249
250 // Show the overview
251 touchFlick(dash, dash.width / 2, dash.height - 1, dash.width / 2, dash.height - units.gu(18));
252 var overviewController = findInvisibleChild(dash, "overviewController");
253 tryCompare(overviewController, "progress", 1);
254
255 // Make sure tab is where it should
256 var scopesOverview = findChild(dash, "scopesOverview");
257 compare(scopesOverview.currentTab, 1);
258
259 // Do a search
260 var scopesOverviewPageHeader = findChild(scopesOverview, "scopesOverviewPageHeader");
261 var searchButton = findChild(scopesOverviewPageHeader, "search_header_button");
262 mouseClick(searchButton, 0, 0);
263
264 // Type something
265 keyClick(Qt.Key_H);
266
267 // Check results grid is there and the other lists are not
268 var searchResultsViewer = findChild(scopesOverview, "searchResultsViewer");
269 var scopesOverviewRepeater = findChild(dash, "scopesOverviewRepeater");
270 tryCompare(searchResultsViewer, "opacity", 1);
271 tryCompare(scopesOverviewRepeater, "count", 0);
272
273 // Click on a temp scope in the search
274 var dashCategorysearchA = findChild(searchResultsViewer, "dashCategorysearchA");
275 var cardTempScope = findChild(dashCategorysearchA, "delegate2");
276 waitForRendering(cardTempScope);
277 mouseClick(cardTempScope, cardTempScope.width / 2, cardTempScope.height / 2);
278
279 // Check the bottom edge (overview) is disabled from temp scope
280 var overviewDragHandle = findChild(dash, "overviewDragHandle");
281 compare(overviewDragHandle.enabled, false);
282
283 // Check temp scope is there
284 var scopesOverviewTempScopeItem = findChild(dash, "scopesOverviewTempScopeItem");
285 tryCompareFunction( function() { return scopesOverviewTempScopeItem.scope != null; }, true);
286 tryCompare(scopesOverviewTempScopeItem, "enabled", true);
287
288 // Go back
289 var scopesOverviewTempScopeItemHeader = findChild(scopesOverviewTempScopeItem, "scopePageHeader");
290 var backButton = findChild(findChild(scopesOverviewTempScopeItemHeader, "innerPageHeader"), "backButton");
291 mouseClick(backButton, 0, 0);
292
293 // Check temp scope is gone
294 var scopesOverviewTempScopeItem = findChild(dash, "scopesOverviewTempScopeItem");
295 tryCompareFunction( function() { return scopesOverviewTempScopeItem.scope == null; }, true);
296 tryCompare(scopesOverviewTempScopeItem, "enabled", false);
297
298 // Press on a favorite
299 var dashCategorysearchB = findChild(searchResultsViewer, "dashCategorysearchB");
300 var cardFavSearch = findChild(dashCategorysearchB, "delegate3");
301 mouseClick(cardFavSearch, 0, 0);
302
303 // Check the dash overview is gone
304 tryCompare(overviewController, "progress", 0);
305
306 // Original list went to the favorite
307 compare(dashContentList.currentIndex, 0);
86 }308 }
87309
88 function test_setCurrentScope() {310 function test_setCurrentScope() {
89311
=== modified file 'tests/qmltests/Dash/tst_DashContent.qml'
--- tests/qmltests/Dash/tst_DashContent.qml 2014-08-06 10:16:59 +0000
+++ tests/qmltests/Dash/tst_DashContent.qml 2014-08-08 20:44:52 +0000
@@ -70,7 +70,7 @@
70 function loadScopes() {70 function loadScopes() {
71 scopeLoadedSpy.clear();71 scopeLoadedSpy.clear();
72 scopesModel.load();72 scopesModel.load();
73 tryCompare(scopeLoadedSpy, "count", 4);73 tryCompare(scopeLoadedSpy, "count", 6);
74 }74 }
7575
76 function init() {76 function init() {
@@ -114,7 +114,8 @@
114114
115 loadScopes();115 loadScopes();
116116
117 verify(dashContentList.currentIndex >= 0 && dashContentList.currentIndex < 5);117 compare(dashContentList.count, 6);
118 verify(dashContentList.currentIndex >= 0 && dashContentList.currentIndex < dashContentList.count);
118 }119 }
119120
120 function test_show_header_on_list_movement() {121 function test_show_header_on_list_movement() {
@@ -170,7 +171,7 @@
170171
171 // test greater than scope count.172 // test greater than scope count.
172 var currentScopeIndex = dashContent.currentIndex;173 var currentScopeIndex = dashContent.currentIndex;
173 dashContent.setCurrentScopeAtIndex(8, true, false);174 dashContent.setCurrentScopeAtIndex(18, true, false);
174 compare(dashContent.currentIndex, currentScopeIndex, "Scope should not change if changing to greater index than count");175 compare(dashContent.currentIndex, currentScopeIndex, "Scope should not change if changing to greater index than count");
175 }176 }
176177
@@ -189,9 +190,9 @@
189 function test_scope_mapping_data() {190 function test_scope_mapping_data() {
190 return [191 return [
191 {tag: "index0", index: 0, objectName: "MockScope1"},192 {tag: "index0", index: 0, objectName: "MockScope1"},
192 {tag: "index1", index: 1, objectName: "MockScope2"},193 {tag: "index1", index: 1, objectName: "clickscope"},
193 {tag: "index2", index: 2, objectName: "clickscope"},194 {tag: "index2", index: 2, objectName: "MockScope5"},
194 {tag: "index3", index: 3, objectName: "MockScope5"}195 {tag: "index3", index: 3, objectName: "SingleCategoryScope"}
195 ]196 ]
196 }197 }
197198
198199
=== modified file 'tests/qmltests/Dash/tst_GenericScopeView.qml'
--- tests/qmltests/Dash/tst_GenericScopeView.qml 2014-08-06 19:39:30 +0000
+++ tests/qmltests/Dash/tst_GenericScopeView.qml 2014-08-08 20:44:52 +0000
@@ -57,12 +57,12 @@
57 name: "GenericScopeView"57 name: "GenericScopeView"
58 when: scopes.loaded && windowShown58 when: scopes.loaded && windowShown
5959
60 property Item previewListView: findChild(genericScopeView, "previewListView")60 property Item subPageLoader: findChild(genericScopeView, "subPageLoader")
61 property Item header: findChild(genericScopeView, "scopePageHeader")61 property Item header: findChild(genericScopeView, "scopePageHeader")
6262
63 function init() {63 function init() {
64 genericScopeView.scope = scopes.getScope(1)64 genericScopeView.scope = scopes.getScope(2);
65 shell.width = units.gu(120)65 shell.width = units.gu(120);
66 genericScopeView.categoryView.positionAtBeginning();66 genericScopeView.categoryView.positionAtBeginning();
67 waitForRendering(genericScopeView.categoryView);67 waitForRendering(genericScopeView.categoryView);
68 }68 }
@@ -78,24 +78,24 @@
78 tryCompare(genericScopeView.scope, "isActive", false)78 tryCompare(genericScopeView.scope, "isActive", false)
79 genericScopeView.isCurrent = true79 genericScopeView.isCurrent = true
80 tryCompare(genericScopeView.scope, "isActive", true)80 tryCompare(genericScopeView.scope, "isActive", true)
81 testCase.previewListView.open = true81 testCase.subPageLoader.open = true
82 tryCompare(genericScopeView.scope, "isActive", false)82 tryCompare(genericScopeView.scope, "isActive", false)
83 testCase.previewListView.open = false83 testCase.subPageLoader.open = false
84 tryCompare(genericScopeView.scope, "isActive", true)84 tryCompare(genericScopeView.scope, "isActive", true)
85 genericScopeView.isCurrent = false85 genericScopeView.isCurrent = false
86 tryCompare(genericScopeView.scope, "isActive", false)86 tryCompare(genericScopeView.scope, "isActive", false)
87 }87 }
8888
89 function test_showDash() {89 function test_showDash() {
90 testCase.previewListView.open = true;90 testCase.subPageLoader.open = true;
91 scopes.getScope(1).showDash();91 genericScopeView.scope.showDash();
92 tryCompare(testCase.previewListView, "open", false);92 tryCompare(testCase.subPageLoader, "open", false);
93 }93 }
9494
95 function test_hideDash() {95 function test_hideDash() {
96 testCase.previewListView.open = true;96 testCase.subPageLoader.open = true;
97 scopes.getScope(1).hideDash();97 genericScopeView.scope.hideDash();
98 tryCompare(testCase.previewListView, "open", false);98 tryCompare(testCase.subPageLoader, "open", false);
99 }99 }
100100
101 function test_searchQuery() {101 function test_searchQuery() {
@@ -111,8 +111,9 @@
111111
112 function test_changeScope() {112 function test_changeScope() {
113 genericScopeView.scope.searchQuery = "test"113 genericScopeView.scope.searchQuery = "test"
114 genericScopeView.scope = scopes.getScope(2)114 var originalScopeId = genericScopeView.scope.id;
115 genericScopeView.scope = scopes.getScope(1)115 genericScopeView.scope = scopes.getScope(originalScopeId + 1)
116 genericScopeView.scope = scopes.getScope(originalScopeId)
116 tryCompare(genericScopeView.scope, "searchQuery", "test")117 tryCompare(genericScopeView.scope, "searchQuery", "test")
117 }118 }
118119
@@ -197,7 +198,9 @@
197198
198 openPreview(4, 0);199 openPreview(4, 0);
199200
200 compare(testCase.previewListView.count, 12, "There should only be 12 items in preview.");201 compare(testCase.subPageLoader.count, 12, "There should only be 12 items in preview.");
202
203 closePreview();
201 }204 }
202205
203 function test_narrow_delegate_ranges_expand() {206 function test_narrow_delegate_ranges_expand() {
@@ -232,7 +235,7 @@
232 }235 }
233236
234 function test_single_category_expansion() {237 function test_single_category_expansion() {
235 genericScopeView.scope = scopes.getScope(4);238 genericScopeView.scope = scopes.getScope(3);
236239
237 tryCompareFunction(function() { return findChild(genericScopeView, "dashCategory0") != undefined; }, true);240 tryCompareFunction(function() { return findChild(genericScopeView, "dashCategory0") != undefined; }, true);
238 var category = findChild(genericScopeView, "dashCategory0")241 var category = findChild(genericScopeView, "dashCategory0")
@@ -258,19 +261,19 @@
258 true);261 true);
259 var tile = findChild(findChild(genericScopeView, category), "delegate"+delegate);262 var tile = findChild(findChild(genericScopeView, category), "delegate"+delegate);
260 mouseClick(tile, tile.width / 2, tile.height / 2);263 mouseClick(tile, tile.width / 2, tile.height / 2);
261 tryCompare(testCase.previewListView, "open", true);264 tryCompare(testCase.subPageLoader, "open", true);
262 tryCompare(testCase.previewListView, "x", 0);265 tryCompare(testCase.subPageLoader, "x", 0);
263 }266 }
264267
265 function closePreview() {268 function closePreview() {
266 var closePreviewMouseArea = findChild(genericScopeView, "innerPageHeader");269 var closePreviewMouseArea = findChild(subPageLoader.item, "pageHeader");
267 mouseClick(closePreviewMouseArea, units.gu(2), units.gu(2));270 mouseClick(closePreviewMouseArea, units.gu(2), units.gu(2));
268271
269 tryCompare(testCase.previewListView, "open", false);272 tryCompare(testCase.subPageLoader, "open", false);
270 }273 }
271274
272 function test_previewOpenClose() {275 function test_previewOpenClose() {
273 tryCompare(testCase.previewListView, "open", false);276 tryCompare(testCase.subPageLoader, "open", false);
274277
275 var categoryListView = findChild(genericScopeView, "categoryListView");278 var categoryListView = findChild(genericScopeView, "categoryListView");
276 categoryListView.positionAtBeginning();279 categoryListView.positionAtBeginning();
@@ -290,15 +293,15 @@
290 },293 },
291 true);294 true);
292295
293 tryCompare(testCase.previewListView, "open", false);296 tryCompare(testCase.subPageLoader, "open", false);
294297
295 var dashCategory1 = findChild(genericScopeView, "dashCategory1");298 var dashCategory1 = findChild(genericScopeView, "dashCategory1");
296 var tile = findChild(dashCategory1, "carouselDelegate1");299 var tile = findChild(dashCategory1, "carouselDelegate1");
297 mouseClick(tile, tile.width / 2, tile.height / 2);300 mouseClick(tile, tile.width / 2, tile.height / 2);
298 tryCompare(tile, "explicitlyScaled", true);301 tryCompare(tile, "explicitlyScaled", true);
299 mouseClick(tile, tile.width / 2, tile.height / 2);302 mouseClick(tile, tile.width / 2, tile.height / 2);
300 tryCompare(testCase.previewListView, "open", true);303 tryCompare(testCase.subPageLoader, "open", true);
301 tryCompare(testCase.previewListView, "x", 0);304 tryCompare(testCase.subPageLoader, "x", 0);
302305
303 closePreview();306 closePreview();
304 }307 }
@@ -307,21 +310,20 @@
307 var categoryListView = findChild(genericScopeView, "categoryListView");310 var categoryListView = findChild(genericScopeView, "categoryListView");
308 categoryListView.positionAtBeginning();311 categoryListView.positionAtBeginning();
309312
310 tryCompare(testCase.previewListView, "open", false);313 tryCompare(testCase.subPageLoader, "open", false);
311 var previewListViewList = findChild(previewListView, "listView");
312314
313 openPreview();315 openPreview();
316 var previewListViewList = findChild(subPageLoader.item, "listView");
314317
315 // flick to the next previews318 // flick to the next previews
316 tryCompare(testCase.previewListView, "count", 15);319 tryCompare(testCase.subPageLoader, "count", 15);
317 for (var i = 1; i < testCase.previewListView.count; ++i) {320 for (var i = 1; i < testCase.subPageLoader.count; ++i) {
318 mouseFlick(testCase.previewListView, testCase.previewListView.width - units.gu(1),321 mouseFlick(testCase.subPageLoader.item, testCase.subPageLoader.width - units.gu(1),
319 testCase.previewListView.height / 2,322 testCase.subPageLoader.height / 2,
320 units.gu(2),323 units.gu(2),
321 testCase.previewListView.height / 2);324 testCase.subPageLoader.height / 2);
322 tryCompare(previewListViewList, "moving", false);325 tryCompare(previewListViewList, "moving", false);
323 tryCompare(testCase.previewListView.currentItem, "objectName", "preview" + i);326 tryCompare(testCase.subPageLoader.currentItem, "objectName", "preview" + i);
324
325 }327 }
326 closePreview();328 closePreview();
327 }329 }
@@ -329,8 +331,8 @@
329 function test_header_style_data() {331 function test_header_style_data() {
330 return [332 return [
331 { tag: "Default", index: 0, foreground: "grey", background: "", logo: "" },333 { tag: "Default", index: 0, foreground: "grey", background: "", logo: "" },
332 { tag: "Foreground", index: 2, foreground: "yellow", background: "", logo: "" },334 { tag: "Foreground", index: 1, foreground: "yellow", background: "", logo: "" },
333 { tag: "Logo+Background", index: 3, foreground: "grey", background: "gradient:///lightgrey/grey",335 { tag: "Logo+Background", index: 2, foreground: "grey", background: "gradient:///lightgrey/grey",
334 logo: Qt.resolvedUrl("../Components/tst_PageHeader/logo-ubuntu-orange.svg") },336 logo: Qt.resolvedUrl("../Components/tst_PageHeader/logo-ubuntu-orange.svg") },
335 ];337 ];
336 }338 }

Subscribers

People subscribed via source and target branches