on xenial help sign in
Merge from trunk
commite6f3d11abfcfc1b6a789d59f8e80a7a08ce4ea19 authorMichael Terry <michael.terry@canonical.com> dateMon 6 Oct 2014, 17:29 (12 years ago) parentd6de6bc49bcb3a
104 files changed+1588−528
CMakeLists.txt+2−2 build.sh+1 cmake/modules/QmlTest.cmake+2−1 debian/changelog+40 debian/control+2−1 debian/unity8-private.install+1 plugins/Dash/CardAttributes.qml+1−1 plugins/Dash/CardCreator.js+15−16 plugins/Dash/CroppedImageMinimumSourceSize.qml+38 plugins/Dash/listviewwithpageheader.cpp+18−7 plugins/Dash/listviewwithpageheader.h+6 plugins/Dash/qmldir+2−1 plugins/LightDM/DBusGreeter.h−1 plugins/LightDM/DBusGreeterList.h−1 plugins/Unity/DashCommunicator/CMakeLists.txt+8−2 plugins/Unity/DashCommunicator/dashcommunicator.cpp+22−13 plugins/Unity/DashCommunicator/dashcommunicator.h+16−6 plugins/Unity/DashCommunicator/dashconnection.cpp+33 plugins/Unity/DashCommunicator/dashconnection.h+34 plugins/Unity/Launcher/CMakeLists.txt+1−1 po/am.po+12−15 po/ast.po+9−12 po/br.po+14−13 po/en_GB.po+13−16 po/es.po+15−14 po/eu.po+13−13 po/fi.po+13−14 po/gd.po+15−12 po/gl.po+1−4 po/hu.po+12−15 po/is.po+31−12 po/nb.po+13−14 po/nl.po+14−13 po/pt.po+12−15 po/ro.po+13−12 po/sl.po+15−16 po/ug.po+11−15 po/uk.po+15−13 po/unity8.pot+10−2 qml/Components/LazyImage.qml+1 qml/Components/ResponsiveGridView.qml+5−1 qml/Dash/CardGrid.qml+2−1 qml/Dash/CardHorizontalList.qml+1−1 qml/Dash/CardTool.qml+26−18 qml/Dash/CardVerticalJournal.qml+2−1 qml/Dash/DashContent.qml+3 qml/Dash/DashNavigation.qml+1 qml/Dash/DashRenderer.qml+4 qml/Dash/GenericScopeView.qml+71−13 qml/Dash/Previews/PreviewHeader.qml+13 qml/Dash/Previews/PreviewImageGallery.qml+121−18 qml/Dash/PullToRefreshScopeStyle.qml+82 qml/Dash/ScopeListView.qml+1 qml/Dash/ScopeSettingsPage.qml+1 qml/Dash/ScopesOverviewAll.qml+2 qml/Dash/ScopesOverviewFavorites.qml+1−1 qml/Launcher/Launcher.qml+1 qml/Shell.qml+8−6 src/CMakeLists.txt+1 src/Dash/CMakeLists.txt+2 src/Panel/CMakeLists.txt+2 src/libunity8-private/CMakeLists.txt+25 src/libunity8-private/abstractdbusservicemonitor.cpp+87 src/libunity8-private/abstractdbusservicemonitor.h+66 tests/autopilot/unity8/shell/emulators/dash.py+4−4 tests/mocks/Ubuntu/CMakeLists.txt+1 tests/mocks/Ubuntu/Connectivity/CMakeLists.txt+10 tests/mocks/Ubuntu/Connectivity/networking-status.cpp+64 tests/mocks/Ubuntu/Connectivity/networking-status.h+73 tests/mocks/Ubuntu/Connectivity/plugin.cpp+46 tests/mocks/Ubuntu/Connectivity/plugin.h+35 tests/mocks/Ubuntu/Connectivity/qmldir+2 tests/mocks/Unity/Application/ApplicationManager.cpp+26 tests/mocks/Unity/Application/ApplicationManager.h+6−2 tests/mocks/Unity/Application/CMakeLists.txt+1−1 tests/mocks/Unity/fake_scope.cpp+1−1 tests/mocks/Unity/fake_scope.h+3 tests/plugins/Dash/CMakeLists.txt+3−3 tests/plugins/Dash/cardcreator/1.res+7−6 tests/plugins/Dash/cardcreator/2.res+8−11 tests/plugins/Dash/cardcreator/3.res+9−9 tests/plugins/Dash/cardcreator/4.res+8−11 tests/plugins/Dash/cardcreator/5.res+9−9 tests/plugins/Dash/cardcreator/6.res+5−7 tests/plugins/Dash/cardcreator/7.res+9−12 tests/plugins/Dash/listviewwithpageheadertest.cpp+39 tests/plugins/Dash/listviewwithpageheadertest.qml+1 tests/plugins/Dash/listviewwithpageheadertestsection.qml+1 tests/plugins/Dash/listviewwithpageheadertestsectionexternalmodel.qml+1 tests/plugins/Ubuntu/Gestures/CMakeLists.txt+1−1 tests/plugins/Unity/Launcher/CMakeLists.txt+1−1 tests/plugins/Unity/Launcher/launchermodeltest.cpp+2 tests/qmltests/Components/CMakeLists.txt+1−1 tests/qmltests/Dash/CardHelpers.js+1−12 tests/qmltests/Dash/Previews/tst_PreviewHeader.qml+4−2 tests/qmltests/Dash/Previews/tst_PreviewImageGallery.qml+51−1 tests/qmltests/Dash/tst_Card.qml+26 tests/qmltests/Dash/tst_CardTool.qml+28−20 tests/qmltests/Dash/tst_Dash.qml+16−39 tests/qmltests/Dash/tst_DashContent.qml+14−1 tests/qmltests/Dash/tst_GenericScopeView.qml+28−6 tests/qmltests/tst_Shell.qml+4 tests/utils/modules/Unity/Test/UnityTestCase.qml+3−2 tools/unlock-device+14−13
CMakeLists.txt+2−2
@@ -64,13 +64,13 @@ if(SHELL_INSTALL_QML STREQUAL "")
6464 message(FATAL_ERROR "Could not determine plugin installation dir.")
6565endif()
6666
67+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
68+
6769execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=plugindir unity-shell-api OUTPUT_VARIABLE SHELL_PLUGINDIR OUTPUT_STRIP_TRAILING_WHITESPACE)
6870if(SHELL_PLUGINDIR STREQUAL "")
6971 message(FATAL_ERROR "Could not determine plugin import dir.")
7072endif()
7173
72−set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
73−
7474set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fno-permissive -pedantic -Wall -Wextra")
7575
7676if ("${CMAKE_BUILD_TYPE}" STREQUAL "release" OR "${CMAKE_BUILD_TYPE}" STREQUAL "relwithdebinfo")
build.sh+1
@@ -51,6 +51,7 @@ install_dependencies() {
5151 qtdeclarative5-ubuntu-settings-components \
5252 qtdeclarative5-ubuntu-telephony0.1 \
5353 qtdeclarative5-ubuntu-thumbnailer0.1 \
54+ qml-module-ubuntu-connectivity \
5455 unity-notifications-impl \
5556 ubuntu-mobile-icons \
5657 unity-scope-home \
cmake/modules/QmlTest.cmake+2−1
@@ -151,7 +151,7 @@ macro(add_qml_test_internal SUBPATH COMPONENT_NAME ITERATIONS)
151151 add_manual_qml_test(${SUBPATH} ${COMPONENT_NAME} ${ARGN})
152152endmacro(add_qml_test_internal)
153153
154−macro(add_binary_qml_test CLASS_NAME LD_PATH DEPS)
154+macro(add_binary_qml_test CLASS_NAME LD_PATH DEPS ENVVAR)
155155 set(testCommand
156156 LD_LIBRARY_PATH=${LD_PATH}
157157 ${CMAKE_CURRENT_BINARY_DIR}/${CLASS_NAME}TestExec
@@ -168,6 +168,7 @@ macro(add_binary_qml_test CLASS_NAME LD_PATH DEPS)
168168 endif()
169169 set(xvfbtestCommand
170170 ${LD_PRELOAD_PATH}
171+ ${ENVVAR}
171172 LD_LIBRARY_PATH=${LD_PATH}
172173 xvfb-run --server-args "-screen 0 1024x768x24" --auto-servernum
173174 ${CMAKE_CURRENT_BINARY_DIR}/${CLASS_NAME}TestExec
debian/changelog+40
@@ -1,3 +1,43 @@
1+unity8 (8.00+14.10.20141006-0ubuntu1) utopic; urgency=low
2+
3+ [ Andrea Cimitan ]
4+ * Tweak card header to match the spec
5+ * Add preview image slideshow (LP: #1351537)
6+
7+ [ Michał Sawicz ]
8+ * Cache more things in memory, so flicking scopes should be faster
9+ (LP: #1336724)
10+ * Tweak card header to match the spec
11+ * Save texture memory by limiting sourceSize (LP: #1338430)
12+
13+ [ Ying-Chun Liu ]
14+ * Add attributes to Preview. (LP: #1282460)
15+
16+ [ Albert Astals ]
17+ * Update pot
18+ * Cache more things in memory, so flicking scopes should be faster
19+ (LP: #1336724)
20+ * Save texture memory by limiting sourceSize (LP: #1338430)
21+ * Clip the settings list
22+ * Fix unlocking from the left again
23+ * Add wait_ makes tests more reliable
24+
25+ [ Michael Zanetti ]
26+ * fix fading out the launcher instead of sliding it out on left-edge
27+ minimizing an app.
28+ * Make the DashCommunicator async and more flexible to handle a
29+ lifecycle-suspended dash (LP: #1339883)
30+
31+ [ Michael Terry ]
32+ * Retry unlock-device script if it fails, as there is always a risk of
33+ a small race with boot-up. (LP: #1370644)
34+ * Add pull-to-refresh functionality to scopes. (LP: #1368336)
35+
36+ [ CI bot ]
37+ * Resync trunk
38+
39+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 06 Oct 2014 08:03:23 +0000
40+
141unity8 (8.00+14.10.20140930.2-0ubuntu1) utopic; urgency=low
242
343 [ Alexandros Frantzis ]
debian/control+2−1
@@ -25,7 +25,7 @@ Build-Depends: cmake,
2525 libpulse-dev,
2626 libqmenumodel-dev (>= 0.2.8),
2727 libqt5xmlpatterns5-dev,
28− libunity-api-dev (>= 7.91),
28+ libunity-api-dev (>= 7.92),
2929 libusermetricsoutput1-dev,
3030 libxcb1-dev,
3131 pkg-config,
@@ -174,6 +174,7 @@ Depends: accountsservice-ubuntu-schemas (>= 0.0.3),
174174 libhardware2,
175175 unity-schemas (>= 7.3.1+14.10.20140915),
176176 pay-service,
177+ qml-module-ubuntu-connectivity,
177178 ${misc:Depends},
178179 ${shlibs:Depends},
179180Provides: unity-launcher-impl,
debian/unity8-private.install+1
@@ -1,3 +1,4 @@
1+usr/lib/*/libunity8-private.*
12usr/lib/*/unity8/qml/AccountsService
23usr/lib/*/unity8/qml/Dash
34usr/lib/*/unity8/qml/HudClient
plugins/Dash/CardAttributes.qml+1−1
@@ -59,7 +59,7 @@ GridLayout {
5959 text: "value" in modelData && modelData["value"] || "";
6060 elide: Text.ElideRight
6161 maximumLineCount: 1
62− font.weight: "style" in modelData && modelData["style"] == "highlighted" ? Font.DemiBold : Font.Light
62+ font.weight: "style" in modelData && modelData["style"] === "highlighted" ? Font.Bold : Font.Light
6363 fontSize: "small"
6464 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale)
6565 color: grid.color
plugins/Dash/CardCreator.js+15−16
@@ -82,12 +82,13 @@ var kArtShapeHolderCode = 'Item { \n\
8282 height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height }); \n\
8383 } \n\
8484 } \n\
85− image: Image { \n\
85+ image: CroppedImageMinimumSourceSize { \n\
8686 objectName: "artImage"; \n\
87− source: cardData && cardData["art"] || ""; \n\
87+ property bool doLoadSource: !NetworkingStatus.limitedBandwith; \n\
88+ source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["art"] || ""; } \n\
8889 cache: true; \n\
8990 asynchronous: root.asynchronous; \n\
90− fillMode: Image.PreserveAspectCrop; \n\
91+ visible: false; \n\
9192 width: %2; \n\
9293 height: %3; \n\
9394 } \n\
@@ -190,16 +191,14 @@ var kMascotShapeLoaderCode = 'Loader { \n\
190191
191192// %1 is used as anchors of mascotImage
192193// %2 is used as visible of mascotImage
193−var kMascotImageCode = 'Image { \n\
194+var kMascotImageCode = 'CroppedImageMinimumSourceSize { \n\
194195 id: mascotImage; \n\
195196 objectName: "mascotImage"; \n\
196197 anchors { %1 } \n\
197− readonly property int maxSize: Math.max(width, height) * 4; \n\
198− source: cardData && cardData["mascot"] || ""; \n\
198+ property bool doLoadSource: !NetworkingStatus.limitedBandwith; \n\
199+ source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["mascot"] || ""; } \n\
199200 width: units.gu(6); \n\
200201 height: units.gu(5.625); \n\
201− sourceSize { width: maxSize; height: maxSize } \n\
202− fillMode: Image.PreserveAspectCrop; \n\
203202 horizontalAlignment: Image.AlignHCenter; \n\
204203 verticalAlignment: Image.AlignVCenter; \n\
205204 visible: %2; \n\
@@ -220,13 +219,13 @@ var kTitleLabelCode = 'Label { \n\
220219 color: %2; \n\
221220 visible: showHeader %3; \n\
222221 text: root.title; \n\
223− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal; \n\
224− horizontalAlignment: root.headerAlignment; \n\
222+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal; \n\
223+ horizontalAlignment: root.titleAlignment; \n\
225224 }\n';
226225
227226// %1 is used as extra anchors of emblemIcon
228227// %2 is used as color of emblemIcon
229−var kEmblemIconCode = 'Icon { \n\
228+var kEmblemIconCode = 'StatusIcon { \n\
230229 id: emblemIcon; \n\
231230 objectName: "emblemIcon"; \n\
232231 anchors { \n\
@@ -236,7 +235,6 @@ var kEmblemIconCode = 'Icon { \n\
236235 } \n\
237236 source: cardData && cardData["emblem"] || ""; \n\
238237 color: %2; \n\
239− width: height; \n\
240238 height: source != "" ? titleLabel.font.pixelSize : 0; \n\
241239 }\n';
242240
@@ -258,13 +256,12 @@ var kSubtitleLabelCode = 'Label { \n\
258256 anchors { %1 } \n\
259257 anchors.topMargin: units.dp(2); \n\
260258 elide: Text.ElideRight; \n\
261− fontSize: "small"; \n\
259+ fontSize: "x-small"; \n\
262260 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale); \n\
263261 color: %2; \n\
264262 visible: titleLabel.visible && titleLabel.text; \n\
265263 text: cardData && cardData["subtitle"] || ""; \n\
266264 font.weight: Font.Light; \n\
267− horizontalAlignment: root.headerAlignment; \n\
268265 }\n';
269266
270267// %1 is used as anchors of attributesRow
@@ -310,7 +307,7 @@ function cardString(template, components) {
310307 property var artShapeBorderSource: undefined; \n\
311308 property real fontScale: 1.0; \n\
312309 property var scopeStyle: null; \n\
313− property int headerAlignment: Text.AlignLeft; \n\
310+ property int titleAlignment: Text.AlignLeft; \n\
314311 property int fixedHeaderHeight: -1; \n\
315312 property size fixedArtShapeSize: Qt.size(-1, -1); \n\
316313 readonly property string title: cardData && cardData["title"] || ""; \n\
@@ -436,7 +433,7 @@ function cardString(template, components) {
436433 mascotShapeCode = kMascotShapeLoaderCode.arg(mascotAnchors);
437434 }
438435
439− var mascotImageVisible = useMascotShape ? 'false' : 'showHeader';
436+ var mascotImageVisible = useMascotShape ? 'false' : 'showHeader && resized';
440437 mascotCode = kMascotImageCode.arg(mascotAnchors).arg(mascotImageVisible);
441438 }
442439
@@ -655,6 +652,8 @@ function cardString(template, components) {
655652function createCardComponent(parent, template, components) {
656653 var imports = 'import QtQuick 2.2; \n\
657654 import Ubuntu.Components 1.1; \n\
655+ import Ubuntu.Settings.Components 0.1; \n\
656+ import Ubuntu.Connectivity 1.0; \n\
658657 import Dash 0.1;\n\
659658 import Utils 0.1;\n';
660659 var card = cardString(template, components);
plugins/Dash/CroppedImageMinimumSourceSize.qmlnew file+38
@@ -0,0 +1,38 @@
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.3
18+
19+Image {
20+ property bool resized: false
21+ property bool resizing: false
22+ fillMode: Image.PreserveAspectCrop
23+ visible: resized
24+ onSourceSizeChanged: {
25+ if (!resized && !resizing) {
26+ resizing = true;
27+ var ar = width / height;
28+ var ssar = sourceSize.width / sourceSize.height;
29+ if (ar > ssar) {
30+ sourceSize = Qt.size(width, 0);
31+ } else {
32+ sourceSize = Qt.size(0, height);
33+ }
34+ resizing = false;
35+ resized = true;
36+ }
37+ }
38+}
plugins/Dash/listviewwithpageheader.cpp+18−7
@@ -104,8 +104,6 @@
104104#pragma GCC diagnostic pop
105105// #include <private/qquickrectangle_p.h>
106106
107−static const qreal bufferRatio = 0.5;
108−
109107qreal ListViewWithPageHeader::ListItem::height() const
110108{
111109 return m_item->height() + (m_sectionItem ? m_sectionItem->height() : 0);
@@ -158,6 +156,7 @@ ListViewWithPageHeader::ListViewWithPageHeader()
158156 , m_forceNoClip(false)
159157 , m_inLayout(false)
160158 , m_inContentHeightKeepHeaderShown(false)
159+ , m_cacheBuffer(0)
161160{
162161 m_clipItem = new QQuickItem(contentItem());
163162// m_clipItem = new QQuickRectangle(contentItem());
@@ -335,6 +334,20 @@ qreal ListViewWithPageHeader::headerItemShownHeight() const
335334 return m_headerItemShownHeight;
336335}
337336
337+qreal ListViewWithPageHeader::cacheBuffer() const
338+{
339+ return m_cacheBuffer;
340+}
341+
342+void ListViewWithPageHeader::setCacheBuffer(qreal cacheBuffer)
343+{
344+ if (cacheBuffer != m_cacheBuffer) {
345+ m_cacheBuffer = cacheBuffer;
346+ Q_EMIT cacheBufferChanged();
347+ polish();
348+ }
349+}
350+
338351void ListViewWithPageHeader::positionAtBeginning()
339352{
340353 if (m_delegateModel->count() <= 0)
@@ -356,8 +369,7 @@ void ListViewWithPageHeader::positionAtBeginning()
356369 // Create the subsequent items
357370 int modelIndex = 1;
358371 qreal pos = item->y() + item->height();
359− const qreal buffer = height() * bufferRatio;
360− const qreal bufferTo = height() + buffer;
372+ const qreal bufferTo = height() + m_cacheBuffer;
361373 while (modelIndex < m_delegateModel->count() && pos <= bufferTo) {
362374 if (!(item = createItem(modelIndex, false)))
363375 break;
@@ -603,11 +615,10 @@ void ListViewWithPageHeader::refill()
603615 return;
604616 }
605617
606− const qreal buffer = height() * bufferRatio;
607618 const qreal from = contentY();
608619 const qreal to = from + height();
609− const qreal bufferFrom = from - buffer;
610− const qreal bufferTo = to + buffer;
620+ const qreal bufferFrom = from - m_cacheBuffer;
621+ const qreal bufferTo = to + m_cacheBuffer;
611622
612623 bool added = addVisibleItems(from, to, false);
613624 bool removed = removeNonVisibleItems(bufferFrom, bufferTo);
plugins/Dash/listviewwithpageheader.h+6
@@ -54,6 +54,7 @@ class ListViewWithPageHeader : public QQuickFlickable, public QQuickItemChangeLi
5454 Q_PROPERTY(bool forceNoClip READ forceNoClip WRITE setForceNoClip NOTIFY forceNoClipChanged)
5555 Q_PROPERTY(int stickyHeaderHeight READ stickyHeaderHeight NOTIFY stickyHeaderHeightChanged)
5656 Q_PROPERTY(qreal headerItemShownHeight READ headerItemShownHeight NOTIFY headerItemShownHeightChanged)
57+ Q_PROPERTY(qreal cacheBuffer READ cacheBuffer WRITE setCacheBuffer NOTIFY cacheBufferChanged)
5758
5859 friend class ListViewWithPageHeaderTest;
5960 friend class ListViewWithPageHeaderTestSection;
@@ -84,6 +85,9 @@ public:
8485 int stickyHeaderHeight() const;
8586 qreal headerItemShownHeight() const;
8687
88+ qreal cacheBuffer() const;
89+ void setCacheBuffer(qreal cacheBuffer);
90+
8791 Q_INVOKABLE void positionAtBeginning();
8892 Q_INVOKABLE void showHeader();
8993 Q_INVOKABLE int firstCreatedIndex() const;
@@ -105,6 +109,7 @@ Q_SIGNALS:
105109 void forceNoClipChanged();
106110 void stickyHeaderHeightChanged();
107111 void headerItemShownHeightChanged();
112+ void cacheBufferChanged();
108113
109114protected:
110115 void componentComplete() override;
@@ -199,6 +204,7 @@ private:
199204 bool m_forceNoClip;
200205 bool m_inLayout;
201206 bool m_inContentHeightKeepHeaderShown;
207+ qreal m_cacheBuffer;
202208
203209 // Qt 5.0 doesn't like releasing the items just after itemCreated
204210 // so we delay the releasing until the next updatePolish
plugins/Dash/qmldir+2−1
@@ -3,4 +3,5 @@ plugin Dash-qml
33typeinfo Dash.qmltypes
44singleton CardCreatorCache 0.1 CardCreatorCache.qml
55ScopeStyle 0.1 ScopeStyle.qml
6−CardAttributes 0.1 CardAttributes.qml
6+CardAttributes 0.1 CardAttributes.qml
7+CroppedImageMinimumSourceSize 0.1 CroppedImageMinimumSourceSize.qml
plugins/LightDM/DBusGreeter.h−1
@@ -21,7 +21,6 @@
2121#include <QObject>
2222
2323class Greeter;
24−class QDBusInterface;
2524
2625/** This is an internal class used to talk with the indicators.
2726 */
plugins/LightDM/DBusGreeterList.h−1
@@ -21,7 +21,6 @@
2121#include <QObject>
2222
2323class Greeter;
24−class QDBusInterface;
2524
2625/** This is an internal class used to talk with the indicators.
2726 */
plugins/Unity/DashCommunicator/CMakeLists.txt+8−2
@@ -1,5 +1,6 @@
11include_directories(
22 ${CMAKE_CURRENT_SOURCE_DIR}
3+ ${libunity8-private_SOURCE_DIR}
34)
45
56set(QMLDASHCOMMUNICATORPLUGIN_SRC
@@ -7,13 +8,18 @@ set(QMLDASHCOMMUNICATORPLUGIN_SRC
78 dbusdashcommunicatorservice.cpp
89 dashcommunicatorservice.cpp
910 dashcommunicator.cpp
10− )
11+ dashconnection.cpp
12+)
1113
1214add_library(DashCommunicator-qml MODULE
1315 ${QMLDASHCOMMUNICATORPLUGIN_SRC}
14− )
16+)
1517
1618qt5_use_modules(DashCommunicator-qml DBus Qml)
1719
20+target_link_libraries(DashCommunicator-qml
21+ unity8-private
22+)
23+
1824# export the qmldir and qmltypes files
1925add_unity8_plugin(Unity.DashCommunicator 0.1 Unity/DashCommunicator TARGETS DashCommunicator-qml)
plugins/Unity/DashCommunicator/dashcommunicator.cpp+22−13
@@ -15,29 +15,38 @@
1515 */
1616
1717#include "dashcommunicator.h"
18+#include "dashconnection.h"
1819
1920#include <QObject>
20−#include <QDBusConnection>
21−#include <QDBusInterface>
22−#include <QDebug>
2321
2422DashCommunicator::DashCommunicator(QObject *parent):
25− QObject(parent)
23+ QThread(parent),
24+ m_dashConnection(nullptr),
25+ m_created(false)
2626{
27+ start();
2728}
2829
29−DashCommunicator::~DashCommunicator()
30+void DashCommunicator::setCurrentScope(const QString &scopeId, bool animate, bool isSwipe)
3031{
32+ m_mutex.lock();
33+ if (m_created) {
34+ QMetaObject::invokeMethod(m_dashConnection, "setCurrentScope",
35+ Q_ARG(QString, scopeId),
36+ Q_ARG(bool, animate),
37+ Q_ARG(bool, isSwipe));
38+ }
39+ m_mutex.unlock();
3140}
3241
33−
34−void DashCommunicator::setCurrentScope(const QString &scopeId, bool animate, bool isSwipe)
42+void DashCommunicator::run()
3543{
36− QDBusConnection connection = QDBusConnection::sessionBus();
37− QDBusInterface dashIface ("com.canonical.UnityDash",
38− "/com/canonical/UnityDash",
39− "",
40− connection);
44+ m_dashConnection = new DashConnection("com.canonical.UnityDash",
45+ "/com/canonical/UnityDash",
46+ "", this);
47+ m_mutex.lock();
48+ m_created = true;
49+ m_mutex.unlock();
4150
42− dashIface.call("SetCurrentScope", scopeId, animate, isSwipe);
51+ exec();
4352}
plugins/Unity/DashCommunicator/dashcommunicator.h+16−6
@@ -17,19 +17,29 @@
1717#ifndef DASHCOMMUNICATOR_H
1818#define DASHCOMMUNICATOR_H
1919
20−#include <QObject>
20+// Qt
21+#include <QThread>
22+#include <QMutex>
2123
22−class DashCommunicator: public QObject
24+class DashConnection;
25+
26+class DashCommunicator: public QThread
2327{
2428 Q_OBJECT
25− Q_CLASSINFO("D-Bus Interface", "com.canonical.Unity.DashCommunicator")
26−
2729public:
28− DashCommunicator(QObject *parent = 0);
29− ~DashCommunicator();
30+ explicit DashCommunicator(QObject *parent = 0);
31+ ~DashCommunicator() = default;
3032
3133public Q_SLOTS:
3234 void setCurrentScope(const QString &scopeId, bool animate, bool isSwipe);
35+
36+protected:
37+ void run() override;
38+
39+private:
40+ DashConnection *m_dashConnection;
41+ bool m_created;
42+ QMutex m_mutex;
3343};
3444
3545#endif
plugins/Unity/DashCommunicator/dashconnection.cppnew file+33
@@ -0,0 +1,33 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "dashconnection.h"
18+
19+#include <QDBusInterface>
20+#include <QDBusPendingCall>
21+
22+DashConnection::DashConnection(const QString &service, const QString &path, const QString &interface, QObject *parent):
23+ AbstractDBusServiceMonitor(service, path, interface, SessionBus, parent)
24+{
25+
26+}
27+
28+void DashConnection::setCurrentScope(const QString &scopeId, bool animate, bool isSwipe)
29+{
30+ if (dbusInterface()) {
31+ dbusInterface()->asyncCall("SetCurrentScope", scopeId, animate, isSwipe);
32+ }
33+}
plugins/Unity/DashCommunicator/dashconnection.hnew file+34
@@ -0,0 +1,34 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef THREADEDDASHCONNECTION_H
18+#define THREADEDDASHCONNECTION_H
19+
20+// local
21+#include "abstractdbusservicemonitor.h"
22+
23+
24+class DashConnection: public AbstractDBusServiceMonitor
25+{
26+ Q_OBJECT
27+public:
28+ DashConnection(const QString &service, const QString &path, const QString &interface, QObject *parent = 0);
29+
30+public Q_SLOTS:
31+ void setCurrentScope(const QString &scopeId, bool animate, bool isSwipe);
32+};
33+
34+#endif
plugins/Unity/Launcher/CMakeLists.txt+1−1
@@ -1,6 +1,6 @@
11include(FindPkgConfig)
22pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=4)
3−pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=4)
3+pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=5)
44pkg_check_modules(GSETTINGS_QT REQUIRED gsettings-qt)
55
66add_definitions(-DSM_BUSNAME=systemBus)
po/am.po+12−15
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-10-02 10:35+0200\n"
11−"PO-Revision-Date: 2014-09-28 14:37+0000\n"
11+"PO-Revision-Date: 2014-10-04 15:36+0000\n"
1212"Last-Translator: samson <Unknown>\n"
1313"Language-Team: Amharic <am@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-03 06:21+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-05 06:38+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -33,22 +33,22 @@ msgstr "አቋራጭ መለያያ"
3333
3434#: qml/Components/DelayedLockscreen.qml:47
3535msgid "Device Locked"
36−msgstr ""
36+msgstr "አካሉ ተቆልፏል"
3737
3838#: qml/Components/DelayedLockscreen.qml:62
3939msgid "You have been locked out due to too many failed passphrase attempts."
40−msgstr ""
40+msgstr "ብዙ ጊዜ የተሳሳተ የ ማለፊያ ሀረግ ለማስገባት በ መሞከር ምክንያት ስልኩ ተቆልፏል"
4141
4242#: qml/Components/DelayedLockscreen.qml:63
4343msgid "You have been locked out due to too many failed passcode attempts."
44−msgstr ""
44+msgstr "ብዙ ጊዜ የተሳሳተ የ ማለፊያ ኮድ ለማስገባት በ መሞከር ምክንያት ስልኩ ተቆልፏል"
4545
4646#: qml/Components/DelayedLockscreen.qml:72
4747#, qt-format
4848msgid "Please wait %1 minute and then try again…"
4949msgid_plural "Please wait %1 minutes and then try again…"
50−msgstr[0] ""
51−msgstr[1] ""
50+msgstr[0] "እባክዎን ይቆዩ %1 ደቂቃ እና ከዛ እንደ ገና ይምክሩ…"
51+msgstr[1] "እባክዎን ይቆዩ %1 ደቂቃዎች እና ከዛ እንደ ገና ይምክሩ…"
5252
5353#: qml/Components/Dialogs.qml:70
5454msgid "Log out"
@@ -230,7 +230,7 @@ msgstr "ሁሉንም"
230230
231231#: qml/Greeter/Greeter.qml:157
232232msgid "Unlock"
233−msgstr ""
233+msgstr "መክፈቻ"
234234
235235#: qml/Hud/HudParametrizedActionsPage.qml:139
236236msgid "Confirm"
@@ -310,7 +310,7 @@ msgstr "ማዘዋወሪያ"
310310
311311#: qml/Shell.qml:340
312312msgid "Enter passphrase"
313−msgstr ""
313+msgstr "የ ማለፊያ ሀረግ ያስገቡ"
314314
315315#: qml/Shell.qml:321
316316msgid "Sorry, incorrect passphrase"
@@ -318,11 +318,11 @@ msgstr "አዝናለሁ የተሳሳተ የማለፊያ ሐረግ"
318318
319319#: qml/Shell.qml:342
320320msgid "Please re-enter"
321−msgstr ""
321+msgstr "እባክዎን እንደገና-ያስገቡ"
322322
323323#: qml/Shell.qml:344
324324msgid "Enter passcode"
325−msgstr ""
325+msgstr "የ ማለፊያ ኮድ ያስገቡ"
326326
327327#: qml/Shell.qml:324
328328msgid "Sorry, incorrect passcode"
@@ -331,7 +331,7 @@ msgstr "አዝናለሁ የተሳሳተ የማለፊያ ኮድ"
331331#: qml/Shell.qml:348
332332#, qt-format
333333msgid "Enter %1"
334−msgstr ""
334+msgstr "ማስገቢያ %1"
335335
336336#: qml/Shell.qml:328
337337#, qt-format
@@ -391,6 +391,3 @@ msgstr ""
391391
392392#~ msgid "Enter your passcode"
393393#~ msgstr "የ እርስዎን የማለፊያ ኮድ ያስገቡ"
394−
395−#~ msgid "Manage Dash"
396−#~ msgstr "የ ዳሽ አስተዳዳሪ"
po/ast.po+9−12
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-10-02 10:35+0200\n"
11−"PO-Revision-Date: 2014-09-28 09:02+0000\n"
12−"Last-Translator: ivarela <ivarela@ubuntu.com>\n"
11+"PO-Revision-Date: 2014-10-03 22:20+0000\n"
12+"Last-Translator: Xuacu Saturio <xuacusk8@gmail.com>\n"
1313"Language-Team: Asturian <ast@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-03 06:21+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-04 06:28+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -33,7 +33,7 @@ msgstr "Desanclar"
3333
3434#: qml/Components/DelayedLockscreen.qml:47
3535msgid "Device Locked"
36−msgstr ""
36+msgstr "Preséu bloquiáu"
3737
3838#: qml/Components/DelayedLockscreen.qml:62
3939msgid "You have been locked out due to too many failed passphrase attempts."
@@ -47,8 +47,8 @@ msgstr ""
4747#, qt-format
4848msgid "Please wait %1 minute and then try again…"
4949msgid_plural "Please wait %1 minutes and then try again…"
50−msgstr[0] ""
51−msgstr[1] ""
50+msgstr[0] "Espera %1 minutu y vuelvi a intentalo…"
51+msgstr[1] "Espera %1 minutos y vuelvi a intentalo…"
5252
5353#: qml/Components/Dialogs.qml:70
5454msgid "Log out"
@@ -233,7 +233,7 @@ msgstr "Too"
233233
234234#: qml/Greeter/Greeter.qml:157
235235msgid "Unlock"
236−msgstr ""
236+msgstr "Desbloquiar"
237237
238238#: qml/Hud/HudParametrizedActionsPage.qml:139
239239msgid "Confirm"
@@ -321,7 +321,7 @@ msgstr "Sentímoslo, contraseña incorreuta"
321321
322322#: qml/Shell.qml:342
323323msgid "Please re-enter"
324−msgstr ""
324+msgstr "Vuelvi a escribila"
325325
326326#: qml/Shell.qml:344
327327msgid "Enter passcode"
@@ -334,7 +334,7 @@ msgstr "Sentímoslo, códigu de pasu incorreutu"
334334#: qml/Shell.qml:348
335335#, qt-format
336336msgid "Enter %1"
337−msgstr ""
337+msgstr "Escribi %1"
338338
339339#: qml/Shell.qml:328
340340#, qt-format
@@ -392,8 +392,5 @@ msgstr ""
392392#~ msgid "Enter your passcode"
393393#~ msgstr "Introduz códigu de pasu"
394394
395−#~ msgid "Manage Dash"
396−#~ msgstr "Xestionar tableru"
397−
398395#~ msgid "Too many incorrect attempts"
399396#~ msgstr "Munchos intentos incorreutos"
po/br.po+14−13
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-10-02 10:35+0200\n"
11−"PO-Revision-Date: 2014-09-30 06:25+0000\n"
11+"PO-Revision-Date: 2014-10-03 06:52+0000\n"
1212"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
1313"Language-Team: Breton <br@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-03 06:21+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-04 06:28+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -33,22 +33,26 @@ msgstr "Dispilhennañ ar verradenn"
3333
3434#: qml/Components/DelayedLockscreen.qml:47
3535msgid "Device Locked"
36−msgstr ""
36+msgstr "Benveg prennet"
3737
3838#: qml/Components/DelayedLockscreen.qml:62
3939msgid "You have been locked out due to too many failed passphrase attempts."
4040msgstr ""
41+"Prennet eo bet ho penveg abalamour da re a daolioù-esae c'hwitet evit merkañ "
42+"ho frazenn-dremen."
4143
4244#: qml/Components/DelayedLockscreen.qml:63
4345msgid "You have been locked out due to too many failed passcode attempts."
4446msgstr ""
47+"Prennet eo bet ho penveg abalamour da re a daolioù-esae evit merkañ ho kod-"
48+"tremen."
4549
4650#: qml/Components/DelayedLockscreen.qml:72
4751#, qt-format
4852msgid "Please wait %1 minute and then try again…"
4953msgid_plural "Please wait %1 minutes and then try again…"
50−msgstr[0] ""
51−msgstr[1] ""
54+msgstr[0] "Gortozit %1 vunutenn, mar plij, hag esaeit en-dro..."
55+msgstr[1] "Gortozit %1 a vunutoù, mar plij, hag esaeit en-dro..."
5256
5357#: qml/Components/Dialogs.qml:70
5458msgid "Log out"
@@ -236,7 +240,7 @@ msgstr "An holl anezho"
236240
237241#: qml/Greeter/Greeter.qml:157
238242msgid "Unlock"
239−msgstr ""
243+msgstr "Dibrennañ"
240244
241245#: qml/Hud/HudParametrizedActionsPage.qml:139
242246msgid "Confirm"
@@ -316,7 +320,7 @@ msgstr "O kantren"
316320
317321#: qml/Shell.qml:340
318322msgid "Enter passphrase"
319−msgstr ""
323+msgstr "Merkañ ar frazenn-dremen"
320324
321325#: qml/Shell.qml:321
322326msgid "Sorry, incorrect passphrase"
@@ -324,11 +328,11 @@ msgstr "Siwazh, frazenn-dremen direizh"
324328
325329#: qml/Shell.qml:342
326330msgid "Please re-enter"
327−msgstr ""
331+msgstr "Adverkañ, mar plij"
328332
329333#: qml/Shell.qml:344
330334msgid "Enter passcode"
331−msgstr ""
335+msgstr "Merkañ ar c'hod-tremen"
332336
333337#: qml/Shell.qml:324
334338msgid "Sorry, incorrect passcode"
@@ -337,7 +341,7 @@ msgstr "Digarezit, kod-tremen direizh"
337341#: qml/Shell.qml:348
338342#, qt-format
339343msgid "Enter %1"
340−msgstr ""
344+msgstr "Merkañ %1"
341345
342346#: qml/Shell.qml:328
343347#, qt-format
@@ -388,9 +392,6 @@ msgstr ""
388392#~ msgid "Too many incorrect attempts"
389393#~ msgstr "Re a daolioù-esae direizh"
390394
391−#~ msgid "Manage Dash"
392−#~ msgstr "Merañ an daolenn-vourzh"
393−
394395#~ msgid "Enter your passphrase"
395396#~ msgstr "Ebarzhit ho frazenn-dremen"
396397
po/en_GB.po+13−16
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-10-02 10:35+0200\n"
11−"PO-Revision-Date: 2014-08-23 13:48+0000\n"
12−"Last-Translator: Alan Pope ( ͡° ͜ʖ ͡°) <alan@ubuntu.com>\n"
11+"PO-Revision-Date: 2014-10-03 12:46+0000\n"
12+"Last-Translator: Andi Chandler <Unknown>\n"
1313"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-03 06:22+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-04 06:28+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -33,22 +33,22 @@ msgstr "Unpin shortcut"
3333
3434#: qml/Components/DelayedLockscreen.qml:47
3535msgid "Device Locked"
36−msgstr ""
36+msgstr "Device Locked"
3737
3838#: qml/Components/DelayedLockscreen.qml:62
3939msgid "You have been locked out due to too many failed passphrase attempts."
40−msgstr ""
40+msgstr "You have been locked out due to too many failed passphrase attempts."
4141
4242#: qml/Components/DelayedLockscreen.qml:63
4343msgid "You have been locked out due to too many failed passcode attempts."
44−msgstr ""
44+msgstr "You have been locked out due to too many failed passcode attempts."
4545
4646#: qml/Components/DelayedLockscreen.qml:72
4747#, qt-format
4848msgid "Please wait %1 minute and then try again…"
4949msgid_plural "Please wait %1 minutes and then try again…"
50−msgstr[0] ""
51−msgstr[1] ""
50+msgstr[0] "Please wait %1 minute and then try again…"
51+msgstr[1] "Please wait %1 minutes and then try again…"
5252
5353#: qml/Components/Dialogs.qml:70
5454msgid "Log out"
@@ -231,7 +231,7 @@ msgstr "All"
231231
232232#: qml/Greeter/Greeter.qml:157
233233msgid "Unlock"
234−msgstr ""
234+msgstr "Unlock"
235235
236236#: qml/Hud/HudParametrizedActionsPage.qml:139
237237msgid "Confirm"
@@ -311,7 +311,7 @@ msgstr "Roaming"
311311
312312#: qml/Shell.qml:340
313313msgid "Enter passphrase"
314−msgstr ""
314+msgstr "Enter passphrase"
315315
316316#: qml/Shell.qml:321
317317msgid "Sorry, incorrect passphrase"
@@ -319,11 +319,11 @@ msgstr "Sorry, incorrect passphrase"
319319
320320#: qml/Shell.qml:342
321321msgid "Please re-enter"
322−msgstr ""
322+msgstr "Please re-enter"
323323
324324#: qml/Shell.qml:344
325325msgid "Enter passcode"
326−msgstr ""
326+msgstr "Enter passcode"
327327
328328#: qml/Shell.qml:324
329329msgid "Sorry, incorrect passcode"
@@ -332,7 +332,7 @@ msgstr "Sorry, incorrect passcode"
332332#: qml/Shell.qml:348
333333#, qt-format
334334msgid "Enter %1"
335−msgstr ""
335+msgstr "Enter %1"
336336
337337#: qml/Shell.qml:328
338338#, qt-format
@@ -377,9 +377,6 @@ msgstr ""
377377#~ msgid "Swipe to unlock"
378378#~ msgstr "Swipe to unlock"
379379
380−#~ msgid "Manage Dash"
381−#~ msgstr "Manage Dash"
382−
383380#~ msgid "Please wait"
384381#~ msgstr "Please wait"
385382
po/es.po+15−14
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-10-02 10:35+0200\n"
11−"PO-Revision-Date: 2014-10-01 15:04+0000\n"
12−"Last-Translator: Leo Arias <leo.arias@canonical.com>\n"
11+"PO-Revision-Date: 2014-10-05 08:50+0000\n"
12+"Last-Translator: Paco Molinero <paco@byasl.com>\n"
1313"Language-Team: Spanish <es@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-03 06:22+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-06 07:00+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -33,22 +33,26 @@ msgstr "Desanclar"
3333
3434#: qml/Components/DelayedLockscreen.qml:47
3535msgid "Device Locked"
36−msgstr ""
36+msgstr "Dispositivo bloqueado"
3737
3838#: qml/Components/DelayedLockscreen.qml:62
3939msgid "You have been locked out due to too many failed passphrase attempts."
4040msgstr ""
41+"Se ha proporcionado una contraseña errónea demasiadas veces. Se ha bloqueado "
42+"el dispositivo."
4143
4244#: qml/Components/DelayedLockscreen.qml:63
4345msgid "You have been locked out due to too many failed passcode attempts."
4446msgstr ""
47+"Se ha bloqueado el dispositivo debido al gran número de intentos fallidos de "
48+"desbloqueo."
4549
4650#: qml/Components/DelayedLockscreen.qml:72
4751#, qt-format
4852msgid "Please wait %1 minute and then try again…"
4953msgid_plural "Please wait %1 minutes and then try again…"
50−msgstr[0] ""
51−msgstr[1] ""
54+msgstr[0] "Espere %1 minuto e inténtelo de nuevo..."
55+msgstr[1] "Espere %1 minutos e inténtelo de nuevo..."
5256
5357#: qml/Components/Dialogs.qml:70
5458msgid "Log out"
@@ -234,7 +238,7 @@ msgstr "Todo"
234238
235239#: qml/Greeter/Greeter.qml:157
236240msgid "Unlock"
237−msgstr ""
241+msgstr "Desbloquear"
238242
239243#: qml/Hud/HudParametrizedActionsPage.qml:139
240244msgid "Confirm"
@@ -314,7 +318,7 @@ msgstr "Itinerancia"
314318
315319#: qml/Shell.qml:340
316320msgid "Enter passphrase"
317−msgstr ""
321+msgstr "Introduzca la contraseña"
318322
319323#: qml/Shell.qml:321
320324msgid "Sorry, incorrect passphrase"
@@ -322,11 +326,11 @@ msgstr "La contraseña es incorrecta"
322326
323327#: qml/Shell.qml:342
324328msgid "Please re-enter"
325−msgstr ""
329+msgstr "Reintroduzca"
326330
327331#: qml/Shell.qml:344
328332msgid "Enter passcode"
329−msgstr ""
333+msgstr "Introduzca el código"
330334
331335#: qml/Shell.qml:324
332336msgid "Sorry, incorrect passcode"
@@ -335,7 +339,7 @@ msgstr "El código es incorrecto"
335339#: qml/Shell.qml:348
336340#, qt-format
337341msgid "Enter %1"
338−msgstr ""
342+msgstr "Introduzca %1"
339343
340344#: qml/Shell.qml:328
341345#, qt-format
@@ -386,9 +390,6 @@ msgstr ""
386390#~ msgid "Too many incorrect attempts"
387391#~ msgstr "Demasiados intentos incorrectos"
388392
389−#~ msgid "Manage Dash"
390−#~ msgstr "Gestionar tablero"
391−
392393#, qt-format
393394#~ msgid "Enter your %1"
394395#~ msgstr "Introduzca su %1"
po/eu.po+13−13
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-10-02 10:35+0200\n"
11−"PO-Revision-Date: 2014-09-27 12:47+0000\n"
11+"PO-Revision-Date: 2014-10-04 01:50+0000\n"
1212"Last-Translator: Ibai Oihanguren Sala <Unknown>\n"
1313"Language-Team: Basque <eu@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-03 06:21+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-05 06:38+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -33,22 +33,25 @@ msgstr "Askatu lasterbidea"
3333
3434#: qml/Components/DelayedLockscreen.qml:47
3535msgid "Device Locked"
36−msgstr ""
36+msgstr "Gailua blokeatuta"
3737
3838#: qml/Components/DelayedLockscreen.qml:62
3939msgid "You have been locked out due to too many failed passphrase attempts."
4040msgstr ""
41+"Gailua blokeatu da, pasaesaldia sartzeko saiakera gehiegi hutsegin "
42+"dituzulako."
4143
4244#: qml/Components/DelayedLockscreen.qml:63
4345msgid "You have been locked out due to too many failed passcode attempts."
4446msgstr ""
47+"Gailua blokeatu da, pasakodea sartzeko saiakera gehiegi hutsegin dituzulako."
4548
4649#: qml/Components/DelayedLockscreen.qml:72
4750#, qt-format
4851msgid "Please wait %1 minute and then try again…"
4952msgid_plural "Please wait %1 minutes and then try again…"
50−msgstr[0] ""
51−msgstr[1] ""
53+msgstr[0] "Itxaron minutu %1ez eta saiatu berriro…"
54+msgstr[1] "Itxaron %1 minutuz eta saiatu berriro…"
5255
5356#: qml/Components/Dialogs.qml:70
5457msgid "Log out"
@@ -232,7 +235,7 @@ msgstr "Guztiak"
232235
233236#: qml/Greeter/Greeter.qml:157
234237msgid "Unlock"
235−msgstr ""
238+msgstr "Desblokeatu"
236239
237240#: qml/Hud/HudParametrizedActionsPage.qml:139
238241msgid "Confirm"
@@ -312,7 +315,7 @@ msgstr "Ibiltaritza"
312315
313316#: qml/Shell.qml:340
314317msgid "Enter passphrase"
315−msgstr ""
318+msgstr "Sartu pasaesaldia"
316319
317320#: qml/Shell.qml:321
318321msgid "Sorry, incorrect passphrase"
@@ -320,11 +323,11 @@ msgstr "Sentitzen dugu, pasaesaldia okerrekoa da"
320323
321324#: qml/Shell.qml:342
322325msgid "Please re-enter"
323−msgstr ""
326+msgstr "Errepikatu"
324327
325328#: qml/Shell.qml:344
326329msgid "Enter passcode"
327−msgstr ""
330+msgstr "Sartu pasakodea"
328331
329332#: qml/Shell.qml:324
330333msgid "Sorry, incorrect passcode"
@@ -333,7 +336,7 @@ msgstr "Sentitzen dugu, pasakodea okerrekoa da"
333336#: qml/Shell.qml:348
334337#, qt-format
335338msgid "Enter %1"
336−msgstr ""
339+msgstr "Sartu %1"
337340
338341#: qml/Shell.qml:328
339342#, qt-format
@@ -384,9 +387,6 @@ msgstr ""
384387#~ msgid "Too many incorrect attempts"
385388#~ msgstr "Okerreko saiakera gehiegi"
386389
387−#~ msgid "Manage Dash"
388−#~ msgstr "Kudeatu abio-leihoa"
389−
390390#~ msgid "Enter your passphrase"
391391#~ msgstr "Sartu pasaesaldia"
392392
po/fi.po+13−14
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-10-02 10:35+0200\n"
11−"PO-Revision-Date: 2014-08-28 13:47+0000\n"
12−"Last-Translator: Timo Jyrinki <timo.jyrinki@canonical.com>\n"
11+"PO-Revision-Date: 2014-10-04 08:00+0000\n"
12+"Last-Translator: Jiri Grönroos <Unknown>\n"
1313"Language-Team: Finnish <fi@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-03 06:21+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-05 06:38+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -33,22 +33,24 @@ msgstr "Poista pikakuvakkeen kiinnitys"
3333
3434#: qml/Components/DelayedLockscreen.qml:47
3535msgid "Device Locked"
36−msgstr ""
36+msgstr "Laite on lukittu"
3737
3838#: qml/Components/DelayedLockscreen.qml:62
3939msgid "You have been locked out due to too many failed passphrase attempts."
4040msgstr ""
41+"Laite on lukittu liian monen virheellisen tunnuslauseyrityksen jälkeen."
4142
4243#: qml/Components/DelayedLockscreen.qml:63
4344msgid "You have been locked out due to too many failed passcode attempts."
4445msgstr ""
46+"Laite on lukittu liian monen virheellisen suojakoodiyrityksen jälkeen."
4547
4648#: qml/Components/DelayedLockscreen.qml:72
4749#, qt-format
4850msgid "Please wait %1 minute and then try again…"
4951msgid_plural "Please wait %1 minutes and then try again…"
50−msgstr[0] ""
51−msgstr[1] ""
52+msgstr[0] "Odota %1 minuutti ja yritä sitten uudelleen…"
53+msgstr[1] "Odota %1 minuuttia ja yritä sitten uudelleen…"
5254
5355#: qml/Components/Dialogs.qml:70
5456msgid "Log out"
@@ -231,7 +233,7 @@ msgstr "Kaikki"
231233
232234#: qml/Greeter/Greeter.qml:157
233235msgid "Unlock"
234−msgstr ""
236+msgstr "Avaa lukitus"
235237
236238#: qml/Hud/HudParametrizedActionsPage.qml:139
237239msgid "Confirm"
@@ -311,7 +313,7 @@ msgstr "Verkkovierailu"
311313
312314#: qml/Shell.qml:340
313315msgid "Enter passphrase"
314−msgstr ""
316+msgstr "Anna tunnuslause"
315317
316318#: qml/Shell.qml:321
317319msgid "Sorry, incorrect passphrase"
@@ -319,11 +321,11 @@ msgstr "Virheellinen tunnuslause"
319321
320322#: qml/Shell.qml:342
321323msgid "Please re-enter"
322−msgstr ""
324+msgstr "Anna uudelleen"
323325
324326#: qml/Shell.qml:344
325327msgid "Enter passcode"
326−msgstr ""
328+msgstr "Anna suojakoodi"
327329
328330#: qml/Shell.qml:324
329331msgid "Sorry, incorrect passcode"
@@ -332,7 +334,7 @@ msgstr "Väärä suojakoodi"
332334#: qml/Shell.qml:348
333335#, qt-format
334336msgid "Enter %1"
335−msgstr ""
337+msgstr "Anna %1"
336338
337339#: qml/Shell.qml:328
338340#, qt-format
@@ -387,9 +389,6 @@ msgstr ""
387389#~ msgid "Enter your %1"
388390#~ msgstr "Anna %1"
389391
390−#~ msgid "Manage Dash"
391−#~ msgstr "Unityn hallinta"
392−
393392#~ msgid "Enter your passphrase"
394393#~ msgstr "Anna tunnuslause"
395394
po/gd.po+15−12
@@ -8,7 +8,7 @@ msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-10-02 10:35+0200\n"
11−"PO-Revision-Date: 2014-10-02 13:17+0000\n"
11+"PO-Revision-Date: 2014-10-03 19:54+0000\n"
1212"Last-Translator: GunChleoc <Unknown>\n"
1313"Language-Team: Fòram na Gàidhlig\n"
1414"MIME-Version: 1.0\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
1818"(n > 2 && n < 20) ? 2 : 3;\n"
19−"X-Launchpad-Export-Date: 2014-10-03 06:21+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-04 06:28+0000\n"
2020"X-Generator: Launchpad (build 17196)\n"
2121"Language: gd\n"
2222
@@ -35,22 +35,28 @@ msgstr "Neo-phrìnich an ath-ghoirid"
3535
3636#: qml/Components/DelayedLockscreen.qml:47
3737msgid "Device Locked"
38−msgstr ""
38+msgstr "Tha glas air an uidheam"
3939
4040#: qml/Components/DelayedLockscreen.qml:62
4141msgid "You have been locked out due to too many failed passphrase attempts."
4242msgstr ""
43+"Chaidh do glasadh a-mach às an uidheam on a chuir thu abairt-fhaire chearr a-"
44+"steach cus tursan."
4345
4446#: qml/Components/DelayedLockscreen.qml:63
4547msgid "You have been locked out due to too many failed passcode attempts."
4648msgstr ""
49+"Chaidh do glasadh a-mach às an uidheam on a chuir thu còd-faire cearr a-"
50+"steach cus tursan."
4751
4852#: qml/Components/DelayedLockscreen.qml:72
4953#, qt-format
5054msgid "Please wait %1 minute and then try again…"
5155msgid_plural "Please wait %1 minutes and then try again…"
52−msgstr[0] ""
53−msgstr[1] ""
56+msgstr[0] "Fuirich ort %1 diog 's feuch ris a-rithist an uairsin…"
57+msgstr[1] "Fuirich ort %1 dhiog 's feuch ris a-rithist an uairsin…"
58+msgstr[2] "Fuirich ort %1 diogan 's feuch ris a-rithist an uairsin…"
59+msgstr[3] "Fuirich ort %1 diog 's feuch ris a-rithist an uairsin…"
5460
5561#: qml/Components/Dialogs.qml:70
5662msgid "Log out"
@@ -319,7 +325,7 @@ msgstr "Air fàrsan"
319325
320326#: qml/Shell.qml:340
321327msgid "Enter passphrase"
322−msgstr ""
328+msgstr "Cuir abairt-fhaire a-steach"
323329
324330#: qml/Shell.qml:321
325331msgid "Sorry, incorrect passphrase"
@@ -327,11 +333,11 @@ msgstr "Duilich ach tha an abairt-fhaire cearr"
327333
328334#: qml/Shell.qml:342
329335msgid "Please re-enter"
330−msgstr ""
336+msgstr "Cuir a-steach e a-rithist"
331337
332338#: qml/Shell.qml:344
333339msgid "Enter passcode"
334−msgstr ""
340+msgstr "Cuir còd-faire a-steach"
335341
336342#: qml/Shell.qml:324
337343msgid "Sorry, incorrect passcode"
@@ -340,7 +346,7 @@ msgstr "Duilich ach tha an còd-faire cearr"
340346#: qml/Shell.qml:348
341347#, qt-format
342348msgid "Enter %1"
343−msgstr ""
349+msgstr "Cuir a-steach %1"
344350
345351#: qml/Shell.qml:328
346352#, qt-format
@@ -387,9 +393,6 @@ msgstr ""
387393#~ msgid "Swipe to unlock"
388394#~ msgstr "Dèan grad-shlaighdeadh gus a' ghlas a thoirt dheth"
389395
390−#~ msgid "Manage Dash"
391−#~ msgstr "Stiùirich an deas-bhòrd"
392−
393396#~ msgid "Please wait"
394397#~ msgstr "Fuirich ort"
395398
po/gl.po+1−4
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-03 06:21+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-04 06:28+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -383,9 +383,6 @@ msgstr ""
383383#~ msgid "Too many incorrect attempts"
384384#~ msgstr "Demasiados erros"
385385
386−#~ msgid "Manage Dash"
387−#~ msgstr "Xestión do Panel"
388−
389386#, qt-format
390387#~ msgid "Enter your %1"
391388#~ msgstr "Introducir %1"
po/hu.po+12−15
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-10-02 10:35+0200\n"
11−"PO-Revision-Date: 2014-09-28 09:02+0000\n"
11+"PO-Revision-Date: 2014-10-03 10:57+0000\n"
1212"Last-Translator: Richard Somlói <ricsipontaz@gmail.com>\n"
1313"Language-Team: Hungarian <hu@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-03 06:21+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-04 06:28+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -33,22 +33,22 @@ msgstr "Indító feloldása"
3333
3434#: qml/Components/DelayedLockscreen.qml:47
3535msgid "Device Locked"
36−msgstr ""
36+msgstr "Eszköz lezárva"
3737
3838#: qml/Components/DelayedLockscreen.qml:62
3939msgid "You have been locked out due to too many failed passphrase attempts."
40−msgstr ""
40+msgstr "A túl sok hibás jelmondat próbálkozás miatt le lett zárva az eszköz."
4141
4242#: qml/Components/DelayedLockscreen.qml:63
4343msgid "You have been locked out due to too many failed passcode attempts."
44−msgstr ""
44+msgstr "A túl sok hibás jelkód próbálkozás miatt le lett zárva az eszköz."
4545
4646#: qml/Components/DelayedLockscreen.qml:72
4747#, qt-format
4848msgid "Please wait %1 minute and then try again…"
4949msgid_plural "Please wait %1 minutes and then try again…"
50−msgstr[0] ""
51−msgstr[1] ""
50+msgstr[0] "Kérjük várjon %1 percet és próbálja újra…"
51+msgstr[1] "Kérjük várjon %1 percet és próbálja újra…"
5252
5353#: qml/Components/Dialogs.qml:70
5454msgid "Log out"
@@ -233,7 +233,7 @@ msgstr "Összes"
233233
234234#: qml/Greeter/Greeter.qml:157
235235msgid "Unlock"
236−msgstr ""
236+msgstr "Feloldás"
237237
238238#: qml/Hud/HudParametrizedActionsPage.qml:139
239239msgid "Confirm"
@@ -313,7 +313,7 @@ msgstr "Barangolás"
313313
314314#: qml/Shell.qml:340
315315msgid "Enter passphrase"
316−msgstr ""
316+msgstr "Jelmondat megadása"
317317
318318#: qml/Shell.qml:321
319319msgid "Sorry, incorrect passphrase"
@@ -321,11 +321,11 @@ msgstr "Sajnáljuk, helytelen jelmondat"
321321
322322#: qml/Shell.qml:342
323323msgid "Please re-enter"
324−msgstr ""
324+msgstr "Kérjük adja meg újra"
325325
326326#: qml/Shell.qml:344
327327msgid "Enter passcode"
328−msgstr ""
328+msgstr "Jelkód megadása"
329329
330330#: qml/Shell.qml:324
331331msgid "Sorry, incorrect passcode"
@@ -334,7 +334,7 @@ msgstr "Sajnáljuk, helytelen jelkód"
334334#: qml/Shell.qml:348
335335#, qt-format
336336msgid "Enter %1"
337−msgstr ""
337+msgstr "Adja meg: %1"
338338
339339#: qml/Shell.qml:328
340340#, qt-format
@@ -385,9 +385,6 @@ msgstr ""
385385#~ msgid "Too many incorrect attempts"
386386#~ msgstr "Túl sok sikertelen kísérlet"
387387
388−#~ msgid "Manage Dash"
389−#~ msgstr "Dash kezelése"
390−
391388#~ msgid "Enter your passphrase"
392389#~ msgstr "Adja meg a jelmondatot"
393390
po/is.po+31−12
@@ -10,14 +10,14 @@ msgstr ""
1010"Project-Id-Version: po_unity8-is\n"
1111"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1212"POT-Creation-Date: 2014-10-02 10:35+0200\n"
13−"PO-Revision-Date: 2014-09-21 12:07+0000\n"
13+"PO-Revision-Date: 2014-10-05 08:44+0000\n"
1414"Last-Translator: Sveinn í Felli <sv1@fellsnet.is>\n"
1515"Language-Team: Icelandic <translation-team-is@lists.sourceforge.net>\n"
1616"MIME-Version: 1.0\n"
1717"Content-Type: text/plain; charset=UTF-8\n"
1818"Content-Transfer-Encoding: 8bit\n"
1919"Plural-Forms: nplurals=2; plural=n != 1;\n"
20−"X-Launchpad-Export-Date: 2014-10-03 06:21+0000\n"
20+"X-Launchpad-Export-Date: 2014-10-06 07:00+0000\n"
2121"X-Generator: Launchpad (build 17196)\n"
2222"Language: is\n"
2323
@@ -59,7 +59,7 @@ msgstr "Útskráning"
5959
6060#: qml/Components/Dialogs.qml:71
6161msgid "Are you sure you want to log out?"
62−msgstr ""
62+msgstr "Ertu viss um að þú viljir skrá þig út?"
6363
6464#: qml/Components/Dialogs.qml:73 qml/Components/Dialogs.qml:97
6565#: qml/Components/Dialogs.qml:122
@@ -77,7 +77,7 @@ msgstr "Slökkva á tölvunni"
7777
7878#: qml/Components/Dialogs.qml:95
7979msgid "Are you sure you want to shut down?"
80−msgstr ""
80+msgstr "Ertu viss um að þú viljir slökkva á símanum?"
8181
8282#: qml/Components/Dialogs.qml:119
8383msgid "Reboot"
@@ -85,7 +85,7 @@ msgstr "Endurræsa"
8585
8686#: qml/Components/Dialogs.qml:120
8787msgid "Are you sure you want to reboot?"
88−msgstr ""
88+msgstr "Ertu viss að þú viljir enduræsa?"
8989
9090#: qml/Components/Dialogs.qml:144
9191msgid "Power"
@@ -96,6 +96,8 @@ msgid ""
9696"Are you sure you would like\n"
9797"to power off?"
9898msgstr ""
99+"Ertu viss um að þú viljir\n"
100+"slökkva á símanum?"
99101
100102#: qml/Components/Dialogs.qml:147
101103msgid "Power off"
@@ -309,7 +311,7 @@ msgstr "Aflæsa SIM-korti"
309311
310312#: qml/Panel/Indicators/RoamingIndication.qml:27
311313msgid "Roaming"
312−msgstr ""
314+msgstr "Ráphamur"
313315
314316#: qml/Shell.qml:340
315317msgid "Enter passphrase"
@@ -317,7 +319,7 @@ msgstr ""
317319
318320#: qml/Shell.qml:321
319321msgid "Sorry, incorrect passphrase"
320−msgstr ""
322+msgstr "Því miður, rangt lykilorð"
321323
322324#: qml/Shell.qml:342
323325msgid "Please re-enter"
@@ -329,7 +331,7 @@ msgstr ""
329331
330332#: qml/Shell.qml:324
331333msgid "Sorry, incorrect passcode"
332−msgstr ""
334+msgstr "Því miður, rangur aðgangskóði"
333335
334336#: qml/Shell.qml:348
335337#, qt-format
@@ -339,31 +341,35 @@ msgstr ""
339341#: qml/Shell.qml:328
340342#, qt-format
341343msgid "Sorry, incorrect %1"
342−msgstr ""
344+msgstr "Því miður, rangt %1"
343345
344346#: qml/Shell.qml:363
345347msgid "Sorry, incorrect passphrase."
346−msgstr ""
348+msgstr "Því miður, rangt lykilorð."
347349
348350#: qml/Shell.qml:364
349351msgid "Sorry, incorrect passcode."
350−msgstr ""
352+msgstr "Því miður, rangur aðgangskóði."
351353
352354#: qml/Shell.qml:365
353355msgid "This will be your last attempt."
354−msgstr ""
356+msgstr "Þetta mun verða síðasta tilraunin þín."
355357
356358#: qml/Shell.qml:367
357359msgid ""
358360"If passphrase is entered incorrectly, your phone will conduct a factory "
359361"reset and all personal data will be deleted."
360362msgstr ""
363+"Ef lykilorð er rangt, mun síminn frumstilla allt á verksmiðjustillingar og "
364+"öllum einkagögnum verður eytt."
361365
362366#: qml/Shell.qml:368
363367msgid ""
364368"If passcode is entered incorrectly, your phone will conduct a factory reset "
365369"and all personal data will be deleted."
366370msgstr ""
371+"Ef aðgangskóði er rangur, mun síminn frumstilla allt á verksmiðjustillingar "
372+"og öllum einkagögnum verður eytt."
367373
368374#, qt-format
369375#~ msgid "Hello %1"
@@ -377,3 +383,16 @@ msgstr ""
377383
378384#~ msgid "Please wait"
379385#~ msgstr "Bíddu aðeins"
386+
387+#~ msgid "Too many incorrect attempts"
388+#~ msgstr "Of margar rangar tilraunir"
389+
390+#~ msgid "Enter your passphrase"
391+#~ msgstr "Sláðu inn lykilorðið þitt"
392+
393+#~ msgid "Enter your passcode"
394+#~ msgstr "Settu inn aðgangskóðann þinn"
395+
396+#, qt-format
397+#~ msgid "Enter your %1"
398+#~ msgstr "Settu inn %1"
po/nb.po+13−14
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-10-02 10:35+0200\n"
11−"PO-Revision-Date: 2014-09-29 05:32+0000\n"
11+"PO-Revision-Date: 2014-10-03 08:44+0000\n"
1212"Last-Translator: Åka Sikrom <Unknown>\n"
1313"Language-Team: Norwegian Bokmal <nb@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-03 06:22+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-04 06:28+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -33,22 +33,24 @@ msgstr "Fjern snarvei"
3333
3434#: qml/Components/DelayedLockscreen.qml:47
3535msgid "Device Locked"
36−msgstr ""
36+msgstr "Enheten er låst"
3737
3838#: qml/Components/DelayedLockscreen.qml:62
3939msgid "You have been locked out due to too many failed passphrase attempts."
4040msgstr ""
41+"Du har skrevet inn feil passordfrase for mange ganger, og er derfor "
42+"utestengt."
4143
4244#: qml/Components/DelayedLockscreen.qml:63
4345msgid "You have been locked out due to too many failed passcode attempts."
44−msgstr ""
46+msgstr "Du har tastet feil kode for mange ganger, og er derfor utestengt."
4547
4648#: qml/Components/DelayedLockscreen.qml:72
4749#, qt-format
4850msgid "Please wait %1 minute and then try again…"
4951msgid_plural "Please wait %1 minutes and then try again…"
50−msgstr[0] ""
51−msgstr[1] ""
52+msgstr[0] "Vent i %1 minutt, og prøv deretter på nytt …"
53+msgstr[1] "Vent i %1 minutter, og prøv deretter på nytt …"
5254
5355#: qml/Components/Dialogs.qml:70
5456msgid "Log out"
@@ -231,7 +233,7 @@ msgstr "Alt"
231233
232234#: qml/Greeter/Greeter.qml:157
233235msgid "Unlock"
234−msgstr ""
236+msgstr "Lås opp"
235237
236238#: qml/Hud/HudParametrizedActionsPage.qml:139
237239msgid "Confirm"
@@ -311,7 +313,7 @@ msgstr "Fremmednett"
311313
312314#: qml/Shell.qml:340
313315msgid "Enter passphrase"
314−msgstr ""
316+msgstr "Skriv inn passordfrase"
315317
316318#: qml/Shell.qml:321
317319msgid "Sorry, incorrect passphrase"
@@ -319,11 +321,11 @@ msgstr "Feil passordfrase"
319321
320322#: qml/Shell.qml:342
321323msgid "Please re-enter"
322−msgstr ""
324+msgstr "Skriv inn på nytt"
323325
324326#: qml/Shell.qml:344
325327msgid "Enter passcode"
326−msgstr ""
328+msgstr "Tast kode"
327329
328330#: qml/Shell.qml:324
329331msgid "Sorry, incorrect passcode"
@@ -332,7 +334,7 @@ msgstr "Feil kode"
332334#: qml/Shell.qml:348
333335#, qt-format
334336msgid "Enter %1"
335−msgstr ""
337+msgstr "Skriv inn %1"
336338
337339#: qml/Shell.qml:328
338340#, qt-format
@@ -374,9 +376,6 @@ msgstr ""
374376#~ msgid "Hello %1"
375377#~ msgstr "Hei, %1"
376378
377−#~ msgid "Manage Dash"
378−#~ msgstr "Håndter dashbord"
379−
380379#~ msgid "Please wait"
381380#~ msgstr "Vent litt"
382381
po/nl.po+14−13
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-10-02 10:35+0200\n"
11−"PO-Revision-Date: 2014-09-28 16:19+0000\n"
11+"PO-Revision-Date: 2014-10-03 18:53+0000\n"
1212"Last-Translator: rob <linuxned@gmail.com>\n"
1313"Language-Team: Dutch <nl@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-03 06:21+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-04 06:28+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -33,22 +33,26 @@ msgstr "Snelkoppeling losmaken"
3333
3434#: qml/Components/DelayedLockscreen.qml:47
3535msgid "Device Locked"
36−msgstr ""
36+msgstr "Apparaat vergrendeld"
3737
3838#: qml/Components/DelayedLockscreen.qml:62
3939msgid "You have been locked out due to too many failed passphrase attempts."
4040msgstr ""
41+"U werd de toegang geweigerd omdat u te vaak een onjuiste wachtwoordzin heeft "
42+"ingevoerd."
4143
4244#: qml/Components/DelayedLockscreen.qml:63
4345msgid "You have been locked out due to too many failed passcode attempts."
4446msgstr ""
47+"U werd de toegang geweigerd omdat u te vaak een onjuiste toegangscode heeft "
48+"ingevoerd."
4549
4650#: qml/Components/DelayedLockscreen.qml:72
4751#, qt-format
4852msgid "Please wait %1 minute and then try again…"
4953msgid_plural "Please wait %1 minutes and then try again…"
50−msgstr[0] ""
51−msgstr[1] ""
54+msgstr[0] "Wacht a.u.b. %1 minuut en probeer het dan opnieuw…"
55+msgstr[1] "Wacht a.u.b. %1 minuten en probeer het dan opnieuw…"
5256
5357#: qml/Components/Dialogs.qml:70
5458msgid "Log out"
@@ -231,7 +235,7 @@ msgstr "Alles"
231235
232236#: qml/Greeter/Greeter.qml:157
233237msgid "Unlock"
234−msgstr ""
238+msgstr "Ontgrendelen"
235239
236240#: qml/Hud/HudParametrizedActionsPage.qml:139
237241msgid "Confirm"
@@ -311,7 +315,7 @@ msgstr "Roaming"
311315
312316#: qml/Shell.qml:340
313317msgid "Enter passphrase"
314−msgstr ""
318+msgstr "Voer wachtwoordzin in"
315319
316320#: qml/Shell.qml:321
317321msgid "Sorry, incorrect passphrase"
@@ -319,11 +323,11 @@ msgstr "Sorry, onjuiste wachtwoordzin"
319323
320324#: qml/Shell.qml:342
321325msgid "Please re-enter"
322−msgstr ""
326+msgstr "Herhaal deze a.u.b."
323327
324328#: qml/Shell.qml:344
325329msgid "Enter passcode"
326−msgstr ""
330+msgstr "Voer toegangscode in"
327331
328332#: qml/Shell.qml:324
329333msgid "Sorry, incorrect passcode"
@@ -332,7 +336,7 @@ msgstr "Sorry, onjuiste toegangscode"
332336#: qml/Shell.qml:348
333337#, qt-format
334338msgid "Enter %1"
335−msgstr ""
339+msgstr "Voer %1 in"
336340
337341#: qml/Shell.qml:328
338342#, qt-format
@@ -377,9 +381,6 @@ msgstr ""
377381#~ msgid "Swipe to unlock"
378382#~ msgstr "Veeg om te ontgrendelen"
379383
380−#~ msgid "Manage Dash"
381−#~ msgstr "Snelzoeker-beheer"
382−
383384#~ msgid "Please wait"
384385#~ msgstr "Even geduld a.u.b."
385386
po/pt.po+12−15
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-10-02 10:35+0200\n"
11−"PO-Revision-Date: 2014-09-28 18:52+0000\n"
11+"PO-Revision-Date: 2014-10-03 16:17+0000\n"
1212"Last-Translator: Ivo Xavier <ivofernandes12@gmail.com>\n"
1313"Language-Team: Portuguese <pt@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-03 06:22+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-04 06:28+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -33,22 +33,22 @@ msgstr "Remover atalho"
3333
3434#: qml/Components/DelayedLockscreen.qml:47
3535msgid "Device Locked"
36−msgstr ""
36+msgstr "Dispositivo bloqueado"
3737
3838#: qml/Components/DelayedLockscreen.qml:62
3939msgid "You have been locked out due to too many failed passphrase attempts."
40−msgstr ""
40+msgstr "Foi bloqueado devido a muitas tentativas falhadas da frase-senha."
4141
4242#: qml/Components/DelayedLockscreen.qml:63
4343msgid "You have been locked out due to too many failed passcode attempts."
44−msgstr ""
44+msgstr "Foi bloqueado devido a muitas tentativas falhadas da senha."
4545
4646#: qml/Components/DelayedLockscreen.qml:72
4747#, qt-format
4848msgid "Please wait %1 minute and then try again…"
4949msgid_plural "Please wait %1 minutes and then try again…"
50−msgstr[0] ""
51−msgstr[1] ""
50+msgstr[0] "Por favor, aguarde %1 minuto e tente novamente…"
51+msgstr[1] "Por favor, aguarde %1 minutos e tente novamente…"
5252
5353#: qml/Components/Dialogs.qml:70
5454msgid "Log out"
@@ -232,7 +232,7 @@ msgstr "Todos"
232232
233233#: qml/Greeter/Greeter.qml:157
234234msgid "Unlock"
235−msgstr ""
235+msgstr "Desbloquear"
236236
237237#: qml/Hud/HudParametrizedActionsPage.qml:139
238238msgid "Confirm"
@@ -312,7 +312,7 @@ msgstr "Roaming"
312312
313313#: qml/Shell.qml:340
314314msgid "Enter passphrase"
315−msgstr ""
315+msgstr "Indique a frase-senha"
316316
317317#: qml/Shell.qml:321
318318msgid "Sorry, incorrect passphrase"
@@ -320,11 +320,11 @@ msgstr "Desculpe, frase-senha incorreta"
320320
321321#: qml/Shell.qml:342
322322msgid "Please re-enter"
323−msgstr ""
323+msgstr "Por favor, volte a introduzir"
324324
325325#: qml/Shell.qml:344
326326msgid "Enter passcode"
327−msgstr ""
327+msgstr "Introduza senha"
328328
329329#: qml/Shell.qml:324
330330msgid "Sorry, incorrect passcode"
@@ -333,7 +333,7 @@ msgstr "Desculpe, senha incorreta"
333333#: qml/Shell.qml:348
334334#, qt-format
335335msgid "Enter %1"
336−msgstr ""
336+msgstr "Introduziu %1"
337337
338338#: qml/Shell.qml:328
339339#, qt-format
@@ -378,9 +378,6 @@ msgstr ""
378378#~ msgid "Swipe to unlock"
379379#~ msgstr "Deslize para desbloquear"
380380
381−#~ msgid "Manage Dash"
382−#~ msgstr "Gerir o Dash"
383−
384381#~ msgid "Please wait"
385382#~ msgstr "Por favor aguarde"
386383
po/ro.po+13−12
@@ -8,7 +8,7 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-10-02 10:35+0200\n"
11−"PO-Revision-Date: 2014-09-28 13:24+0000\n"
11+"PO-Revision-Date: 2014-10-04 11:36+0000\n"
1212"Last-Translator: Marian Vasile <marianvasile1972@gmail.com>\n"
1313"Language-Team: Romanian <ro@li.org>\n"
1414"MIME-Version: 1.0\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
1818"== 0) && (n != 0))) ? 2: 1));\n"
19−"X-Launchpad-Export-Date: 2014-10-03 06:22+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-05 06:38+0000\n"
2020"X-Generator: Launchpad (build 17196)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
@@ -34,22 +34,26 @@ msgstr "Eliberează scurtătura"
3434
3535#: qml/Components/DelayedLockscreen.qml:47
3636msgid "Device Locked"
37−msgstr ""
37+msgstr "Dispozitiv blocat"
3838
3939#: qml/Components/DelayedLockscreen.qml:62
4040msgid "You have been locked out due to too many failed passphrase attempts."
4141msgstr ""
42+"Dispozitivul este blocat din cauza utilizării mai multor fraze parolă "
43+"greșite."
4244
4345#: qml/Components/DelayedLockscreen.qml:63
4446msgid "You have been locked out due to too many failed passcode attempts."
4547msgstr ""
48+"Dispozitivul este blocat din cauza utilizării mai multor parole greșite."
4649
4750#: qml/Components/DelayedLockscreen.qml:72
4851#, qt-format
4952msgid "Please wait %1 minute and then try again…"
5053msgid_plural "Please wait %1 minutes and then try again…"
51−msgstr[0] ""
52−msgstr[1] ""
54+msgstr[0] "Așteptați %1 minut și apoi încercați din nou..."
55+msgstr[1] "Așteptați %1 minute și apoi încercați din nou..."
56+msgstr[2] "Așteptați %1 de minute și apoi încercați din nou..."
5357
5458#: qml/Components/Dialogs.qml:70
5559msgid "Log out"
@@ -235,7 +239,7 @@ msgstr "Tot"
235239
236240#: qml/Greeter/Greeter.qml:157
237241msgid "Unlock"
238−msgstr ""
242+msgstr "Deblocare"
239243
240244#: qml/Hud/HudParametrizedActionsPage.qml:139
241245msgid "Confirm"
@@ -315,7 +319,7 @@ msgstr "Roaming"
315319
316320#: qml/Shell.qml:340
317321msgid "Enter passphrase"
318−msgstr ""
322+msgstr "Introduceți fraza parolă"
319323
320324#: qml/Shell.qml:321
321325msgid "Sorry, incorrect passphrase"
@@ -323,11 +327,11 @@ msgstr "Frază secretă incorectă"
323327
324328#: qml/Shell.qml:342
325329msgid "Please re-enter"
326−msgstr ""
330+msgstr "Introduceți din nou"
327331
328332#: qml/Shell.qml:344
329333msgid "Enter passcode"
330−msgstr ""
334+msgstr "Introduceți parola"
331335
332336#: qml/Shell.qml:324
333337msgid "Sorry, incorrect passcode"
@@ -383,9 +387,6 @@ msgstr ""
383387#~ msgid "Swipe to unlock"
384388#~ msgstr "Glisați pentru deblocare"
385389
386−#~ msgid "Manage Dash"
387−#~ msgstr "Administrare Panou principal"
388−
389390#~ msgid "Please wait"
390391#~ msgstr "Așteptați"
391392
po/sl.po+15−16
@@ -8,7 +8,7 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-10-02 10:35+0200\n"
11−"PO-Revision-Date: 2014-09-23 12:35+0000\n"
11+"PO-Revision-Date: 2014-10-03 17:37+0000\n"
1212"Last-Translator: Damir Jerovšek <Unknown>\n"
1313"Language-Team: Slovenian <sl@li.org>\n"
1414"MIME-Version: 1.0\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
1818"n%100==4 ? 3 : 0);\n"
19−"X-Launchpad-Export-Date: 2014-10-03 06:22+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-04 06:28+0000\n"
2020"X-Generator: Launchpad (build 17196)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
@@ -34,22 +34,24 @@ msgstr "Odpni bližnjico"
3434
3535#: qml/Components/DelayedLockscreen.qml:47
3636msgid "Device Locked"
37−msgstr ""
37+msgstr "Naprava je zaklenjena"
3838
3939#: qml/Components/DelayedLockscreen.qml:62
4040msgid "You have been locked out due to too many failed passphrase attempts."
41−msgstr ""
41+msgstr "Telefon ste zaklenili zaradi preveč napačnih vnosov šifrirnih rekel."
4242
4343#: qml/Components/DelayedLockscreen.qml:63
4444msgid "You have been locked out due to too many failed passcode attempts."
45−msgstr ""
45+msgstr "Telefon ste zaklenili zaradi preveč napačnih vnosov gesla."
4646
4747#: qml/Components/DelayedLockscreen.qml:72
4848#, qt-format
4949msgid "Please wait %1 minute and then try again…"
5050msgid_plural "Please wait %1 minutes and then try again…"
51−msgstr[0] ""
52−msgstr[1] ""
51+msgstr[0] "Počakajte %1 minut ter poskusite ponovno ..."
52+msgstr[1] "Počakajte %1 minuto ter poskusite ponovno ..."
53+msgstr[2] "Počakajte %1 minuti ter poskusite ponovno ..."
54+msgstr[3] "Počakajte %1 minute ter poskusite ponovno ..."
5355
5456#: qml/Components/Dialogs.qml:70
5557msgid "Log out"
@@ -234,7 +236,7 @@ msgstr "Vse"
234236
235237#: qml/Greeter/Greeter.qml:157
236238msgid "Unlock"
237−msgstr ""
239+msgstr "Odkleni"
238240
239241#: qml/Hud/HudParametrizedActionsPage.qml:139
240242msgid "Confirm"
@@ -278,7 +280,7 @@ msgstr "Konferenca"
278280
279281#: qml/Panel/Indicators/MenuItemFactory.qml:600
280282msgid "Nothing is playing"
281−msgstr ""
283+msgstr "Nič se ne predvaja"
282284
283285#: qml/Panel/Indicators/MenuItemFactory.qml:748
284286msgid "In queue…"
@@ -314,7 +316,7 @@ msgstr "Gostovanje"
314316
315317#: qml/Shell.qml:340
316318msgid "Enter passphrase"
317−msgstr ""
319+msgstr "Vnesite šifrirno reklo"
318320
319321#: qml/Shell.qml:321
320322msgid "Sorry, incorrect passphrase"
@@ -322,11 +324,11 @@ msgstr "Oprostite, napačno šifrirno reklo"
322324
323325#: qml/Shell.qml:342
324326msgid "Please re-enter"
325−msgstr ""
327+msgstr "Ponovno vnesite"
326328
327329#: qml/Shell.qml:344
328330msgid "Enter passcode"
329−msgstr ""
331+msgstr "Vnesite geslo"
330332
331333#: qml/Shell.qml:324
332334msgid "Sorry, incorrect passcode"
@@ -335,7 +337,7 @@ msgstr "Nepravilno geslo"
335337#: qml/Shell.qml:348
336338#, qt-format
337339msgid "Enter %1"
338−msgstr ""
340+msgstr "Vnesite %1"
339341
340342#: qml/Shell.qml:328
341343#, qt-format
@@ -386,9 +388,6 @@ msgstr ""
386388#~ msgid "Too many incorrect attempts"
387389#~ msgstr "Preveč nepravilnih poskusov"
388390
389−#~ msgid "Manage Dash"
390−#~ msgstr "Upravljaj s pregledno ploščo"
391−
392391#, qt-format
393392#~ msgid "Enter your %1"
394393#~ msgstr "Vnesite vaš %1"
po/ug.po+11−15
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-10-02 10:35+0200\n"
11−"PO-Revision-Date: 2014-09-29 00:52+0000\n"
11+"PO-Revision-Date: 2014-10-06 00:47+0000\n"
1212"Last-Translator: Gheyret T.Kenji <Unknown>\n"
1313"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-03 06:22+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-06 07:00+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -33,22 +33,21 @@ msgstr "تېزلەتمىنى ئېلىۋەت"
3333
3434#: qml/Components/DelayedLockscreen.qml:47
3535msgid "Device Locked"
36−msgstr ""
36+msgstr "ئۈسكۈنە قۇلۇپلانغان"
3737
3838#: qml/Components/DelayedLockscreen.qml:62
3939msgid "You have been locked out due to too many failed passphrase attempts."
40−msgstr ""
40+msgstr "خاتا ئىم جۈملىسى كۆپ قېتىم كىرگۈزۈلگەنلىكى ئۈچۈن قۇلۇپلاندى."
4141
4242#: qml/Components/DelayedLockscreen.qml:63
4343msgid "You have been locked out due to too many failed passcode attempts."
44−msgstr ""
44+msgstr "خاتا ئىم كودى(passcode) كۆپ قېتىم كىرگۈزۈلگەنلىكى ئۈچۈن قۇلۇپلاندى."
4545
4646#: qml/Components/DelayedLockscreen.qml:72
4747#, qt-format
4848msgid "Please wait %1 minute and then try again…"
4949msgid_plural "Please wait %1 minutes and then try again…"
50−msgstr[0] ""
51−msgstr[1] ""
50+msgstr[0] "%1 مىنۇت كۈتۈپ ئاندىن قايتا سىناڭ…"
5251
5352#: qml/Components/Dialogs.qml:70
5453msgid "Log out"
@@ -231,7 +230,7 @@ msgstr "ھەممىسى"
231230
232231#: qml/Greeter/Greeter.qml:157
233232msgid "Unlock"
234−msgstr ""
233+msgstr "قۇلۇپسىزلا"
235234
236235#: qml/Hud/HudParametrizedActionsPage.qml:139
237236msgid "Confirm"
@@ -311,7 +310,7 @@ msgstr "كەزمە"
311310
312311#: qml/Shell.qml:340
313312msgid "Enter passphrase"
314−msgstr ""
313+msgstr "ئىم كىرگۈزۈڭ"
315314
316315#: qml/Shell.qml:321
317316msgid "Sorry, incorrect passphrase"
@@ -319,11 +318,11 @@ msgstr "كەچۈرۈڭ، ئىم توغرا ئەمەس"
319318
320319#: qml/Shell.qml:342
321320msgid "Please re-enter"
322−msgstr ""
321+msgstr "قايتا كىرگۈزۈڭ"
323322
324323#: qml/Shell.qml:344
325324msgid "Enter passcode"
326−msgstr ""
325+msgstr "ئىم كودى(passcode)نى كىرگۈزۈڭ"
327326
328327#: qml/Shell.qml:324
329328msgid "Sorry, incorrect passcode"
@@ -332,7 +331,7 @@ msgstr "كەچۈرۈڭ، ئىم توغرا ئەمەس"
332331#: qml/Shell.qml:348
333332#, qt-format
334333msgid "Enter %1"
335−msgstr ""
334+msgstr "%1 نى كىرگۈزۈڭ"
336335
337336#: qml/Shell.qml:328
338337#, qt-format
@@ -380,9 +379,6 @@ msgstr ""
380379#~ msgid "Please wait"
381380#~ msgstr "سەل ساقلاڭ"
382381
383−#~ msgid "Manage Dash"
384−#~ msgstr "باش تاختىنى باشقۇرۇش"
385−
386382#~ msgid "Enter your passphrase"
387383#~ msgstr "ئىمىڭىزنى كىرگۈزۈڭ"
388384
po/uk.po+15−13
@@ -8,7 +8,7 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-10-02 10:35+0200\n"
11−"PO-Revision-Date: 2014-08-26 19:06+0000\n"
11+"PO-Revision-Date: 2014-10-03 12:44+0000\n"
1212"Last-Translator: Yuri Chornoivan <yurchor@gmail.com>\n"
1313"Language-Team: Ukrainian <uk@li.org>\n"
1414"MIME-Version: 1.0\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-10-03 06:22+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-04 06:28+0000\n"
2020"X-Generator: Launchpad (build 17196)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
@@ -34,22 +34,27 @@ msgstr "Розблокувати кнопку"
3434
3535#: qml/Components/DelayedLockscreen.qml:47
3636msgid "Device Locked"
37−msgstr ""
37+msgstr "Пристрій заблоковано"
3838
3939#: qml/Components/DelayedLockscreen.qml:62
4040msgid "You have been locked out due to too many failed passphrase attempts."
4141msgstr ""
42+"Ваш пристрій було заблоковано через перевищення граничної кількості спроб "
43+"введення пароля."
4244
4345#: qml/Components/DelayedLockscreen.qml:63
4446msgid "You have been locked out due to too many failed passcode attempts."
4547msgstr ""
48+"Ваш пристрій було заблоковано через перевищення граничної кількості спроб "
49+"введення коду-пароля."
4650
4751#: qml/Components/DelayedLockscreen.qml:72
4852#, qt-format
4953msgid "Please wait %1 minute and then try again…"
5054msgid_plural "Please wait %1 minutes and then try again…"
51−msgstr[0] ""
52−msgstr[1] ""
55+msgstr[0] "Зачекайте %1 хвилину і повторіть спробу…"
56+msgstr[1] "Зачекайте %1 хвилини і повторіть спробу…"
57+msgstr[2] "Зачекайте %1 хвилин і повторіть спробу…"
5358
5459#: qml/Components/Dialogs.qml:70
5560msgid "Log out"
@@ -235,7 +240,7 @@ msgstr "Все"
235240
236241#: qml/Greeter/Greeter.qml:157
237242msgid "Unlock"
238−msgstr ""
243+msgstr "Розблокувати"
239244
240245#: qml/Hud/HudParametrizedActionsPage.qml:139
241246msgid "Confirm"
@@ -315,7 +320,7 @@ msgstr "Роумінг"
315320
316321#: qml/Shell.qml:340
317322msgid "Enter passphrase"
318−msgstr ""
323+msgstr "Введіть пароль"
319324
320325#: qml/Shell.qml:321
321326msgid "Sorry, incorrect passphrase"
@@ -323,11 +328,11 @@ msgstr "Вибачте, помилковий пароль"
323328
324329#: qml/Shell.qml:342
325330msgid "Please re-enter"
326−msgstr ""
331+msgstr "Ввведіть ще раз"
327332
328333#: qml/Shell.qml:344
329334msgid "Enter passcode"
330−msgstr ""
335+msgstr "Введіть код"
331336
332337#: qml/Shell.qml:324
333338msgid "Sorry, incorrect passcode"
@@ -336,7 +341,7 @@ msgstr "Вибачте, помилковий код-пароль"
336341#: qml/Shell.qml:348
337342#, qt-format
338343msgid "Enter %1"
339−msgstr ""
344+msgstr "Введіть %1"
340345
341346#: qml/Shell.qml:328
342347#, qt-format
@@ -381,9 +386,6 @@ msgstr ""
381386#~ msgid "Swipe to unlock"
382387#~ msgstr "Проведіть пальцем, щоб розблокувати"
383388
384−#~ msgid "Manage Dash"
385−#~ msgstr "Керування панеллю"
386−
387389#~ msgid "Please wait"
388390#~ msgstr "Будь ласка, зачекайте"
389391
po/unity8.pot+10−2
@@ -8,7 +8,7 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity8\n"
1010"Report-Msgid-Bugs-To: \n"
11−"POT-Creation-Date: 2014-10-02 10:35+0200\n"
11+"POT-Creation-Date: 2014-10-03 08:13-0400\n"
1212"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1313"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1414"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -160,7 +160,7 @@ msgstr ""
160160msgid "OK"
161161msgstr ""
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:533
163+#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
164164msgid "See less"
165165msgstr ""
166166
@@ -205,6 +205,14 @@ msgstr ""
205205msgid "Send"
206206msgstr ""
207207
208+#: qml/Dash/PullToRefreshScopeStyle.qml:55
209+msgid "Pull to refresh…"
210+msgstr ""
211+
212+#: qml/Dash/PullToRefreshScopeStyle.qml:60
213+msgid "Release to refresh…"
214+msgstr ""
215+
208216#: qml/Dash/ScopesOverview.qml:206
209217msgid "Manage Scopes"
210218msgstr ""
qml/Components/LazyImage.qml+1
@@ -37,6 +37,7 @@ Item {
3737 property alias horizontalAlignment: image.horizontalAlignment
3838 property alias verticalAlignment: image.verticalAlignment
3939 property alias sourceImage: image
40+ property alias borderSource: shape.borderSource
4041
4142 state: "default"
4243
qml/Components/ResponsiveGridView.qml+5−1
@@ -34,7 +34,11 @@ Item {
3434 readonly property int cellWidth: gridView.cellWidth
3535 readonly property int cellHeight: gridView.cellHeight
3636 readonly property int totalContentHeight: {
37− return contentHeightForRows(Math.ceil(gridView.model.count / columns), cellHeight)
37+ if (gridView.model) {
38+ return contentHeightForRows(Math.ceil(gridView.model.count / columns), cellHeight)
39+ } else {
40+ return 0;
41+ }
3842 }
3943 property alias interactive: gridView.interactive
4044 readonly property alias flicking: gridView.flicking
qml/Dash/CardGrid.qml+2−1
@@ -55,6 +55,7 @@ DashRenderer {
5555 delegate: Item {
5656 width: grid.cellWidth
5757 height: grid.cellHeight
58+ visible: y + height >= root.visibleRangeBegin && y <= root.visibleRangeEnd
5859 Loader {
5960 id: loader
6061 sourceComponent: cardTool.cardComponent
@@ -68,7 +69,7 @@ DashRenderer {
6869 item.cardData = Qt.binding(function() { return model; });
6970 item.template = Qt.binding(function() { return cardTool.template; });
7071 item.components = Qt.binding(function() { return cardTool.components; });
71− item.headerAlignment = Qt.binding(function() { return cardTool.headerAlignment; });
72+ item.titleAlignment = Qt.binding(function() { return cardTool.titleAlignment; });
7273 item.scopeStyle = root.scopeStyle;
7374 }
7475 Connections {
qml/Dash/CardHorizontalList.qml+1−1
@@ -49,7 +49,7 @@ DashRenderer {
4949 item.cardData = Qt.binding(function() { return model; });
5050 item.template = Qt.binding(function() { return cardTool.template; });
5151 item.components = Qt.binding(function() { return cardTool.components; });
52− item.headerAlignment = Qt.binding(function() { return cardTool.headerAlignment; });
52+ item.titleAlignment = Qt.binding(function() { return cardTool.titleAlignment; });
5353 item.scopeStyle = root.scopeStyle;
5454 }
5555 Connections {
qml/Dash/CardTool.qml+26−18
@@ -131,21 +131,26 @@ Item {
131131 property size artShapeSize: cardLoader.item ? cardLoader.item.artShapeSize : 0
132132
133133 /*!
134− \brief Desired alignment of header components.
134+ \brief Desired alignment of title
135135 */
136− readonly property int headerAlignment: {
137− var subtitle = components["subtitle"];
138− var price = components["price"];
139− var summary = components["summary"];
140−
141− var hasSubtitle = subtitle && (typeof subtitle === "string" || subtitle["field"])
142− var hasPrice = price && (typeof price === "string" || subtitle["field"]);
143− var hasSummary = summary && (typeof summary === "string" || summary["field"])
144−
145− var isOnlyTextComponent = !hasSubtitle && !hasPrice && !hasSummary;
146− if (!isOnlyTextComponent) return Text.AlignLeft;
136+ readonly property int titleAlignment: {
137+ if (template["card-layout"] === "horizontal"
138+ || (typeof components["title"] !== "object" &&
139+ components["title"]["align"] !== "center")) return Text.AlignLeft;
140+
141+ var keys = ["mascot", "emblem", "subtitle", "attributes", "summary"];
142+
143+ for (var key in keys) {
144+ key = keys[key];
145+ try {
146+ if (typeof components[key] === "string"
147+ || typeof components[key]["field"] === "string") return Text.AlignLeft;
148+ } catch (e) {
149+ continue;
150+ }
151+ }
147152
148− return (template["card-layout"] === "horizontal") ? Text.AlignLeft : Text.AlignHCenter;
153+ return Text.AlignHCenter;
149154 }
150155
151156 QtObject {
@@ -169,16 +174,19 @@ Item {
169174
170175 Item {
171176 id: attributesModel
172− property int numOfAttributes: {
177+ property int numOfAttributes: 0
178+ property var model: []
179+ property bool hasAttributes: {
173180 var attributes = components["attributes"];
174− if ((attributes != undefined) && attributes["field"]) {
181+ var hasAttributesFlag = (attributes != undefined) && attributes["field"];
182+
183+ if (hasAttributesFlag) {
175184 if (attributes["max-count"]) {
176− return attributes["max-count"];
185+ numOfAttributes = attributes["max-count"];
177186 }
178187 }
179− return 0;
188+ return hasAttributesFlag
180189 }
181− property var model: []
182190
183191 onNumOfAttributesChanged: {
184192 model = []
qml/Dash/CardVerticalJournal.qml+2−1
@@ -49,6 +49,7 @@ DashRenderer {
4949 id: loader
5050 sourceComponent: cardTool.cardComponent
5151 width: cardTool.cardWidth
52+ visible: y + height >= root.visibleRangeBegin && y <= root.visibleRangeEnd
5253 onLoaded: {
5354 item.objectName = "delegate" + index;
5455 item.fixedArtShapeSize = Qt.binding(function() { return cardTool.artShapeSize; });
@@ -56,7 +57,7 @@ DashRenderer {
5657 item.cardData = Qt.binding(function() { return model; });
5758 item.template = Qt.binding(function() { return cardTool.template; });
5859 item.components = Qt.binding(function() { return cardTool.components; });
59− item.headerAlignment = Qt.binding(function() { return cardTool.headerAlignment; });
60+ item.titleAlignment = Qt.binding(function() { return cardTool.titleAlignment; });
6061 item.scopeStyle = root.scopeStyle;
6162 }
6263 Connections {
qml/Dash/DashContent.qml+3
@@ -111,6 +111,8 @@ Item {
111111 highlightMoveDuration: 250
112112 highlightRangeMode: ListView.StrictlyEnforceRange
113113 // TODO Investigate if we can switch to a smaller cache buffer when/if UbuntuShape gets more performant
114+ // 1073741823 is s^30 -1. A quite big number so that you have "infinite" cache, but not so
115+ // big so that if you add if with itself you're outside the 2^31 int range
114116 cacheBuffer: 1073741823
115117 onMovementStarted: currentItem.item.showHeader();
116118 clip: parent.x != 0
@@ -177,6 +179,7 @@ Item {
177179 dashContent.scopeLoaded(item.scope.id)
178180 item.paginationCount = Qt.binding(function() { return dashContentList.count } )
179181 item.paginationIndex = Qt.binding(function() { return dashContentList.currentIndex } )
182+ item.holdingList = dashContentList;
180183 }
181184 Connections {
182185 target: isCurrent ? scope : null
qml/Dash/DashNavigation.qml+1
@@ -52,6 +52,7 @@ Item {
5252
5353 Rectangle {
5454 id: blackRect
55+ objectName: "blackRect"
5556 color: "black"
5657 opacity: openList && openList.currentItem && openList.currentItem.visible ? 0.5 : 0
5758 Behavior on opacity { UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration } }
qml/Dash/DashRenderer.qml+4
@@ -27,6 +27,10 @@ Item {
2727
2828 property int displayMarginEnd: 0
2929
30+ property int visibleRangeBegin: 0
31+
32+ property int visibleRangeEnd: 0
33+
3034 property real originY: 0
3135
3236 // The model to renderer
qml/Dash/GenericScopeView.qml+71−13
@@ -15,7 +15,7 @@
1515 */
1616
1717import QtQuick 2.0
18−import Ubuntu.Components 0.1
18+import Ubuntu.Components 1.1
1919import Utils 0.1
2020import Unity 0.2
2121import Dash 0.1
@@ -38,6 +38,7 @@ FocusScope {
3838 property int paginationCount: 0
3939 property int paginationIndex: 0
4040 property alias pageHeaderTotallyVisible: categoryView.pageHeaderTotallyVisible
41+ property var holdingList: null
4142
4243 property var scopeStyle: ScopeStyle {
4344 style: scope ? scope.customizations : {}
@@ -251,8 +252,8 @@ FocusScope {
251252 }
252253 }
253254
254− onHeightChanged: rendererLoader.updateDelegateCreationRange();
255− onYChanged: rendererLoader.updateDelegateCreationRange();
255+ onHeightChanged: rendererLoader.updateRanges();
256+ onYChanged: rendererLoader.updateRanges();
256257
257258 Loader {
258259 id: rendererLoader
@@ -314,7 +315,7 @@ FocusScope {
314315 var shouldExpand = baseItem.category === categoryView.expandedCategoryId;
315316 baseItem.expand(shouldExpand, false /*animate*/);
316317 }
317− updateDelegateCreationRange();
318+ updateRanges();
318319 if (scope && scope.id === "clickscope" && (categoryId === "predefined" || categoryId === "local")) {
319320 // Yeah, hackish :/
320321 cardTool.artShapeSize = Qt.size(units.gu(8), units.gu(7.5));
@@ -348,13 +349,25 @@ FocusScope {
348349 }
349350 Connections {
350351 target: categoryView
351− onOriginYChanged: rendererLoader.updateDelegateCreationRange();
352− onContentYChanged: rendererLoader.updateDelegateCreationRange();
353− onHeightChanged: rendererLoader.updateDelegateCreationRange();
354− onContentHeightChanged: rendererLoader.updateDelegateCreationRange();
352+ onOriginYChanged: rendererLoader.updateRanges();
353+ onContentYChanged: rendererLoader.updateRanges();
354+ onHeightChanged: rendererLoader.updateRanges();
355+ onContentHeightChanged: rendererLoader.updateRanges();
356+ }
357+ Connections {
358+ target: scopeView
359+ onIsCurrentChanged: rendererLoader.updateRanges();
360+ }
361+ Connections {
362+ target: holdingList
363+ onMovingChanged: if (!moving) rendererLoader.updateRanges();
355364 }
356365
357− function updateDelegateCreationRange() {
366+ function updateRanges() {
367+ if (holdingList && holdingList.moving) {
368+ return;
369+ }
370+
358371 if (categoryView.moving) {
359372 // Do not update the range if we are overshooting up or down, since we'll come back
360373 // to the stable position and delete/create items without any reason
@@ -366,10 +379,20 @@ FocusScope {
366379 }
367380 }
368381
382+ if (item && item.hasOwnProperty("visibleRangeBegin")) {
383+ item.visibleRangeBegin = Math.max(-baseItem.y, 0)
384+ item.visibleRangeEnd = item.visibleRangeBegin + Math.min(categoryView.height, rendererLoader.height)
385+ }
386+
369387 if (item && item.hasOwnProperty("displayMarginBeginning")) {
370388 // TODO do we need item.originY here, test 1300302 once we have a silo
371389 // and we can run it on the phone
372− if (baseItem.y + baseItem.height <= 0) {
390+ if (scopeView.isCurrent) {
391+ // 1073741823 is s^30 -1. A quite big number so that you have "infinite" display margin, but not so
392+ // big so that if you add if with itself you're outside the 2^31 int range
393+ item.displayMarginBeginning = 1073741823;
394+ item.displayMarginEnd = 1073741823;
395+ } else if (baseItem.y + baseItem.height <= 0) {
373396 // Not visible (item at top of the list viewport)
374397 item.displayMarginBeginning = -baseItem.height;
375398 item.displayMarginEnd = 0;
@@ -378,9 +401,9 @@ FocusScope {
378401 item.displayMarginBeginning = 0;
379402 item.displayMarginEnd = -baseItem.height;
380403 } else {
381− item.displayMarginBeginning = -Math.max(-baseItem.y, 0);
382− item.displayMarginEnd = -Math.max(baseItem.height - seeAll.height
383− - categoryView.height + baseItem.y, 0)
404+ item.displayMarginBeginning = Math.round(-Math.max(-baseItem.y, 0));
405+ item.displayMarginEnd = -Math.round(Math.max(baseItem.height - seeAll.height -
406+ categoryView.height + baseItem.y, 0));
384407 }
385408 }
386409 }
@@ -496,6 +519,41 @@ FocusScope {
496519 }
497520 }
498521
522+ Item {
523+ id: pullToRefreshClippingItem
524+ anchors.left: parent.left
525+ anchors.right: parent.right
526+ anchors.bottom: parent.bottom
527+ height: parent.height - pullToRefresh.contentY + (pageHeaderLoader.item ? pageHeaderLoader.item.bottomItem[0].height - pageHeaderLoader.item.height : 0)
528+ clip: true
529+
530+ PullToRefresh {
531+ id: pullToRefresh
532+ objectName: "pullToRefresh"
533+ target: categoryView
534+
535+ readonly property real contentY: categoryView.contentY - categoryView.originY
536+ y: -contentY - units.gu(5)
537+
538+ onRefresh: {
539+ refreshing = true
540+ scopeView.scope.refresh()
541+ }
542+ anchors.left: parent.left
543+ anchors.right: parent.right
544+
545+ Connections {
546+ target: scopeView
547+ onProcessingChanged: if (!scopeView.processing) pullToRefresh.refreshing = false
548+ }
549+
550+ style: PullToRefreshScopeStyle {
551+ anchors.fill: parent
552+ activationThreshold: units.gu(14)
553+ }
554+ }
555+ }
556+
499557 AbstractButton {
500558 id: floatingSeeLess
501559 objectName: "floatingSeeLess"
qml/Dash/Previews/PreviewHeader.qml+13
@@ -16,12 +16,14 @@
1616
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
19+import Dash 0.1
1920import "../"
2021
2122/*! This preview widget shows a header
2223 * The title comes in widgetData["title"]
2324 * The mascot comes in widgetData["mascot"]
2425 * The subtitle comes in widgetData["subtitle"]
26+ * The attributes comes in widgetData["attributes"]
2527 */
2628
2729PreviewWidget {
@@ -35,6 +37,7 @@ PreviewWidget {
3537 readonly property url mascot: root.widgetData["mascot"] || ""
3638 readonly property string title: root.widgetData["title"] || ""
3739 readonly property string subtitle: root.widgetData["subtitle"] || ""
40+ readonly property var attributes: root.widgetData["attributes"] || null
3841 readonly property color fontColor: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText
3942
4043 implicitHeight: row.height + row.margins * 2
@@ -114,6 +117,16 @@ PreviewWidget {
114117 text: headerRoot.subtitle
115118 }
116119 }
120+
121+ Loader {
122+ active: titleLabel.text && headerRoot.attributes
123+ anchors { left: parent.left; right: parent.right }
124+ sourceComponent: CardAttributes {
125+ id: previewAttributes
126+ objectName: "previewAttributes"
127+ model: headerRoot.attributes
128+ }
129+ }
117130 }
118131 }
119132 }
qml/Dash/Previews/PreviewImageGallery.qml+121−18
@@ -26,8 +26,11 @@ PreviewWidget {
2626 id: root
2727 implicitHeight: units.gu(22)
2828
29+ property Item rootItem: QuickUtils.rootItem(root)
30+
2931 ListView {
3032 id: previewImageListView
33+ objectName: "previewImageListView"
3134 spacing: units.gu(1)
3235 anchors.fill: parent
3336 orientation: ListView.Horizontal
@@ -35,24 +38,6 @@ PreviewWidget {
3538 model: root.widgetData["sources"]
3639 clip: true
3740
38− // FIXME: Because of ListViews inside ListViews inside Flickables inside ListViews (and some more)
39− // we finally reached the point where this ListView doesn't correctly get swipe input any more but
40− // instead the parent ListView is the one that is swiped. This MouseArea sort of creates a blocking
41− // layer to make sure this ListView can be swiped, regardless of what's behind it.
42− MouseArea {
43− anchors.fill: parent
44− enabled: parent.contentWidth > parent.width
45− }
46−
47− // FIXME: Because of ListViews inside ListViews inside Flickables inside ListViews (and some more)
48− // we finally reached the point where this ListView doesn't correctly get swipe input any more but
49− // instead the parent ListView is the one that is swiped. This MouseArea sort of creates a blocking
50− // layer to make sure this ListView can be swiped, regardless of what's behind it.
51− MouseArea {
52− anchors.fill: parent
53− enabled: parent.contentWidth > parent.width
54− }
55−
5641 LazyImage {
5742 objectName: "placeholderScreenshot"
5843 anchors {
@@ -66,6 +51,7 @@ PreviewWidget {
6651 }
6752
6853 delegate: LazyImage {
54+ objectName: "previewImage" + index
6955 anchors {
7056 top: parent.top
7157 bottom: parent.bottom
@@ -73,6 +59,123 @@ PreviewWidget {
7359 source: modelData ? modelData : ""
7460 scaleTo: "height"
7561 initialWidth: units.gu(13)
62+ borderSource: mouseArea.pressed ? "radius_pressed.sci" : "radius_idle.sci"
63+
64+ MouseArea {
65+ id: mouseArea
66+ anchors.fill: parent
67+ onClicked: {
68+ slideShowListView.currentIndex = index;
69+ slideShow.initialX = rootItem.mapFromItem(parent, 0, 0).x
70+ slideShow.initialY = rootItem.mapFromItem(parent, 0, 0).y
71+ slideShow.visible = true;
72+ }
73+ }
74+ }
75+ }
76+
77+ Rectangle {
78+ id: slideShow
79+ objectName: "slideShow"
80+
81+ readonly property real initialScale: previewImageListView.height / rootItem.height
82+ readonly property real scaleProgress: (scale - initialScale) / (1.0 - initialScale)
83+ property real initialX: 0
84+ property real initialY: 0
85+
86+ parent: rootItem
87+ width: parent.width
88+ height: parent.height
89+ visible: false
90+ clip: visible && scale < 1.0
91+ scale: visible ? 1.0 : initialScale
92+ transformOrigin: Item.TopLeft
93+ transform: Translate {
94+ x: slideShow.initialX - slideShow.initialX * slideShow.scaleProgress
95+ y: slideShow.initialY - slideShow.initialY * slideShow.scaleProgress
96+ }
97+ color: "black"
98+ radius: units.gu(1) - units.gu(1) * slideShow.scaleProgress
99+
100+ Behavior on scale {
101+ enabled: !slideShow.visible
102+ UbuntuNumberAnimation { duration: UbuntuAnimation.FastDuration }
103+ }
104+
105+ ListView {
106+ id: slideShowListView
107+ objectName: "slideShowListView"
108+ anchors.fill: parent
109+ orientation: ListView.Horizontal
110+ highlightRangeMode: ListView.StrictlyEnforceRange
111+ highlightMoveDuration: 0
112+ snapMode: ListView.SnapOneItem
113+ boundsBehavior: Flickable.DragAndOvershootBounds
114+ model: root.widgetData["sources"]
115+
116+ delegate: Image {
117+ id: screenshot
118+ anchors {
119+ top: parent.top
120+ bottom: parent.bottom
121+ }
122+ width: slideShow.width
123+ source: modelData ? modelData : ""
124+ fillMode: Image.PreserveAspectFit
125+ sourceSize { width: screenshot.width; height: screenshot.height }
126+ }
127+
128+ MouseArea {
129+ anchors.fill: parent
130+ onClicked: slideShowHeader.shown = !slideShowHeader.shown
131+ }
132+ }
133+
134+ Rectangle {
135+ id: slideShowHeader
136+
137+ property bool shown: true
138+
139+ anchors {
140+ left: parent.left
141+ right: parent.right
142+ }
143+ height: units.gu(7)
144+ visible: opacity > 0
145+ opacity: slideShow.scaleProgress > 0.6 && shown ? 0.8 : 0
146+ color: "black"
147+
148+ Behavior on opacity {
149+ UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration }
150+ }
151+
152+ AbstractButton {
153+ id: slideShowCloseButton
154+ objectName: "slideShowCloseButton"
155+ anchors {
156+ top: parent.top
157+ bottom: parent.bottom
158+ }
159+ width: units.gu(8)
160+ height: width
161+
162+ onClicked: slideShow.visible = false
163+
164+ Rectangle {
165+ anchors.fill: parent
166+ color: Qt.rgba(1.0, 1.0, 1.0, 0.3)
167+ visible: slideShowCloseButton.pressed
168+ }
169+
170+ Icon {
171+ id: icon
172+ anchors.centerIn: parent
173+ width: units.gu(2.5)
174+ height: width
175+ color: Theme.palette.normal.foregroundText
176+ name: "close"
177+ }
178+ }
76179 }
77180 }
78181}
qml/Dash/PullToRefreshScopeStyle.qmlnew file+82
@@ -0,0 +1,82 @@
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.3
18+import Ubuntu.Components 1.1
19+import Ubuntu.Components.Styles 1.1
20+
21+/**
22+ * TODO: Once the SDK version of PullToRefreshStyle doesn't have bug 1375799
23+ * (https://launchpad.net/bugs/1375799) anymore, we should switch to using a
24+ * a subclass of the Ambiance version with a hidden ActivityIndicator.
25+ */
26+PullToRefreshStyle {
27+ releaseToRefresh: styledItem.target.originY - styledItem.target.contentY > activationThreshold
28+
29+ Connections {
30+ property bool willRefresh: false
31+
32+ target: styledItem.target
33+ onDraggingChanged: {
34+ if (!styledItem.target.dragging && releaseToRefresh) {
35+ willRefresh = true
36+ }
37+ }
38+ onContentYChanged: {
39+ if (styledItem.target.originY - styledItem.target.contentY == 0 && willRefresh) {
40+ styledItem.refresh()
41+ willRefresh = false
42+ }
43+ }
44+ }
45+
46+ Label {
47+ id: pullLabel
48+ anchors.horizontalCenter: parent.horizontalCenter
49+ horizontalAlignment: Text.AlignHCenter
50+ verticalAlignment: Text.AlignVCenter
51+ states: [
52+ State {
53+ name: "pulling"
54+ when: styledItem.target.dragging && !releaseToRefresh
55+ PropertyChanges { target: pullLabel; text: i18n.tr("Pull to refresh…") }
56+ },
57+ State {
58+ name: "releasable"
59+ when: styledItem.target.dragging && releaseToRefresh
60+ PropertyChanges { target: pullLabel; text: i18n.tr("Release to refresh…") }
61+ }
62+ ]
63+ transitions: Transition {
64+ SequentialAnimation {
65+ UbuntuNumberAnimation {
66+ target: pullLabel
67+ property: "opacity"
68+ to: 0.0
69+ }
70+ PropertyAction {
71+ target: pullLabel
72+ property: "text"
73+ }
74+ UbuntuNumberAnimation {
75+ target: pullLabel
76+ property: "opacity"
77+ to: 1.0
78+ }
79+ }
80+ }
81+ }
82+}
qml/Dash/ScopeListView.qml+1
@@ -20,4 +20,5 @@ import Dash 0.1
2020ListViewWithPageHeader {
2121 maximumFlickVelocity: height * 10
2222 flickDeceleration: height * 2
23+ cacheBuffer: Number.MAX_VALUE
2324}
qml/Dash/ScopeSettingsPage.qml+1
@@ -49,6 +49,7 @@ Item {
4949 right: parent.right
5050 }
5151 model: root.scope ? root.scope.settings : null
52+ clip: true
5253
5354 delegate: ScopeSettingsWidgetFactory {
5455 objectName: "scopeSettingItem" + index
qml/Dash/ScopesOverviewAll.qml+2
@@ -43,6 +43,8 @@ Flickable {
4343 id: cardGrid
4444 width: root.width
4545 height: parent.height
46+ visibleRangeBegin: root.contentY
47+ visibleRangeEnd: root.contentY + root.height
4648
4749 onClicked: {
4850 root.clicked(index, result, item, itemModel);
qml/Dash/ScopesOverviewFavorites.qml+1−1
@@ -61,7 +61,7 @@ Flickable {
6161 item.cardData = Qt.binding(function() { return model; });
6262 item.template = Qt.binding(function() { return cardTool.template; });
6363 item.components = Qt.binding(function() { return cardTool.components; });
64− item.headerAlignment = Qt.binding(function() { return cardTool.headerAlignment; });
64+ item.titleAlignment = Qt.binding(function() { return cardTool.titleAlignment; });
6565 }
6666
6767 Connections {
qml/Launcher/Launcher.qml+1
@@ -92,6 +92,7 @@ Item {
9292 // machine and switch to the final state in the next event loop run
9393 Timer {
9494 id: animateTimer
95+ objectName: "animateTimer"
9596 interval: 1
9697 property string nextState: ""
9798 onTriggered: {
qml/Shell.qml+8−6
@@ -128,6 +128,13 @@ Item {
128128 objectName: "dashCommunicator"
129129 }
130130
131+ Binding {
132+ target: ApplicationManager
133+ property: "forceDashActive"
134+ value: launcher.shown || launcher.dashSwipe
135+ }
136+
137+
131138 WindowKeysFilter {
132139 // Handle but do not filter out volume keys
133140 Keys.onVolumeUpPressed: { volumeControl.volumeUp(); event.accepted = false; }
@@ -170,7 +177,6 @@ Item {
170177 lockscreen.show();
171178 }
172179 greeter.hide();
173− launcher.hide();
174180 }
175181
176182 onFocusedApplicationIdChanged: {
@@ -600,11 +606,7 @@ Item {
600606 available: edgeDemo.launcherEnabled && (!shell.locked || AccountsService.enableLauncherWhileLocked) && greeter.fakeActiveForApp === ""
601607
602608 onShowDashHome: showHome()
603− onDash: {
604− if (ApplicationManager.focusedApplicationId != "unity8-dash") {
605− showDash()
606− }
607− }
609+ onDash: showDash()
608610 onDashSwipeChanged: {
609611 if (dashSwipe) {
610612 dash.setCurrentScope("clickscope", false, true)
src/CMakeLists.txt+1
@@ -36,3 +36,4 @@ install(TARGETS ${SHELL_APP}
3636
3737add_subdirectory(Panel)
3838add_subdirectory(Dash)
39+add_subdirectory(libunity8-private)
src/Dash/CMakeLists.txt+2
@@ -9,6 +9,8 @@ add_executable(unity8-dash ${DASH_SRCS})
99
1010qt5_use_modules(unity8-dash Gui Qml Quick Test)
1111
12+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
13+
1214# install binaries
1315install(TARGETS ${DASH_APP}
1416 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
src/Panel/CMakeLists.txt+2
@@ -1 +1,3 @@
11add_subdirectory(Indicators)
2+
3+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
src/libunity8-private/CMakeLists.txtnew file+25
@@ -0,0 +1,25 @@
1+set(LIB_NAME "unity8-private")
2+set(SOVERSION 0)
3+set(VERSION ${SOVERSION}.0.0)
4+
5+project(lib${LIB_NAME})
6+
7+set(lib${LIB_NAME}_SRCS
8+ abstractdbusservicemonitor.cpp
9+ )
10+
11+add_library(${LIB_NAME} SHARED
12+ ${lib${LIB_NAME}_SRCS}
13+ )
14+
15+set_target_properties(${LIB_NAME} PROPERTIES
16+ VERSION ${VERSION}
17+ SOVERSION ${SOVERSION}
18+ )
19+
20+qt5_use_modules(${LIB_NAME} DBus)
21+
22+# install library
23+install(TARGETS ${LIB_NAME}
24+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
25+ )
src/libunity8-private/abstractdbusservicemonitor.cppnew file+87
@@ -0,0 +1,87 @@
1+/*
2+ * Copyright (C) 2011-2014 Canonical, Ltd.
3+ *
4+ * Authors:
5+ * Ugo Riboni <ugo.riboni@canonical.com>
6+ *
7+ * This program is free software; you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation; version 3.
10+ *
11+ * This program is distributed in the hope that it will be useful,
12+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+ * GNU General Public License for more details.
15+ *
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/>.
18+ */
19+
20+#include "abstractdbusservicemonitor.h"
21+
22+#include <QDBusInterface>
23+#include <QDBusServiceWatcher>
24+#include <QDBusConnection>
25+#include <QDBusConnectionInterface>
26+#include <QDBusReply>
27+
28+AbstractDBusServiceMonitor::AbstractDBusServiceMonitor(const QString &service, const QString &path,
29+ const QString &interface, const Bus bus,
30+ QObject *parent)
31+ : QObject(parent)
32+ , m_service(service)
33+ , m_path(path)
34+ , m_interface(interface)
35+ , m_watcher(new QDBusServiceWatcher(service,
36+ (bus == SystemBus) ? QDBusConnection::systemBus()
37+ : QDBusConnection::sessionBus()))
38+ , m_dbusInterface(nullptr)
39+{
40+ connect(m_watcher, &QDBusServiceWatcher::serviceRegistered, this, &AbstractDBusServiceMonitor::createInterface);
41+ connect(m_watcher, &QDBusServiceWatcher::serviceUnregistered, this, &AbstractDBusServiceMonitor::destroyInterface);
42+
43+ // Connect to the service if it's up already
44+ QDBusConnectionInterface* sessionBus = QDBusConnection::sessionBus().interface();
45+ QDBusReply<bool> reply = sessionBus->isServiceRegistered(m_service);
46+ if (reply.isValid() && reply.value()) {
47+ createInterface(m_service);
48+ }
49+}
50+
51+AbstractDBusServiceMonitor::~AbstractDBusServiceMonitor()
52+{
53+ delete m_watcher;
54+ delete m_dbusInterface;
55+}
56+
57+void AbstractDBusServiceMonitor::createInterface(const QString &)
58+{
59+ if (m_dbusInterface != nullptr) {
60+ delete m_dbusInterface;
61+ m_dbusInterface = nullptr;
62+ }
63+
64+ m_dbusInterface = new QDBusInterface(m_service, m_path, m_interface,
65+ QDBusConnection::sessionBus());
66+ Q_EMIT serviceAvailableChanged(true);
67+}
68+
69+void AbstractDBusServiceMonitor::destroyInterface(const QString &)
70+{
71+ if (m_dbusInterface != nullptr) {
72+ delete m_dbusInterface;
73+ m_dbusInterface = nullptr;
74+ }
75+
76+ Q_EMIT serviceAvailableChanged(false);
77+}
78+
79+QDBusInterface* AbstractDBusServiceMonitor::dbusInterface() const
80+{
81+ return m_dbusInterface;
82+}
83+
84+bool AbstractDBusServiceMonitor::serviceAvailable() const
85+{
86+ return m_dbusInterface != nullptr;
87+}
src/libunity8-private/abstractdbusservicemonitor.hnew file+66
@@ -0,0 +1,66 @@
1+/*
2+ * Copyright (C) 2011-2014 Canonical, Ltd.
3+ *
4+ * Authors:
5+ * Ugo Riboni <ugo.riboni@canonical.com>
6+ *
7+ * This program is free software; you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation; version 3.
10+ *
11+ * This program is distributed in the hope that it will be useful,
12+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+ * GNU General Public License for more details.
15+ *
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/>.
18+ */
19+
20+#ifndef ABSTRACTDBUSSERVICEMONITOR_H
21+#define ABSTRACTDBUSSERVICEMONITOR_H
22+
23+#include <QObject>
24+#include <QString>
25+#include <QDBusConnection>
26+
27+class QDBusInterface;
28+class QDBusServiceWatcher;
29+
30+class Q_DECL_EXPORT AbstractDBusServiceMonitor : public QObject
31+{
32+ Q_OBJECT
33+ Q_ENUMS(Bus)
34+ Q_PROPERTY(bool serviceAvailable READ serviceAvailable NOTIFY serviceAvailableChanged)
35+
36+public:
37+ enum Bus {
38+ SessionBus,
39+ SystemBus,
40+ };
41+
42+ explicit AbstractDBusServiceMonitor(const QString &service, const QString &path, const QString &interface,
43+ const Bus bus = SessionBus,
44+ QObject *parent = 0);
45+ ~AbstractDBusServiceMonitor();
46+
47+ QDBusInterface* dbusInterface() const;
48+
49+ bool serviceAvailable() const;
50+
51+Q_SIGNALS:
52+ void serviceAvailableChanged(bool available);
53+
54+private Q_SLOTS:
55+ void createInterface(const QString &service);
56+ void destroyInterface(const QString &service);
57+
58+protected:
59+ const QString m_service;
60+ const QString m_path;
61+ const QString m_interface;
62+ QDBusServiceWatcher* m_watcher;
63+ QDBusInterface* m_dbusInterface;
64+};
65+
66+#endif // ABSTRACTDBUSSERVICEMONITOR_H
tests/autopilot/unity8/shell/emulators/dash.py+4−4
@@ -66,7 +66,7 @@ class Dash(emulators.UnityEmulatorBase):
6666 return resp_grid.select_single('Tile', text=text)
6767
6868 def get_scope(self, scope_name='clickscope'):
69− return self.dash_content_list.select_single(
69+ return self.dash_content_list.wait_select_single(
7070 'QQuickLoader', scopeId=scope_name)
7171
7272 @autopilot_logging.log_action(logger.info)
@@ -86,14 +86,14 @@ class Dash(emulators.UnityEmulatorBase):
8686
8787 def _get_scope_loader(self, scope_id):
8888 try:
89− return self.dash_content_list.select_single(
89+ return self.dash_content_list.wait_select_single(
9090 'QQuickLoader', scopeId=scope_id)
9191 except dbus.StateNotFoundError:
9292 raise emulators.UnityEmulatorException(
9393 'No scope found with id {0}'.format(scope_id))
9494
9595 def _get_scope_from_loader(self, loader):
96− return loader.get_children()[0]
96+ return loader.wait_select_single('GenericScopeView');
9797
9898 def _open_scope_scrolling(self, scope_loader):
9999 scroll = self._get_scroll_direction(scope_loader)
@@ -102,8 +102,8 @@ class Dash(emulators.UnityEmulatorBase):
102102 scroll()
103103 self.dash_content_list.moving.wait_for(False)
104104
105+ scope_loader.isCurrent.wait_for(True)
105106 scope = self._get_scope_from_loader(scope_loader)
106− scope.isCurrent.wait_for(True)
107107 return scope
108108
109109 def _get_scroll_direction(self, scope_loader):
tests/mocks/Ubuntu/CMakeLists.txt+1
@@ -1,3 +1,4 @@
1+add_subdirectory(Connectivity)
12add_subdirectory(DownloadDaemonListener)
23add_subdirectory(Payments)
34add_subdirectory(SystemImage)
tests/mocks/Ubuntu/Connectivity/CMakeLists.txtnew file+10
@@ -0,0 +1,10 @@
1+add_library(connectivity-qml SHARED
2+ networking-status.cpp
3+ plugin.cpp
4+)
5+qt5_use_modules(connectivity-qml Qml)
6+
7+# copy qmldir file into build directory for shadow builds
8+file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/qmldir"
9+ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
10+ )
tests/mocks/Ubuntu/Connectivity/networking-status.cppnew file+64
@@ -0,0 +1,64 @@
1+/*
2+ * Copyright © 2014 Canonical Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it
5+ * under the terms of the GNU Lesser General Public License version 3,
6+ * as published by the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Authors:
17+ * Antti Kaijanmäki <antti.kaijanmaki@canonical.com>
18+ */
19+
20+#include "networking-status.h"
21+
22+NetworkingStatus::NetworkingStatus(QObject *parent)
23+ : QObject(parent)
24+{
25+ qRegisterMetaType<NetworkingStatus::Limitations>();
26+ qRegisterMetaType<QVector<NetworkingStatus::Limitations>>();
27+ qRegisterMetaType<NetworkingStatus::Status>();
28+}
29+
30+NetworkingStatus::~NetworkingStatus()
31+{}
32+
33+QVector<NetworkingStatus::Limitations>
34+NetworkingStatus::limitations() const
35+{
36+ return m_limitations;
37+}
38+
39+NetworkingStatus::Status
40+NetworkingStatus::status() const
41+{
42+ return Status::Online;
43+}
44+
45+bool
46+NetworkingStatus::online() const
47+{
48+ return status() == Status::Online;
49+}
50+
51+bool
52+NetworkingStatus::limitedBandwith() const
53+{
54+ return limitations().contains(Limitations::Bandwith);
55+}
56+
57+void NetworkingStatus::setLimitedBandwidth(bool limited)
58+{
59+ if (limited) {
60+ m_limitations << Limitations::Bandwith;
61+ } else if (limitedBandwith()) {
62+ m_limitations.remove(m_limitations.indexOf(Limitations::Bandwith));
63+ }
64+}
tests/mocks/Ubuntu/Connectivity/networking-status.hnew file+73
@@ -0,0 +1,73 @@
1+/*
2+ * Copyright © 2014 Canonical Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it
5+ * under the terms of the GNU Lesser General Public License version 3,
6+ * as published by the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ */
17+
18+#ifndef FAKE_NETWORKING_STATUS_H
19+#define FAKE_NETWORKING_STATUS_H
20+
21+#include <QObject>
22+#include <QVector>
23+
24+class Q_DECL_EXPORT NetworkingStatus : public QObject
25+{
26+ Q_OBJECT
27+ Q_DISABLE_COPY(NetworkingStatus)
28+
29+ Q_ENUMS(Limitations)
30+ Q_ENUMS(Status)
31+
32+ Q_PROPERTY(QVector<Limitations> limitations READ limitations NOTIFY limitationsChanged)
33+ Q_PROPERTY(Status status READ status NOTIFY statusChanged)
34+ Q_PROPERTY(bool online READ online NOTIFY onlineChanged)
35+ Q_PROPERTY(bool limitedBandwith READ limitedBandwith WRITE setLimitedBandwidth NOTIFY limitedBandwithChanged)
36+
37+public:
38+ explicit NetworkingStatus(QObject *parent = 0);
39+ virtual ~NetworkingStatus();
40+
41+ enum Limitations {
42+ Bandwith
43+ };
44+
45+ enum Status {
46+ Offline,
47+ Connecting,
48+ Online
49+ };
50+
51+ QVector<Limitations> limitations() const;
52+ Status status() const;
53+ bool online() const;
54+ bool limitedBandwith() const;
55+
56+ // Only in the fake one
57+ void setLimitedBandwidth(bool limited);
58+
59+Q_SIGNALS:
60+ void limitationsChanged();
61+ void statusChanged(Status value);
62+ void onlineChanged(bool value);
63+ void limitedBandwithChanged(bool value);
64+
65+private:
66+ QVector<NetworkingStatus::Limitations> m_limitations;
67+};
68+
69+Q_DECLARE_METATYPE(NetworkingStatus::Limitations)
70+Q_DECLARE_METATYPE(QVector<NetworkingStatus::Limitations>)
71+Q_DECLARE_METATYPE(NetworkingStatus::Status)
72+
73+#endif // FAKE_NETWORKING_STATUS_H
tests/mocks/Ubuntu/Connectivity/plugin.cppnew file+46
@@ -0,0 +1,46 @@
1+/*
2+ * Copyright © 2014 Canonical Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it
5+ * under the terms of the GNU Lesser General Public License version 3,
6+ * as published by the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Authors:
17+ * Antti Kaijanmäki <antti.kaijanmaki@canonical.com>
18+ */
19+
20+#include "plugin.h"
21+
22+#include <QtQml>
23+
24+#include "networking-status.h"
25+
26+static QObject *
27+networkingStatusSingletonProvider(QQmlEngine *engine, QJSEngine *scriptEngine)
28+{
29+ Q_UNUSED(scriptEngine)
30+
31+ return new NetworkingStatus(engine);
32+}
33+
34+void
35+QmlConnectivityNetworkingPlugin::registerTypes(const char *uri)
36+{
37+ // @uri Ubuntu.Connectivity
38+ qmlRegisterSingletonType<NetworkingStatus>(uri, 1, 0, "NetworkingStatus", networkingStatusSingletonProvider);
39+}
40+
41+void
42+QmlConnectivityNetworkingPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
43+{
44+ Q_UNUSED(uri);
45+ Q_UNUSED(engine);
46+}
tests/mocks/Ubuntu/Connectivity/plugin.hnew file+35
@@ -0,0 +1,35 @@
1+/*
2+ * Copyright © 2014 Canonical Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it
5+ * under the terms of the GNU Lesser General Public License version 3,
6+ * as published by the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Authors:
17+ * Antti Kaijanmäki <antti.kaijanmaki@canonical.com>
18+ */
19+
20+#ifndef QML_CONNECTIVITY_PLUGIN_H
21+#define QML_CONNECTIVITY_PLUGIN_H
22+
23+#include <QQmlExtensionPlugin>
24+
25+class QmlConnectivityNetworkingPlugin : public QQmlExtensionPlugin {
26+ Q_OBJECT
27+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28+ Q_INTERFACES(QQmlExtensionInterface)
29+
30+public:
31+ void registerTypes(const char *uri);
32+ void initializeEngine(QQmlEngine *engine, const char *uri);
33+};
34+
35+#endif // QML_CONNECTIVITY_PLUGIN_H
tests/mocks/Ubuntu/Connectivity/qmldirnew file+2
@@ -0,0 +1,2 @@
1+module Ubuntu.Connectivity
2+plugin connectivity-qml
tests/mocks/Unity/Application/ApplicationManager.cpp+26
@@ -43,6 +43,7 @@ ApplicationManager *ApplicationManager::singleton()
4343ApplicationManager::ApplicationManager(QObject *parent)
4444 : ApplicationManagerInterface(parent)
4545 , m_suspended(false)
46+ , m_forceDashActive(false)
4647{
4748 m_roleNames.insert(RoleSession, "session");
4849 m_roleNames.insert(RoleFullscreen, "fullscreen");
@@ -292,6 +293,31 @@ void ApplicationManager::setSuspended(bool suspended)
292293 Q_EMIT suspendedChanged();
293294}
294295
296+bool ApplicationManager::forceDashActive() const
297+{
298+ return m_forceDashActive;
299+}
300+
301+void ApplicationManager::setForceDashActive(bool forceDashActive)
302+{
303+ if (m_forceDashActive == forceDashActive) {
304+ return;
305+ }
306+
307+ ApplicationInfo *dash = findApplication("unity8-dash");
308+ if (dash) {
309+ if (forceDashActive) {
310+ dash->setState(ApplicationInfo::Running);
311+ } else {
312+ if (!dash->focused()) {
313+ dash->setState(ApplicationInfo::Suspended);
314+ }
315+ }
316+ }
317+ m_forceDashActive = forceDashActive;
318+ Q_EMIT forceDashActiveChanged();
319+}
320+
295321bool ApplicationManager::focusApplication(const QString &appId)
296322{
297323 ApplicationInfo *application = findApplication(appId);
tests/mocks/Unity/Application/ApplicationManager.h+6−2
@@ -99,8 +99,11 @@ class ApplicationManager : public ApplicationManagerInterface {
9999 Q_INVOKABLE bool stopApplication(const QString &appId) override;
100100
101101 QString focusedApplicationId() const override;
102− bool suspended() const;
103− void setSuspended(bool suspended);
102+ bool suspended() const override;
103+ void setSuspended(bool suspended) override;
104+
105+ bool forceDashActive() const override;
106+ void setForceDashActive(bool forceDashActive) override;
104107
105108 // Only for testing
106109 Q_INVOKABLE QStringList availableApplications();
@@ -124,6 +127,7 @@ class ApplicationManager : public ApplicationManagerInterface {
124127 void buildListOfAvailableApplications();
125128 void onWindowCreated();
126129 bool m_suspended;
130+ bool m_forceDashActive;
127131 QList<ApplicationInfo*> m_runningApplications;
128132 QList<ApplicationInfo*> m_availableApplications;
129133 QTimer m_windowCreatedTimer;
tests/mocks/Unity/Application/CMakeLists.txt+1−1
@@ -1,4 +1,4 @@
1−pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=4)
1+pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=5)
22
33set(FakeUnityApplicationQml_SOURCES
44 plugin.cpp
tests/mocks/Unity/fake_scope.cpp+1−1
@@ -266,7 +266,7 @@ QVariantMap Scope::customizations() const
266266
267267void Scope::refresh()
268268{
269− qDebug() << "Scope::refresh is currently not implmented in the fake scopes plugin";
269+ Q_EMIT refreshed();
270270}
271271
272272unity::shell::scopes::NavigationInterface* Scope::getNavigation(const QString& id)
tests/mocks/Unity/fake_scope.h+3
@@ -79,6 +79,9 @@ public:
7979
8080 Q_INVOKABLE void refresh() override;
8181
82+Q_SIGNALS:
83+ void refreshed(); // This is not in the Interface, here for testing benefits
84+
8285protected:
8386
8487 QString m_id;
tests/plugins/Dash/CMakeLists.txt+3−3
@@ -32,7 +32,7 @@ macro(add_lvwph_test FILENAME TESTNAME)
3232 qt5_use_modules(${TESTNAME}TestExec Test Core Qml)
3333 target_link_libraries(${TESTNAME}TestExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
3434
35− add_binary_qml_test(${TESTNAME} "" "Dash-qml")
35+ add_binary_qml_test(${TESTNAME} "" "Dash-qml" "")
3636endmacro()
3737
3838add_lvwph_test(listviewwithpageheader ListViewWithPageHeader)
@@ -48,7 +48,7 @@ macro(add_dashview_try_test FILENAME TESTNAME)
4848 qt5_use_modules(${TESTNAME}TestExec Test Core Qml)
4949 target_link_libraries(${TESTNAME}TestExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
5050
51− add_binary_qml_test(${TESTNAME} "" "Dash-qml")
51+ add_binary_qml_test(${TESTNAME} "" "Dash-qml" "")
5252
5353 add_executable(${TESTNAME}tryExec
5454 ${FILENAME}try.cpp
@@ -71,7 +71,7 @@ add_dashview_try_test(organicgrid OrganicGrid)
7171add_executable(CardCreatorTestExec cardcreatortest.cpp)
7272qt5_use_modules(CardCreatorTestExec Test Core Qml)
7373target_link_libraries(CardCreatorTestExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
74−add_binary_qml_test(CardCreator "" "Dash-qml")
74+add_binary_qml_test(CardCreator "" "Dash-qml" "QML2_IMPORT_PATH=${CMAKE_BINARY_DIR}/tests/mocks/")
7575
7676# plain qml test
7777set(qmltest_DEFAULT_TARGETS qmluitests)
tests/plugins/Dash/cardcreator/1.res+7−6
@@ -6,7 +6,7 @@ AbstractButton {
66 property var artShapeBorderSource: undefined;
77 property real fontScale: 1.0;
88 property var scopeStyle: null;
9− property int headerAlignment: Text.AlignLeft;
9+ property int titleAlignment: Text.AlignLeft;
1010 property int fixedHeaderHeight: -1;
1111 property size fixedArtShapeSize: Qt.size(-1, -1);
1212 readonly property string title: cardData && cardData["title"] || "";
@@ -44,12 +44,13 @@ Item {
4444 height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height });
4545 }
4646 }
47− image: Image {
47+ image: CroppedImageMinimumSourceSize {
4848 objectName: "artImage";
49− source: cardData && cardData["art"] || "";
49+ property bool doLoadSource: !NetworkingStatus.limitedBandwith;
50+ source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["art"] || ""; }
5051 cache: true;
5152 asynchronous: root.asynchronous;
52− fillMode: Image.PreserveAspectCrop;
53+ visible: false;
5354 width: root.width;
5455 height: width / artShape.aspect;
5556 }
@@ -73,8 +74,8 @@ Label {
7374 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText;
7475 visible: showHeader ;
7576 text: root.title;
76− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
77− horizontalAlignment: root.headerAlignment;
77+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
78+ horizontalAlignment: root.titleAlignment;
7879 }
7980UbuntuShape {
8081 id: touchdown;
tests/plugins/Dash/cardcreator/2.res+8−11
@@ -6,7 +6,7 @@ AbstractButton {
66 property var artShapeBorderSource: undefined;
77 property real fontScale: 1.0;
88 property var scopeStyle: null;
9− property int headerAlignment: Text.AlignLeft;
9+ property int titleAlignment: Text.AlignLeft;
1010 property int fixedHeaderHeight: -1;
1111 property size fixedArtShapeSize: Qt.size(-1, -1);
1212 readonly property string title: cardData && cardData["title"] || "";
@@ -62,19 +62,17 @@ Row {
6262 anchors.margins: margins;
6363 anchors.rightMargin: 0;
6464 data: [
65−Image {
65+CroppedImageMinimumSourceSize {
6666 id: mascotImage;
6767 objectName: "mascotImage";
6868 anchors { verticalCenter: parent.verticalCenter; }
69− readonly property int maxSize: Math.max(width, height) * 4;
70− source: cardData && cardData["mascot"] || "";
69+ property bool doLoadSource: !NetworkingStatus.limitedBandwith;
70+ source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["mascot"] || ""; }
7171 width: units.gu(6);
7272 height: units.gu(5.625);
73− sourceSize { width: maxSize; height: maxSize }
74− fillMode: Image.PreserveAspectCrop;
7573 horizontalAlignment: Image.AlignHCenter;
7674 verticalAlignment: Image.AlignVCenter;
77− visible: showHeader;
75+ visible: showHeader && resized;
7876 }
7977,Item {
8078 id: headerTitleContainer;
@@ -97,8 +95,8 @@ Image {
9795 color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
9896 visible: showHeader ;
9997 text: root.title;
100− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
101− horizontalAlignment: root.headerAlignment;
98+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
99+ horizontalAlignment: root.titleAlignment;
102100 }
103101 ,Label {
104102 id: subtitleLabel;
@@ -110,13 +108,12 @@ Image {
110108 }
111109 anchors.topMargin: units.dp(2);
112110 elide: Text.ElideRight;
113− fontSize: "small";
111+ fontSize: "x-small";
114112 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
115113 color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
116114 visible: titleLabel.visible && titleLabel.text;
117115 text: cardData && cardData["subtitle"] || "";
118116 font.weight: Font.Light;
119− horizontalAlignment: root.headerAlignment;
120117 }
121118
122119 ]
tests/plugins/Dash/cardcreator/3.res+9−9
@@ -6,7 +6,7 @@ AbstractButton {
66 property var artShapeBorderSource: undefined;
77 property real fontScale: 1.0;
88 property var scopeStyle: null;
9− property int headerAlignment: Text.AlignLeft;
9+ property int titleAlignment: Text.AlignLeft;
1010 property int fixedHeaderHeight: -1;
1111 property size fixedArtShapeSize: Qt.size(-1, -1);
1212 readonly property string title: cardData && cardData["title"] || "";
@@ -44,12 +44,13 @@ Item {
4444 height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height });
4545 }
4646 }
47− image: Image {
47+ image: CroppedImageMinimumSourceSize {
4848 objectName: "artImage";
49− source: cardData && cardData["art"] || "";
50− cache: true;
49+ property bool doLoadSource: !NetworkingStatus.limitedBandwith;
50+ source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["art"] || ""; }
51+ cache: true;
5152 asynchronous: root.asynchronous;
52− fillMode: Image.PreserveAspectCrop;
53+ visible: false;
5354 width: root.width;
5455 height: width / artShape.aspect;
5556 }
@@ -73,8 +74,8 @@ Label {
7374 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText;
7475 visible: showHeader ;
7576 text: root.title;
76− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
77− horizontalAlignment: root.headerAlignment;
77+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
78+ horizontalAlignment: root.titleAlignment;
7879 }
7980Label {
8081 id: subtitleLabel;
@@ -86,13 +87,12 @@ Label {
8687 }
8788 anchors.topMargin: units.dp(2);
8889 elide: Text.ElideRight;
89− fontSize: "small";
90+ fontSize: "x-small";
9091 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
9192 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText;
9293 visible: titleLabel.visible && titleLabel.text;
9394 text: cardData && cardData["subtitle"] || "";
9495 font.weight: Font.Light;
95− horizontalAlignment: root.headerAlignment;
9696 }
9797UbuntuShape {
9898 id: touchdown;
tests/plugins/Dash/cardcreator/4.res+8−11
@@ -6,7 +6,7 @@ AbstractButton {
66 property var artShapeBorderSource: undefined;
77 property real fontScale: 1.0;
88 property var scopeStyle: null;
9− property int headerAlignment: Text.AlignLeft;
9+ property int titleAlignment: Text.AlignLeft;
1010 property int fixedHeaderHeight: -1;
1111 property size fixedArtShapeSize: Qt.size(-1, -1);
1212 readonly property string title: cardData && cardData["title"] || "";
@@ -41,16 +41,14 @@ Loader {
4141 anchors { verticalCenter: parent.verticalCenter; }
4242 }
4343
44−,Image {
44+,CroppedImageMinimumSourceSize {
4545 id: mascotImage;
4646 objectName: "mascotImage";
4747 anchors { verticalCenter: parent.verticalCenter; }
48− readonly property int maxSize: Math.max(width, height) * 4;
49− source: cardData && cardData["mascot"] || "";
50− width: units.gu(6);
48+ property bool doLoadSource: !NetworkingStatus.limitedBandwith;
49+ source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["mascot"] || ""; }
50+ width: units.gu(6);
5151 height: units.gu(5.625);
52− sourceSize { width: maxSize; height: maxSize }
53− fillMode: Image.PreserveAspectCrop;
5452 horizontalAlignment: Image.AlignHCenter;
5553 verticalAlignment: Image.AlignVCenter;
5654 visible: false;
@@ -77,8 +75,8 @@ Label {
7775 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText;
7876 visible: showHeader ;
7977 text: root.title;
80− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
81− horizontalAlignment: root.headerAlignment;
78+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
79+ horizontalAlignment: root.titleAlignment;
8280 }
8381,Label {
8482 id: subtitleLabel;
@@ -90,13 +88,12 @@ Label {
9088 }
9189 anchors.topMargin: units.dp(2);
9290 elide: Text.ElideRight;
93− fontSize: "small";
91+ fontSize: "x-small";
9492 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
9593 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText;
9694 visible: titleLabel.visible && titleLabel.text;
9795 text: cardData && cardData["subtitle"] || "";
9896 font.weight: Font.Light;
99− horizontalAlignment: root.headerAlignment;
10097 }
10198]
10299}
tests/plugins/Dash/cardcreator/5.res+9−9
@@ -6,7 +6,7 @@ AbstractButton {
66 property var artShapeBorderSource: undefined;
77 property real fontScale: 1.0;
88 property var scopeStyle: null;
9− property int headerAlignment: Text.AlignLeft;
9+ property int titleAlignment: Text.AlignLeft;
1010 property int fixedHeaderHeight: -1;
1111 property size fixedArtShapeSize: Qt.size(-1, -1);
1212 readonly property string title: cardData && cardData["title"] || "";
@@ -44,12 +44,13 @@ Item {
4444 height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height });
4545 }
4646 }
47− image: Image {
47+ image: CroppedImageMinimumSourceSize {
4848 objectName: "artImage";
49− source: cardData && cardData["art"] || "";
50− cache: true;
49+ property bool doLoadSource: !NetworkingStatus.limitedBandwith;
50+ source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["art"] || ""; }
51+ cache: true;
5152 asynchronous: root.asynchronous;
52− fillMode: Image.PreserveAspectCrop;
53+ visible: false;
5354 width: root.width;
5455 height: width / artShape.aspect;
5556 }
@@ -117,8 +118,8 @@ Label {
117118 color: root.scopeStyle && overlayLoader.item ? root.scopeStyle.getTextColor(overlayLoader.item.luminance) : (overlayLoader.item && overlayLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
118119 visible: showHeader && overlayLoader.active;
119120 text: root.title;
120− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
121− horizontalAlignment: root.headerAlignment;
121+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
122+ horizontalAlignment: root.titleAlignment;
122123 }
123124Label {
124125 id: subtitleLabel;
@@ -131,13 +132,12 @@ Label {
131132 }
132133 anchors.topMargin: units.dp(2);
133134 elide: Text.ElideRight;
134− fontSize: "small";
135+ fontSize: "x-small";
135136 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
136137 color: root.scopeStyle && overlayLoader.item ? root.scopeStyle.getTextColor(overlayLoader.item.luminance) : (overlayLoader.item && overlayLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
137138 visible: titleLabel.visible && titleLabel.text;
138139 text: cardData && cardData["subtitle"] || "";
139140 font.weight: Font.Light;
140− horizontalAlignment: root.headerAlignment;
141141 }
142142UbuntuShape {
143143 id: touchdown;
tests/plugins/Dash/cardcreator/6.res+5−7
@@ -6,7 +6,7 @@ AbstractButton {
66 property var artShapeBorderSource: undefined;
77 property real fontScale: 1.0;
88 property var scopeStyle: null;
9− property int headerAlignment: Text.AlignLeft;
9+ property int titleAlignment: Text.AlignLeft;
1010 property int fixedHeaderHeight: -1;
1111 property size fixedArtShapeSize: Qt.size(-1, -1);
1212 readonly property string title: cardData && cardData["title"] || "";
@@ -73,8 +73,8 @@ Item {
7373 color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
7474 visible: showHeader ;
7575 text: root.title;
76− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
77− horizontalAlignment: root.headerAlignment;
76+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
77+ horizontalAlignment: root.titleAlignment;
7878 }
7979,Label {
8080 id: subtitleLabel;
@@ -86,15 +86,14 @@ Item {
8686 }
8787 anchors.topMargin: units.dp(2);
8888 elide: Text.ElideRight;
89− fontSize: "small";
89+ fontSize: "x-small";
9090 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
9191 color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
9292 visible: titleLabel.visible && titleLabel.text;
9393 text: cardData && cardData["subtitle"] || "";
9494 font.weight: Font.Light;
95− horizontalAlignment: root.headerAlignment;
9695 }
97−,Icon {
96+,StatusIcon {
9897 id: emblemIcon;
9998 objectName: "emblemIcon";
10099 anchors {
@@ -104,7 +103,6 @@ Item {
104103 }
105104 source: cardData && cardData["emblem"] || "";
106105 color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
107− width: height;
108106 height: source != "" ? titleLabel.font.pixelSize : 0;
109107 }
110108
tests/plugins/Dash/cardcreator/7.res+9−12
@@ -6,7 +6,7 @@ AbstractButton {
66 property var artShapeBorderSource: undefined;
77 property real fontScale: 1.0;
88 property var scopeStyle: null;
9− property int headerAlignment: Text.AlignLeft;
9+ property int titleAlignment: Text.AlignLeft;
1010 property int fixedHeaderHeight: -1;
1111 property size fixedArtShapeSize: Qt.size(-1, -1);
1212 readonly property string title: cardData && cardData["title"] || "";
@@ -62,19 +62,17 @@ Row {
6262 anchors.margins: margins;
6363 anchors.rightMargin: 0;
6464 data: [
65−Image {
65+CroppedImageMinimumSourceSize {
6666 id: mascotImage;
6767 objectName: "mascotImage";
6868 anchors { verticalCenter: parent.verticalCenter; }
69− readonly property int maxSize: Math.max(width, height) * 4;
70− source: cardData && cardData["mascot"] || "";
71− width: units.gu(6);
69+ property bool doLoadSource: !NetworkingStatus.limitedBandwith;
70+ source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["mascot"] || ""; }
71+ width: units.gu(6);
7272 height: units.gu(5.625);
73− sourceSize { width: maxSize; height: maxSize }
74− fillMode: Image.PreserveAspectCrop;
7573 horizontalAlignment: Image.AlignHCenter;
7674 verticalAlignment: Image.AlignVCenter;
77− visible: showHeader;
75+ visible: showHeader && resized;
7876 }
7977
8078,Item {
@@ -98,8 +96,8 @@ Image {
9896 color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
9997 visible: showHeader ;
10098 text: root.title;
101− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
102− horizontalAlignment: root.headerAlignment;
99+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
100+ horizontalAlignment: root.titleAlignment;
103101 }
104102,Label {
105103 id: subtitleLabel;
@@ -111,13 +109,12 @@ Image {
111109 }
112110 anchors.topMargin: units.dp(2);
113111 elide: Text.ElideRight;
114− fontSize: "small";
112+ fontSize: "x-small";
115113 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
116114 color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
117115 visible: titleLabel.visible && titleLabel.text;
118116 text: cardData && cardData["subtitle"] || "";
119117 font.weight: Font.Light;
120− horizontalAlignment: root.headerAlignment;
121118 }
122119,CardAttributes {
123120 id: attributesRow;
tests/plugins/Dash/listviewwithpageheadertest.cpp+39
@@ -28,6 +28,8 @@
2828#include <private/qquickitem_p.h>
2929#pragma GCC diagnostic pop
3030
31+#include <limits>
32+
3133// TODO Think on how doing a test for lost items
3234// particullary making sure that lost items are culled
3335// and then removed in the next updatePolish cycle
@@ -1899,6 +1901,43 @@ private Q_SLOTS:
18991901 QTRY_COMPARE(lvwph->m_firstVisibleIndex, 0);
19001902 }
19011903
1904+ void testNoCacheBuffer()
1905+ {
1906+ lvwph->setCacheBuffer(0);
1907+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1908+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1909+ verifyItem(0, 50., 150., false);
1910+ verifyItem(1, 200., 200., false);
1911+ verifyItem(2, 400., 350., false);
1912+ QCOMPARE(lvwph->m_minYExtent, 0.);
1913+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
1914+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1915+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1916+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1917+ QCOMPARE(lvwph->contentY(), 0.);
1918+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1919+ }
1920+
1921+ void testAllCacheBuffer()
1922+ {
1923+ lvwph->setCacheBuffer(std::numeric_limits<qreal>::max());
1924+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 6);
1925+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1926+ verifyItem(0, 50., 150., false);
1927+ verifyItem(1, 200., 200., false);
1928+ verifyItem(2, 400., 350., false);
1929+ verifyItem(3, 750., 350., true);
1930+ verifyItem(4, 1100., 350., true);
1931+ verifyItem(5, 1450., 350., true);
1932+ QCOMPARE(lvwph->m_minYExtent, 0.);
1933+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
1934+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1935+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1936+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1937+ QCOMPARE(lvwph->contentY(), 0.);
1938+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1939+ }
1940+
19021941private:
19031942 QQuickView *view;
19041943 ListViewWithPageHeader *lvwph;
tests/plugins/Dash/listviewwithpageheadertest.qml+1
@@ -60,6 +60,7 @@ Rectangle {
6060 anchors.top: parent.top
6161 anchors.bottom: parent.bottom
6262 model: model
63+ cacheBuffer: height * 0.5
6364 delegate: Rectangle {
6465 property bool timerDone: false
6566 width: parent.width - 20
tests/plugins/Dash/listviewwithpageheadertestsection.qml+1
@@ -60,6 +60,7 @@ Rectangle {
6060 anchors.top: parent.top
6161 anchors.bottom: parent.bottom
6262 model: model
63+ cacheBuffer: height * 0.5
6364 delegate: Rectangle {
6465 property bool timerDone: false
6566 width: parent.width - 20
tests/plugins/Dash/listviewwithpageheadertestsectionexternalmodel.qml+1
@@ -28,6 +28,7 @@ Rectangle {
2828 anchors.top: parent.top
2929 anchors.bottom: parent.bottom
3030 model: model
31+ cacheBuffer: height * 0.5
3132 delegate: Rectangle {
3233 property bool timerDone: false
3334 width: parent.width - 20
tests/plugins/Ubuntu/Gestures/CMakeLists.txt+1−1
@@ -19,7 +19,7 @@ macro(add_gesture_ui_test CLASSNAME)
1919 qt5_use_modules(${CLASSNAME}TestExec Test Core Qml Gui Quick)
2020 target_link_libraries(${CLASSNAME}TestExec UbuntuGestureQml)
2121
22− add_binary_qml_test(${CLASSNAME} ${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures UbuntuGesturesTestQmlFiles)
22+ add_binary_qml_test(${CLASSNAME} ${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures UbuntuGesturesTestQmlFiles "")
2323 add_manual_qml_test(. ${CLASSNAME} IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
2424endmacro(add_gesture_ui_test)
2525
tests/plugins/Unity/Launcher/CMakeLists.txt+1−1
@@ -1,6 +1,6 @@
11pkg_check_modules(GSETTINGS_QT REQUIRED gsettings-qt)
22pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=4)
3−pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=4)
3+pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=5)
44
55include_directories(
66 ${CMAKE_CURRENT_BINARY_DIR}
tests/plugins/Unity/Launcher/launchermodeltest.cpp+2
@@ -105,6 +105,8 @@ public:
105105 bool requestFocusApplication(const QString &appId) { Q_UNUSED(appId); return true; }
106106 bool suspended() const { return false; }
107107 void setSuspended(bool) {}
108+ bool forceDashActive() const { return false; }
109+ void setForceDashActive(bool) {}
108110
109111private:
110112 QList<MockApp*> m_list;
tests/qmltests/Components/CMakeLists.txt+1−1
@@ -10,7 +10,7 @@ add_executable(DragHandleTestExec tst_DragHandle.cpp)
1010qt5_use_modules(DragHandleTestExec Test Core Qml Gui Quick)
1111target_link_libraries(DragHandleTestExec UbuntuGestureQml)
1212
13−add_binary_qml_test(DragHandle ${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures "")
13+add_binary_qml_test(DragHandle ${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures "" "")
1414add_manual_qml_test(. DragHandle IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
1515
1616add_definitions(-DUBUNTU_GESTURES_PLUGIN_DIR="${CMAKE_BINARY_DIR}/plugins")
tests/qmltests/Dash/CardHelpers.js+1−12
@@ -16,7 +16,7 @@
1616
1717.pragma library
1818
19−var components = ["title", "art", "subtitle", "mascot", "emblem", "old-price", "price", "alt-price", "rating", "alt-rating", "summary", "attributes", "overlayColor"]
19+var components = ["title", "art", "subtitle", "mascot", "emblem", "summary", "attributes", "overlayColor"]
2020
2121var defaultLayout = ' \
2222{ \
@@ -37,17 +37,6 @@ var defaultLayout = ' \
3737 "overlayColor": null, \
3838 "mascot": null, \
3939 "emblem": null, \
40− "old-price": null, \
41− "price": null, \
42− "alt-price": null, \
43− "rating": { \
44− "type": "stars", \
45− "range": [0, 5], \
46− "full": "image://theme/rating-star-full", \
47− "half": "image://theme/rating-star-half", \
48− "empty": "image://theme/rating-star-empty" \
49− }, \
50− "alt-rating": null, \
5140 "summary": null, \
5241 "attributes": { "max-count": 2 } \
5342 }, \
tests/qmltests/Dash/Previews/tst_PreviewHeader.qml+4−2
@@ -27,13 +27,15 @@ Rectangle {
2727 property var origHeaderjson: {
2828 "title": "THE TITLE",
2929 "subtitle": "Something catchy",
30− "mascot": "../graphics/play_button.png"
30+ "mascot": "../graphics/play_button.png",
31+ "attributes": [{"value":"text1","icon":"image://theme/ok"},{"value":"text2","icon":"image://theme/cancel"}]
3132 }
3233
3334 property var headerjson: {
3435 "title": "THE TITLE",
3536 "subtitle": "Something catchy",
36− "mascot": "../graphics/play_button.png"
37+ "mascot": "../graphics/play_button.png",
38+ "attributes": [{"value":"text1","icon":"image://theme/ok"},{"value":"text2","icon":"image://theme/cancel"}]
3739 }
3840
3941 PreviewHeader {
tests/qmltests/Dash/Previews/tst_PreviewImageGallery.qml+51−1
@@ -21,7 +21,7 @@ import Unity.Test 0.1 as UT
2121
2222Rectangle {
2323 id: root
24− width: units.gu(60)
24+ width: units.gu(80)
2525 height: units.gu(80)
2626 color: "lightgrey"
2727
@@ -44,13 +44,63 @@ Rectangle {
4444 }
4545
4646 UT.UnityTestCase {
47+ id: testCase
4748 name: "PreviewImageGalleryTest"
4849 when: windowShown
4950
51+ property Item slideShow: findChild(imageGallery.rootItem, "slideShow")
52+ property Item slideShowCloseButton: findChild(slideShow, "slideShowCloseButton")
53+ property Item slideShowListView: findChild(slideShow, "slideShowListView")
54+
55+ function cleanup() {
56+ slideShow.visible = false;
57+ imageGallery.widgetData = sourcesModel1;
58+ waitForRendering(imageGallery);
59+ }
60+
5061 function test_changeEmptyModel() {
5162 imageGallery.widgetData = sourcesModel0;
5263 var placeholderScreenshot = findChild(imageGallery, "placeholderScreenshot");
5364 compare(placeholderScreenshot.visible, true);
5465 }
66+
67+ function test_slideShowOpenClose() {
68+ var image0 = findChild(imageGallery, "previewImage0");
69+ mouseClick(image0, image0.width / 2, image0.height / 2);
70+ tryCompare(slideShow, "visible", true);
71+ tryCompare(slideShow, "scale", 1.0);
72+ tryCompare(slideShowCloseButton, "visible", true);
73+ mouseClick(slideShowCloseButton, slideShowCloseButton.width / 2, slideShowCloseButton.height / 2);
74+ tryCompare(slideShow, "visible", false);
75+ }
76+
77+ function test_slideShowShowHideHeader() {
78+ var image0 = findChild(imageGallery, "previewImage0");
79+ mouseClick(image0, image0.width / 2, image0.height / 2);
80+ tryCompare(slideShow, "visible", true);
81+ tryCompare(slideShow, "scale", 1.0);
82+ tryCompare(slideShowCloseButton, "visible", true);
83+ mouseClick(slideShow, slideShow.width / 2, slideShow.height / 2);
84+ tryCompare(slideShowCloseButton, "visible", false);
85+ mouseClick(slideShow, slideShow.width / 2, slideShow.height / 2);
86+ tryCompare(slideShowCloseButton, "visible", true);
87+ }
88+
89+ function test_slideShowOpenCorrectImage_data() {
90+ return [
91+ { tag: "Image 0", index: 0 },
92+ { tag: "Image 1", index: 1 },
93+ { tag: "Image 2", index: 2 },
94+ ];
95+ }
96+
97+ function test_slideShowOpenCorrectImage(data) {
98+ var image = findChild(imageGallery, "previewImage" + data.index);
99+ mouseClick(image, image.width / 2, image.height / 2);
100+ tryCompare(slideShow, "visible", true);
101+ tryCompare(slideShow, "scale", 1.0);
102+ tryCompare(slideShowListView, "currentIndex", data.index);
103+ verify(image.source === slideShowListView.currentItem.source);
104+ }
55105 }
56106}
tests/qmltests/Dash/tst_Card.qml+26
@@ -17,6 +17,7 @@
1717import QtQuick 2.0
1818import QtTest 1.0
1919import Ubuntu.Components 0.1
20+import Ubuntu.Connectivity 1.0
2021import Unity.Test 0.1 as UT
2122import "../../../qml/Dash"
2223import "CardHelpers.js" as Helpers
@@ -205,6 +206,11 @@ Rectangle {
205206 property Item backgroundImage: findChild(card, "backgroundImage")
206207 property Item mascotImage: findChild(card, "mascotImage");
207208
209+ function init() {
210+ loader.visible = true;
211+ NetworkingStatus.limitedBandwith = false;
212+ }
213+
208214 function cleanup() {
209215 selector.selectedIndex = -1;
210216 }
@@ -566,5 +572,25 @@ Rectangle {
566572 verify((card.width - titleToCard.x - titleToCard.width) === units.gu(1));
567573 }
568574 }
575+
576+ function test_load_images_visibility_network_data() {
577+ return [
578+ { tag: "Visible, network", visible: true, limitedBandwith: false },
579+ { tag: "Visible, no network", visible: true, limitedBandwith: true },
580+ { tag: "Not Visible, network", visible: false, limitedBandwith: false },
581+ { tag: "Not Visible, no network", visible: false, limitedBandwith: true }
582+ ];
583+ }
584+
585+ function test_load_images_visibility_network(data) {
586+ loader.visible = data.visible;
587+ NetworkingStatus.limitedBandwith = data.limitedBandwith;
588+
589+ selector.selectedIndex = 0;
590+ waitForRendering(selector);
591+ waitForRendering(card);
592+
593+ verify(data.visible || !data.limitedBandwith || artImage.source == "");
594+ }
569595 }
570596}
tests/qmltests/Dash/tst_CardTool.qml+28−20
@@ -85,8 +85,8 @@ Rectangle {
8585 "layout": { "template": { "card-layout": "vertical" }, "components": { "title": "title", "subtitle": "subtitle" } }
8686 },
8787 {
88− "name": "Title, price - horizontal",
89− "layout": { "template": { "card-layout": "horizontal" }, "components": { "title": "title", "price": "price" } }
88+ "name": "Title, attributes - horizontal",
89+ "layout": { "template": { "card-layout": "horizontal" }, "components": { "title": "title", "attributes": "attributes" } }
9090 },
9191 ]
9292
@@ -100,6 +100,7 @@ Rectangle {
100100 }
101101
102102 Column {
103+ id: column
103104 width: units.gu(38)
104105 anchors { left: parent.left; top: parent.top; margins: units.gu(1) }
105106
@@ -111,7 +112,7 @@ Rectangle {
111112 ]
112113
113114 delegate: Row {
114− anchors { left: parent.left; right: parent.right; margins: units.gu(3) }
115+ anchors { left: column.left; right: column.right; margins: units.gu(3) }
115116
116117 Label {
117118 height: units.gu(5)
@@ -315,28 +316,35 @@ Rectangle {
315316 }
316317 }
317318
318− function test_card_header_component_alignment_data() {
319+ function test_card_title_alignment_data() {
319320 return [
320− { tag: "Title - vertical", component: "titleLabel", property: "headerAlignment",
321− value: Text.AlignHCenter, index: 11, layout_index: 0 },
322− { tag: "Title - horizontal", component: "titleLabel", property: "headerAlignment",
323− value: Text.AlignLeft, index: 12, layout_index: 0},
324− { tag: "Title, subtitle - vertical", component: "titleLabel", property: "headerAlignment",
325− value: Text.AlignLeft, index: 13, layout_index: 0},
326− { tag: "Title, price - horizontal", component: "titleLabel", property: "headerAlignment",
327− value: Text.AlignLeft, index: 14, layout_index: 0},
328− ]
321+ { tag: "Art, header, summary", value: Text.AlignLeft, index: 0 },
322+ { tag: "Header, summary", value: Text.AlignLeft, index: 1 },
323+ { tag: "Art, header", value: Text.AlignLeft, index: 2 },
324+ { tag: "Header only", value: Text.AlignLeft, index: 3 },
325+ { tag: "Header title only", value: Text.AlignHCenter, index: 4 },
326+ { tag: "Header title and subtitle", value: Text.AlignLeft, index: 5 },
327+ { tag: "Header title and mascot", value: Text.AlignLeft, index: 6 },
328+ { tag: "Art, header, summary - small", value: Text.AlignLeft, index: 7 },
329+ { tag: "Art, header, summary - large", value: Text.AlignLeft, index: 8 },
330+ { tag: "Art, header, summary - horizontal", value: Text.AlignLeft, index: 9 },
331+ { tag: "Art, header - portrait", value: Text.AlignLeft, index: 10 },
332+ { tag: "Title - vertical", value: Text.AlignHCenter, index: 11 },
333+ { tag: "Title - horizontal", value: Text.AlignLeft, index: 12 },
334+ { tag: "Title, subtitle - vertical", value: Text.AlignLeft, index: 13 },
335+ { tag: "Title, attributes - horizontal", value: Text.AlignLeft, index: 14 },
336+ ];
329337 }
330338
331− function test_card_header_component_alignment(data) {
339+ function test_card_title_alignment(data) {
332340 selector.selectedIndex = data.index;
333− if (data.hasOwnProperty("layout_index")) {
334− layoutSelector.selectedIndex = data.layout_index;
335− }
336341
337− if (data.hasOwnProperty("property")) {
338− tryCompare(cardTool, data.property, data.value);
339− }
342+ tryCompare(cardTool, "titleAlignment", Text.AlignLeft);
343+
344+ cardTool.components['title'] = { "field": "title", "align": "center" };
345+ cardTool.componentsChanged();
346+
347+ tryCompare(cardTool, "titleAlignment", data.value);
340348 }
341349
342350 function test_categoryLayout_data() {
tests/qmltests/Dash/tst_Dash.qml+16−39
@@ -55,6 +55,16 @@ Item {
5555 scopes.load();
5656 tryCompare(dashContentList, "currentIndex", 0);
5757 tryCompare(dashContentList, "count", 6);
58+ tryCompare(scopes, "loaded", true);
59+ tryCompareFunction(function() {
60+ var mockScope1Loader = findChild(dash, "MockScope1 loader");
61+ return mockScope1Loader && mockScope1Loader.item != null; },
62+ true, 15000);
63+ tryCompareFunction(function() {
64+ var mockScope1Loader = findChild(dash, "MockScope1 loader");
65+ return mockScope1Loader && mockScope1Loader.status === Loader.Ready; },
66+ true, 15000);
67+ waitForRendering(findChild(dash, "MockScope1 loader").item);
5868 }
5969
6070 function get_scope_data() {
@@ -92,15 +102,6 @@ Item {
92102 }
93103
94104 function test_dash_overview_show_select_same_favorite() {
95− // Wait for stuff to be loaded
96− tryCompare(scopes, "loaded", true);
97− var dashContentList = findChild(dash, "dashContentList");
98− tryCompare(dashContentList, "count", 6);
99− tryCompareFunction(function() {
100− var mockScope1Loader = findChild(dash, "MockScope1 loader");
101− return mockScope1Loader && mockScope1Loader.item != null; },
102− true);
103−
104105 // Show the overview
105106 touchFlick(dash, dash.width / 2, dash.height - 1, dash.width / 2, dash.height - units.gu(18));
106107 var overviewController = findInvisibleChild(dash, "overviewController");
@@ -121,18 +122,12 @@ Item {
121122
122123 // Make sure animation went back
123124 tryCompare(overviewController, "progress", 0);
125+
126+ var dashContentList = findChild(dash, "dashContentList");
124127 compare(dashContentList.currentIndex, 0);
125128 }
126129
127130 function test_dash_overview_show_select_different_favorite() {
128− // Wait for stuff to be loaded
129− tryCompare(scopes, "loaded", true);
130− var dashContentList = findChild(dash, "dashContentList");
131− tryCompare(dashContentList, "count", 6);
132− tryCompareFunction(function() { return findChild(dash, "MockScope1 loader") != null; }, true);
133− var mockScope1Loader = findChild(dash, "MockScope1 loader");
134− tryCompare(mockScope1Loader, "status", Loader.Ready);
135−
136131 // Show the overview
137132 touchFlick(dash, dash.width / 2, dash.height - 1, dash.width / 2, dash.height - units.gu(18));
138133 var overviewController = findInvisibleChild(dash, "overviewController");
@@ -153,19 +148,11 @@ Item {
153148
154149 // Make sure animation went back
155150 tryCompare(overviewController, "progress", 0);
151+ var dashContentList = findChild(dash, "dashContentList");
156152 compare(dashContentList.currentIndex, 1);
157153 }
158154
159155 function test_dash_overview_all_temp_scope_done_from_all() {
160− // Wait for stuff to be loaded
161− tryCompare(scopes, "loaded", true);
162− var dashContentList = findChild(dash, "dashContentList");
163− tryCompare(dashContentList, "count", 6);
164− tryCompareFunction(function() {
165− var mockScope1Loader = findChild(dash, "MockScope1 loader");
166− return mockScope1Loader && mockScope1Loader.item != null; },
167− true);
168−
169156 // Show the overview
170157 touchFlick(dash, dash.width / 2, dash.height - 1, dash.width / 2, dash.height - units.gu(18));
171158 var overviewController = findInvisibleChild(dash, "overviewController");
@@ -227,20 +214,13 @@ Item {
227214 tryCompare(overviewController, "progress", 0);
228215
229216 // Original list is still on 0
217+ var dashContentList = findChild(dash, "dashContentList");
230218 compare(dashContentList.currentIndex, 0);
231219 }
232220
233221 function test_temp_scope_dash_overview_all_search_temp_scope_favorite_from_all() {
234− // Wait for stuff to be loaded
235− tryCompare(scopes, "loaded", true);
236− var dashContentList = findChild(dash, "dashContentList");
237− tryCompare(dashContentList, "count", 6);
238− tryCompareFunction(function() {
239− var mockScope1Loader = findChild(dash, "MockScope1 loader");
240− return mockScope1Loader && mockScope1Loader.item != null; },
241− true);
242−
243222 // Swipe right to Apps scope
223+ var dashContentList = findChild(dash, "dashContentList");
244224 touchFlick(dash, dash.width - 1, units.gu(1), dash.width - units.gu(10), units.gu(1));
245225 tryCompare(dashContentList, "contentX", dashContentList.width);
246226 tryCompare(dashContentList, "currentIndex", 1);
@@ -249,8 +229,7 @@ Item {
249229 var categoryListView = findChild(dashContentList.currentItem, "categoryListView");
250230 var dashCategory2 = findChild(categoryListView, "dashCategory2");
251231 tryCompareFunction(function() {
252− var d = findChild(dashCategory2, "delegate2");
253− if (d) return true;
232+ if (dashCategory2.y < 200) return true;
254233 categoryListView.contentY += 100;
255234 return false;
256235 }, true);
@@ -340,8 +319,6 @@ Item {
340319 }
341320
342321 function test_processing_indicator() {
343− tryCompare(scopes, "loaded", true);
344−
345322 var processingIndicator = findChild(dash, "processingIndicator");
346323 verify(processingIndicator, "Can't find the processing indicator.");
347324
tests/qmltests/Dash/tst_DashContent.qml+14−1
@@ -70,7 +70,17 @@ Item {
7070 function loadScopes() {
7171 scopeLoadedSpy.clear();
7272 scopesModel.load();
73− tryCompare(scopeLoadedSpy, "count", 6);
73+ tryCompare(scopeLoadedSpy, "count", 6, 15000);
74+ tryCompare(scopesModel, "loaded", true);
75+ tryCompareFunction(function() {
76+ var mockScope1Loader = findChild(shell, "MockScope1 loader");
77+ return mockScope1Loader && mockScope1Loader.item != null; },
78+ true, 15000);
79+ tryCompareFunction(function() {
80+ var mockScope1Loader = findChild(shell, "MockScope1 loader");
81+ return mockScope1Loader && mockScope1Loader.status === Loader.Ready; },
82+ true, 15000);
83+ waitForRendering(findChild(shell, "MockScope1 loader").item);
7484 }
7585
7686 function init() {
@@ -467,6 +477,9 @@ Item {
467477 var navigationListView = findChild(dashAltNavigationButton, "navigationListView");
468478 tryCompare(navigationListView.currentItem.navigation, "loaded", true);
469479
480+ var blackRect = findChild(dashNavigation, "blackRect");
481+ tryCompare(blackRect, "opacity", 0.5);
482+
470483 mouseClick(dashNavigation, dashNavigationButton.x, 0);
471484 compare(dashNavigationButton.showList, false);
472485 compare(dashAltNavigationButton.showList, false);
tests/qmltests/Dash/tst_GenericScopeView.qml+28−6
@@ -82,18 +82,19 @@ Item {
8282 spy.signalName = "";
8383 }
8484
85− function scrollToCategory(category) {
85+ function scrollToCategory(categoryName) {
8686 var categoryListView = findChild(genericScopeView, "categoryListView");
8787 tryCompareFunction(function() {
88− if (findChild(genericScopeView, category)) return true;
88+ var category = findChild(genericScopeView, categoryName);
89+ if (category && category.y > 0 && category.y < genericScopeView.height) return true;
8990 mouseFlick(genericScopeView, genericScopeView.width/2, genericScopeView.height,
9091 genericScopeView.width/2, genericScopeView.y)
9192 tryCompare(categoryListView, "moving", false);
92− return findChild(genericScopeView, category) !== null;
93+ return false;
9394 }, true);
9495
9596 tryCompareFunction(function() { return findChild(genericScopeView, "delegate0") !== null; }, true);
96− return findChild(genericScopeView, category);
97+ return findChild(genericScopeView, categoryName);
9798 }
9899
99100 function scrollToEnd()
@@ -283,7 +284,7 @@ Item {
283284 if (category === undefined) category = 0;
284285 if (delegate === undefined) delegate = 0;
285286 tryCompareFunction(function() {
286− var cardGrid = findChild(genericScopeView, category);
287+ var cardGrid = findChild(genericScopeView, "dashCategory"+category);
287288 if (cardGrid != null) {
288289 var tile = findChild(cardGrid, "delegate"+delegate);
289290 return tile != null;
@@ -291,7 +292,7 @@ Item {
291292 return false;
292293 },
293294 true);
294− var tile = findChild(findChild(genericScopeView, category), "delegate"+delegate);
295+ var tile = findChild(findChild(genericScopeView, "dashCategory"+category), "delegate"+delegate);
295296 mouseClick(tile, tile.width / 2, tile.height / 2);
296297 tryCompare(testCase.subPageLoader, "open", true);
297298 tryCompare(testCase.subPageLoader, "x", 0);
@@ -581,6 +582,27 @@ Item {
581582
582583 genericScopeView.scope = !genericScopeView.scope;
583584 }
585+
586+ function test_pullToRefresh() {
587+ waitForRendering(genericScopeView)
588+
589+ mouseFlick(genericScopeView,
590+ genericScopeView.width/2, units.gu(10),
591+ genericScopeView.width/2, units.gu(80),
592+ true, false)
593+
594+ var pullToRefresh = findChild(genericScopeView, "pullToRefresh")
595+ tryCompare(pullToRefresh, "releaseToRefresh", true)
596+
597+ spy.target = genericScopeView.scope
598+ spy.signalName = "refreshed"
599+
600+ mouseRelease(genericScopeView)
601+ tryCompare(pullToRefresh, "releaseToRefresh", false)
602+
603+ spy.wait()
604+ compare(spy.count, 1)
605+ }
584606 }
585607 }
586608}
tests/qmltests/tst_Shell.qml+4
@@ -199,6 +199,10 @@ Row {
199199
200200 var launcher = findChild(shell, "launcherPanel");
201201 tryCompare(launcher, "x", data.launcherHides ? -launcher.width : 0)
202+
203+ // Make sure the helper for sliding out the launcher wasn't touched. We want to fade it out here.
204+ var animateTimer = findInvisibleChild(shell, "animateTimer");
205+ compare(animateTimer.nextState, "visible");
202206 }
203207
204208 function test_suspend() {
tests/utils/modules/Unity/Test/UnityTestCase.qml+3−2
@@ -178,9 +178,10 @@ TestCase {
178178 // Keeps executing a given parameter-less function until it returns the given
179179 // expected result or the timemout is reached (in which case a test failure
180180 // is generated)
181− function tryCompareFunction(func, expectedResult) {
181+ function tryCompareFunction(func, expectedResult, timeout) {
182182 var timeSpent = 0
183− var timeout = 5000
183+ if (timeout === undefined)
184+ timeout = 5000;
184185 var success = false
185186 var actualResult
186187 while (timeSpent < timeout && !success) {
tools/unlock-device+14−13
@@ -4,7 +4,7 @@
44# Our goal here is to get an Ubuntu Touch device into a testable unlocked state.
55# This will include a reboot.
66
7−WAIT_COMMAND="adb reboot; sleep 5; adb wait-for-device"
7+WAIT_COMMAND="adb reboot; sleep 5; adb wait-for-device; sleep 20"
88
99while getopts s:w: opt; do
1010 case $opt in
@@ -19,16 +19,17 @@ done
1919
2020eval "$WAIT_COMMAND"
2121
22−# Force a sleep no matter what, since we may need to wait for unity8
23−# to finish coming up (it's hard to tell when the greeter is actually rendered)
24−sleep 30
22+for i in `seq 1 5`; do
23+ # We need to go through sudo to get a proper environment for dbus set up
24+ UNLOCK_OUTPUT=$(adb shell "gdbus call --session --dest com.canonical.UnityGreeter --object-path / --method com.canonical.UnityGreeter.HideGreeter && echo Greeter unlocked" 2>&1)
25+ if echo "$UNLOCK_OUTPUT" | grep 'Greeter unlocked' >/dev/null; then
26+ echo "I: Unlock passed"
27+ exit 0
28+ else
29+ echo "I: Unlock attempt $i failed, script output: '$UNLOCK_OUTPUT'"
30+ sleep 20
31+ fi
32+done
2533
26−# We need to go through sudo to get a proper environment for dbus set up
27−UNLOCK_OUTPUT=$(adb shell "gdbus call --session --dest com.canonical.UnityGreeter --object-path / --method com.canonical.UnityGreeter.HideGreeter && echo Greeter unlocked" 2>&1)
28−if echo "$UNLOCK_OUTPUT" | grep 'Greeter unlocked' >/dev/null; then
29− echo "I: Unlock passed"
30− exit 0
31−else
32− echo "I: Unlock failed, script output: '$UNLOCK_OUTPUT'"
33− exit 1
34−fi
34+echo "I: Too many unlock failures, giving up"
35+exit 1