on xenial help sign in
Merge
af2f0bbAlbert Astals
debian/changelog+36
@@ -1,3 +1,39 @@
1+unity8 (7.90+14.10.20140724.1-0ubuntu1) utopic; urgency=low
2+
3+ [ Michael Zanetti ]
4+ * properly parent launcher items (LP: #1347902)
5+
6+ [ Michał Sawicz ]
7+ * Move the PyDev project files to the root, supporting .py scripts
8+ outside of tests/autopilot. Add Autopilot Run and List launch
9+ configurations to easily support debugging in Eclipse. Use
10+ add_unity8_mock macro in the Telephony plugin.
11+ * Drop FilterGrid and refactor height animations in GenericScopeView.
12+ Also implement forced category expansion. (LP: #1326470)
13+ * Move expansion button from section header to category footer. (LP:
14+ #1261300)
15+ * Fix expect-sigstop enviroment variable name. (LP: #1346819)
16+ * Make headerless categories easier Instead of having no header
17+ category (which is a bit confusing since the LVWPH code was designed
18+ so that when a category has no header it is because it shares the
19+ category with the previous one) what we have for headerless
20+ categories is a header of height 0, this way everything works as it
21+ should and results in cleaner code in the LVWPH and in
22+ GenericScopeView
23+ * Add support for header links.
24+ * Add dash PageHeader styling.
25+
26+ [ Albert Astals ]
27+ * Make headerless categories easier Instead of having no header
28+ category (which is a bit confusing since the LVWPH code was designed
29+ so that when a category has no header it is because it shares the
30+ category with the previous one) what we have for headerless
31+ categories is a header of height 0, this way everything works as it
32+ should and results in cleaner code in the LVWPH and in
33+ GenericScopeView
34+
35+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 24 Jul 2014 20:41:29 +0000
36+
1unity8 (7.90+14.10.20140723.4-0ubuntu1) utopic; urgency=low
37unity8 (7.90+14.10.20140723.4-0ubuntu1) utopic; urgency=low
2
38
3 [ thomas-voss ]
39 [ thomas-voss ]
plugins/Dash/ScopeStyle.qml+6
@@ -70,6 +70,12 @@ QtObject {
70 /// Source of the logo image for the header
70 /// Source of the logo image for the header
71 readonly property url headerLogo: "logo" in d.headerStyle ? d.headerStyle["logo"] : ""
71 readonly property url headerLogo: "logo" in d.headerStyle ? d.headerStyle["logo"] : ""
72
72
73+ /// Background style for the header
74+ readonly property url headerBackground: "background" in d.headerStyle ? d.headerStyle["background"] : ""
75+
76+ /// Foreground color for the header
77+ readonly property color headerForeground: "foreground-color" in d.headerStyle ? d.headerStyle["foreground-color"] : foreground
78+
73 //! @cond
79 //! @cond
74 property var d: QtObject {
80 property var d: QtObject {
75 readonly property real foregroundLuminance: luminance(foreground)
81 readonly property real foregroundLuminance: luminance(foreground)
plugins/Dash/listviewwithpageheader.cpp−5
@@ -141,8 +141,6 @@ void ListViewWithPageHeader::ListItem::setCulled(bool culled)
141void ListViewWithPageHeader::ListItem::setSectionItem(QQuickItem *sectionItem)
141void ListViewWithPageHeader::ListItem::setSectionItem(QQuickItem *sectionItem)
142{
142{
143 m_sectionItem = sectionItem;
143 m_sectionItem = sectionItem;
144− QQmlContext *context = QQmlEngine::contextForObject(m_item)->parentContext();
145− context->setContextProperty(QLatin1String("hasSectionHeader"), QVariant::fromValue<bool>(sectionItem != nullptr));
146}
144}
147
145
148ListViewWithPageHeader::ListViewWithPageHeader()
146ListViewWithPageHeader::ListViewWithPageHeader()
@@ -685,8 +683,6 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(int modelIndex, bool alreadyI
685 return nullptr;
683 return nullptr;
686
684
687 const QString section = m_delegateModel->stringValue(modelIndex, m_sectionProperty);
685 const QString section = m_delegateModel->stringValue(modelIndex, m_sectionProperty);
688− if (section.isEmpty())
689− return nullptr;
690
686
691 if (modelIndex > 0) {
687 if (modelIndex > 0) {
692 const QString prevSection = m_delegateModel->stringValue(modelIndex - 1, m_sectionProperty);
688 const QString prevSection = m_delegateModel->stringValue(modelIndex - 1, m_sectionProperty);
@@ -877,7 +873,6 @@ void ListViewWithPageHeader::itemCreated(int modelIndex, QObject *object)
877 QQmlContext *context = QQmlEngine::contextForObject(item)->parentContext();
873 QQmlContext *context = QQmlEngine::contextForObject(item)->parentContext();
878 context->setContextProperty(QLatin1String("ListViewWithPageHeader"), this);
874 context->setContextProperty(QLatin1String("ListViewWithPageHeader"), this);
879 context->setContextProperty(QLatin1String("heightToClip"), QVariant::fromValue<int>(0));
875 context->setContextProperty(QLatin1String("heightToClip"), QVariant::fromValue<int>(0));
880− context->setContextProperty(QLatin1String("hasSectionHeader"), QVariant::fromValue<bool>(false));
881 if (modelIndex == m_asyncRequestedIndex) {
876 if (modelIndex == m_asyncRequestedIndex) {
882 createItem(modelIndex, false);
877 createItem(modelIndex, false);
883 refill();
878 refill();
plugins/Unity/Launcher/launchermodel.cpp+3−2
@@ -141,7 +141,8 @@ void LauncherModel::pin(const QString &appId, int index)
141 beginInsertRows(QModelIndex(), index, index);
141 beginInsertRows(QModelIndex(), index, index);
142 LauncherItem *item = new LauncherItem(appId,
142 LauncherItem *item = new LauncherItem(appId,
143 m_backend->displayName(appId),
143 m_backend->displayName(appId),
144− m_backend->icon(appId));
144+ m_backend->icon(appId),
145+ this);
145 item->setPinned(true);
146 item->setPinned(true);
146 m_list.insert(index, item);
147 m_list.insert(index, item);
147 endInsertRows();
148 endInsertRows();
@@ -326,7 +327,7 @@ void LauncherModel::applicationAdded(const QModelIndex &parent, int row)
326 if (found) {
327 if (found) {
327 // Shall we paint some running/recent app highlight? If yes, do it here.
328 // Shall we paint some running/recent app highlight? If yes, do it here.
328 } else {
329 } else {
329− LauncherItem *item = new LauncherItem(app->appId(), app->name(), app->icon().toString());
330+ LauncherItem *item = new LauncherItem(app->appId(), app->name(), app->icon().toString(), this);
330 item->setRecent(true);
331 item->setRecent(true);
331 item->setFocused(app->focused());
332 item->setFocused(app->focused());
332
333
po/gd.po+3−3
@@ -8,13 +8,13 @@ msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-16 14:48+0000\n"
11+"PO-Revision-Date: 2014-07-24 22:26+0000\n"
12"Last-Translator: GunChleoc <Unknown>\n"
12"Last-Translator: GunChleoc <Unknown>\n"
13"Language-Team: Fòram na Gàidhlig http://www.foramnagaidhlig.net\n"
13"Language-Team: Fòram na Gàidhlig http://www.foramnagaidhlig.net\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-17 06:38+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-25 07:54+0000\n"
18"X-Generator: Launchpad (build 17114)\n"
18"X-Generator: Launchpad (build 17114)\n"
19"Language: gd\n"
19"Language: gd\n"
20
20
@@ -87,7 +87,7 @@ msgstr "Gairm èiginn"
87
87
88#: qml/Components/Lockscreen.qml:231
88#: qml/Components/Lockscreen.qml:231
89msgid "OK"
89msgid "OK"
90−msgstr "Ceart ma-hà"
90+msgstr "Ceart ma-thà"
91
91
92#: qml/Components/PageHeader.qml:366
92#: qml/Components/PageHeader.qml:366
93msgid "Recent searches"
93msgid "Recent searches"
po/hu.po+11−9
@@ -8,23 +8,23 @@ msgstr ""
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: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-23 10:07+0000\n"
11+"PO-Revision-Date: 2014-07-24 08:19+0000\n"
12−"Last-Translator: Úr Balázs <urbalazs@gmail.com>\n"
12+"Last-Translator: Gabor Kelemen <kelemeng@openscope.org>\n"
13"Language-Team: Hungarian <hu@li.org>\n"
13"Language-Team: Hungarian <hu@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-24 06:32+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-25 07:54+0000\n"
18"X-Generator: Launchpad (build 17114)\n"
18"X-Generator: Launchpad (build 17114)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
22msgid "Pin shortcut"
22msgid "Pin shortcut"
23−msgstr ""
23+msgstr "Indító rögzítése"
24
24
25#: plugins/Unity/Launcher/launcheritem.cpp:73
25#: plugins/Unity/Launcher/launcheritem.cpp:73
26msgid "Unpin shortcut"
26msgid "Unpin shortcut"
27−msgstr ""
27+msgstr "Indító feloldása"
28
28
29#: qml/Components/EdgeDemoOverlay.qml:151
29#: qml/Components/EdgeDemoOverlay.qml:151
30msgid "Skip intro"
30msgid "Skip intro"
@@ -73,6 +73,8 @@ msgid ""
73"You have now mastered the edge gestures and can start using the "
73"You have now mastered the edge gestures and can start using the "
74"phone<br><br>Tap on the screen to start"
74"phone<br><br>Tap on the screen to start"
75msgstr ""
75msgstr ""
76+"Elsajátította a gesztusokat, és megkezdheti a telefon "
77+"használatát.<br><br>Koppintson a képernyőre a kezdéshez."
76
78
77#: qml/Components/Lockscreen.qml:214
79#: qml/Components/Lockscreen.qml:214
78msgid "Emergency Call"
80msgid "Emergency Call"
@@ -105,11 +107,11 @@ msgstr "KÉSZ"
105
107
106#: qml/Components/SeeMore.qml:35
108#: qml/Components/SeeMore.qml:35
107msgid "See more"
109msgid "See more"
108−msgstr ""
110+msgstr "Több"
109
111
110#: qml/Components/SeeMore.qml:58
112#: qml/Components/SeeMore.qml:58
111msgid "See less"
113msgid "See less"
112−msgstr ""
114+msgstr "Kevesebb"
113
115
114#: qml/Dash/DashApps.qml:37
116#: qml/Dash/DashApps.qml:37
115msgid "Recent"
117msgid "Recent"
@@ -137,7 +139,7 @@ msgstr "Küldés"
137
139
138#: qml/Greeter/Greeter.qml:157
140#: qml/Greeter/Greeter.qml:157
139msgid "Swipe to unlock"
141msgid "Swipe to unlock"
140−msgstr ""
142+msgstr "Csúsztasson a feloldáshoz"
141
143
142#: qml/Hud/HudParametrizedActionsPage.qml:132
144#: qml/Hud/HudParametrizedActionsPage.qml:132
143msgid "Confirm"
145msgid "Confirm"
@@ -169,7 +171,7 @@ msgstr "Adja meg a SIM PIN kódját"
169
171
170#: qml/Panel/Indicators/MenuItemFactory.qml:583
172#: qml/Panel/Indicators/MenuItemFactory.qml:583
171msgid "In queue…"
173msgid "In queue…"
172−msgstr ""
174+msgstr "Sorban…"
173
175
174#: qml/Panel/Indicators/MenuItemFactory.qml:587
176#: qml/Panel/Indicators/MenuItemFactory.qml:587
175msgid "Downloading"
177msgid "Downloading"
po/sl.po+11−11
@@ -8,23 +8,23 @@ msgstr ""
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: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-06-23 09:29+0000\n"
11+"PO-Revision-Date: 2014-07-24 09:01+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"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-25 07:54+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17114)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
22msgid "Pin shortcut"
22msgid "Pin shortcut"
23−msgstr ""
23+msgstr "Pripni bližnjico"
24
24
25#: plugins/Unity/Launcher/launcheritem.cpp:73
25#: plugins/Unity/Launcher/launcheritem.cpp:73
26msgid "Unpin shortcut"
26msgid "Unpin shortcut"
27−msgstr ""
27+msgstr "Odpni bližnjico"
28
28
29#: qml/Components/EdgeDemoOverlay.qml:151
29#: qml/Components/EdgeDemoOverlay.qml:151
30msgid "Skip intro"
30msgid "Skip intro"
@@ -171,27 +171,27 @@ msgstr "Vnesite PIN kartice SIM"
171
171
172#: qml/Panel/Indicators/MenuItemFactory.qml:583
172#: qml/Panel/Indicators/MenuItemFactory.qml:583
173msgid "In queue…"
173msgid "In queue…"
174−msgstr ""
174+msgstr "V vrsti ..."
175
175
176#: qml/Panel/Indicators/MenuItemFactory.qml:587
176#: qml/Panel/Indicators/MenuItemFactory.qml:587
177msgid "Downloading"
177msgid "Downloading"
178−msgstr ""
178+msgstr "Prejemanje"
179
179
180#: qml/Panel/Indicators/MenuItemFactory.qml:589
180#: qml/Panel/Indicators/MenuItemFactory.qml:589
181msgid "Paused, tap to resume"
181msgid "Paused, tap to resume"
182−msgstr ""
182+msgstr "Premor, tapnite za nadaljevanje"
183
183
184#: qml/Panel/Indicators/MenuItemFactory.qml:591
184#: qml/Panel/Indicators/MenuItemFactory.qml:591
185msgid "Canceled"
185msgid "Canceled"
186−msgstr ""
186+msgstr "Preklicano"
187
187
188#: qml/Panel/Indicators/MenuItemFactory.qml:593
188#: qml/Panel/Indicators/MenuItemFactory.qml:593
189msgid "Finished"
189msgid "Finished"
190−msgstr ""
190+msgstr "Končano"
191
191
192#: qml/Panel/Indicators/MenuItemFactory.qml:595
192#: qml/Panel/Indicators/MenuItemFactory.qml:595
193msgid "Failed, tap to retry"
193msgid "Failed, tap to retry"
194−msgstr ""
194+msgstr "Spodletelo, tapnite za ponovni poskus"
195
195
196#: qml/Panel/SearchIndicator.qml:27
196#: qml/Panel/SearchIndicator.qml:27
197msgid "Search"
197msgid "Search"
po/sv.po+19−18
@@ -1,21 +1,22 @@
1# Swedish translation for unity
1# Swedish translation for unity
2−# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
2+# Copyright © 2013-2014 Rosetta Contributors and Canonical Ltd 2013-2014
3# This file is distributed under the same license as the unity package.
3# This file is distributed under the same license as the unity package.
4−# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
4+# Josef Andersson <josef.andersson@fripost.org>, 2014.
5#
5#
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: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-20 19:14+0000\n"
11+"PO-Revision-Date: 2014-07-24 13:56+0000\n"
12−"Last-Translator: Gunnar Hjalmarsson <Unknown>\n"
12+"Last-Translator: Josef Andersson <Unknown>\n"
13−"Language-Team: Swedish <sv@li.org>\n"
13+"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-21 07:05+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-25 07:54+0000\n"
18"X-Generator: Launchpad (build 17114)\n"
18"X-Generator: Launchpad (build 17114)\n"
19+"Language: sv\n"
19
20
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -28,7 +29,7 @@ msgstr "Släpp genväg"
28
29
29#: qml/Components/EdgeDemoOverlay.qml:151
30#: qml/Components/EdgeDemoOverlay.qml:151
30msgid "Skip intro"
31msgid "Skip intro"
31−msgstr "Skippa intro"
32+msgstr "Hoppa över introduktion"
32
33
33#: qml/Components/EdgeDemo.qml:113
34#: qml/Components/EdgeDemo.qml:113
34msgid "Right edge"
35msgid "Right edge"
@@ -36,7 +37,7 @@ msgstr "Högerkant"
36
37
37#: qml/Components/EdgeDemo.qml:114
38#: qml/Components/EdgeDemo.qml:114
38msgid "Try swiping from the right edge to unlock the phone"
39msgid "Try swiping from the right edge to unlock the phone"
39−msgstr "Dra med fingret från höger för att låsa upp telefonen"
40+msgstr "Svep från höger för att låsa upp telefonen"
40
41
41#: qml/Components/EdgeDemo.qml:145
42#: qml/Components/EdgeDemo.qml:145
42msgid "Top edge"
43msgid "Top edge"
@@ -71,8 +72,8 @@ msgid ""
71"You have now mastered the edge gestures and can start using the "
72"You have now mastered the edge gestures and can start using the "
72"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
73msgstr ""
74msgstr ""
74−"Du har nu bemästrat kantgesterna och kan börja använda telefonen<br><br>Peka "
75+"Du har nu bemästrat kantgesterna och kan börja använda "
75−"på skärmen för att starta"
76+"telefonen<br><br>Tryck på skärmen för att starta"
76
77
77#: qml/Components/Lockscreen.qml:214
78#: qml/Components/Lockscreen.qml:214
78msgid "Emergency Call"
79msgid "Emergency Call"
@@ -117,11 +118,11 @@ msgstr "Senaste"
117
118
118#: qml/Dash/Previews/PreviewActionCombo.qml:34
119#: qml/Dash/Previews/PreviewActionCombo.qml:34
119msgid "More..."
120msgid "More..."
120−msgstr "Mer..."
121+msgstr "Mer…"
121
122
122#: qml/Dash/Previews/PreviewActionCombo.qml:34
123#: qml/Dash/Previews/PreviewActionCombo.qml:34
123msgid "Less..."
124msgid "Less..."
124−msgstr "Mindre..."
125+msgstr "Mindre…"
125
126
126#: qml/Dash/Previews/PreviewRatingInput.qml:82
127#: qml/Dash/Previews/PreviewRatingInput.qml:82
127msgid "Rate this"
128msgid "Rate this"
@@ -149,15 +150,15 @@ msgstr "Skriv eller tala in ett kommando"
149
150
150#: qml/Hud/Hud.qml:84
151#: qml/Hud/Hud.qml:84
151msgid "Loading. Please Wait..."
152msgid "Loading. Please Wait..."
152−msgstr "Laddar. Var god vänta..."
153+msgstr "Läser in. Var god vänta…"
153
154
154#: qml/Hud/Hud.qml:89
155#: qml/Hud/Hud.qml:89
155msgid "Speak Now..."
156msgid "Speak Now..."
156−msgstr "Tala nu..."
157+msgstr "Tala nu…"
157
158
158#: qml/Hud/Hud.qml:94
159#: qml/Hud/Hud.qml:94
159msgid "Speaking..."
160msgid "Speaking..."
160−msgstr "Talar..."
161+msgstr "Talar…"
161
162
162#: qml/Notifications/NotificationMenuItemFactory.qml:91
163#: qml/Notifications/NotificationMenuItemFactory.qml:91
163msgid "Show password"
164msgid "Show password"
@@ -169,7 +170,7 @@ msgstr "Ange SIM PIN-kod"
169
170
170#: qml/Panel/Indicators/MenuItemFactory.qml:583
171#: qml/Panel/Indicators/MenuItemFactory.qml:583
171msgid "In queue…"
172msgid "In queue…"
172−msgstr "I kö..."
173+msgstr "I kö…"
173
174
174#: qml/Panel/Indicators/MenuItemFactory.qml:587
175#: qml/Panel/Indicators/MenuItemFactory.qml:587
175msgid "Downloading"
176msgid "Downloading"
@@ -177,7 +178,7 @@ msgstr "Hämtar"
177
178
178#: qml/Panel/Indicators/MenuItemFactory.qml:589
179#: qml/Panel/Indicators/MenuItemFactory.qml:589
179msgid "Paused, tap to resume"
180msgid "Paused, tap to resume"
180−msgstr "Pausad, peka för att fortsätta"
181+msgstr "Pausad, tryck för att fortsätta"
181
182
182#: qml/Panel/Indicators/MenuItemFactory.qml:591
183#: qml/Panel/Indicators/MenuItemFactory.qml:591
183msgid "Canceled"
184msgid "Canceled"
@@ -189,7 +190,7 @@ msgstr "Klart"
189
190
190#: qml/Panel/Indicators/MenuItemFactory.qml:595
191#: qml/Panel/Indicators/MenuItemFactory.qml:595
191msgid "Failed, tap to retry"
192msgid "Failed, tap to retry"
192−msgstr "Misslyckades, peka för att försöka igen"
193+msgstr "Misslyckades, tryck för att försöka igen"
193
194
194#: qml/Panel/SearchIndicator.qml:27
195#: qml/Panel/SearchIndicator.qml:27
195msgid "Search"
196msgid "Search"
qml/Components/Background.qmlnew file+77
@@ -0,0 +1,77 @@
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+import QtQuick 2.0
18+
19+Loader {
20+ id: root
21+ anchors.fill: parent
22+
23+ property url style
24+ readonly property var parsedStyle: String(style)
25+ .match(/^(color|gradient):\/\/\/(?:(#(?:[0-9a-f]{3,4}){1,2}|[a-z]{3,}))(?:\/(#(?:[0-9a-f]{3,4}){1,2}|[a-z]{3,}))?\/?$/i)
26+
27+ sourceComponent: {
28+ if (style == "") return null;
29+ if (!parsedStyle) return image;
30+ if (parsedStyle[1] === "color") return solid
31+ if (parsedStyle[1] === "gradient") return gradient
32+ }
33+
34+ onLoaded: if (item.hasOwnProperty("parsedStyle")) {
35+ item.parsedStyle = Qt.binding(function() { return root.parsedStyle } );
36+ }
37+
38+ Component {
39+ id: solid
40+
41+ Rectangle {
42+ objectName: "solid"
43+
44+ property var parsedStyle
45+
46+ color: parsedStyle ? parsedStyle[2] : "#ffffff"
47+ }
48+ }
49+
50+ Component {
51+ id: gradient
52+
53+ Rectangle {
54+ objectName: "gradient"
55+
56+ property var parsedStyle
57+
58+ gradient: Gradient {
59+ GradientStop { position: 0; color: parsedStyle ? parsedStyle[2] : "#000000" }
60+ GradientStop { position: 1; color: parsedStyle ? parsedStyle[3] : "#000000" }
61+ }
62+ }
63+ }
64+
65+ Component {
66+ id: image
67+
68+ Image {
69+ objectName: "image"
70+
71+ source: width > 0 && height > 0 && root.style
72+
73+ sourceSize.width: width
74+ sourceSize.height: height
75+ }
76+ }
77+}
qml/Components/PageHeader.qml+6−1
@@ -130,6 +130,11 @@ Item {
130 property bool showSearch: false
130 property bool showSearch: false
131 property var popover: null
131 property var popover: null
132
132
133+ Background {
134+ objectName: "headerBackground"
135+ style: scopeStyle.headerBackground
136+ }
137+
133 Behavior on contentY {
138 Behavior on contentY {
134 UbuntuNumberAnimation {
139 UbuntuNumberAnimation {
135 id: openSearchAnimation
140 id: openSearchAnimation
@@ -228,7 +233,7 @@ Item {
228 height: headerContainer.height
233 height: headerContainer.height
229 contentHeight: height
234 contentHeight: height
230 separatorSource: ""
235 separatorSource: ""
231− textColor: root.scopeStyle ? root.scopeStyle.foreground : "grey"
236+ textColor: root.scopeStyle ? root.scopeStyle.headerForeground : "grey"
232 property var styledItem: header
237 property var styledItem: header
233 property string title: root.title
238 property string title: root.title
234 property var config: PageHeadConfiguration {
239 property var config: PageHeadConfiguration {
qml/Dash/CardVerticalJournal.qml+1
@@ -25,6 +25,7 @@ DashRenderer {
25
25
26 expandedHeight: Math.max(cardVerticalJournal.implicitHeight, minHeight)
26 expandedHeight: Math.max(cardVerticalJournal.implicitHeight, minHeight)
27 collapsedHeight: Math.max(Math.min(collapseLimit, cardVerticalJournal.implicitHeight), minHeight)
27 collapsedHeight: Math.max(Math.min(collapseLimit, cardVerticalJournal.implicitHeight), minHeight)
28+ // TODO: implement collapsedItemCount
28
29
29 // This minHeight is used as bootstrapper for the height. Vertical Journal
30 // This minHeight is used as bootstrapper for the height. Vertical Journal
30 // is special by the fact that it doesn't know how to calculate its implicit height unless we give it
31 // is special by the fact that it doesn't know how to calculate its implicit height unless we give it
qml/Dash/DashRenderer.qml+1−1
@@ -21,7 +21,7 @@ Item {
21
21
22 property int expandedHeight
22 property int expandedHeight
23
23
24− property int collapsedItemCount: 0
24+ property int collapsedItemCount: -1
25
25
26 property int displayMarginBeginning: 0
26 property int displayMarginBeginning: 0
27
27
qml/Dash/GenericScopeView.qml+19−1
@@ -125,6 +125,7 @@ FocusScope {
125
125
126 model: scopeView.categories
126 model: scopeView.categories
127 forceNoClip: previewListView.open
127 forceNoClip: previewListView.open
128+ pixelAligned: true
128
129
129 property string expandedCategoryId: ""
130 property string expandedCategoryId: ""
130
131
@@ -177,7 +178,7 @@ FocusScope {
177 top: parent.top
178 top: parent.top
178 left: parent.left
179 left: parent.left
179 right: parent.right
180 right: parent.right
180− topMargin: hasSectionHeader ? 0 : units.gu(2)
181+ topMargin: name != "" ? 0 : units.gu(2)
181 }
182 }
182
183
183 Behavior on height {
184 Behavior on height {
@@ -195,6 +196,21 @@ FocusScope {
195 readonly property bool expanded: baseItem.expanded || !baseItem.expandable
196 readonly property bool expanded: baseItem.expanded || !baseItem.expandable
196 height: expanded ? item.expandedHeight : item.collapsedHeight
197 height: expanded ? item.expandedHeight : item.collapsedHeight
197
198
199+ Behavior on height {
200+ id: heightBehaviour
201+ enabled: false
202+ animation: UbuntuNumberAnimation {
203+ onRunningChanged: {
204+ if (!running) {
205+ heightBehaviour.enabled = false
206+ }
207+ }
208+ }
209+ }
210+
211+ readonly property bool expanded: baseItem.expanded || !baseItem.expandable
212+ height: expanded ? item.expandedHeight : item.collapsedHeight
213+
198 source: {
214 source: {
199 switch (cardTool.categoryLayout) {
215 switch (cardTool.categoryLayout) {
200 case "carousel": return "CardCarousel.qml";
216 case "carousel": return "CardCarousel.qml";
@@ -251,6 +267,7 @@ FocusScope {
251 openPreview(index);
267 openPreview(index);
252 }
268 }
253 }
269 }
270+
254 onPressAndHold: {
271 onPressAndHold: {
255 if (scopeView.pressAndHoldOverride) {
272 if (scopeView.pressAndHoldOverride) {
256 scopeView.pressAndHoldOverride(index);
273 scopeView.pressAndHoldOverride(index);
@@ -396,6 +413,7 @@ FocusScope {
396 objectName: "dashSectionHeader" + (delegate ? delegate.category : "")
413 objectName: "dashSectionHeader" + (delegate ? delegate.category : "")
397 readonly property var delegate: categoryView.item(delegateIndex)
414 readonly property var delegate: categoryView.item(delegateIndex)
398 width: categoryView.width
415 width: categoryView.width
416+ height: section != "" ? units.gu(5) : 0
399 text: section
417 text: section
400 color: scopeStyle ? scopeStyle.foreground : "grey"
418 color: scopeStyle ? scopeStyle.foreground : "grey"
401 iconName: delegate && delegate.headerLink ? "go-next" : ""
419 iconName: delegate && delegate.headerLink ? "go-next" : ""
src/main.cpp+1−1
@@ -221,7 +221,7 @@ int main(int argc, const char *argv[])
221
221
222 return runWithClient(mirServer, startShell);
222 return runWithClient(mirServer, startShell);
223 } else {
223 } else {
224− if (qgetenv("UPSTART_JOB") == "unity8") {
224+ if (!qgetenv("UNITY_MIR_EMITS_SIGSTOP").isEmpty()) {
225 // Emit SIGSTOP as expected by upstart, under Mir it's unity-mir that will raise it.
225 // Emit SIGSTOP as expected by upstart, under Mir it's unity-mir that will raise it.
226 // see http://upstart.ubuntu.com/cookbook/#expect-stop
226 // see http://upstart.ubuntu.com/cookbook/#expect-stop
227 raise(SIGSTOP);
227 raise(SIGSTOP);
tests/autopilot/unity8/shell/emulators/dash.py+10−7
@@ -19,6 +19,7 @@
19
19
20import logging
20import logging
21import time
21import time
22+import ubuntuuitoolkit
22
23
23from unity8.shell import emulators
24from unity8.shell import emulators
24
25
@@ -137,9 +138,9 @@ class Dash(emulators.UnityEmulatorBase):
137 def enter_search_query(self, query):
138 def enter_search_query(self, query):
138 current_header = self._get_current_page_header()
139 current_header = self._get_current_page_header()
139 self.pointing_device.move(current_header.globalRect.x +
140 self.pointing_device.move(current_header.globalRect.x +
140− current_header.width - current_header.height / 2,
141+ current_header.width - current_header.height / 4,
141 current_header.globalRect.y +
142 current_header.globalRect.y +
142− current_header.height / 2)
143+ current_header.height / 4)
143 self.pointing_device.click()
144 self.pointing_device.click()
144 headerContainer = current_header.select_single(objectName="headerContainer")
145 headerContainer = current_header.select_single(objectName="headerContainer")
145 headerContainer.contentY.wait_for(0)
146 headerContainer.contentY.wait_for(0)
@@ -160,6 +161,10 @@ class Dash(emulators.UnityEmulatorBase):
160 return None
161 return None
161
162
162
163
164+class ListViewWithPageHeader(ubuntuuitoolkit.QQuickFlickable):
165+ pass
166+
167+
163class GenericScopeView(emulators.UnityEmulatorBase):
168class GenericScopeView(emulators.UnityEmulatorBase):
164 """Autopilot emulator for generic scopes."""
169 """Autopilot emulator for generic scopes."""
165
170
@@ -205,17 +210,15 @@ class DashApps(GenericScopeView):
205 category_element = self._get_category_element(category)
210 category_element = self._get_category_element(category)
206 application_cards = category_element.select_many('AbstractButton')
211 application_cards = category_element.select_many('AbstractButton')
207
212
208− # sort by y, x, filter those out of view
209− categoryBottom = category_element.globalRect.y \
210− + category_element.height
211 application_cards = sorted(
213 application_cards = sorted(
212 (card for card in application_cards
214 (card for card in application_cards
213− if card.globalRect.y < categoryBottom),
215+ if card.globalRect.y
216+ < category_element.globalRect.y + category_element.height),
214 key=lambda card: (card.globalRect.y, card.globalRect.x))
217 key=lambda card: (card.globalRect.y, card.globalRect.x))
215
218
216 result = []
219 result = []
217 for card in application_cards:
220 for card in application_cards:
218− if card.objectName != 'cardToolCard':
221+ if card.objectName not in ('cardToolCard', 'seeAll'):
219 result.append(card.title)
222 result.append(card.title)
220 return result
223 return result
221
224
tests/autopilot/unity8/shell/tests/test_emulators.py+10
@@ -16,6 +16,7 @@
16# You should have received a copy of the GNU General Public License
16# You should have received a copy of the GNU General Public License
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
18#
18#
19+from unity8.shell.emulators.dash import ListViewWithPageHeader
19
20
20"""Tests for the Dash autopilot emulators.
21"""Tests for the Dash autopilot emulators.
21
22
@@ -182,9 +183,18 @@ class DashAppsEmulatorTestCase(DashBaseTestCase):
182
183
183 def test_get_applications_should_return_correct_applications(self):
184 def test_get_applications_should_return_correct_applications(self):
184 category = '2'
185 category = '2'
186+ category_element = self.applications_scope._get_category_element(
187+ category)
188+ list_view = self.dash.get_scope('clickscope')\
189+ .select_single(ListViewWithPageHeader)
185 expected_apps_count = self._get_number_of_application_slots(category)
190 expected_apps_count = self._get_number_of_application_slots(category)
186 expected_applications = self.available_applications[
191 expected_applications = self.available_applications[
187 :expected_apps_count]
192 :expected_apps_count]
193+ x_center = list_view.globalRect.x + list_view.width / 2
194+ y_center = list_view.globalRect.y + list_view.height / 2
195+ y_diff = category_element.y - list_view.height + category_element.height
196+ list_view._slow_drag(x_center, x_center,
197+ y_center, y_center - y_diff)
188 applications = self.applications_scope.get_applications(category)
198 applications = self.applications_scope.get_applications(category)
189 self.assertEqual(expected_applications, applications)
199 self.assertEqual(expected_applications, applications)
190
200
tests/autopilot/unity8/shell/tests/test_upstart.py+13
@@ -20,6 +20,7 @@
20"""Tests for upstart integration."""
20"""Tests for upstart integration."""
21
21
22import os
22import os
23+import stat
23import signal
24import signal
24import subprocess
25import subprocess
25import time
26import time
@@ -57,6 +58,18 @@ class UpstartIntegrationTests(UnityTestCase):
57
58
58 def _launch_unity(self):
59 def _launch_unity(self):
59 self.patch_environment("QT_LOAD_TESTABILITY", "1")
60 self.patch_environment("QT_LOAD_TESTABILITY", "1")
61+
62+ try:
63+ host_socket = os.getenv("MIR_SOCKET", "/run/mir_socket")
64+ if stat.S_ISSOCK(os.stat(host_socket).st_mode):
65+ self.patch_environment("MIR_SERVER_HOST_SOCKET",
66+ host_socket)
67+ socket = os.path.join(os.getenv("XDG_RUNTIME_DIR", "/tmp"),
68+ "mir_socket")
69+ self.patch_environment("MIR_SERVER_FILE", socket)
70+ except OSError:
71+ pass
72+
60 self.process = subprocess.Popen(
73 self.process = subprocess.Popen(
61 [get_binary_path()] + self.unity_geometry_args)
74 [get_binary_path()] + self.unity_geometry_args)
62
75
tests/mocks/Unity/fake_scope.cpp+6−4
@@ -195,14 +195,16 @@ bool Scope::hasDepartments() const
195
195
196QVariantMap Scope::customizations() const
196QVariantMap Scope::customizations() const
197{
197{
198− QVariantMap m;
198+ QVariantMap m, h;
199 if (m_id == "clickscope") {
199 if (m_id == "clickscope") {
200+ h["foreground-color"] = "yellow";
200 m["background-color"] = "red";
201 m["background-color"] = "red";
201 m["foreground-color"] = "blue";
202 m["foreground-color"] = "blue";
203+ m["page-header"] = h;
202 } else if (m_id == "MockScope5") {
204 } else if (m_id == "MockScope5") {
203− QVariantMap pageHeader;
205+ h["background"] = "gradient:///lightgrey/grey";
204− pageHeader["logo"] = QUrl("../../../tests/qmltests/Components/tst_PageHeader/logo-ubuntu-orange.svg");
206+ h["logo"] = QUrl("../../../tests/qmltests/Components/tst_PageHeader/logo-ubuntu-orange.svg");
205− m["page-header"] = pageHeader;
207+ m["page-header"] = h;
206 }
208 }
207 return m;
209 return m;
208}
210}
tests/plugins/Dash/tst_ScopeStyle.qml+27−2
@@ -36,8 +36,8 @@ Rectangle {
36 property var styles: [
36 property var styles: [
37 {},
37 {},
38 { "foreground-color": "red", "background-color": "black", "page-header": { "logo": "/foo/bar" } },
38 { "foreground-color": "red", "background-color": "black", "page-header": { "logo": "/foo/bar" } },
39− { "foreground-color": "green", "background-color": "white" },
39+ { "foreground-color": "green", "background-color": "white", "page-header": { "foreground-color": "black" } },
40− { "foreground-color": "blue", "background-color": "darkgrey" },
40+ { "foreground-color": "blue", "background-color": "darkgrey", "page-header": { "background": "gradient:///white/blue" } },
41 ]
41 ]
42
42
43 function cleanup() {
43 function cleanup() {
@@ -147,5 +147,30 @@ Rectangle {
147 tool.style = testCase.styles[data.index];
147 tool.style = testCase.styles[data.index];
148 compare(tool.headerLogo, data.headerLogo, "Header logo was incorrect.");
148 compare(tool.headerLogo, data.headerLogo, "Header logo was incorrect.");
149 }
149 }
150+
151+ function test_headerForeground_data() {
152+ return [
153+ { tag: "default", index: 0, headerForeground: "grey" },
154+ { tag: "black", index: 2, headerForeground: "black" },
155+ ];
156+ }
157+
158+ function test_headerForeground(data) {
159+ tool.style = testCase.styles[data.index];
160+ verify(Qt.colorEqual(tool.headerForeground, data.headerForeground),
161+ "Header foreground not equal: %1 != %2".arg(tool.headerForeground).arg(data.headerForeground));
162+ }
163+
164+ function test_headerBackground_data() {
165+ return [
166+ { tag: "default", index: 0, headerBackground: "" },
167+ { tag: "black", index: 3, headerBackground: "gradient:///white/blue" },
168+ ];
169+ }
170+
171+ function test_headerBackground(data) {
172+ tool.style = testCase.styles[data.index];
173+ compare(tool.headerBackground, data.headerBackground, "Header background was incorrect.");
174+ }
150 }
175 }
151}
176}
tests/qmltests/CMakeLists.txt+1
@@ -21,6 +21,7 @@ set(qmltest_DEFAULT_PROPERTIES ENVIRONMENT "LC_ALL=C")
21
21
22add_qml_test(. Shell ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
22add_qml_test(. Shell ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
23add_qml_test(. ShellWithPin ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single-pin")
23add_qml_test(. ShellWithPin ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single-pin")
24+add_qml_test(Components Background)
24add_qml_test(Components Carousel)
25add_qml_test(Components Carousel)
25add_qml_test(Components DraggingArea)
26add_qml_test(Components DraggingArea)
26add_qml_test(Components EdgeDemoOverlay)
27add_qml_test(Components EdgeDemoOverlay)
tests/qmltests/Components/tst_Background.qmlnew file+90
@@ -0,0 +1,90 @@
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+import QtQuick 2.2
18+import QtTest 1.0
19+import Unity.Test 0.1
20+
21+import "../../../qml/Components"
22+
23+Rectangle {
24+ width: units.gu(40)
25+ height: units.gu(71)
26+
27+ Background {
28+ id: background
29+ }
30+
31+ UnityTestCase {
32+ id: testCase
33+ name: "Background"
34+ when: windowShown
35+
36+ SignalSpy {
37+ id: loadedSpy
38+ target: background
39+ signalName: "loaded"
40+ }
41+
42+ function cleanup() {
43+ background.style = "";
44+ loadedSpy.clear();
45+ }
46+
47+ function test_style_data() {
48+ return [
49+ { tag: "empty", style: "" },
50+ { tag: "solid", style: "color:///black" },
51+ { tag: "gradient", style: "gradient:///black/red" },
52+ { tag: "image", style: "/some/path" },
53+ ];
54+ }
55+
56+ function test_style(data) {
57+ background.style = data.style;
58+ expectFail("empty", "Empty style should not create a background.");
59+ loadedSpy.wait();
60+ compare(background.item.objectName, data.tag, "Background should be %1".arg(data.style));
61+ }
62+
63+ function test_solid() {
64+ background.style = "color:///black";
65+ loadedSpy.wait();
66+
67+ verify(Qt.colorEqual(background.item.color, "black"),
68+ "Solid color not equal: %1 != black".arg(background.item.color));
69+ }
70+
71+ function test_gradient() {
72+ background.style = "gradient:///black/red";
73+ loadedSpy.wait();
74+
75+ var stops = background.item.gradient.stops;
76+
77+ verify(Qt.colorEqual(stops[0].color, "black"),
78+ "Top gradient color not equal: %1 != black".arg(stops[0].color));
79+ verify(Qt.colorEqual(stops[1].color, "red"),
80+ "Bottom gradient color not equal: %1 != black".arg(stops[1].color));
81+ }
82+
83+ function test_image() {
84+ background.style = "/some/path";
85+ loadedSpy.wait();
86+
87+ compare(background.item.source, Qt.resolvedUrl("/some/path"), "Image path is incorrect.");
88+ }
89+ }
90+}
tests/qmltests/Dash/tst_GenericScopeView.qml+26−5
@@ -58,6 +58,7 @@ Item {
58 when: scopes.loaded && windowShown
58 when: scopes.loaded && windowShown
59
59
60 property Item previewListView: findChild(genericScopeView, "previewListView")
60 property Item previewListView: findChild(genericScopeView, "previewListView")
61+ property Item header: findChild(genericScopeView, "scopePageHeader")
61
62
62 function init() {
63 function init() {
63 genericScopeView.scope = scopes.getScope(1)
64 genericScopeView.scope = scopes.getScope(1)
@@ -324,13 +325,33 @@ Item {
324 closePreview();
325 closePreview();
325 }
326 }
326
327
327− function test_header_logo() {
328+ function test_header_style_data() {
328− genericScopeView.scope = scopes.getScope(3);
329+ return [
330+ { tag: "Default", index: 0, foreground: "grey", background: "", logo: "" },
331+ { tag: "Foreground", index: 2, foreground: "yellow", background: "", logo: "" },
332+ { tag: "Logo+Background", index: 3, foreground: "grey", background: "gradient:///lightgrey/grey",
333+ logo: Qt.resolvedUrl("../Components/tst_PageHeader/logo-ubuntu-orange.svg") },
334+ ];
335+ }
329
336
330− var image = findChild(genericScopeView, "titleImage");
337+ function test_header_style(data) {
338+ genericScopeView.scope = scopes.getScope(data.index);
339+ waitForRendering(genericScopeView);
340+ verify(header, "Could not find the header.");
341+
342+ var innerHeader = findChild(header, "innerPageHeader");
331− verify(image, "Could not find the title image");
343+ verify(innerHeader, "Could not find the inner header");
332− compare(image.source, Qt.resolvedUrl("../Components/tst_PageHeader/logo-ubuntu-orange.svg"), "Title image has the wrong source");
344+ verify(Qt.colorEqual(innerHeader.textColor, data.foreground),
345+ "Foreground color not equal: %1 != %2".arg(innerHeader.textColor).arg(data.foreground));
333
346
347+ var background = findChild(header, "headerBackground");
348+ verify(background, "Could not find the background");
349+ compare(background.style, data.background);
350+
351+ var image = findChild(genericScopeView, "titleImage");
352+ if (data.logo == "") expectFail(data.tag, "Title image should not exist.");
353+ verify(image, "Could not find the title image.");
354+ compare(image.source, data.logo, "Title image has the wrong source");
334 }
355 }
335 }
356 }
336 }
357 }