on xenial help sign in
merge prereq
commitcd236867d7cc8ae0f455734098a8cb57f03e59e6 authorMichael Zanetti <michael.zanetti@canonical.com> dateWed 3 Dec 2014, 12:08 (12 years ago) parent6354820ef90709
141 files changed+1101−551
debian/changelog+57 debian/control+4−4 plugins/Dash/CMakeLists.txt+3−2 plugins/Dash/CardAttributes.qml+1−3 plugins/Dash/CardCreator.js+9−11 plugins/Dash/CroppedImageMinimumSourceSize.qml+24−18 plugins/Dash/ScopeStyle.qml+1−1 plugins/Dash/abstractdashview.h+4 plugins/Dash/croppedimagesizer.cpp+136 plugins/Dash/croppedimagesizer.h+72 plugins/Dash/croppedimagesizerasyncworker.cpp+74 plugins/Dash/croppedimagesizerasyncworker.h+47 plugins/Dash/horizontaljournal.cpp+5−1 plugins/Dash/horizontaljournal.h+4 plugins/Dash/listviewwithpageheader.cpp+2−2 plugins/Dash/organicgrid.cpp+5−1 plugins/Dash/organicgrid.h+4 plugins/Dash/plugin.cpp+2 plugins/Dash/verticaljournal.cpp+5−1 plugins/Dash/verticaljournal.h+4 po/am.po+2−2 po/ar.po+2−2 po/ast.po+2−2 po/az.po+2−2 po/be.po+2−2 po/bg.po+2−2 po/br.po+2−2 po/bs.po+2−2 po/ca.po+2−2 po/ca@valencia.po+4−4 po/ckb.po+2−2 po/cs.po+2−2 po/da.po+2−2 po/de.po+3−3 po/el.po+3−3 po/en_AU.po+2−2 po/en_GB.po+2−2 po/eo.po+2−2 po/es.po+2−2 po/eu.po+2−2 po/fa.po+2−2 po/fi.po+2−2 po/fo.po+2−2 po/fr.po+2−2 po/gd.po+2−2 po/gl.po+2−2 po/he.po+2−2 po/hi.po+2−2 po/hr.po+2−2 po/hu.po+2−2 po/hy.po+2−2 po/id.po+98−74 po/is.po+21−21 po/it.po+2−2 po/ja.po+14−15 po/km.po+2−2 po/kn.po+2−2 po/ko.po+2−2 po/ku.po+2−2 po/ky.po+2−2 po/lo.po+2−2 po/lt.po+2−2 po/lv.po+2−2 po/ml.po+2−2 po/mr.po+2−2 po/ms.po+2−2 po/my.po+2−2 po/nb.po+21−21 po/nl.po+2−2 po/pa.po+2−2 po/pl.po+2−2 po/pt.po+2−2 po/pt_BR.po+2−2 po/ro.po+4−4 po/ru.po+6−6 po/shn.po+2−2 po/si.po+2−2 po/sl.po+2−2 po/sq.po+2−2 po/sr.po+2−2 po/sv.po+2−2 po/sw.po+2−2 po/ta.po+2−2 po/te.po+2−2 po/th.po+2−2 po/tr.po+2−2 po/ug.po+3−3 po/uk.po+2−2 po/vi.po+2−2 po/xh.po+2−2 po/zh_CN.po+2−2 po/zh_HK.po+2−2 po/zh_TW.po+7−7 qml/Dash/CardCarousel.qml+1 qml/Dash/CardGrid.qml+1−1 qml/Dash/CardHorizontalList.qml+1 qml/Dash/CardTool.qml+1−1 qml/Dash/CardVerticalJournal.qml−1 qml/Dash/Dash.qml+11−3 qml/Dash/DashRenderer.qml−4 qml/Dash/GenericScopeView.qml+22−25 qml/Dash/Previews/PreviewActions.qml+2−1 qml/Dash/Previews/PreviewPayments.qml+1−1 qml/Dash/Previews/PreviewZoomableImage.qml+1 qml/Dash/ScopesOverviewAll.qml−2 qml/Launcher/LauncherPanel.qml+27−7 qml/Panel/IndicatorItem.qml+1−2 qml/Shell.qml+16−5 qml/Stages/PhoneStage.qml+18−34 qml/Stages/SpreadDelegate.qml+20−3 qml/Stages/TabletStage.qml+6−15 qml/graphics/applicationIcons/dash@18.png → qml/graphics/applicationIcons/dash.png src/CMakeLists.txt+4−1 src/CachingNetworkManagerFactory.cpp+2−11 src/CachingNetworkManagerFactory.h+2−6 src/Dash/CMakeLists.txt+1−1 tests/autopilot/unity8/application_lifecycle/tests/test_application_lifecycle.py+1−1 tests/autopilot/unity8/shell/emulators/dash.py+1−1 tests/plugins/Dash/CMakeLists.txt+1 tests/plugins/Dash/cardcreator/1.res+4−4 tests/plugins/Dash/cardcreator/2.res+2−3 tests/plugins/Dash/cardcreator/3.res+10−10 tests/plugins/Dash/cardcreator/4.res+3−4 tests/plugins/Dash/cardcreator/5.res+10−10 tests/plugins/Dash/cardcreator/6.res+1−1 tests/plugins/Dash/cardcreator/7.res+2−3 tests/plugins/Dash/tst_CroppedImageMinimumSourceSize.qml+56 tests/plugins/Dash/tst_ScopeStyle.qml+1−1 tests/qmltests/Dash/tst_Card.qml−22 tests/qmltests/Dash/tst_Dash.qml+20−2 tests/qmltests/Dash/tst_GenericScopeView.qml+3−2 tests/qmltests/Dash/tst_PreviewListView.qml+2−2 tests/qmltests/Panel/tst_IndicatorsBar.qml+1−1 tests/qmltests/Panel/tst_IndicatorsMenu.qml+3−3 tests/qmltests/Panel/tst_Panel.qml+5−10 tests/qmltests/Stages/tst_PhoneStage.qml+41−6 tests/qmltests/Stages/tst_SpreadDelegate.qml+11−5 tests/qmltests/tst_Shell.qml+1 tests/qmltests/tst_ShellWithPin.qml+1 tests/qmltests/tst_TabletShell.qml+1 tests/utils/modules/Unity/Test/UnityTestCase.qml+11−7
debian/changelog+57
@@ -1,3 +1,60 @@
1+unity8 (8.01+15.04.20141202-0ubuntu1) vivid; urgency=low
2+
3+ [ Michael Terry ]
4+ * Make sure that there is no window of opportunity for swiping away
5+ greeter before the lockscreen appears.
6+ * Don't allow dragging the greeter out from the left edge if it's
7+ hidden there. (LP: #1372952)
8+
9+ [ Michał Sawicz ]
10+ * Move from Theme colour to direct UbuntuColors.orange for activity
11+ indicator and preview buttons
12+
13+ [ Albert Astals ]
14+ * Use QImageReader not to load the image into memory twice (LP:
15+ #1384374)
16+ * Don't create the whole current scope delegates, just height * 3 (LP:
17+ #1384393, #1384374)
18+ * Make CroppedImageSizer async
19+ * Use ubuntu::connectivity::NetworkingStatus instead of
20+ QNetworkConfigurationManager
21+ * Compile with Qt 5.4 (LP: #1395636)
22+
23+ [ Michael Zanetti ]
24+ * close previews and temp scopes on left edge/BFB (LP: #1391798)
25+ * make spread reversible (LP: #1368668, #1355284, #1368677)
26+
27+ [ Andrea Cimitan ]
28+ * Different drag behaviour for not closable apps in spread (LP:
29+ #1368287)
30+
31+ [ Daniel d'Andrada ]
32+ * Make UnityTestCase.touchFlick properly map event coordinates
33+
34+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 02 Dec 2014 09:26:49 +0000
35+
36+unity8 (8.01+15.04.20141125.2-0ubuntu1) vivid; urgency=low
37+
38+ [ Michael Zanetti ]
39+ * improve snapping after dragging
40+ * Make the launcher BFB rounded on one end (LP: #1382596)
41+ * disable swipeToClose while some snapping is happening (LP: #1378938)
42+ * increase threshold and avoid jumping in SpreadDelegate dragging (LP:
43+ #1352842, #1350803)
44+
45+ [ Ying-Chun Liu ]
46+ * Notifications should be on right side when wide. (LP: 1379384) (LP:
47+ #1379384)
48+
49+ [ Albert Astals ]
50+ * Fix qml warnings
51+ * Fix some qmluitests
52+
53+ [ Lars Uebernickel ]
54+ * Use Icon instead of StatusIcon
55+
56+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 25 Nov 2014 13:54:47 +0000
57+
158unity8 (8.01+15.04.20141117-0ubuntu1) vivid; urgency=low
259
360 [ josharenson ]
debian/control+4−4
@@ -12,6 +12,7 @@ Build-Depends: cmake,
1212# in libstdc++ causing us issues, we explicitly select a G++
1313# version.
1414 g++-4.9,
15+ libconnectivity-qt1-dev,
1516 libgl1-mesa-dev[!armhf] | libgl-dev[!armhf],
1617 libgl1-mesa-dri,
1718 libgles2-mesa-dev[armhf],
@@ -44,7 +45,7 @@ Build-Depends: cmake,
4445 qtdeclarative5-private-dev (>= 5.2.1),
4546 qtdeclarative5-qtmultimedia-plugin,
4647 qtdeclarative5-ubuntu-settings-components (>= 0.4),
47− qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 0.1.49) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 0.1.49),
48+ qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.1.1239) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.1.1239),
4849 ttf-ubuntu-font-family,
4950Standards-Version: 3.9.4
5051Homepage: http://launchpad.net/unity
@@ -58,7 +59,7 @@ X-Ubuntu-Use-Langpack: yes
5859Package: indicators-client
5960Architecture: amd64 armhf i386
6061Depends: qmenumodel-qml (>= 0.2.8),
61− qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 0.1.49) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 0.1.49),
62+ qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.1.1239) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.1.1239),
6263 unity8 (= ${binary:Version}),
6364 ${misc:Depends},
6465 ${shlibs:Depends},
@@ -108,7 +109,7 @@ Architecture: all
108109Depends: qml-module-qtquick-layouts,
109110 qtdeclarative5-ubuntu-settings-components (>= 0.4),
110111 qtdeclarative5-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
111− qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 0.1.49) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 0.1.49),
112+ qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.1.1239) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.1.1239),
112113 qtdeclarative5-unity-notifications-plugin (>= 0.1.2) | unity-notifications-impl,
113114 ubuntu-thumbnailer-impl-0,
114115 unity-application-impl-4,
@@ -173,7 +174,6 @@ Depends: accountsservice-ubuntu-schemas (>= 0.0.3),
173174 libhardware2,
174175 unity-schemas (>= 7.3.1+14.10.20140915),
175176 pay-service,
176− qml-module-ubuntu-connectivity,
177177 ${misc:Depends},
178178 ${shlibs:Depends},
179179Provides: unity-launcher-impl,
plugins/Dash/CMakeLists.txt+3−2
@@ -11,7 +11,6 @@ include_directories(
1111 ${CMAKE_CURRENT_SOURCE_DIR}
1212 ${CMAKE_CURRENT_BINARY_DIR}
1313 ${Qt5Qml_PRIVATE_INCLUDE_DIRS}
14− ${Qt5Quick_INCLUDE_DIRS}
1514 ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
1615 ${Qt5V8_PRIVATE_INCLUDE_DIR}
1716)
@@ -25,6 +24,8 @@ set(QMLPLUGIN_SRC
2524 verticaljournal.cpp
2625 horizontaljournal.cpp
2726 organicgrid.cpp
27+ croppedimagesizer.cpp
28+ croppedimagesizerasyncworker.cpp
2829 )
2930
3031add_library(Dash-qml MODULE
@@ -36,6 +37,6 @@ target_link_libraries(Dash-qml
3637 ${Qt5Quick_LIBRARIES}
3738 )
3839
39−qt5_use_modules(Dash-qml Qml Quick)
40+qt5_use_modules(Dash-qml Qml Quick Concurrent)
4041
4142add_unity8_plugin(Dash 0.1 Dash TARGETS Dash-qml)
plugins/Dash/CardAttributes.qml+1−3
@@ -17,7 +17,6 @@
1717import QtQuick 2.2
1818import QtQuick.Layouts 1.1
1919import Ubuntu.Components 1.1
20−import Ubuntu.Settings.Components 0.1
2120
2221GridLayout {
2322 id: grid
@@ -47,10 +46,9 @@ GridLayout {
4746 Layout.maximumWidth: Math.max(icon.width, label.x + label.implicitWidth)
4847 Layout.fillWidth: true
4948 height: units.gu(2)
50− StatusIcon {
49+ Icon {
5150 id: icon
5251 height: units.gu(2)
53− sets: ["actions", "status", "apps"]
5452 source: "icon" in modelData && modelData["icon"] || ""
5553 color: grid.color
5654 }
plugins/Dash/CardCreator.js+9−11
@@ -82,16 +82,16 @@ var kArtShapeHolderCode = 'Item { \n\
8282 height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height }); \n\
8383 } \n\
8484 } \n\
85− image: CroppedImageMinimumSourceSize { \n\
85+ CroppedImageMinimumSourceSize { \n\
86+ id: artImage; \n\
8687 objectName: "artImage"; \n\
87− property bool doLoadSource: !NetworkingStatus.limitedBandwith; \n\
88− source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["art"] || ""; } \n\
89− cache: true; \n\
88+ source: cardData && cardData["art"] || ""; \n\
9089 asynchronous: root.asynchronous; \n\
9190 visible: false; \n\
9291 width: %2; \n\
9392 height: %3; \n\
9493 } \n\
94+ image: artImage.image; \n\
9595 } \n\
9696 } \n\
9797 }\n';
@@ -181,11 +181,11 @@ var kMascotShapeLoaderCode = 'Loader { \n\
181181 id: mascotShapeLoader; \n\
182182 objectName: "mascotShapeLoader"; \n\
183183 asynchronous: root.asynchronous; \n\
184− active: mascotImage.status === Image.Ready; \n\
184+ active: mascotImage.image.status === Image.Ready; \n\
185185 visible: showHeader && active && status == Loader.Ready; \n\
186186 width: units.gu(6); \n\
187187 height: units.gu(5.625); \n\
188− sourceComponent: UbuntuShape { image: mascotImage } \n\
188+ sourceComponent: UbuntuShape { image: mascotImage.image } \n\
189189 anchors { %1 } \n\
190190 }\n';
191191
@@ -195,8 +195,7 @@ var kMascotImageCode = 'CroppedImageMinimumSourceSize { \n\
195195 id: mascotImage; \n\
196196 objectName: "mascotImage"; \n\
197197 anchors { %1 } \n\
198− property bool doLoadSource: !NetworkingStatus.limitedBandwith; \n\
199− source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["mascot"] || ""; } \n\
198+ source: cardData && cardData["mascot"] || ""; \n\
200199 width: units.gu(6); \n\
201200 height: units.gu(5.625); \n\
202201 horizontalAlignment: Image.AlignHCenter; \n\
@@ -225,7 +224,7 @@ var kTitleLabelCode = 'Label { \n\
225224
226225// %1 is used as extra anchors of emblemIcon
227226// %2 is used as color of emblemIcon
228−var kEmblemIconCode = 'StatusIcon { \n\
227+var kEmblemIconCode = 'Icon { \n\
229228 id: emblemIcon; \n\
230229 objectName: "emblemIcon"; \n\
231230 anchors { \n\
@@ -435,7 +434,7 @@ function cardString(template, components) {
435434 mascotShapeCode = kMascotShapeLoaderCode.arg(mascotAnchors);
436435 }
437436
438− var mascotImageVisible = useMascotShape ? 'false' : 'showHeader && resized';
437+ var mascotImageVisible = useMascotShape ? 'false' : 'showHeader';
439438 mascotCode = kMascotImageCode.arg(mascotAnchors).arg(mascotImageVisible);
440439 }
441440
@@ -655,7 +654,6 @@ function createCardComponent(parent, template, components) {
655654 var imports = 'import QtQuick 2.2; \n\
656655 import Ubuntu.Components 1.1; \n\
657656 import Ubuntu.Settings.Components 0.1; \n\
658− import Ubuntu.Connectivity 1.0; \n\
659657 import Dash 0.1;\n\
660658 import Utils 0.1;\n';
661659 var card = cardString(template, components);
plugins/Dash/CroppedImageMinimumSourceSize.qml+24−18
@@ -15,24 +15,30 @@
1515 */
1616
1717import QtQuick 2.3
18+import Dash 0.1
1819
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− }
20+Item {
21+ id: root
22+
23+ property string source
24+ property alias image: innerImage
25+ property alias asynchronous: innerImage.asynchronous
26+ property alias verticalAlignment: innerImage.verticalAlignment
27+ property alias horizontalAlignment: innerImage.horizontalAlignment
28+ property alias fillMode: innerImage.fillMode
29+
30+ CroppedImageSizer {
31+ id: sizer
32+ source: root.source
33+ width: root.width
34+ height: root.height
35+ }
36+
37+ Image {
38+ id: innerImage
39+ anchors.fill: parent
40+ fillMode: Image.PreserveAspectCrop
41+ sourceSize: sizer.sourceSize.width == 0 && sizer.sourceSize.height == 0 ? undefined : sizer.sourceSize
42+ source: sizer.sourceSize.width == -1 && sizer.sourceSize.height == -1 ? "" : root.source
3743 }
3844}
plugins/Dash/ScopeStyle.qml+1−1
@@ -70,7 +70,7 @@ QtObject {
7070 readonly property url navigationBackground: "navigation-background" in d.headerStyle ? d.headerStyle["navigation-background"] : "color:///#f5f5f5"
7171
7272 /// Color of the primary preview button
73− readonly property color previewButtonColor: "preview-button-color" in style ? style["preview-button-color"] : Theme.palette.selected.foreground
73+ readonly property color previewButtonColor: "preview-button-color" in style ? style["preview-button-color"] : UbuntuColors.orange
7474
7575 //! @cond
7676 property var d: QtObject {
plugins/Dash/abstractdashview.h+4
@@ -104,7 +104,11 @@ private:
104104 virtual void doRelayout() = 0;
105105 virtual void updateItemCulling(qreal visibleFromY, qreal visibleToY) = 0;
106106 virtual void calculateImplicitHeight() = 0;
107+#if (QT_VERSION < QT_VERSION_CHECK(5, 4, 0))
107108 virtual void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) = 0;
109+#else
110+ virtual void processModelRemoves(const QVector<QQmlChangeSet::Change> &removes) = 0;
111+#endif
108112
109113 QQmlDelegateModel *m_delegateModel;
110114
plugins/Dash/croppedimagesizer.cppnew file+136
@@ -0,0 +1,136 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "croppedimagesizer.h"
18+
19+#include "croppedimagesizerasyncworker.h"
20+
21+#include <QNetworkAccessManager>
22+#include <QNetworkRequest>
23+#include <QQmlEngine>
24+#include <QQuickItem>
25+
26+CroppedImageSizer::CroppedImageSizer()
27+ : m_width(0),
28+ m_height(0),
29+ m_sourceSize(QSize(-1, -1)),
30+ m_worker(nullptr)
31+{
32+ connect(this, &CroppedImageSizer::inputParamsChanged, this, &CroppedImageSizer::calculateSourceSize);
33+ connect(this, &CroppedImageSizer::sourceChanged, this, &CroppedImageSizer::requestImage);
34+}
35+
36+CroppedImageSizer::~CroppedImageSizer()
37+{
38+ if (m_worker) {
39+ m_worker->abort();
40+ }
41+}
42+
43+QUrl CroppedImageSizer::source() const
44+{
45+ return m_source;
46+}
47+
48+void CroppedImageSizer::setSource(const QUrl &source)
49+{
50+ if (source != m_source) {
51+ m_source = source;
52+ Q_EMIT sourceChanged();
53+ }
54+}
55+
56+qreal CroppedImageSizer::width() const
57+{
58+ return m_width;
59+}
60+
61+void CroppedImageSizer::setWidth(qreal width)
62+{
63+ if (width != m_width) {
64+ m_width = width;
65+ Q_EMIT inputParamsChanged();
66+ }
67+}
68+
69+qreal CroppedImageSizer::height() const
70+{
71+ return m_height;
72+}
73+
74+void CroppedImageSizer::setHeight(qreal height)
75+{
76+ if (height != m_height) {
77+ m_height = height;
78+ Q_EMIT inputParamsChanged();
79+ }
80+}
81+
82+QSize CroppedImageSizer::sourceSize() const
83+{
84+ return m_sourceSize;
85+}
86+
87+void CroppedImageSizer::setSourceSize(const QSize &sourceSize)
88+{
89+ if (sourceSize != m_sourceSize) {
90+ m_sourceSize = sourceSize;
91+ Q_EMIT sourceSizeChanged();
92+ }
93+}
94+
95+void CroppedImageSizer::setImageSize(const QSize &imageSize)
96+{
97+ m_imageSize = imageSize;
98+ m_worker = nullptr;
99+ calculateSourceSize();
100+}
101+
102+void CroppedImageSizer::requestImage()
103+{
104+ if (m_worker) {
105+ m_worker->abort();
106+ m_worker = nullptr;
107+ }
108+
109+ if (m_source.isValid() && qmlEngine(this) && qmlEngine(this)->networkAccessManager()) {
110+ QNetworkRequest request(m_source);
111+ QNetworkReply *reply = qmlEngine(this)->networkAccessManager()->get(request);
112+ m_worker = new CroppedImageSizerAsyncWorker(this, reply);
113+ } else {
114+ setSourceSize(QSize(-1, -1));
115+ }
116+}
117+
118+void CroppedImageSizer::calculateSourceSize()
119+{
120+ if (m_source.isValid() && m_width > 0 && m_height > 0 && !m_worker) {
121+ if (!m_imageSize.isEmpty()) {
122+ const qreal ar = m_width / m_height;
123+ const qreal ssar = m_imageSize.width() / (qreal)m_imageSize.height();
124+ if (ar > ssar) {
125+ setSourceSize(QSize(m_width, 0));
126+ } else {
127+ setSourceSize(QSize(0, m_height));
128+ }
129+ } else {
130+ qWarning() << "Invalid size for " << m_source << m_imageSize;
131+ setSourceSize(QSize(0, 0));
132+ }
133+ } else {
134+ setSourceSize(QSize(-1, -1));
135+ }
136+}
plugins/Dash/croppedimagesizer.hnew file+72
@@ -0,0 +1,72 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef CROPPEDIMAGESIZER_H
18+#define CROPPEDIMAGESIZER_H
19+
20+#include <QImageReader>
21+#include <QObject>
22+#include <QSize>
23+#include <QUrl>
24+
25+class CroppedImageSizerAsyncWorker;
26+
27+class CroppedImageSizer : public QObject
28+{
29+ Q_OBJECT
30+
31+ Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
32+ Q_PROPERTY(qreal width READ width WRITE setWidth NOTIFY inputParamsChanged)
33+ Q_PROPERTY(qreal height READ height WRITE setHeight NOTIFY inputParamsChanged)
34+ Q_PROPERTY(QSize sourceSize READ sourceSize NOTIFY sourceSizeChanged)
35+
36+public:
37+ CroppedImageSizer();
38+ ~CroppedImageSizer();
39+
40+ QUrl source() const;
41+ void setSource(const QUrl &source);
42+
43+ qreal width() const;
44+ void setWidth(qreal width);
45+
46+ qreal height() const;
47+ void setHeight(qreal height);
48+
49+ QSize sourceSize() const;
50+ void setSourceSize(const QSize &sourceSize);
51+
52+ Q_INVOKABLE void setImageSize(const QSize &imageSize);
53+
54+Q_SIGNALS:
55+ void inputParamsChanged();
56+ void sourceChanged();
57+ void sourceSizeChanged();
58+
59+private Q_SLOT:
60+ void calculateSourceSize();
61+ void requestImage();
62+
63+private:
64+ QUrl m_source;
65+ qreal m_width;
66+ qreal m_height;
67+ QSize m_sourceSize;
68+ QSize m_imageSize;
69+ QPointer<CroppedImageSizerAsyncWorker> m_worker;
70+};
71+
72+#endif
plugins/Dash/croppedimagesizerasyncworker.cppnew file+74
@@ -0,0 +1,74 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "croppedimagesizerasyncworker.h"
18+
19+#include "croppedimagesizer.h"
20+
21+#include <QNetworkReply>
22+#include <QtConcurrentRun>
23+
24+CroppedImageSizerAsyncWorker::CroppedImageSizerAsyncWorker(CroppedImageSizer *sizer, QNetworkReply *reply)
25+ : m_sizer(sizer),
26+ m_reply(reply),
27+ m_ignoreAbort(false)
28+{
29+ connect(m_reply, &QNetworkReply::finished, this, &CroppedImageSizerAsyncWorker::requestFinished);
30+}
31+
32+void CroppedImageSizerAsyncWorker::abort()
33+{
34+ // This runs on main thread
35+ QMutexLocker locker(&m_mutex);
36+ m_sizer = nullptr;
37+ // If we already started the future run we can't abort the reply
38+ // since we don't know at which stage the future is, just let it finish
39+ if (!m_ignoreAbort) {
40+ QMetaObject::invokeMethod(m_reply, "abort", Qt::QueuedConnection);
41+ }
42+}
43+
44+void CroppedImageSizerAsyncWorker::requestFinished()
45+{
46+ // This runs on main thread
47+ QMutexLocker locker(&m_mutex);
48+ if (m_sizer) {
49+ m_ignoreAbort = true;
50+ QtConcurrent::run(processRequestFinished, this);
51+ } else {
52+ // We were aborted delete ourselves
53+ m_reply->deleteLater();
54+ deleteLater();
55+ }
56+}
57+
58+void CroppedImageSizerAsyncWorker::processRequestFinished(CroppedImageSizerAsyncWorker *worker)
59+{
60+ // This runs on non main thread
61+ // m_reply has finished at this point and is protected against change by m_ignoreAbort
62+ QImageReader reader(worker->m_reply);
63+ const QSize imageSize = reader.size();
64+
65+ worker->m_mutex.lock();
66+ if (worker->m_sizer) {
67+ QMetaObject::invokeMethod(worker->m_sizer, "setImageSize", Qt::QueuedConnection, Q_ARG(QSize, imageSize));
68+ }
69+ worker->m_mutex.unlock();
70+
71+ // All work is done, delete ourselves
72+ worker->m_reply->deleteLater();
73+ worker->deleteLater();
74+}
plugins/Dash/croppedimagesizerasyncworker.hnew file+47
@@ -0,0 +1,47 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef CROPPEDIMAGESIZERASYNCWORKER_H
18+#define CROPPEDIMAGESIZERASYNCWORKER_H
19+
20+#include <QMutex>
21+#include <QObject>
22+
23+class CroppedImageSizer;
24+
25+class QNetworkReply;
26+
27+class CroppedImageSizerAsyncWorker : public QObject
28+{
29+ Q_OBJECT
30+public:
31+ CroppedImageSizerAsyncWorker(CroppedImageSizer *sizer, QNetworkReply *reply);
32+
33+ void abort();
34+
35+private Q_SLOTS:
36+ void requestFinished();
37+
38+private:
39+ static void processRequestFinished(CroppedImageSizerAsyncWorker *worker);
40+
41+ QMutex m_mutex;
42+ CroppedImageSizer *m_sizer;
43+ QNetworkReply *m_reply;
44+ bool m_ignoreAbort;
45+};
46+
47+#endif
plugins/Dash/horizontaljournal.cpp+5−1
@@ -184,9 +184,13 @@ void HorizontalJournal::calculateImplicitHeight()
184184 }
185185}
186186
187+#if (QT_VERSION < QT_VERSION_CHECK(5, 4, 0))
187188void HorizontalJournal::processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes)
189+#else
190+void HorizontalJournal::processModelRemoves(const QVector<QQmlChangeSet::Change> &removes)
191+#endif
188192{
189− Q_FOREACH(const QQmlChangeSet::Remove &remove, removes) {
193+ Q_FOREACH(const QQmlChangeSet::Change &remove, removes) {
190194 for (int i = remove.count - 1; i >= 0; --i) {
191195 const int indexToRemove = remove.index + i;
192196 // We only support removing from the end so
plugins/Dash/horizontaljournal.h+4
@@ -52,7 +52,11 @@ private:
5252 void calculateImplicitHeight() override;
5353 void doRelayout() override;
5454 void updateItemCulling(qreal visibleFromY, qreal visibleToY) override;
55+#if (QT_VERSION < QT_VERSION_CHECK(5, 4, 0))
5556 void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) override;
57+#else
58+ void processModelRemoves(const QVector<QQmlChangeSet::Change> &removes) override;
59+#endif
5660
5761 int m_firstVisibleIndex;
5862 QList<QQuickItem*> m_visibleItems;
plugins/Dash/listviewwithpageheader.cpp+2−2
@@ -936,7 +936,7 @@ void ListViewWithPageHeader::onModelUpdated(const QQmlChangeSet &changeSet, bool
936936// qDebug() << "ListViewWithPageHeader::onModelUpdated" << changeSet << reset;
937937 const auto oldFirstVisibleIndex = m_firstVisibleIndex;
938938
939− Q_FOREACH(const QQmlChangeSet::Remove &remove, changeSet.removes()) {
939+ Q_FOREACH(const QQmlChangeSet::Change &remove, changeSet.removes()) {
940940// qDebug() << "ListViewWithPageHeader::onModelUpdated Remove" << remove.index << remove.count;
941941 if (remove.index + remove.count > m_firstVisibleIndex && remove.index < m_firstVisibleIndex + m_visibleItems.count()) {
942942 const qreal oldFirstValidIndexPos = m_visibleItems.first()->y();
@@ -990,7 +990,7 @@ void ListViewWithPageHeader::onModelUpdated(const QQmlChangeSet &changeSet, bool
990990 }
991991 }
992992
993− Q_FOREACH(const QQmlChangeSet::Insert &insert, changeSet.inserts()) {
993+ Q_FOREACH(const QQmlChangeSet::Change &insert, changeSet.inserts()) {
994994// qDebug() << "ListViewWithPageHeader::onModelUpdated Insert" << insert.index << insert.count;
995995 const bool insertingInValidIndexes = insert.index > m_firstVisibleIndex && insert.index < m_firstVisibleIndex + m_visibleItems.count();
996996 const bool firstItemWithViewOnTop = insert.index == 0 && m_firstVisibleIndex == 0 && m_visibleItems.first()->y() + m_clipItem->y() > contentY();
plugins/Dash/organicgrid.cpp+5−1
@@ -237,9 +237,13 @@ void OrganicGrid::calculateImplicitHeight()
237237 }
238238}
239239
240+#if (QT_VERSION < QT_VERSION_CHECK(5, 4, 0))
240241void OrganicGrid::processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes)
242+#else
243+void OrganicGrid::processModelRemoves(const QVector<QQmlChangeSet::Change> &removes)
244+#endif
241245{
242− Q_FOREACH(const QQmlChangeSet::Remove &remove, removes) {
246+ Q_FOREACH(const QQmlChangeSet::Change &remove, removes) {
243247 for (int i = remove.count - 1; i >= 0; --i) {
244248 const int indexToRemove = remove.index + i;
245249 // We only support removing from the end
plugins/Dash/organicgrid.h+4
@@ -79,7 +79,11 @@ private:
7979 void doRelayout() override;
8080 void updateItemCulling(qreal visibleFromY, qreal visibleToY) override;
8181 void calculateImplicitHeight() override;
82+#if (QT_VERSION < QT_VERSION_CHECK(5, 4, 0))
8283 void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) override;
84+#else
85+ void processModelRemoves(const QVector<QQmlChangeSet::Change> &removes) override;
86+#endif
8387
8488 QSizeF m_smallDelegateSize;
8589 QSizeF m_bigDelegateSize;
plugins/Dash/plugin.cpp+2
@@ -17,6 +17,7 @@
1717
1818#include "plugin.h"
1919
20+#include "croppedimagesizer.h"
2021#include "horizontaljournal.h"
2122#include "listviewwithpageheader.h"
2223#include "organicgrid.h"
@@ -32,4 +33,5 @@ void DashPlugin::registerTypes(const char *uri)
3233 qmlRegisterType<ListViewWithPageHeader>(uri, 0, 1, "ListViewWithPageHeader");
3334 qmlRegisterType<OrganicGrid>(uri, 0, 1, "OrganicGrid");
3435 qmlRegisterType<VerticalJournal>(uri, 0, 1, "VerticalJournal");
36+ qmlRegisterType<CroppedImageSizer>(uri, 0, 1, "CroppedImageSizer");
3537}
plugins/Dash/verticaljournal.cpp+5−1
@@ -239,9 +239,13 @@ void VerticalJournal::updateItemCulling(qreal visibleFromY, qreal visibleToY)
239239 }
240240}
241241
242+#if (QT_VERSION < QT_VERSION_CHECK(5, 4, 0))
242243void VerticalJournal::processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes)
244+#else
245+void VerticalJournal::processModelRemoves(const QVector<QQmlChangeSet::Change> &removes)
246+#endif
243247{
244− Q_FOREACH(const QQmlChangeSet::Remove &remove, removes) {
248+ Q_FOREACH(const QQmlChangeSet::Change &remove, removes) {
245249 for (int i = remove.count - 1; i >= 0; --i) {
246250 const int indexToRemove = remove.index + i;
247251 // Since we only support removing from the end, indexToRemove
plugins/Dash/verticaljournal.h+4
@@ -90,7 +90,11 @@ private:
9090 void calculateImplicitHeight() override;
9191 void doRelayout() override;
9292 void updateItemCulling(qreal visibleFromY, qreal visibleToY) override;
93+#if (QT_VERSION < QT_VERSION_CHECK(5, 4, 0))
9394 void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) override;
95+#else
96+ void processModelRemoves(const QVector<QQmlChangeSet::Change> &removes) override;
97+#endif
9498
9599 QVector<QList<ViewItem>> m_columnVisibleItems;
96100 QHash<int, int> m_indexColumnMap;
po/am.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:49+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/ar.po+2−2
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
1818"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
19−"X-Launchpad-Export-Date: 2014-11-09 06:54+0000\n"
20−"X-Generator: Launchpad (build 17231)\n"
19+"X-Launchpad-Export-Date: 2014-12-03 06:49+0000\n"
20+"X-Generator: Launchpad (build 17274)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
2323msgid "Password: "
po/ast.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:49+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/az.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:49+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/be.po+2−2
@@ -16,8 +16,8 @@ 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-11-09 06:54+0000\n"
20−"X-Generator: Launchpad (build 17231)\n"
19+"X-Launchpad-Export-Date: 2014-12-03 06:49+0000\n"
20+"X-Generator: Launchpad (build 17274)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
2323msgid "Password: "
po/bg.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:49+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/br.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:49+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/bs.po+2−2
@@ -16,8 +16,8 @@ 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-11-09 06:54+0000\n"
20−"X-Generator: Launchpad (build 17231)\n"
19+"X-Launchpad-Export-Date: 2014-12-03 06:49+0000\n"
20+"X-Generator: Launchpad (build 17274)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
2323msgid "Password: "
po/ca.po+2−2
@@ -15,8 +15,8 @@ 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-11-11 07:11+0000\n"
19−"X-Generator: Launchpad (build 17241)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/ca@valencia.po+4−4
@@ -8,15 +8,15 @@ msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-11-07 10:59+0100\n"
11−"PO-Revision-Date: 2014-10-15 14:39+0000\n"
11+"PO-Revision-Date: 2014-11-23 07:17+0000\n"
1212"Last-Translator: Pau Iranzo <Unknown>\n"
1313"Language-Team: Catalan <ca@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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
@@ -168,7 +168,7 @@ msgstr ""
168168
169169#: qml/Components/Lockscreen.qml:223
170170msgid "Return to Call"
171−msgstr ""
171+msgstr "Torna a la trucada"
172172
173173#: qml/Components/Lockscreen.qml:223
174174msgid "Emergency Call"
po/ckb.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/cs.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2014-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/da.po+2−2
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Type: text/plain; charset=UTF-8\n"
1717"Content-Transfer-Encoding: 8bit\n"
1818"Plural-Forms: nplurals=2; plural=n != 1;\n"
19−"X-Launchpad-Export-Date: 2014-11-09 06:54+0000\n"
20−"X-Generator: Launchpad (build 17231)\n"
19+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
20+"X-Generator: Launchpad (build 17274)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
2323msgid "Password: "
po/de.po+3−3
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
@@ -165,7 +165,7 @@ msgstr ""
165165
166166#: qml/Components/Lockscreen.qml:223
167167msgid "Return to Call"
168−msgstr ""
168+msgstr "Zu Anruf zurückkehren"
169169
170170#: qml/Components/Lockscreen.qml:223
171171msgid "Emergency Call"
po/el.po+3−3
@@ -9,14 +9,14 @@ msgstr ""
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-11-07 10:59+0100\n"
1111"PO-Revision-Date: 2014-11-08 18:38+0000\n"
12−"Last-Translator: Stathis Iosifidis <Unknown>\n"
12+"Last-Translator: Efstathios Iosifidis <Unknown>\n"
1313"Language-Team: Greek <el@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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/en_AU.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/en_GB.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/eo.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/es.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/eu.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:49+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/fa.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/fi.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/fo.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/fr.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/gd.po+2−2
@@ -16,8 +16,8 @@ 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-11-10 06:09+0000\n"
20−"X-Generator: Launchpad (build 17231)\n"
19+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
20+"X-Generator: Launchpad (build 17274)\n"
2121"Language: gd\n"
2222
2323#: plugins/LightDM/Greeter.cpp:130
po/gl.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/he.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/hi.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/hr.po+2−2
@@ -16,8 +16,8 @@ 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-11-09 06:54+0000\n"
20−"X-Generator: Launchpad (build 17231)\n"
19+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
20+"X-Generator: Launchpad (build 17274)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
2323msgid "Password: "
po/hu.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/hy.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:49+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/id.po+98−74
@@ -15,330 +15,354 @@ msgstr ""
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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
23−msgstr ""
23+msgstr "Sandi: "
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:45
2626#: plugins/Unity/Launcher/launcheritem.cpp:91
2727msgid "Pin shortcut"
28−msgstr ""
28+msgstr "Paku pintasan"
2929
3030#: plugins/Unity/Launcher/launcheritem.cpp:91
3131msgid "Unpin shortcut"
32−msgstr ""
32+msgstr "Lepas pintasan"
3333
3434#: qml/Components/DelayedLockscreen.qml:47
3535msgid "Device Locked"
36−msgstr ""
36+msgstr "Perangkat Terkunci"
3737
3838#: qml/Components/DelayedLockscreen.qml:62
3939msgid "You have been locked out due to too many failed passphrase attempts."
4040msgstr ""
41+"Anda telah terkunci karena terlalu banyak percobaan frasa sandi yang gagal."
4142
4243#: qml/Components/DelayedLockscreen.qml:63
4344msgid "You have been locked out due to too many failed passcode attempts."
4445msgstr ""
46+"Anda telah terkunci karena terlalu banyak percobaan kode sandi yang gagal."
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] "Harap tunggu %1 menit lalu coba lagi..."
5253
5354#: qml/Components/Dialogs.qml:74
5455msgid "Log out"
55−msgstr ""
56+msgstr "Log keluar"
5657
5758#: qml/Components/Dialogs.qml:75
5859msgid "Are you sure you want to log out?"
59−msgstr ""
60+msgstr "Anda yakin ingin log keluar?"
6061
6162#: qml/Components/Dialogs.qml:77 qml/Components/Dialogs.qml:101
6263#: qml/Components/Dialogs.qml:126
6364msgid "No"
64−msgstr ""
65+msgstr "Tidak"
6566
6667#: qml/Components/Dialogs.qml:84 qml/Components/Dialogs.qml:108
6768#: qml/Components/Dialogs.qml:133
6869msgid "Yes"
69−msgstr ""
70+msgstr "Ya"
7071
7172#: qml/Components/Dialogs.qml:98
7273msgid "Shut down"
73−msgstr ""
74+msgstr "Matikan"
7475
7576#: qml/Components/Dialogs.qml:99
7677msgid "Are you sure you want to shut down?"
77−msgstr ""
78+msgstr "Anda yakin ingin mematikan?"
7879
7980#: qml/Components/Dialogs.qml:123
8081msgid "Reboot"
81−msgstr ""
82+msgstr "Boot ulang"
8283
8384#: qml/Components/Dialogs.qml:124
8485msgid "Are you sure you want to reboot?"
85−msgstr ""
86+msgstr "Anda yakin ingin boot ulang?"
8687
8788#: qml/Components/Dialogs.qml:148
8889msgid "Power"
89−msgstr ""
90+msgstr "Daya"
9091
9192#: qml/Components/Dialogs.qml:149
9293msgid ""
9394"Are you sure you would like\n"
9495"to power off?"
9596msgstr ""
97+"Anda yakin ingin\n"
98+"mematikan daya?"
9699
97100#: qml/Components/Dialogs.qml:151
98101msgid "Power off"
99−msgstr ""
102+msgstr "Matikan"
100103
101104#: qml/Components/Dialogs.qml:161
102105msgid "Restart"
103−msgstr ""
106+msgstr "Nyalakan ulang"
104107
105108#: qml/Components/Dialogs.qml:171
106109msgid "Cancel"
107−msgstr ""
110+msgstr "Batal"
108111
109112#: qml/Components/EdgeDemoOverlay.qml:151
110113msgid "Skip intro"
111−msgstr ""
114+msgstr "Lewati pengenalan"
112115
113116#: qml/Components/EdgeDemo.qml:112
114117msgid "Right edge"
115−msgstr ""
118+msgstr "Tepi kanan"
116119
117120#: qml/Components/EdgeDemo.qml:113
118121msgid "Try swiping from the right edge to unlock the phone"
119−msgstr ""
122+msgstr "Coba usap dari tepi kanan untuk membuka kunci telepon"
120123
121124#: qml/Components/EdgeDemo.qml:144
122125msgid "Top edge"
123−msgstr ""
126+msgstr "Tepi atas"
124127
125128#: qml/Components/EdgeDemo.qml:145
126129msgid "Try swiping from the top edge to access the indicators"
127−msgstr ""
130+msgstr "Coba usap dari tepi atas untuk mengakses indikator"
128131
129132#: qml/Components/EdgeDemo.qml:170
130133msgid "Close"
131−msgstr ""
134+msgstr "Tutup"
132135
133136#: qml/Components/EdgeDemo.qml:171
134137msgid "Swipe up again to close the settings screen"
135−msgstr ""
138+msgstr "Usap ke atas lagi untuk menutup layar pengaturan"
136139
137140#: qml/Components/EdgeDemo.qml:201
138141msgid "Left edge"
139−msgstr ""
142+msgstr "Tepi kiri"
140143
141144#: qml/Components/EdgeDemo.qml:202
142145msgid "Swipe from the left to reveal the launcher for quick access to apps"
143−msgstr ""
146+msgstr "Usap dari tepi kiri menampilkan peluncur untuk akses cepat aplikasi"
144147
145148#: qml/Components/EdgeDemo.qml:229
146149msgid "Well done"
147−msgstr ""
150+msgstr "Bagus sekali"
148151
149152#: qml/Components/EdgeDemo.qml:230
150153msgid ""
151154"You have now mastered the edge gestures and can start using the "
152155"phone<br><br>Tap on the screen to start"
153156msgstr ""
157+"Anda kini telah menguasai gestur tepi dan dapat mulai memakai "
158+"telepon<br><br>Ketuk pada layar untuk mulai"
154159
155160#: qml/Components/Lockscreen.qml:223
156161msgid "Return to Call"
157−msgstr ""
162+msgstr "Kembali ke Panggilan"
158163
159164#: qml/Components/Lockscreen.qml:223
160165msgid "Emergency Call"
161−msgstr ""
166+msgstr "Panggilan Darurat"
162167
163168#: qml/Components/Lockscreen.qml:255
164169msgid "OK"
165−msgstr ""
170+msgstr "OK"
166171
167172#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
168173msgid "See less"
169−msgstr ""
174+msgstr "Lihat lebih sedikit"
170175
171176#: qml/Dash/GenericScopeView.qml:434
172177msgid "See all"
173−msgstr ""
178+msgstr "Lihat semua"
174179
175180#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
176181#: qml/Panel/SearchIndicator.qml:27
177182msgid "Search"
178−msgstr ""
183+msgstr "Cari"
179184
180185#: qml/Dash/PageHeader.qml:268
181186msgid "Settings"
182−msgstr ""
187+msgstr "Pengaturan"
183188
184189#: qml/Dash/PageHeader.qml:275
185190msgid "Remove from Favorites"
186−msgstr ""
191+msgstr "Hapus dari Favorit"
187192
188193#: qml/Dash/PageHeader.qml:275
189194msgid "Add to Favorites"
190−msgstr ""
195+msgstr "Tambah ke Favorit"
191196
192197#: qml/Dash/Previews/PreviewActionCombo.qml:35
193198msgid "More..."
194−msgstr ""
199+msgstr "Lebih..."
195200
196201#: qml/Dash/Previews/PreviewActionCombo.qml:35
197202msgid "Less..."
198−msgstr ""
203+msgstr "Kurang..."
199204
200205#: qml/Dash/Previews/PreviewRatingInput.qml:81
201206msgid "Rate this"
202−msgstr ""
207+msgstr "Beri peringkat"
203208
204209#: qml/Dash/Previews/PreviewRatingInput.qml:126
205210msgid "Add a review"
206−msgstr ""
211+msgstr "Berikan ulasan"
207212
208213#: qml/Dash/Previews/PreviewRatingInput.qml:166
209214msgid "Send"
210−msgstr ""
215+msgstr "Kirim"
211216
212217#: qml/Dash/PullToRefreshScopeStyle.qml:55
213218msgid "Pull to refresh…"
214−msgstr ""
219+msgstr "Tarik untuk menyegarkan..."
215220
216221#: qml/Dash/PullToRefreshScopeStyle.qml:60
217222msgid "Release to refresh…"
218−msgstr ""
223+msgstr "Lepas untuk menyegarkan..."
219224
220225#: qml/Dash/ScopesOverview.qml:215
221226msgid "Manage Scopes"
222−msgstr ""
227+msgstr "Kelola Skup"
223228
224229#: qml/Dash/ScopesOverview.qml:437
225230msgid "Done"
226−msgstr ""
231+msgstr "Selesai"
227232
228233#: qml/Dash/ScopesOverview.qml:463
229234msgid "Store"
230−msgstr ""
235+msgstr "Simpan"
231236
232237#: qml/Dash/ScopesOverviewTab.qml:36
233238msgid "Favorites"
234−msgstr ""
239+msgstr "Favorit"
235240
236241#: qml/Dash/ScopesOverviewTab.qml:54
237242msgid "All"
238−msgstr ""
243+msgstr "Semua"
239244
240245#: qml/Greeter/Greeter.qml:174
241246msgid "Unlock"
242−msgstr ""
247+msgstr "Buka kunci"
243248
244249#: qml/Notifications/NotificationMenuItemFactory.qml:116
245250msgid "Show password"
246−msgstr ""
251+msgstr "Tampilkan sandi"
247252
248253#: qml/Panel/ActiveCallHint.qml:79
249254msgid "Tap to return to call..."
250−msgstr ""
255+msgstr "Ketuk untuk kembali ke panggilan..."
251256
252257#: qml/Panel/ActiveCallHint.qml:92
253258msgid "Conference"
254−msgstr ""
259+msgstr "Konferensi"
255260
256261#: qml/Panel/Indicators/MenuItemFactory.qml:643
257262msgid "Nothing is playing"
258−msgstr ""
263+msgstr "Tak ada yang sedang diputar"
259264
260265#: qml/Panel/Indicators/MenuItemFactory.qml:791
261266msgid "In queue…"
262−msgstr ""
267+msgstr "Dalam antrian..."
263268
264269#: qml/Panel/Indicators/MenuItemFactory.qml:795
265270msgid "Downloading"
266−msgstr ""
271+msgstr "Sedang mengunduh"
267272
268273#: qml/Panel/Indicators/MenuItemFactory.qml:797
269274msgid "Paused, tap to resume"
270−msgstr ""
275+msgstr "Jeda, ketuk untuk melanjutkan"
271276
272277#: qml/Panel/Indicators/MenuItemFactory.qml:799
273278msgid "Canceled"
274−msgstr ""
279+msgstr "Dibatalkan"
275280
276281#: qml/Panel/Indicators/MenuItemFactory.qml:801
277282msgid "Finished"
278−msgstr ""
283+msgstr "Selesai"
279284
280285#: qml/Panel/Indicators/MenuItemFactory.qml:803
281286msgid "Failed, tap to retry"
282−msgstr ""
287+msgstr "Gagal, ketuk untuk mencoba ulang"
283288
284289#: qml/Panel/Indicators/ModemInfoItem.qml:105
285290msgid "Unlock SIM"
286−msgstr ""
291+msgstr "Buka Kunci SIM"
287292
288293#: qml/Panel/Indicators/RoamingIndication.qml:27
289294msgid "Roaming"
290−msgstr ""
295+msgstr "Roaming"
291296
292297#: qml/Shell.qml:391
293298msgid "Enter passphrase"
294−msgstr ""
299+msgstr "Masukkan frasa sandi"
295300
296301#: qml/Shell.qml:392
297302msgid "Sorry, incorrect passphrase"
298−msgstr ""
303+msgstr "Maaf, frasa sandi salah"
299304
300305#: qml/Shell.qml:393
301306msgid "Please re-enter"
302−msgstr ""
307+msgstr "Harap masukkan lagi"
303308
304309#: qml/Shell.qml:395
305310msgid "Enter passcode"
306−msgstr ""
311+msgstr "Masukkan kode sandi"
307312
308313#: qml/Shell.qml:396
309314msgid "Sorry, incorrect passcode"
310−msgstr ""
315+msgstr "Maaf, kode sandi salah"
311316
312317#: qml/Shell.qml:399
313318#, qt-format
314319msgid "Enter %1"
315−msgstr ""
320+msgstr "Masukkan %1"
316321
317322#: qml/Shell.qml:400
318323#, qt-format
319324msgid "Sorry, incorrect %1"
320−msgstr ""
325+msgstr "Maaf, %1 salah"
321326
322327#: qml/Shell.qml:441
323328msgid "Sorry, incorrect passphrase."
324−msgstr ""
329+msgstr "Maaf, frasa sandi salah."
325330
326331#: qml/Shell.qml:442
327332msgid "Sorry, incorrect passcode."
328−msgstr ""
333+msgstr "Maaf, kode sandi salah."
329334
330335#: qml/Shell.qml:443
331336msgid "This will be your last attempt."
332−msgstr ""
337+msgstr "Ini akan menjadi upaya terakhir Anda."
333338
334339#: qml/Shell.qml:445
335340msgid ""
336341"If passphrase is entered incorrectly, your phone will conduct a factory "
337342"reset and all personal data will be deleted."
338343msgstr ""
344+"Bila frasa sandi salah dimasukkan, telepon Anda akan melakukan reset pabrik "
345+"dan semua data pribadi akan dihapus."
339346
340347#: qml/Shell.qml:446
341348msgid ""
342349"If passcode is entered incorrectly, your phone will conduct a factory reset "
343350"and all personal data will be deleted."
344351msgstr ""
352+"Bila kode sandi salah dimasukkan, telepon Anda akan melakukan reset pabrik "
353+"dan semua data pribadi akan dihapus."
354+
355+#~ msgid "Loading. Please Wait..."
356+#~ msgstr "Memuat. Mohon Tunggu..."
357+
358+#~ msgid "Speaking..."
359+#~ msgstr "Berbicara..."
360+
361+#~ msgid "Confirm"
362+#~ msgstr "Konfirmasi"
363+
364+#~ msgid "Type or say a command"
365+#~ msgstr "Ketik atau ucapkan sebuah perintah"
366+
367+#~ msgid "Speak Now..."
368+#~ msgstr "Bicaralah Sekarang..."
po/is.po+21−21
@@ -17,8 +17,8 @@ msgstr ""
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-11-14 06:34+0000\n"
21−"X-Generator: Launchpad (build 17241)\n"
20+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
21+"X-Generator: Launchpad (build 17274)\n"
2222"Language: is\n"
2323
2424#: plugins/LightDM/Greeter.cpp:130
@@ -265,31 +265,31 @@ msgstr "Slá til að svara símtali..."
265265msgid "Conference"
266266msgstr "Ráðstefna"
267267
268−#: qml/Panel/Indicators/MenuItemFactory.qml:615
268+#: qml/Panel/Indicators/MenuItemFactory.qml:643
269269msgid "Nothing is playing"
270270msgstr "Ekkert er í afspilun"
271271
272−#: qml/Panel/Indicators/MenuItemFactory.qml:763
272+#: qml/Panel/Indicators/MenuItemFactory.qml:791
273273msgid "In queue…"
274274msgstr "Í biðröð..."
275275
276−#: qml/Panel/Indicators/MenuItemFactory.qml:767
276+#: qml/Panel/Indicators/MenuItemFactory.qml:795
277277msgid "Downloading"
278278msgstr "Sæki"
279279
280−#: qml/Panel/Indicators/MenuItemFactory.qml:769
280+#: qml/Panel/Indicators/MenuItemFactory.qml:797
281281msgid "Paused, tap to resume"
282282msgstr "Í bið, sláðu létt til að halda áfram"
283283
284−#: qml/Panel/Indicators/MenuItemFactory.qml:771
284+#: qml/Panel/Indicators/MenuItemFactory.qml:799
285285msgid "Canceled"
286286msgstr "Hætt við"
287287
288−#: qml/Panel/Indicators/MenuItemFactory.qml:773
288+#: qml/Panel/Indicators/MenuItemFactory.qml:801
289289msgid "Finished"
290290msgstr "Lokið"
291291
292−#: qml/Panel/Indicators/MenuItemFactory.qml:775
292+#: qml/Panel/Indicators/MenuItemFactory.qml:803
293293msgid "Failed, tap to retry"
294294msgstr "Mistókst, sláðu létt til að reyna aftur"
295295
@@ -301,49 +301,49 @@ msgstr "Aflæsa SIM-korti"
301301msgid "Roaming"
302302msgstr "Ráphamur"
303303
304−#: qml/Shell.qml:381
304+#: qml/Shell.qml:391
305305msgid "Enter passphrase"
306306msgstr "Settu inn lykilfrasa"
307307
308−#: qml/Shell.qml:382
308+#: qml/Shell.qml:392
309309msgid "Sorry, incorrect passphrase"
310310msgstr "Því miður, rangt lykilorð"
311311
312−#: qml/Shell.qml:383
312+#: qml/Shell.qml:393
313313msgid "Please re-enter"
314314msgstr "Settu aftur inn"
315315
316−#: qml/Shell.qml:385
316+#: qml/Shell.qml:395
317317msgid "Enter passcode"
318318msgstr "Settu inn aðgangskóða"
319319
320−#: qml/Shell.qml:386
320+#: qml/Shell.qml:396
321321msgid "Sorry, incorrect passcode"
322322msgstr "Því miður, rangur aðgangskóði"
323323
324−#: qml/Shell.qml:389
324+#: qml/Shell.qml:399
325325#, qt-format
326326msgid "Enter %1"
327327msgstr "Settu inn %1"
328328
329−#: qml/Shell.qml:390
329+#: qml/Shell.qml:400
330330#, qt-format
331331msgid "Sorry, incorrect %1"
332332msgstr "Því miður, rangt %1"
333333
334−#: qml/Shell.qml:431
334+#: qml/Shell.qml:441
335335msgid "Sorry, incorrect passphrase."
336336msgstr "Því miður, rangt lykilorð."
337337
338−#: qml/Shell.qml:432
338+#: qml/Shell.qml:442
339339msgid "Sorry, incorrect passcode."
340340msgstr "Því miður, rangur aðgangskóði."
341341
342−#: qml/Shell.qml:433
342+#: qml/Shell.qml:443
343343msgid "This will be your last attempt."
344344msgstr "Þetta mun verða síðasta tilraunin þín."
345345
346−#: qml/Shell.qml:435
346+#: qml/Shell.qml:445
347347msgid ""
348348"If passphrase is entered incorrectly, your phone will conduct a factory "
349349"reset and all personal data will be deleted."
@@ -351,7 +351,7 @@ msgstr ""
351351"Ef lykilorð er rangt, mun síminn frumstilla allt á verksmiðjustillingar og "
352352"öllum einkagögnum verður eytt."
353353
354−#: qml/Shell.qml:436
354+#: qml/Shell.qml:446
355355msgid ""
356356"If passcode is entered incorrectly, your phone will conduct a factory reset "
357357"and all personal data will be deleted."
po/it.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/ja.po+14−15
@@ -8,15 +8,15 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-11-07 10:59+0100\n"
11−"PO-Revision-Date: 2014-09-18 09:47+0000\n"
12−"Last-Translator: Mitsuya Shibata <mty.shibata@gmail.com>\n"
11+"PO-Revision-Date: 2014-11-20 05:08+0000\n"
12+"Last-Translator: Kentaro Kazuhama <Unknown>\n"
1313"Language-Team: Japanese <ja@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=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
@@ -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 "パスコードの入力失敗が多すぎたため、デバイスをロックしました。"
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:74
5453msgid "Log out"
@@ -212,15 +211,15 @@ msgstr "送信"
212211
213212#: qml/Dash/PullToRefreshScopeStyle.qml:55
214213msgid "Pull to refresh…"
215−msgstr ""
214+msgstr "引いて更新…"
216215
217216#: qml/Dash/PullToRefreshScopeStyle.qml:60
218217msgid "Release to refresh…"
219−msgstr ""
218+msgstr "指を離して更新…"
220219
221220#: qml/Dash/ScopesOverview.qml:215
222221msgid "Manage Scopes"
223−msgstr ""
222+msgstr "Scopeの管理"
224223
225224#: qml/Dash/ScopesOverview.qml:437
226225msgid "Done"
@@ -300,11 +299,11 @@ msgstr "パスフレーズが違います"
300299
301300#: qml/Shell.qml:393
302301msgid "Please re-enter"
303−msgstr ""
302+msgstr "再入力してください"
304303
305304#: qml/Shell.qml:395
306305msgid "Enter passcode"
307−msgstr ""
306+msgstr "パスコードを入力"
308307
309308#: qml/Shell.qml:396
310309msgid "Sorry, incorrect passcode"
@@ -313,7 +312,7 @@ msgstr "パスコードが違います"
313312#: qml/Shell.qml:399
314313#, qt-format
315314msgid "Enter %1"
316−msgstr ""
315+msgstr "%1 を入力"
317316
318317#: qml/Shell.qml:400
319318#, qt-format
po/km.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/kn.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/ko.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/ku.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/ky.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/lo.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/lt.po+2−2
@@ -16,8 +16,8 @@ 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%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-11-09 06:54+0000\n"
20−"X-Generator: Launchpad (build 17231)\n"
19+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
20+"X-Generator: Launchpad (build 17274)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
2323msgid "Password: "
po/lv.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2014-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/ml.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/mr.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/ms.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/my.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:49+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/nb.po+21−21
@@ -15,8 +15,8 @@ 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-11-13 06:37+0000\n"
19−"X-Generator: Launchpad (build 17241)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
@@ -259,31 +259,31 @@ msgstr "Trykk for å gå tilbake til anrop …"
259259msgid "Conference"
260260msgstr "Konferanse"
261261
262−#: qml/Panel/Indicators/MenuItemFactory.qml:615
262+#: qml/Panel/Indicators/MenuItemFactory.qml:643
263263msgid "Nothing is playing"
264264msgstr "Ingenting spilles nå"
265265
266−#: qml/Panel/Indicators/MenuItemFactory.qml:763
266+#: qml/Panel/Indicators/MenuItemFactory.qml:791
267267msgid "In queue…"
268268msgstr "I kø …"
269269
270−#: qml/Panel/Indicators/MenuItemFactory.qml:767
270+#: qml/Panel/Indicators/MenuItemFactory.qml:795
271271msgid "Downloading"
272272msgstr "Laster ned"
273273
274−#: qml/Panel/Indicators/MenuItemFactory.qml:769
274+#: qml/Panel/Indicators/MenuItemFactory.qml:797
275275msgid "Paused, tap to resume"
276276msgstr "Satt på pause (trykk for å fortsette)"
277277
278−#: qml/Panel/Indicators/MenuItemFactory.qml:771
278+#: qml/Panel/Indicators/MenuItemFactory.qml:799
279279msgid "Canceled"
280280msgstr "Avbrutt"
281281
282−#: qml/Panel/Indicators/MenuItemFactory.qml:773
282+#: qml/Panel/Indicators/MenuItemFactory.qml:801
283283msgid "Finished"
284284msgstr "Ferdig"
285285
286−#: qml/Panel/Indicators/MenuItemFactory.qml:775
286+#: qml/Panel/Indicators/MenuItemFactory.qml:803
287287msgid "Failed, tap to retry"
288288msgstr "Feilet. Trykk for å prøve på nytt"
289289
@@ -295,49 +295,49 @@ msgstr "Lås opp SIM"
295295msgid "Roaming"
296296msgstr "Fremmednett"
297297
298−#: qml/Shell.qml:381
298+#: qml/Shell.qml:391
299299msgid "Enter passphrase"
300300msgstr "Skriv inn passordfrase"
301301
302−#: qml/Shell.qml:382
302+#: qml/Shell.qml:392
303303msgid "Sorry, incorrect passphrase"
304304msgstr "Feil passordfrase"
305305
306−#: qml/Shell.qml:383
306+#: qml/Shell.qml:393
307307msgid "Please re-enter"
308308msgstr "Skriv inn på nytt"
309309
310−#: qml/Shell.qml:385
310+#: qml/Shell.qml:395
311311msgid "Enter passcode"
312312msgstr "Tast kode"
313313
314−#: qml/Shell.qml:386
314+#: qml/Shell.qml:396
315315msgid "Sorry, incorrect passcode"
316316msgstr "Feil kode"
317317
318−#: qml/Shell.qml:389
318+#: qml/Shell.qml:399
319319#, qt-format
320320msgid "Enter %1"
321321msgstr "Skriv inn %1"
322322
323−#: qml/Shell.qml:390
323+#: qml/Shell.qml:400
324324#, qt-format
325325msgid "Sorry, incorrect %1"
326326msgstr "Feil %1"
327327
328−#: qml/Shell.qml:431
328+#: qml/Shell.qml:441
329329msgid "Sorry, incorrect passphrase."
330330msgstr "Feil passordfrase."
331331
332−#: qml/Shell.qml:432
332+#: qml/Shell.qml:442
333333msgid "Sorry, incorrect passcode."
334334msgstr "Feil kode."
335335
336−#: qml/Shell.qml:433
336+#: qml/Shell.qml:443
337337msgid "This will be your last attempt."
338338msgstr "Dette er ditt siste forsøk."
339339
340−#: qml/Shell.qml:435
340+#: qml/Shell.qml:445
341341msgid ""
342342"If passphrase is entered incorrectly, your phone will conduct a factory "
343343"reset and all personal data will be deleted."
@@ -345,7 +345,7 @@ msgstr ""
345345"Hvis du skriver feil passordfrase en gang til, tilbakestilles telefonen til "
346346"fabrikkinnstillinger, og alle personlige data slettes."
347347
348−#: qml/Shell.qml:436
348+#: qml/Shell.qml:446
349349msgid ""
350350"If passcode is entered incorrectly, your phone will conduct a factory reset "
351351"and all personal data will be deleted."
po/nl.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/pa.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/pl.po+2−2
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
1818"|| n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-11-09 06:54+0000\n"
20−"X-Generator: Launchpad (build 17231)\n"
19+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
20+"X-Generator: Launchpad (build 17274)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
2323msgid "Password: "
po/pt.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/pt_BR.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/ro.po+4−4
@@ -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-11-07 10:59+0100\n"
11−"PO-Revision-Date: 2014-10-07 15:54+0000\n"
11+"PO-Revision-Date: 2014-11-18 12:09+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,8 +16,8 @@ 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-11-09 06:54+0000\n"
20−"X-Generator: Launchpad (build 17231)\n"
19+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
20+"X-Generator: Launchpad (build 17274)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
2323msgid "Password: "
@@ -166,7 +166,7 @@ msgstr ""
166166
167167#: qml/Components/Lockscreen.qml:223
168168msgid "Return to Call"
169−msgstr ""
169+msgstr "Reveniți la funcția de apelare"
170170
171171#: qml/Components/Lockscreen.qml:223
172172msgid "Emergency Call"
po/ru.po+6−6
@@ -16,8 +16,8 @@ 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-11-09 06:54+0000\n"
20−"X-Generator: Launchpad (build 17231)\n"
19+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
20+"X-Generator: Launchpad (build 17274)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
2323msgid "Password: "
@@ -30,7 +30,7 @@ msgstr "Закрепить ярлык"
3030
3131#: plugins/Unity/Launcher/launcheritem.cpp:91
3232msgid "Unpin shortcut"
33−msgstr "Изъять ярлык"
33+msgstr "Открепить ярлык"
3434
3535#: qml/Components/DelayedLockscreen.qml:47
3636msgid "Device Locked"
@@ -167,7 +167,7 @@ msgstr ""
167167
168168#: qml/Components/Lockscreen.qml:223
169169msgid "Return to Call"
170−msgstr ""
170+msgstr "Вернуться к вызову"
171171
172172#: qml/Components/Lockscreen.qml:223
173173msgid "Emergency Call"
@@ -232,7 +232,7 @@ msgstr "Отпустите для обновления…"
232232
233233#: qml/Dash/ScopesOverview.qml:215
234234msgid "Manage Scopes"
235−msgstr ""
235+msgstr "Настройки поиска"
236236
237237#: qml/Dash/ScopesOverview.qml:437
238238msgid "Done"
@@ -240,7 +240,7 @@ msgstr "Готово"
240240
241241#: qml/Dash/ScopesOverview.qml:463
242242msgid "Store"
243−msgstr ""
243+msgstr "Магазин"
244244
245245#: qml/Dash/ScopesOverviewTab.qml:36
246246msgid "Favorites"
po/shn.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=(n == 1) ? 0 : 1;\n"
18−"X-Launchpad-Export-Date: 2014-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/si.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/sl.po+2−2
@@ -16,8 +16,8 @@ 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-11-09 06:54+0000\n"
20−"X-Generator: Launchpad (build 17231)\n"
19+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
20+"X-Generator: Launchpad (build 17274)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
2323msgid "Password: "
po/sq.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:49+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/sr.po+2−2
@@ -16,8 +16,8 @@ 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-11-09 06:54+0000\n"
20−"X-Generator: Launchpad (build 17231)\n"
19+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
20+"X-Generator: Launchpad (build 17274)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
2323msgid "Password: "
po/sv.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020"Language: sv\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
po/sw.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/ta.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020"Language: ta\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
po/te.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/th.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/tr.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/ug.po+3−3
@@ -15,8 +15,8 @@ msgstr ""
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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
@@ -157,7 +157,7 @@ msgstr ""
157157
158158#: qml/Components/Lockscreen.qml:223
159159msgid "Return to Call"
160−msgstr ""
160+msgstr "سۆزلىشىشكە قايت"
161161
162162#: qml/Components/Lockscreen.qml:223
163163msgid "Emergency Call"
po/uk.po+2−2
@@ -16,8 +16,8 @@ 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-11-09 06:54+0000\n"
20−"X-Generator: Launchpad (build 17231)\n"
19+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
20+"X-Generator: Launchpad (build 17274)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
2323msgid "Password: "
po/vi.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/xh.po+2−2
@@ -15,8 +15,8 @@ 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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/zh_CN.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/zh_HK.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
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-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
po/zh_TW.po+7−7
@@ -8,15 +8,15 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-11-07 10:59+0100\n"
11−"PO-Revision-Date: 2014-10-16 14:55+0000\n"
12−"Last-Translator: Po-Hsu Lin <po-hsu.lin@canonical.com>\n"
11+"PO-Revision-Date: 2014-11-19 15:05+0000\n"
12+"Last-Translator: Walter Cheuk <wwycheuk@gmail.com>\n"
1313"Language-Team: Chinese (Traditional) <zh_TW@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=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-11-09 06:54+0000\n"
19−"X-Generator: Launchpad (build 17231)\n"
18+"X-Launchpad-Export-Date: 2014-12-03 06:50+0000\n"
19+"X-Generator: Launchpad (build 17274)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
@@ -37,11 +37,11 @@ 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
@@ -254,7 +254,7 @@ msgstr "會議"
254254
255255#: qml/Panel/Indicators/MenuItemFactory.qml:643
256256msgid "Nothing is playing"
257−msgstr ""
257+msgstr "無影音播放中"
258258
259259#: qml/Panel/Indicators/MenuItemFactory.qml:791
260260msgid "In queue…"
qml/Dash/CardCarousel.qml+1
@@ -52,6 +52,7 @@ DashRenderer {
5252 function pressAndHold() { cardCarousel.pressAndHold(index, model.result, model) }
5353
5454 sourceComponent: cardTool.cardComponent
55+ asynchronous: true
5556 onLoaded: {
5657 item.fixedHeaderHeight = Qt.binding(function() { return carousel.headerHeight; });
5758 item.height = Qt.binding(function() { return cardTool.cardHeight; });
qml/Dash/CardGrid.qml+1−1
@@ -55,11 +55,11 @@ DashRenderer {
5555 delegate: Item {
5656 width: grid.cellWidth
5757 height: grid.cellHeight
58− visible: y + height >= root.visibleRangeBegin && y <= root.visibleRangeEnd
5958 Loader {
6059 id: loader
6160 sourceComponent: cardTool.cardComponent
6261 anchors.horizontalCenter: parent.horizontalCenter
62+ asynchronous: true
6363 onLoaded: {
6464 item.objectName = "delegate" + index;
6565 item.width = Qt.binding(function() { return cardTool.cardWidth; });
qml/Dash/CardHorizontalList.qml+1
@@ -42,6 +42,7 @@ DashRenderer {
4242 sourceComponent: cardTool.cardComponent
4343 anchors { top: parent.top; bottom: parent.bottom }
4444 width: cardTool.cardWidth
45+ asynchronous: true
4546 onLoaded: {
4647 item.objectName = "delegate" + index;
4748 item.fixedArtShapeSize = Qt.binding(function() { return cardTool.artShapeSize; });
qml/Dash/CardTool.qml+1−1
@@ -178,7 +178,7 @@ Item {
178178 property var model: []
179179 property bool hasAttributes: {
180180 var attributes = components["attributes"];
181− var hasAttributesFlag = (attributes != undefined) && attributes["field"];
181+ var hasAttributesFlag = (attributes != undefined) && (attributes["field"] != undefined);
182182
183183 if (hasAttributesFlag) {
184184 if (attributes["max-count"]) {
qml/Dash/CardVerticalJournal.qml−1
@@ -66,7 +66,6 @@ DashRenderer {
6666 id: loader
6767 sourceComponent: cardTool.cardComponent
6868 width: cardTool.cardWidth
69− visible: y + height >= root.visibleRangeBegin && y <= root.visibleRangeEnd
7069 onLoaded: {
7170 item.objectName = "delegate" + index;
7271 item.fixedArtShapeSize = Qt.binding(function() { return cardTool.artShapeSize; });
qml/Dash/Dash.qml+11−3
@@ -31,9 +31,10 @@ Showable {
3131 DashCommunicatorService {
3232 objectName: "dashCommunicatorService"
3333 onSetCurrentScopeRequested: {
34− if (!isSwipe || !window.active || overviewController.progress != 0) {
34+ if (!isSwipe || !window.active || overviewController.progress != 0 || scopeItem.scope || dashContent.subPageShown) {
3535 if (overviewController.progress != 0 && window.active) animate = false;
3636 dashContent.setCurrentScopeAtIndex(index, animate, isSwipe)
37+ // Close dash overview and nested temp scopes in it
3738 if (overviewController.progress != 0) {
3839 if (window.active) {
3940 dashContentCache.scheduleUpdate();
@@ -42,6 +43,14 @@ Showable {
4243 overviewController.progress = 0;
4344 scopesOverview.closeTempScope();
4445 }
46+ // Close normal temp scopes (e.g. App Store)
47+ if (scopeItem.scope) {
48+ scopeItem.backClicked();
49+ }
50+ // Close previews
51+ if (dashContent.subPageShown) {
52+ dashContent.closePreview();
53+ }
4554 }
4655 }
4756 }
@@ -309,7 +318,7 @@ Showable {
309318 id: orange
310319 anchors { top: parent.top; bottom: parent.bottom }
311320 width: parent.width / 4
312− color: Theme.palette.selected.foreground
321+ color: UbuntuColors.orange
313322
314323 SequentialAnimation {
315324 running: indicator.visible
@@ -389,5 +398,4 @@ Showable {
389398 }
390399 }
391400 }
392−
393401}
qml/Dash/DashRenderer.qml−4
@@ -27,10 +27,6 @@ Item {
2727
2828 property int displayMarginEnd: 0
2929
30− property int visibleRangeBegin: 0
31−
32− property int visibleRangeEnd: 0
33−
3430 property real originY: 0
3531
3632 // The model to renderer
qml/Dash/GenericScopeView.qml+22−25
@@ -379,32 +379,29 @@ FocusScope {
379379 }
380380 }
381381
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−
387382 if (item && item.hasOwnProperty("displayMarginBeginning")) {
388− // TODO do we need item.originY here, test 1300302 once we have a silo
389− // and we can run it on the phone
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) {
396− // Not visible (item at top of the list viewport)
397− item.displayMarginBeginning = -baseItem.height;
398− item.displayMarginEnd = 0;
399− } else if (baseItem.y >= categoryView.height) {
400− // Not visible (item at bottom of the list viewport)
401− item.displayMarginBeginning = 0;
402− item.displayMarginEnd = -baseItem.height;
403− } else {
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));
407− }
383+ // A item view is considered visible from
384+ // -displayMarginBeginning
385+ // to
386+ // height + item.displayMarginEnd
387+ // We adjust displayMarginBeginning and displayMarginEnd so
388+ // * In non visible scopes only the viewport is considered visible
389+ // that way when you switch to it the visible items are there
390+ // * For visible scopes we increase the visible range by categoryView.height * 1.5
391+ // in both directions to make scrolling nicer by mantaining a higher number of
392+ // cached items
393+ // TODO Improvements
394+ // - For non visible scopes we should always have a visible range of 0 and
395+ // make sure the items in the viewport are created with the cache buffer feature
396+ // - For visible scopes we should always the have a visible range be exactly the
397+ // viewport and make sure the rest of items are created with the cache buffer feature
398+ // To be able to implement that feature VerticalJournal/AbstractDashView needs to
399+ // make the cache buffer value setable externally
400+ var extraMargins = scopeView.isCurrent ? categoryView.height * 1.5 : 0;
401+
402+ item.displayMarginBeginning = Math.round(-Math.max(-baseItem.y - extraMargins, 0));
403+ item.displayMarginEnd = -Math.round(Math.max(baseItem.height - extraMargins - seeAll.height -
404+ categoryView.height + baseItem.y, 0));
408405 }
409406 }
410407 }
qml/Dash/Previews/PreviewActions.qml+2−1
@@ -15,6 +15,7 @@
1515 */
1616
1717import QtQuick 2.1
18+import Ubuntu.Components 1.1
1819
1920/*! This preview widget shows either one button, two buttons or one button
2021 * and a combo button depending on the number of items in widgetData["actions"].
@@ -64,7 +65,7 @@ PreviewWidget {
6465 visible: row.actions && row.actions.length > 0
6566 onTriggeredAction: root.triggered(root.widgetId, actionData.id, actionData)
6667 width: (root.width - units.gu(1)) / 2
67− color: root.scopeStyle ? root.scopeStyle.previewButtonColor : Theme.palette.selected.foreground
68+ color: root.scopeStyle ? root.scopeStyle.previewButtonColor : UbuntuColors.orange
6869 }
6970 }
7071}
qml/Dash/Previews/PreviewPayments.qml+1−1
@@ -35,7 +35,7 @@ PreviewWidget {
3535 id: paymentButton
3636 objectName: "paymentButton"
3737
38− color: Theme.palette.selected.foreground
38+ color: UbuntuColors.orange
3939 text: paymentClient.formattedPrice
4040 onClicked: {
4141 paymentClient.start();
qml/Dash/Previews/PreviewZoomableImage.qml+1
@@ -40,6 +40,7 @@ PreviewWidget {
4040 }
4141 scaleTo: "height"
4242 source: widgetData["source"]
43+ asynchronous: true
4344
4445 borderSource: mouseArea.pressed ? "radius_pressed.sci" : "radius_idle.sci"
4546
qml/Dash/ScopesOverviewAll.qml−2
@@ -43,8 +43,6 @@ Flickable {
4343 id: cardGrid
4444 width: root.width
4545 height: parent.height
46− visibleRangeBegin: root.contentY
47− visibleRangeEnd: root.contentY + root.height
4846
4947 onClicked: {
5048 root.clicked(index, result, item, itemModel);
qml/Launcher/LauncherPanel.qml+27−7
@@ -50,12 +50,19 @@ Rectangle {
5050 fill: parent
5151 }
5252
53− Rectangle {
53+ Item {
5454 objectName: "buttonShowDashHome"
5555 width: parent.width
5656 height: units.gu(7)
57− color: UbuntuColors.orange
58− z: 1
57+
58+ UbuntuShape {
59+ anchors {
60+ fill: parent
61+ topMargin: -units.gu(2)
62+ }
63+ borderSource: "none"
64+ color: UbuntuColors.orange
65+ }
5966
6067 Image {
6168 objectName: "dashItem"
@@ -137,6 +144,20 @@ Rectangle {
137144 property bool draggingTransitionRunning: false
138145 property int scheduledMoveTo: -1
139146
147+ UbuntuNumberAnimation {
148+ id: snapToBottomAnimation
149+ target: launcherListView
150+ property: "contentY"
151+ to: launcherListView.originY
152+ }
153+
154+ UbuntuNumberAnimation {
155+ id: snapToTopAnimation
156+ target: launcherListView
157+ property: "contentY"
158+ to: launcherListView.contentHeight - launcherListView.height + launcherListView.originY
159+ }
160+
140161 displaced: Transition {
141162 NumberAnimation { properties: "x,y"; duration: UbuntuAnimation.FastDuration; easing: UbuntuAnimation.StandardEasing }
142163 }
@@ -342,10 +363,9 @@ Rectangle {
342363 progressiveScrollingTimer.stop();
343364 launcherListView.interactive = true;
344365 if (droppedIndex >= launcherListView.count - 2 && postDragging) {
345− launcherListView.flick(0, -launcherListView.clickFlickSpeed);
346− }
347− if (droppedIndex == 0 && postDragging) {
348− launcherListView.flick(0, launcherListView.clickFlickSpeed);
366+ snapToBottomAnimation.start();
367+ } else if (droppedIndex < 2 && postDragging) {
368+ snapToTopAnimation.start();
349369 }
350370 }
351371
qml/Panel/IndicatorItem.qml+1−2
@@ -99,12 +99,11 @@ IndicatorDelegate {
9999
100100 model: d.useFallbackIcon ? [ "image://theme/settings" ] : root.icons
101101
102− StatusIcon {
102+ Icon {
103103 id: itemImage
104104 objectName: "icon"+index
105105 height: iconHeight
106106 source: modelData
107− sets: ["status", "actions"]
108107 color: root.color
109108 Behavior on color { ColorAnimation { duration: UbuntuAnimation.FastDuration; easing: UbuntuAnimation.StandardEasing } }
110109
qml/Shell.qml+16−5
@@ -44,6 +44,10 @@ import Unity.DashCommunicator 0.1
4444Item {
4545 id: shell
4646
47+ // Disable everything so that user can't swipe greeter or launcher until
48+ // we get first prompt/authenticate, which will re-enable the shell.
49+ enabled: false
50+
4751 // this is only here to select the width / height of the window if not running fullscreen
4852 property bool tablet: false
4953 width: tablet ? units.gu(160) : applicationArguments.hasGeometry() ? applicationArguments.width() : units.gu(40)
@@ -506,7 +510,7 @@ Item {
506510 // Just a tiny wrapper to adjust greeter's x without messing with its own dragging
507511 id: greeterWrapper
508512 objectName: "greeterWrapper"
509− x: greeter.narrowMode ? launcher.progress : 0
513+ x: (greeter.narrowMode && greeter.showProgress > 0) ? launcher.progress : 0
510514 y: panel.panelHeight
511515 width: parent.width
512516 height: parent.height - panel.panelHeight
@@ -585,7 +589,7 @@ Item {
585589 onShownChanged: {
586590 if (shown) {
587591 // Disable everything so that user can't swipe greeter or
588− // launcher until we get first prompt/authenticate, which
592+ // launcher until we get the next prompt/authenticate, which
589593 // will re-enable the shell.
590594 shell.enabled = false;
591595
@@ -777,19 +781,26 @@ Item {
777781 margin: units.gu(1)
778782
779783 y: topmostIsFullscreen ? 0 : panel.panelHeight
780− width: parent.width
781784 height: parent.height - (topmostIsFullscreen ? 0 : panel.panelHeight)
782785
783786 states: [
784787 State {
785788 name: "narrow"
786789 when: overlay.width <= units.gu(60)
787− AnchorChanges { target: notifications; anchors.left: parent.left }
790+ AnchorChanges {
791+ target: notifications
792+ anchors.left: parent.left
793+ anchors.right: parent.right
794+ }
788795 },
789796 State {
790797 name: "wide"
791798 when: overlay.width > units.gu(60)
792− AnchorChanges { target: notifications; anchors.left: undefined }
799+ AnchorChanges {
800+ target: notifications
801+ anchors.left: undefined
802+ anchors.right: parent.right
803+ }
793804 PropertyChanges { target: notifications; width: units.gu(38) }
794805 }
795806 ]
qml/Stages/PhoneStage.qml+18−34
@@ -145,16 +145,16 @@ Rectangle {
145145
146146 // Those markers mark the various positions in the spread (ratio to screen width from right to left):
147147 // 0 - 1: following finger, snap back to the beginning on release
148− property real positionMarker1: 0.3
148+ property real positionMarker1: 0.2
149149 // 1 - 2: curved snapping movement, snap to app 1 on release
150− property real positionMarker2: 0.45
150+ property real positionMarker2: 0.3
151151 // 2 - 3: movement follows finger, snaps back to app 1 on release
152− property real positionMarker3: 0.6
152+ property real positionMarker3: 0.35
153153 // passing 3, we detach movement from the finger and snap to 4
154154 property real positionMarker4: 0.9
155155
156156 // This is where the first app snaps to when bringing it in from the right edge.
157− property real snapPosition: 0.75
157+ property real snapPosition: 0.7
158158
159159 // Phase of the animation:
160160 // 0: Starting from right edge, a new app (index 1) comes in from the right
@@ -178,7 +178,7 @@ Rectangle {
178178 case 1:
179179 if (shiftedContentX < width * positionMarker2) {
180180 phase = 0;
181− } else if (shiftedContentX >= width * positionMarker4) {
181+ } else if (shiftedContentX >= width * positionMarker4 && !spreadDragArea.dragging) {
182182 phase = 2;
183183 }
184184 break;
@@ -270,6 +270,7 @@ Rectangle {
270270
271271 Repeater {
272272 id: spreadRepeater
273+ objectName: "spreadRepeater"
273274 model: ApplicationManager
274275 delegate: TransformedSpreadDelegate {
275276 id: appDelegate
@@ -286,7 +287,7 @@ Rectangle {
286287 otherSelected: spreadView.selectedIndex >= 0 && !selected
287288 interactive: !spreadView.interactive && spreadView.phase === 0
288289 && spreadView.shiftedContentX === 0 && root.interactive && index === 0
289− swipeToCloseEnabled: spreadView.interactive
290+ swipeToCloseEnabled: spreadView.interactive && !snapAnimation.running
290291 maximizedAppTopMargin: root.maximizedAppTopMargin
291292 dropShadow: spreadView.active ||
292293 (priv.focusedAppDelegate && priv.focusedAppDelegate.x !== 0)
@@ -367,8 +368,9 @@ Rectangle {
367368 if (spreadView.phase == 0 && index < 2) {
368369 if (progress < spreadView.positionMarker1) {
369370 return progress;
370− } else if (progress < spreadView.positionMarker1 + snappingCurve.period){
371− return spreadView.positionMarker1 + snappingCurve.value * 3;
371+ } else if (progress < spreadView.positionMarker1 + 0.05){
372+ // p : 0.05 = x : pm2
373+ return spreadView.positionMarker1 + (progress - spreadView.positionMarker1) * (spreadView.positionMarker2 - spreadView.positionMarker1) / 0.05
372374 } else {
373375 return spreadView.positionMarker2;
374376 }
@@ -380,13 +382,6 @@ Rectangle {
380382 visible: (progress >= 0 && progress < 1.7) ||
381383 (isDash && priv.focusedAppDelegate.x !== 0)
382384
383− EasingCurve {
384− id: snappingCurve
385− type: EasingCurve.Linear
386− period: 0.05
387− progress: appDelegate.progress - spreadView.positionMarker1
388− }
389−
390385 Binding {
391386 target: appDelegate
392387 property: "orientation"
@@ -425,16 +420,11 @@ Rectangle {
425420 id: spreadDragArea
426421 objectName: "spreadDragArea"
427422 direction: Direction.Leftwards
428− enabled: spreadView.phase != 2 && root.spreadEnabled
423+ enabled: (spreadView.phase != 2 && root.spreadEnabled) || dragging
429424
430425 anchors { top: parent.top; right: parent.right; bottom: parent.bottom }
431426 width: root.dragAreaWidth
432427
433− // Sitting at the right edge of the screen, this EdgeDragArea directly controls the spreadView when
434− // attachedToView is true. When the finger movement passes positionMarker3 we detach it from the
435− // spreadView and make the spreadView snap to positionMarker4.
436− property bool attachedToView: true
437−
438428 property var gesturePoints: new Array()
439429
440430 onTouchXChanged: {
@@ -443,15 +433,13 @@ Rectangle {
443433 spreadView.phase = 0;
444434 spreadView.contentX = -spreadView.shift;
445435 }
446− if (dragging && status == DirectionalDragArea.Recognized && attachedToView) {
436+ if (dragging && status == DirectionalDragArea.Recognized) {
447437 // Gesture recognized. Let's move the spreadView with the finger
448− var finalX = Math.min(touchX + width, width);
449− spreadView.contentX = -finalX + spreadDragArea.width - spreadView.shift;
450− }
451− if (attachedToView && spreadView.shiftedContentX >= spreadView.width * spreadView.positionMarker3) {
452− // We passed positionMarker3. Detach from spreadView and snap it.
453− attachedToView = false;
454− spreadView.snap();
438+ var dragX = Math.min(touchX + width, width); // Prevent dragging rightwards
439+ dragX = -dragX + spreadDragArea.width - spreadView.shift;
440+ // Don't allow dragging further than the animation crossing with phase2's animation
441+ var maxMovement = spreadView.width * spreadView.positionMarker4 - spreadView.shift;
442+ spreadView.contentX = Math.min(dragX, maxMovement);
455443 }
456444 gesturePoints.push(touchX);
457445 }
@@ -462,10 +450,6 @@ Rectangle {
462450 onStatusChanged: {
463451 previousStatus = currentStatus;
464452 currentStatus = status;
465−
466− if (status == DirectionalDragArea.Recognized) {
467− attachedToView = true;
468− }
469453 }
470454
471455 onDraggingChanged: {
@@ -493,7 +477,7 @@ Rectangle {
493477 // If it was a short one-way movement, do the Alt+Tab switch
494478 // no matter if we didn't cross positionMarker1 yet.
495479 spreadView.snapTo(1);
496− } else if (!dragging && attachedToView) {
480+ } else if (!dragging) {
497481 // otherwise snap to the closest snap position we can find
498482 // (might be back to start, to app 1 or to spread)
499483 spreadView.snap();
qml/Stages/SpreadDelegate.qml+20−3
@@ -41,10 +41,17 @@ Item {
4141 Item {
4242 objectName: "appWindowWithShadow"
4343
44− y: dragArea.distance
44+ readonly property real limit: root.height / 4
45+
46+ y: root.closeable ? dragArea.distance : elastic(dragArea.distance)
4547 width: parent.width
4648 height: parent.height
4749
50+ function elastic(distance) {
51+ var k = distance < 0 ? -limit : limit
52+ return k * (1 - Math.pow((k - 1) / k, distance))
53+ }
54+
4855 BorderImage {
4956 anchors {
5057 fill: appWindow
@@ -75,6 +82,8 @@ Item {
7582
7683 property bool moving: false
7784 property real distance: 0
85+ readonly property int threshold: units.gu(2)
86+ property int offset: 0
7887
7988 readonly property real minSpeedToClose: units.gu(40)
8089
@@ -82,9 +91,17 @@ Item {
8291 if (!dragging) {
8392 return;
8493 }
85− moving = moving || Math.abs(dragValue) > units.gu(1)
94+ moving = moving || Math.abs(dragValue) > threshold;
95+ if (moving) {
96+ distance = dragValue + offset;
97+ }
98+ }
99+
100+ onMovingChanged: {
86101 if (moving) {
87− distance = dragValue;
102+ offset = (dragValue > 0 ? -threshold: threshold)
103+ } else {
104+ offset = 0;
88105 }
89106 }
90107
qml/Stages/TabletStage.qml+6−15
@@ -490,7 +490,7 @@ Rectangle {
490490 otherSelected: spreadView.selectedIndex >= 0 && !selected
491491 isInSideStage: priv.sideStageAppId == model.appId
492492 interactive: !spreadView.interactive && spreadView.phase === 0 && root.interactive
493− swipeToCloseEnabled: spreadView.interactive
493+ swipeToCloseEnabled: spreadView.interactive && !snapAnimation.running
494494 maximizedAppTopMargin: root.maximizedAppTopMargin
495495 dragOffset: !isDash && model.appId == priv.mainStageAppId && root.inverseProgress > 0 ? root.inverseProgress : 0
496496 application: ApplicationManager.get(index)
@@ -590,7 +590,6 @@ Rectangle {
590590 width: root.dragAreaWidth
591591 direction: Direction.Leftwards
592592
593− property bool attachedToView: false
594593 property var gesturePoints: new Array()
595594
596595 onTouchXChanged: {
@@ -599,22 +598,14 @@ Rectangle {
599598 spreadView.contentX = -spreadView.shift;
600599 }
601600
602− if (dragging && attachedToView) {
603− spreadView.contentX = -touchX + spreadDragArea.width - spreadView.shift;
604− if (spreadView.shiftedContentX > spreadView.phase0Width + spreadView.phase1Width / 2) {
605− attachedToView = false;
606− spreadView.snap();
607− }
601+ if (dragging) {
602+ var dragX = -touchX + spreadDragArea.width - spreadView.shift;
603+ var maxDrag = spreadView.width * spreadView.positionMarker4 - spreadView.shift;
604+ spreadView.contentX = Math.min(dragX, maxDrag);
608605 }
609606 gesturePoints.push(touchX);
610607 }
611608
612− onStatusChanged: {
613− if (status == DirectionalDragArea.Recognized) {
614− attachedToView = true;
615− }
616− }
617−
618609 onDraggingChanged: {
619610 if (dragging) {
620611 // Gesture recognized. Start recording this gesture
@@ -630,7 +621,7 @@ Rectangle {
630621 // If it was a short one-way movement, do the Alt+Tab switch
631622 // no matter if we didn't cross positionMarker1 yet.
632623 spreadView.snapTo(spreadView.nextInStack);
633− } else if (!dragging && attachedToView) {
624+ } else if (!dragging) {
634625 if (spreadView.shiftedContentX < spreadView.width * spreadView.positionMarker1) {
635626 spreadView.snap();
636627 } else if (spreadView.shiftedContentX < spreadView.width * spreadView.positionMarker2) {
qml/graphics/applicationIcons/dash@18.png → qml/graphics/applicationIcons/dash.pngrenamed

Binary file not shown.

src/CMakeLists.txt+4−1
@@ -1,6 +1,9 @@
1+pkg_check_modules(CONNECTIVITY REQUIRED connectivity-qt1)
2+
13include_directories(
24 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
35 ${CMAKE_SOURCE_DIR}/libs/UbuntuGestures
6+ ${CONNECTIVITY_INCLUDE_DIRS}
47)
58
69file(GLOB_RECURSE QML_FILES
@@ -30,7 +33,7 @@ if (NOT "${XCB_INCLUDE_DIRS}" STREQUAL "")
3033 target_link_libraries(${SHELL_APP} ${XCB_LDFLAGS})
3134endif()
3235
33−target_link_libraries(${SHELL_APP} UbuntuGestures)
36+target_link_libraries(${SHELL_APP} UbuntuGestures connectivity-qt1)
3437
3538# For it to find libUbuntuGestures.so
3639set_target_properties(${SHELL_APP} PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}")
src/CachingNetworkManagerFactory.cpp+2−11
@@ -20,25 +20,16 @@
2020#include <QNetworkDiskCache>
2121#include <QNetworkAccessManager>
2222#include <QStandardPaths>
23−#include <QNetworkConfigurationManager>
2423
2524CachingNetworkAccessManager::CachingNetworkAccessManager(QObject *parent)
2625 : QNetworkAccessManager(parent)
2726{
28− m_networkManager = new QNetworkConfigurationManager(this);
29−
30− QObject::connect(m_networkManager, &QNetworkConfigurationManager::onlineStateChanged, this, &CachingNetworkAccessManager::onlineStateChanged);
31− m_isOnline = m_networkManager->isOnline();
32−}
33−
34−void CachingNetworkAccessManager::onlineStateChanged(bool isOnline)
35−{
36− m_isOnline = isOnline;
27+ m_networkingStatus = new ubuntu::connectivity::NetworkingStatus(this);
3728}
3829
3930QNetworkReply* CachingNetworkAccessManager::createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData)
4031{
41− if (!m_isOnline) {
32+ if (m_networkingStatus->status() != ubuntu::connectivity::NetworkingStatus::Status::Online) {
4233 QNetworkRequest req(request);
4334 req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysCache);
4435 return QNetworkAccessManager::createRequest(op, req, outgoingData);
src/CachingNetworkManagerFactory.h+2−6
@@ -21,7 +21,7 @@
2121#include <QQmlNetworkAccessManagerFactory>
2222#include <QNetworkAccessManager>
2323
24−class QNetworkConfigurationManager;
24+#include <ubuntu/connectivity/networking-status.h>
2525
2626class CachingNetworkAccessManager : public QNetworkAccessManager
2727{
@@ -31,12 +31,8 @@ public:
3131protected:
3232 QNetworkReply* createRequest(Operation op, const QNetworkRequest &req, QIODevice *outgoingData = 0) override;
3333
34−private Q_SLOTS:
35− void onlineStateChanged(bool isOnline);
36−
3734private:
38− QNetworkConfigurationManager* m_networkManager;
39− bool m_isOnline;
35+ ubuntu::connectivity::NetworkingStatus* m_networkingStatus;
4036};
4137
4238class CachingNetworkManagerFactory : public QQmlNetworkAccessManagerFactory
src/Dash/CMakeLists.txt+1−1
@@ -12,7 +12,7 @@ qt5_use_modules(unity8-dash Gui Qml Quick Test)
1212# For it to find libUbuntuGestures.so, needed by Ubuntu.Gestures QML module.
1313set_target_properties(unity8-dash PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}")
1414
15−target_link_libraries(unity8-dash UbuntuGestures)
15+target_link_libraries(unity8-dash UbuntuGestures connectivity-qt1)
1616
1717set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
1818
tests/autopilot/unity8/application_lifecycle/tests/test_application_lifecycle.py+1−1
@@ -47,7 +47,7 @@ class ApplicationLifecycleTests(tests.ApplicationLifeCycleTestCase):
4747 height = self.main_window.height
4848 start_x = width
4949 start_y = int(height/2)
50− end_x = int(width/2)
50+ end_x = int(width*3/4)
5151 end_y = start_y
5252
5353 logger.info("Swiping screen from the right edge")
tests/autopilot/unity8/shell/emulators/dash.py+1−1
@@ -204,7 +204,7 @@ class GenericScopeView(emulators.UnityEmulatorBase):
204204
205205 """
206206 category_element = self._get_category_element(category)
207− icon = category_element.select_single('AbstractButton', title=title)
207+ icon = category_element.wait_select_single('AbstractButton', title=title)
208208 self.pointing_device.click_object(icon)
209209
210210 def _get_category_element(self, category):
tests/plugins/Dash/CMakeLists.txt+1
@@ -80,3 +80,4 @@ set(qmltest_DEFAULT_PROPERTIES ENVIRONMENT "LC_ALL=C")
8080add_qml_test(. ScopeStyle IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
8181add_qml_test(. ListViewWithPageHeaderQML IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
8282add_qml_test(. CardAttributes IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
83+add_qml_test(. CroppedImageMinimumSourceSize IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
tests/plugins/Dash/cardcreator/1.res+4−4
@@ -46,16 +46,16 @@ Item {
4646 height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height });
4747 }
4848 }
49− image: CroppedImageMinimumSourceSize {
49+ CroppedImageMinimumSourceSize {
50+ id: artImage;
5051 objectName: "artImage";
51− property bool doLoadSource: !NetworkingStatus.limitedBandwith;
52− source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["art"] || ""; }
53− cache: true;
52+ source: cardData && cardData["art"] || "";
5453 asynchronous: root.asynchronous;
5554 visible: false;
5655 width: root.width;
5756 height: width / artShape.aspect;
5857 }
58+ image: artImage.image;
5959 }
6060 }
6161 }
tests/plugins/Dash/cardcreator/2.res+2−3
@@ -68,13 +68,12 @@ CroppedImageMinimumSourceSize {
6868 id: mascotImage;
6969 objectName: "mascotImage";
7070 anchors { verticalCenter: parent.verticalCenter; }
71− property bool doLoadSource: !NetworkingStatus.limitedBandwith;
72− source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["mascot"] || ""; }
71+ source: cardData && cardData["mascot"] || "";
7372 width: units.gu(6);
7473 height: units.gu(5.625);
7574 horizontalAlignment: Image.AlignHCenter;
7675 verticalAlignment: Image.AlignVCenter;
77− visible: showHeader && resized;
76+ visible: showHeader;
7877 }
7978,Item {
8079 id: headerTitleContainer;
tests/plugins/Dash/cardcreator/3.res+10−10
@@ -46,16 +46,16 @@ Item {
4646 height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height });
4747 }
4848 }
49− image: CroppedImageMinimumSourceSize {
50− objectName: "artImage";
51− property bool doLoadSource: !NetworkingStatus.limitedBandwith;
52− source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["art"] || ""; }
53− cache: true;
54− asynchronous: root.asynchronous;
55− visible: false;
56− width: root.width;
57− height: width / artShape.aspect;
58− }
49+ CroppedImageMinimumSourceSize {
50+ id: artImage;
51+ objectName: "artImage";
52+ source: cardData && cardData["art"] || "";
53+ asynchronous: root.asynchronous;
54+ visible: false;
55+ width: root.width;
56+ height: width / artShape.aspect;
57+ }
58+ image: artImage.image;
5959 }
6060 }
6161 }
tests/plugins/Dash/cardcreator/4.res+3−4
@@ -35,11 +35,11 @@ Loader {
3535 id: mascotShapeLoader;
3636 objectName: "mascotShapeLoader";
3737 asynchronous: root.asynchronous;
38− active: mascotImage.status === Image.Ready;
38+ active: mascotImage.image.status === Image.Ready;
3939 visible: showHeader && active && status == Loader.Ready;
4040 width: units.gu(6);
4141 height: units.gu(5.625);
42− sourceComponent: UbuntuShape { image: mascotImage }
42+ sourceComponent: UbuntuShape { image: mascotImage.image }
4343 anchors { verticalCenter: parent.verticalCenter; }
4444 }
4545
@@ -47,8 +47,7 @@ Loader {
4747 id: mascotImage;
4848 objectName: "mascotImage";
4949 anchors { verticalCenter: parent.verticalCenter; }
50− property bool doLoadSource: !NetworkingStatus.limitedBandwith;
51− source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["mascot"] || ""; }
50+ source: cardData && cardData["mascot"] || "";
5251 width: units.gu(6);
5352 height: units.gu(5.625);
5453 horizontalAlignment: Image.AlignHCenter;
tests/plugins/Dash/cardcreator/5.res+10−10
@@ -46,16 +46,16 @@ Item {
4646 height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height });
4747 }
4848 }
49− image: CroppedImageMinimumSourceSize {
50− objectName: "artImage";
51− property bool doLoadSource: !NetworkingStatus.limitedBandwith;
52− source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["art"] || ""; }
53− cache: true;
54− asynchronous: root.asynchronous;
55− visible: false;
56− width: root.width;
57− height: width / artShape.aspect;
58− }
49+ CroppedImageMinimumSourceSize {
50+ id: artImage;
51+ objectName: "artImage";
52+ source: cardData && cardData["art"] || "";
53+ asynchronous: root.asynchronous;
54+ visible: false;
55+ width: root.width;
56+ height: width / artShape.aspect;
57+ }
58+ image: artImage.image;
5959 }
6060 }
6161 }
tests/plugins/Dash/cardcreator/6.res+1−1
@@ -95,7 +95,7 @@ Item {
9595 text: cardData && cardData["subtitle"] || "";
9696 font.weight: Font.Light;
9797 }
98−,StatusIcon {
98+,Icon {
9999 id: emblemIcon;
100100 objectName: "emblemIcon";
101101 anchors {
tests/plugins/Dash/cardcreator/7.res+2−3
@@ -68,13 +68,12 @@ CroppedImageMinimumSourceSize {
6868 id: mascotImage;
6969 objectName: "mascotImage";
7070 anchors { verticalCenter: parent.verticalCenter; }
71− property bool doLoadSource: !NetworkingStatus.limitedBandwith;
72− source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["mascot"] || ""; }
71+ source: cardData && cardData["mascot"] || "";
7372 width: units.gu(6);
7473 height: units.gu(5.625);
7574 horizontalAlignment: Image.AlignHCenter;
7675 verticalAlignment: Image.AlignVCenter;
77− visible: showHeader && resized;
76+ visible: showHeader;
7877 }
7978
8079,Item {
tests/plugins/Dash/tst_CroppedImageMinimumSourceSize.qmlnew file+56
@@ -0,0 +1,56 @@
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 QtTest 1.0
19+import Ubuntu.Components 1.1
20+import Dash 0.1
21+
22+Rectangle {
23+ width: 500
24+ height: 300
25+
26+ color: "red"
27+
28+ CroppedImageMinimumSourceSize {
29+ id: cimss
30+ x: 100
31+ y: 100
32+ width: 100
33+ height: 100
34+ source: Qt.resolvedUrl("../../qmltests/Dash/artwork/music-player-design.png")
35+ asynchronous: true
36+ }
37+
38+ TestCase {
39+ id: testCase
40+ name: "ScopeStyle"
41+ when: windowShown
42+
43+ function test_croppedSource() {
44+ tryCompare(cimss.image.sourceSize, "width", 100);
45+ tryCompare(cimss.image.sourceSize, "height", 0);
46+
47+ cimss.width = 40;
48+ tryCompare(cimss.image.sourceSize, "width", 0);
49+ tryCompare(cimss.image.sourceSize, "height", 100);
50+
51+ cimss.width = 100;
52+ tryCompare(cimss.image.sourceSize, "width", 100);
53+ tryCompare(cimss.image.sourceSize, "height", 0);
54+ }
55+ }
56+}
tests/plugins/Dash/tst_ScopeStyle.qml+1−1
@@ -174,7 +174,7 @@ Rectangle {
174174
175175 function test_previewButtonColor_data() {
176176 return [
177− { tag: "default", index: 0, previewButtonColor: Theme.palette.selected.foreground },
177+ { tag: "default", index: 0, previewButtonColor: UbuntuColors.orange },
178178 { tag: "red", index: 1, previewButtonColor: "red" },
179179 ];
180180 }
tests/qmltests/Dash/tst_Card.qml−22
@@ -17,7 +17,6 @@
1717import QtQuick 2.0
1818import QtTest 1.0
1919import Ubuntu.Components 0.1
20−import Ubuntu.Connectivity 1.0
2120import Unity.Test 0.1 as UT
2221import "../../../qml/Dash"
2322import "CardHelpers.js" as Helpers
@@ -221,7 +220,6 @@ Rectangle {
221220
222221 function init() {
223222 loader.visible = true;
224− NetworkingStatus.limitedBandwith = false;
225223 }
226224
227225 function cleanup() {
@@ -585,25 +583,5 @@ Rectangle {
585583 verify((card.width - titleToCard.x - titleToCard.width) === units.gu(1));
586584 }
587585 }
588−
589− function test_load_images_visibility_network_data() {
590− return [
591− { tag: "Visible, network", visible: true, limitedBandwith: false },
592− { tag: "Visible, no network", visible: true, limitedBandwith: true },
593− { tag: "Not Visible, network", visible: false, limitedBandwith: false },
594− { tag: "Not Visible, no network", visible: false, limitedBandwith: true }
595− ];
596− }
597−
598− function test_load_images_visibility_network(data) {
599− loader.visible = data.visible;
600− NetworkingStatus.limitedBandwith = data.limitedBandwith;
601−
602− selector.selectedIndex = 0;
603− waitForRendering(selector);
604− waitForRendering(card);
605−
606− verify(data.visible || !data.limitedBandwith || artImage.source == "");
607− }
608586 }
609587}
tests/qmltests/Dash/tst_Dash.qml+20−2
@@ -243,8 +243,10 @@ Item {
243243 tryCompare(scopesOverviewRepeater, "count", 0);
244244
245245 // Click on a temp scope in the search
246− var dashCategorysearchA = findChild(searchResultsViewer, "dashCategorysearchA");
247− var cardTempScope = findChild(dashCategorysearchA, "delegate2");
246+ tryCompareFunction( function() {
247+ return findChild(findChild(searchResultsViewer, "dashCategorysearchA"), "delegate2") != null;
248+ }, true);
249+ var cardTempScope = findChild(findChild(searchResultsViewer, "dashCategorysearchA"), "delegate2");
248250 verify(cardTempScope, "Could not find delegate2");
249251
250252 waitForRendering(cardTempScope);
@@ -298,6 +300,22 @@ Item {
298300 tryCompare(dashContentList, "currentIndex", 1)
299301 }
300302
303+ function test_setCurrentScopeClosesPreview() {
304+ var dashContent = findChild(dash, "dashContent");
305+ waitForRendering(dash)
306+
307+ var delegate0 = findChild(dash, "delegate0");
308+ mouseClick(delegate0, delegate0.width / 2, delegate0.height / 2);
309+
310+ tryCompare(dashContent, "subPageShown", true)
311+ waitForRendering(dash);
312+
313+ var dashCommunicatorService = findInvisibleChild(dash, "dashCommunicatorService");
314+ dashCommunicatorService.mockSetCurrentScope(0, true, false);
315+
316+ tryCompare(dashContent, "subPageShown", false)
317+ }
318+
301319 function test_processing_indicator() {
302320 var processingIndicator = findChild(dash, "processingIndicator");
303321 verify(processingIndicator, "Can't find the processing indicator.");
tests/qmltests/Dash/tst_GenericScopeView.qml+3−2
@@ -293,6 +293,7 @@ Item {
293293 },
294294 true);
295295 var tile = findChild(findChild(genericScopeView, "dashCategory"+category), "delegate"+delegate);
296+ waitForRendering(tile);
296297 mouseClick(tile, tile.width / 2, tile.height / 2);
297298 tryCompare(testCase.subPageLoader, "open", true);
298299 tryCompare(testCase.subPageLoader, "x", 0);
@@ -461,8 +462,8 @@ Item {
461462
462463 var innerHeader = findChild(header, "innerPageHeader");
463464 verify(innerHeader, "Could not find the inner header");
464− verify(Qt.colorEqual(innerHeader.textColor, data.foreground),
465− "Foreground color not equal: %1 != %2".arg(innerHeader.textColor).arg(data.foreground));
465+ verify(Qt.colorEqual(innerHeader.config.foregroundColor, data.foreground),
466+ "Foreground color not equal: %1 != %2".arg(innerHeader.config.foregroundColor).arg(data.foreground));
466467
467468 var background = findChild(header, "headerBackground");
468469 verify(background, "Could not find the background");
tests/qmltests/Dash/tst_PreviewListView.qml+2−2
@@ -100,8 +100,8 @@ Rectangle {
100100
101101 var innerHeader = findChild(header, "innerPageHeader");
102102 verify(innerHeader, "Could not find the inner header");
103− verify(Qt.colorEqual(innerHeader.textColor, UbuntuColors.darkGrey),
104− "Foreground color not equal: %1 != %2".arg(innerHeader.textColor).arg(UbuntuColors.darkGrey));
103+ verify(Qt.colorEqual(innerHeader.config.foregroundColor, UbuntuColors.darkGrey),
104+ "Foreground color not equal: %1 != %2".arg(innerHeader.config.foregroundColor).arg(UbuntuColors.darkGrey));
105105
106106 var background = findChild(header, "headerBackground");
107107 verify(background, "Could not find the background");
tests/qmltests/Panel/tst_IndicatorsBar.qml+1−1
@@ -136,8 +136,8 @@ IndicatorTest {
136136 var dataItem = findChild(indicatorsBar, root.originalModelData[data.index]["identifier"] + "-panelItem");
137137 verify(dataItem !== null);
138138
139+ waitForRendering(dataItem);
139140 var mappedPosition = indicatorsBar.mapFromItem(dataItem, dataItem.width/2, dataItem.height/2);
140−
141141 indicatorsBar.selectItemAt(mappedPosition.x);
142142 indicatorsBar.expanded = true;
143143 wait_for_expansion_to_settle();
tests/qmltests/Panel/tst_IndicatorsMenu.qml+3−3
@@ -174,7 +174,7 @@ IndicatorTest {
174174 // and expose the header
175175 function test_hint() {
176176 var indicatorItem = get_indicator_item(0);
177− var mappedPosition = root.mapFromItem(indicatorItem, indicatorItem.width/2, indicatorItem.height/2);
177+ var mappedPosition = indicatorsMenu.mapFromItem(indicatorItem, indicatorItem.width/2, indicatorItem.height/2);
178178
179179 touchPress(indicatorsMenu, mappedPosition.x, indicatorsMenu.minimizedPanelHeight / 2);
180180
@@ -195,7 +195,7 @@ IndicatorTest {
195195 for (var i = 0; i < root.originalModelData.length; i++) {
196196 var indicatorItem = get_indicator_item(i);
197197
198− var mappedPosition = root.mapFromItem(indicatorItem, indicatorItem.width/2, indicatorItem.height/2);
198+ var mappedPosition = indicatorsMenu.mapFromItem(indicatorItem, indicatorItem.width/2, indicatorItem.height/2);
199199
200200 touchFlick(indicatorsMenu,
201201 mappedPosition.x, mappedPosition.y,
@@ -227,7 +227,7 @@ IndicatorTest {
227227
228228 // Get the first indicator
229229 var firstItem = get_indicator_item(0);
230− var firstItemMappedPosition = root.mapFromItem(firstItem, firstItem.width/2, firstItem.height/2);
230+ var firstItemMappedPosition = indicatorsMenu.mapFromItem(firstItem, firstItem.width/2, firstItem.height/2);
231231
232232 // 1) Drag the mouse down to hint a bit
233233 touchFlick(indicatorsMenu,
tests/qmltests/Panel/tst_Panel.qml+5−10
@@ -186,11 +186,10 @@ IndicatorTest {
186186 for (var i = 0; i < root.originalModelData.length; i++) {
187187 var indicatorItem = get_indicator_item(i);
188188
189− var startXPosition = root.mapFromItem(indicatorItem, indicatorItem.width / 2, 0).x;
190− var startYPosition = root.mapFromItem(panel, 0, 0).y;
189+ var startXPosition = panel.mapFromItem(indicatorItem, indicatorItem.width / 2, 0).x;
191190
192191 touchFlick(panel,
193− startXPosition, startYPosition,
192+ startXPosition, 0,
194193 startXPosition, panel.height,
195194 true /* beginTouch */, false /* endTouch */, units.gu(5), 15);
196195
@@ -244,17 +243,13 @@ IndicatorTest {
244243 // (switches between normal and fullscreen modes are animated)
245244 tryCompareFunction(function() { return indicatorArea.y }, data.indicatorY);
246245
247− var startXPosition = root.mapFromItem(panel.indicators, panel.indicators.width / 2, 0).x;
248− var startYPosition = root.mapFromItem(panel, 0, panel.height).y;
249−
250246 panel.indicators.show();
251247 tryCompare(panel.indicators.showAnimation, "running", false);
252248 tryCompare(panel.indicators, "unitProgress", 1);
253249
254−
255250 touchFlick(panel.indicators,
256− startXPosition, startYPosition,
257− startXPosition, 0,
251+ panel.indicators.width / 2, panel.height,
252+ panel.indicators.width / 2, 0,
258253 true /* beginTouch */, false /* endTouch */, units.gu(5), 15);
259254
260255 // Indicators height should follow the drag, and therefore increase accordingly.
@@ -263,7 +258,7 @@ IndicatorTest {
263258 function() {return panel.indicators.height <= panel.height * 0.5},
264259 true);
265260
266− touchRelease(panel.indicators, startXPosition, 0);
261+ touchRelease(panel.indicators, panel.indicators.width / 2, 0);
267262
268263 tryCompare(panel.indicators.hideAnimation, "running", true);
269264 tryCompare(panel.indicators.hideAnimation, "running", false);
tests/qmltests/Stages/tst_PhoneStage.qml+41−6
@@ -128,17 +128,20 @@ Item {
128128 var startX = phoneStage.width - 2;
129129 var startY = phoneStage.height / 2;
130130 var endY = startY;
131− var endX = units.gu(2);
131+ var endX = phoneStage.width / 2;
132132
133133 touchFlick(phoneStage, startX, startY, endX, endY,
134134 true /* beginTouch */, true /* endTouch */, units.gu(10), 50);
135+
136+ tryCompare(spreadView, "phase", 2);
137+ waitForRendering(phoneStage);
135138 }
136139
137140 function test_shortFlick() {
138141 addApps(2)
139142 var startX = phoneStage.width - units.gu(1);
140143 var startY = phoneStage.height / 2;
141− var endX = phoneStage.width / 2;
144+ var endX = startX - units.gu(4);
142145 var endY = startY;
143146
144147 var activeApp = ApplicationManager.get(0);
@@ -164,7 +167,7 @@ Item {
164167 {tag: "<position2 (non-linear)", positionMarker: "positionMarker2", linear: false, offset: -1, endPhase: 0, targetPhase: 0, newFocusedIndex: 1 },
165168 {tag: ">position2", positionMarker: "positionMarker2", linear: true, offset: +1, endPhase: 1, targetPhase: 0, newFocusedIndex: 1 },
166169 {tag: "<position3", positionMarker: "positionMarker3", linear: true, offset: -1, endPhase: 1, targetPhase: 0, newFocusedIndex: 1 },
167− {tag: ">position3", positionMarker: "positionMarker3", linear: true, offset: +1, endPhase: 2, targetPhase: 2, newFocusedIndex: 2 },
170+ {tag: ">position3", positionMarker: "positionMarker3", linear: true, offset: +1, endPhase: 1, targetPhase: 2, newFocusedIndex: 2 },
168171 ];
169172 }
170173
@@ -274,7 +277,7 @@ Item {
274277 compare(ApplicationManager.focusedApplicationId, selectedApp.appId);
275278 }
276279
277− function test_orientation_change_sent_to_focused_app() {
280+ function test_orientationChangeSentToFocusedApp() {
278281 phoneStage.orientation = Qt.PortraitOrientation;
279282 addApps(1);
280283
@@ -286,7 +289,7 @@ Item {
286289 tryCompare(app, "orientation", Qt.LandscapeOrientation);
287290 }
288291
289− function test_orientation_change_not_sent_to_apps_while_spread_open() {
292+ function test_orientationChangeNotSentToAppsWhileSpreadOpen() {
290293 phoneStage.orientation = Qt.PortraitOrientation;
291294 addApps(1);
292295
@@ -299,7 +302,7 @@ Item {
299302 tryCompare(app, "orientation", Qt.PortraitOrientation);
300303 }
301304
302− function test_orientation_change_not_sent_to_unfocused_app_until_it_focused() {
305+ function test_orientationChangeNotSentToUnfocusedAppUntilItFocused() {
303306 phoneStage.orientation = Qt.PortraitOrientation;
304307 addApps(1);
305308
@@ -357,5 +360,37 @@ Item {
357360 tryCompare(firstApp, "state", ApplicationInfoInterface.Running);
358361 tryCompare(firstApp, "focused", true);
359362 }
363+
364+ function test_cantCloseWhileSnapping() {
365+ addApps(2);
366+
367+ goToSpread();
368+
369+ var spreadView = findChild(phoneStage, "spreadView");
370+ var selectedApp = ApplicationManager.get(2);
371+
372+ goToSpread();
373+
374+ var app0 = findChild(spreadView, "appDelegate0");
375+ var app1 = findChild(spreadView, "appDelegate1");
376+ var app2 = findChild(spreadView, "appDelegate2");
377+
378+ var dragArea0 = findChild(app0, "dragArea");
379+ var dragArea1 = findChild(app1, "dragArea");
380+ var dragArea2 = findChild(app2, "dragArea");
381+
382+ compare(dragArea0.enabled, true);
383+ compare(dragArea1.enabled, true);
384+ compare(dragArea2.enabled, true);
385+
386+ phoneStage.select(selectedApp.appId);
387+
388+ // Make sure all drag areas are disabled instantly. Don't use tryCompare here!
389+ compare(dragArea0.enabled, false);
390+ compare(dragArea1.enabled, false);
391+ compare(dragArea2.enabled, false);
392+
393+ tryCompare(spreadView, "contentX", -spreadView.shift)
394+ }
360395 }
361396}
tests/qmltests/Stages/tst_SpreadDelegate.qml+11−5
@@ -110,7 +110,7 @@ Rectangle {
110110 {tag: "swipeToClose=true closeable=true -> appWindow moves away",
111111 swipeToClose: true, closeable: true },
112112
113− {tag: "swipeToClose=true closeable=alse -> appWindow bounces back",
113+ {tag: "swipeToClose=true closeable=false -> appWindow bounces back",
114114 swipeToClose: true, closeable: false },
115115
116116 {tag: "swipeToClose=false -> appWindow stays put",
@@ -126,18 +126,24 @@ Rectangle {
126126 swipeToCloseCheckbox.checked = data.swipeToClose;
127127 closeableCheckbox.checked = data.closeable;
128128
129− var dragDistance = spreadDelegateLoader.item.height / 2;
129+ var dragDistance = spreadDelegateLoader.item.height * 0.8;
130130 var touchX = spreadDelegateLoader.item.width / 2;
131− var fromY = spreadDelegateLoader.item.height / 2;
131+ var fromY = spreadDelegateLoader.item.height * 0.9;
132132 var toY = fromY - dragDistance;
133133 touchFlick(spreadDelegateLoader.item,
134134 touchX /* fromX */, fromY, touchX /* toX */, toY,
135135 true /* beginTouch */, false /* endTouch */, dragArea.minSpeedToClose * 1.1 /* speed */);
136136
137−
138137 if (data.swipeToClose) {
139138 verify(appWindowWithShadow.y < 0);
140− verify(Math.abs(Math.abs(appWindowWithShadow.y) - dragDistance) < units.gu(1));
139+ var threshold = findChild(spreadDelegateLoader.item, "dragArea").threshold
140+ if (data.closeable) {
141+ // Verify that the delegate started moving exactly "threshold" after the finger movement
142+ // and did not jump up to the finger, but lags the threshold behind
143+ compare(Math.abs(Math.abs(appWindowWithShadow.y) - dragDistance), threshold);
144+ } else {
145+ verify(Math.abs(Math.abs(appWindowWithShadow.y) - dragDistance) > threshold);
146+ }
141147
142148 touchRelease(spreadDelegateLoader.item, touchX, toY - units.gu(1));
143149
tests/qmltests/tst_Shell.qml+1
@@ -194,6 +194,7 @@ Item {
194194 killApps(ApplicationManager);
195195
196196 unlockAllModemsSpy.clear()
197+ LightDM.Greeter.authenticate(""); // reset greeter
197198
198199 // reload our test subject to get it in a fresh state once again
199200 shellLoader.active = true;
tests/qmltests/tst_ShellWithPin.qml+1
@@ -161,6 +161,7 @@ Item {
161161 AccountsService.enableIndicatorsWhileLocked = true
162162 AccountsService.demoEdges = false
163163 callManager.foregroundCall = null
164+ LightDM.Greeter.authenticate(""); // reset greeter
164165
165166 // reload our test subject to get it in a fresh state once again
166167 shellLoader.active = true
tests/qmltests/tst_TabletShell.qml+1
@@ -149,6 +149,7 @@ Row {
149149
150150 unlockAllModemsSpy.clear()
151151 AccountsService.demoEdges = false
152+ LightDM.Greeter.authenticate(""); // reset greeter
152153
153154 // reload our test subject to get it in a fresh state once again
154155 shellLoader.active = true
tests/utils/modules/Unity/Test/UnityTestCase.qml+11−7
@@ -221,6 +221,10 @@ TestCase {
221221 // Make sure the item is rendered
222222 waitForRendering(item);
223223
224+ var root = fetchRootItem(item);
225+ var rootFrom = item.mapToItem(root, x, y);
226+ var rootTo = item.mapToItem(root, toX, toY);
227+
224228 // Default to true for beginTouch if not present
225229 beginTouch = (beginTouch !== undefined) ? beginTouch : true
226230
@@ -233,17 +237,17 @@ TestCase {
233237 // Set a default iterations if not specified
234238 var iterations = (iterations !== undefined) ? iterations : 5
235239
236− var distance = Math.sqrt(Math.pow(toX - x, 2) + Math.pow(toY - y, 2))
240+ var distance = Math.sqrt(Math.pow(rootTo.x - rootFrom.x, 2) + Math.pow(rootTo.Y - rootFrom.y, 2))
237241 var totalTime = (distance / speed) * 1000 /* converting speed to pixels/ms */
238242
239243 var timeStep = totalTime / iterations
240− var diffX = (toX - x) / iterations
241− var diffY = (toY - y) / iterations
244+ var diffX = (rootTo.x - rootFrom.x) / iterations
245+ var diffY = (rootTo.y - rootFrom.y) / iterations
242246 if (beginTouch) {
243247 fakeDateTime.currentTimeMs += timeStep
244248
245249 var event = touchEvent()
246− event.press(0 /* touchId */, x, y)
250+ event.press(0 /* touchId */, rootFrom.x, rootFrom.y)
247251 event.commit()
248252 }
249253 for (var i = 0; i < iterations; ++i) {
@@ -253,19 +257,19 @@ TestCase {
253257 // the point specified
254258 wait(iterations / speed)
255259 var event = touchEvent()
256− event.move(0 /* touchId */, toX, toY)
260+ event.move(0 /* touchId */, rootTo.x, rootTo.y)
257261 event.commit()
258262 } else {
259263 wait(iterations / speed)
260264 var event = touchEvent()
261− event.move(0 /* touchId */, x + (i + 1) * diffX, y + (i + 1) * diffY)
265+ event.move(0 /* touchId */, rootFrom.x + (i + 1) * diffX, rootFrom.y + (i + 1) * diffY)
262266 event.commit()
263267 }
264268 }
265269 if (endTouch) {
266270 fakeDateTime.currentTimeMs += timeStep
267271 var event = touchEvent()
268− event.release(0 /* touchId */, toX, toY)
272+ event.release(0 /* touchId */, rootTo.x, rootTo.y)
269273 event.commit()
270274 }
271275 }