on xenial help sign in
Merge
commitb98431818d5cdafec5d6067eb61a42d3d2c588e0 authorAlbert Astals <albert.astals@canonical.com> dateWed 3 Dec 2014, 08:44 (12 years ago) parent2b1d56257f15d1
133 files changed+1036−573
debian/changelog+35 debian/control+1−1 plugins/Dash/CMakeLists.txt+3−2 plugins/Dash/CardCreator.js+8−10 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+21−21 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+21−21 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+21−21 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+21−21 qml/Dash/CardCarousel.qml+1 qml/Dash/CardGrid.qml+1−1 qml/Dash/CardHorizontalList.qml+1 qml/Dash/CardVerticalJournal.qml−1 qml/Dash/Dash.qml+13−4 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/Shell.qml+6−2 qml/Stages/PhoneStage.qml+17−33 qml/Stages/SpreadDelegate.qml+8−1 qml/Stages/TabletStage.qml+5−14 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/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+16 tests/qmltests/Dash/tst_GenericScopeView.qml+1 tests/qmltests/Panel/tst_IndicatorsMenu.qml+3−3 tests/qmltests/Panel/tst_Panel.qml+5−10 tests/qmltests/Stages/tst_PhoneStage.qml+8−3 tests/qmltests/Stages/tst_SpreadDelegate.qml+10−7 tests/qmltests/tst_Shell.qml+3−2 tests/qmltests/tst_ShellWithPin.qml+1 tests/qmltests/tst_TabletShell.qml+1 tests/utils/modules/Unity/Test/UnityTestCase.qml+11−7
debian/changelog+35
@@ -1,3 +1,38 @@
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+
136unity8 (8.01+15.04.20141125.2-0ubuntu1) vivid; urgency=low
237
338 [ Michael Zanetti ]
debian/control+1−1
@@ -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],
@@ -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/CardCreator.js+8−10
@@ -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\
@@ -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+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-24 06:20+0000\n"
19−"X-Generator: Launchpad (build 17252)\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: "
@@ -267,31 +267,31 @@ msgstr "Feu un toc per tornar a la cridada..."
267267msgid "Conference"
268268msgstr "Conferència"
269269
270−#: qml/Panel/Indicators/MenuItemFactory.qml:615
270+#: qml/Panel/Indicators/MenuItemFactory.qml:643
271271msgid "Nothing is playing"
272272msgstr "No s'està reproduint res"
273273
274−#: qml/Panel/Indicators/MenuItemFactory.qml:763
274+#: qml/Panel/Indicators/MenuItemFactory.qml:791
275275msgid "In queue…"
276276msgstr "A la cua..."
277277
278−#: qml/Panel/Indicators/MenuItemFactory.qml:767
278+#: qml/Panel/Indicators/MenuItemFactory.qml:795
279279msgid "Downloading"
280280msgstr "S'està baixant"
281281
282−#: qml/Panel/Indicators/MenuItemFactory.qml:769
282+#: qml/Panel/Indicators/MenuItemFactory.qml:797
283283msgid "Paused, tap to resume"
284284msgstr "En pausa, feu un toc per continuar"
285285
286−#: qml/Panel/Indicators/MenuItemFactory.qml:771
286+#: qml/Panel/Indicators/MenuItemFactory.qml:799
287287msgid "Canceled"
288288msgstr "S'ha cancel·lat"
289289
290−#: qml/Panel/Indicators/MenuItemFactory.qml:773
290+#: qml/Panel/Indicators/MenuItemFactory.qml:801
291291msgid "Finished"
292292msgstr "S'ha finalitzat"
293293
294−#: qml/Panel/Indicators/MenuItemFactory.qml:775
294+#: qml/Panel/Indicators/MenuItemFactory.qml:803
295295msgid "Failed, tap to retry"
296296msgstr "Ha fallat, feu un toc per tornar-ho a intentar"
297297
@@ -303,49 +303,49 @@ msgstr "Desbloca la SIM"
303303msgid "Roaming"
304304msgstr "Itinerància"
305305
306−#: qml/Shell.qml:381
306+#: qml/Shell.qml:391
307307msgid "Enter passphrase"
308308msgstr "Introduïu la contrasenya"
309309
310−#: qml/Shell.qml:382
310+#: qml/Shell.qml:392
311311msgid "Sorry, incorrect passphrase"
312312msgstr "La contrasenya no és correcta"
313313
314−#: qml/Shell.qml:383
314+#: qml/Shell.qml:393
315315msgid "Please re-enter"
316316msgstr "Torneu-ho a introduir"
317317
318−#: qml/Shell.qml:385
318+#: qml/Shell.qml:395
319319msgid "Enter passcode"
320320msgstr "Introduïu el codi d'accés"
321321
322−#: qml/Shell.qml:386
322+#: qml/Shell.qml:396
323323msgid "Sorry, incorrect passcode"
324324msgstr "El codi d'accés no és correcte"
325325
326−#: qml/Shell.qml:389
326+#: qml/Shell.qml:399
327327#, qt-format
328328msgid "Enter %1"
329329msgstr "Introduïu: %1"
330330
331−#: qml/Shell.qml:390
331+#: qml/Shell.qml:400
332332#, qt-format
333333msgid "Sorry, incorrect %1"
334334msgstr "Incorrecte (%1)"
335335
336−#: qml/Shell.qml:431
336+#: qml/Shell.qml:441
337337msgid "Sorry, incorrect passphrase."
338338msgstr "La contrasenya és incorrecta"
339339
340−#: qml/Shell.qml:432
340+#: qml/Shell.qml:442
341341msgid "Sorry, incorrect passcode."
342342msgstr "El codi d'accés no és correcte"
343343
344−#: qml/Shell.qml:433
344+#: qml/Shell.qml:443
345345msgid "This will be your last attempt."
346346msgstr "Este serà el darrer intent."
347347
348−#: qml/Shell.qml:435
348+#: qml/Shell.qml:445
349349msgid ""
350350"If passphrase is entered incorrectly, your phone will conduct a factory "
351351"reset and all personal data will be deleted."
@@ -354,7 +354,7 @@ msgstr ""
354354"reinicialitzarà a l'estat de fàbrica i se suprimiran totes les dades "
355355"personals."
356356
357−#: qml/Shell.qml:436
357+#: qml/Shell.qml:446
358358msgid ""
359359"If passcode is entered incorrectly, your phone will conduct a factory reset "
360360"and all personal data will be deleted."
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+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=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-11-21 06:49+0000\n"
19−"X-Generator: Launchpad (build 17252)\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: "
@@ -253,31 +253,31 @@ msgstr "タップすると通話に戻ります..."
253253msgid "Conference"
254254msgstr "グループ通話"
255255
256−#: qml/Panel/Indicators/MenuItemFactory.qml:615
256+#: qml/Panel/Indicators/MenuItemFactory.qml:643
257257msgid "Nothing is playing"
258258msgstr ""
259259
260−#: qml/Panel/Indicators/MenuItemFactory.qml:763
260+#: qml/Panel/Indicators/MenuItemFactory.qml:791
261261msgid "In queue…"
262262msgstr "開始待ち..."
263263
264−#: qml/Panel/Indicators/MenuItemFactory.qml:767
264+#: qml/Panel/Indicators/MenuItemFactory.qml:795
265265msgid "Downloading"
266266msgstr "ダウンロード中"
267267
268−#: qml/Panel/Indicators/MenuItemFactory.qml:769
268+#: qml/Panel/Indicators/MenuItemFactory.qml:797
269269msgid "Paused, tap to resume"
270270msgstr "停止中、再開するにはタップしてください"
271271
272−#: qml/Panel/Indicators/MenuItemFactory.qml:771
272+#: qml/Panel/Indicators/MenuItemFactory.qml:799
273273msgid "Canceled"
274274msgstr "中止しました"
275275
276−#: qml/Panel/Indicators/MenuItemFactory.qml:773
276+#: qml/Panel/Indicators/MenuItemFactory.qml:801
277277msgid "Finished"
278278msgstr "完了しました"
279279
280−#: qml/Panel/Indicators/MenuItemFactory.qml:775
280+#: qml/Panel/Indicators/MenuItemFactory.qml:803
281281msgid "Failed, tap to retry"
282282msgstr "失敗しました、再試行するにはタップしてください"
283283
@@ -289,55 +289,55 @@ msgstr "SIMのアンロック"
289289msgid "Roaming"
290290msgstr "ローミング"
291291
292−#: qml/Shell.qml:381
292+#: qml/Shell.qml:391
293293msgid "Enter passphrase"
294294msgstr "パスフレーズを入力"
295295
296−#: qml/Shell.qml:382
296+#: qml/Shell.qml:392
297297msgid "Sorry, incorrect passphrase"
298298msgstr "パスフレーズが違います"
299299
300−#: qml/Shell.qml:383
300+#: qml/Shell.qml:393
301301msgid "Please re-enter"
302302msgstr "再入力してください"
303303
304−#: qml/Shell.qml:385
304+#: qml/Shell.qml:395
305305msgid "Enter passcode"
306306msgstr "パスコードを入力"
307307
308−#: qml/Shell.qml:386
308+#: qml/Shell.qml:396
309309msgid "Sorry, incorrect passcode"
310310msgstr "パスコードが違います"
311311
312−#: qml/Shell.qml:389
312+#: qml/Shell.qml:399
313313#, qt-format
314314msgid "Enter %1"
315315msgstr "%1 を入力"
316316
317−#: qml/Shell.qml:390
317+#: qml/Shell.qml:400
318318#, qt-format
319319msgid "Sorry, incorrect %1"
320320msgstr "%1が違います"
321321
322−#: qml/Shell.qml:431
322+#: qml/Shell.qml:441
323323msgid "Sorry, incorrect passphrase."
324324msgstr "パスフレーズが間違っています。"
325325
326−#: qml/Shell.qml:432
326+#: qml/Shell.qml:442
327327msgid "Sorry, incorrect passcode."
328328msgstr "パスコードが間違っています。"
329329
330−#: qml/Shell.qml:433
330+#: qml/Shell.qml:443
331331msgid "This will be your last attempt."
332332msgstr "これが最後のチャンスです。"
333333
334−#: qml/Shell.qml:435
334+#: qml/Shell.qml:445
335335msgid ""
336336"If passphrase is entered incorrectly, your phone will conduct a factory "
337337"reset and all personal data will be deleted."
338338msgstr "パスフレーズが間違っている場合、ファクトリーリセットを実施し、すべての個人データは削除されます。"
339339
340−#: qml/Shell.qml:436
340+#: qml/Shell.qml:446
341341msgid ""
342342"If passcode is entered incorrectly, your phone will conduct a factory reset "
343343"and all personal data will be deleted."
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+21−21
@@ -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-19 06:24+0000\n"
20−"X-Generator: Launchpad (build 17252)\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: "
@@ -265,31 +265,31 @@ msgstr "Atingeți pentru a vă întoarce la convorbire..."
265265msgid "Conference"
266266msgstr "Conferință"
267267
268−#: qml/Panel/Indicators/MenuItemFactory.qml:615
268+#: qml/Panel/Indicators/MenuItemFactory.qml:643
269269msgid "Nothing is playing"
270270msgstr "Nu se redă nimic"
271271
272−#: qml/Panel/Indicators/MenuItemFactory.qml:763
272+#: qml/Panel/Indicators/MenuItemFactory.qml:791
273273msgid "In queue…"
274274msgstr "În așteptare..."
275275
276−#: qml/Panel/Indicators/MenuItemFactory.qml:767
276+#: qml/Panel/Indicators/MenuItemFactory.qml:795
277277msgid "Downloading"
278278msgstr "Se descarcă"
279279
280−#: qml/Panel/Indicators/MenuItemFactory.qml:769
280+#: qml/Panel/Indicators/MenuItemFactory.qml:797
281281msgid "Paused, tap to resume"
282282msgstr "În pauză, atingeți pentru a relua"
283283
284−#: qml/Panel/Indicators/MenuItemFactory.qml:771
284+#: qml/Panel/Indicators/MenuItemFactory.qml:799
285285msgid "Canceled"
286286msgstr "Anulată"
287287
288−#: qml/Panel/Indicators/MenuItemFactory.qml:773
288+#: qml/Panel/Indicators/MenuItemFactory.qml:801
289289msgid "Finished"
290290msgstr "Finalizată"
291291
292−#: qml/Panel/Indicators/MenuItemFactory.qml:775
292+#: qml/Panel/Indicators/MenuItemFactory.qml:803
293293msgid "Failed, tap to retry"
294294msgstr "Eșec, atingeți pentru a încerca din nou"
295295
@@ -301,49 +301,49 @@ msgstr "Deblocare SIM"
301301msgid "Roaming"
302302msgstr "Roaming"
303303
304−#: qml/Shell.qml:381
304+#: qml/Shell.qml:391
305305msgid "Enter passphrase"
306306msgstr "Introduceți fraza parolă"
307307
308−#: qml/Shell.qml:382
308+#: qml/Shell.qml:392
309309msgid "Sorry, incorrect passphrase"
310310msgstr "Frază secretă incorectă"
311311
312−#: qml/Shell.qml:383
312+#: qml/Shell.qml:393
313313msgid "Please re-enter"
314314msgstr "Introduceți din nou"
315315
316−#: qml/Shell.qml:385
316+#: qml/Shell.qml:395
317317msgid "Enter passcode"
318318msgstr "Introduceți parola"
319319
320−#: qml/Shell.qml:386
320+#: qml/Shell.qml:396
321321msgid "Sorry, incorrect passcode"
322322msgstr "Parolă incorectă"
323323
324−#: qml/Shell.qml:389
324+#: qml/Shell.qml:399
325325#, qt-format
326326msgid "Enter %1"
327327msgstr "Introducere %1"
328328
329−#: qml/Shell.qml:390
329+#: qml/Shell.qml:400
330330#, qt-format
331331msgid "Sorry, incorrect %1"
332332msgstr "%1 incorectă"
333333
334−#: qml/Shell.qml:431
334+#: qml/Shell.qml:441
335335msgid "Sorry, incorrect passphrase."
336336msgstr "Frază parolă greșită"
337337
338−#: qml/Shell.qml:432
338+#: qml/Shell.qml:442
339339msgid "Sorry, incorrect passcode."
340340msgstr "Parolă greșită"
341341
342−#: qml/Shell.qml:433
342+#: qml/Shell.qml:443
343343msgid "This will be your last attempt."
344344msgstr "Aceasta va fi ultima încercare"
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."
@@ -352,7 +352,7 @@ msgstr ""
352352"configurările inițiale, ale fabricantului, iar toate datele personale vor fi "
353353"șterse."
354354
355−#: qml/Shell.qml:436
355+#: qml/Shell.qml:446
356356msgid ""
357357"If passcode is entered incorrectly, your phone will conduct a factory reset "
358358"and all personal data will be deleted."
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+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=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-11-20 06:27+0000\n"
19−"X-Generator: Launchpad (build 17252)\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: "
@@ -252,31 +252,31 @@ msgstr "輕觸可返回通話…"
252252msgid "Conference"
253253msgstr "會議"
254254
255−#: qml/Panel/Indicators/MenuItemFactory.qml:615
255+#: qml/Panel/Indicators/MenuItemFactory.qml:643
256256msgid "Nothing is playing"
257257msgstr "無影音播放中"
258258
259−#: qml/Panel/Indicators/MenuItemFactory.qml:763
259+#: qml/Panel/Indicators/MenuItemFactory.qml:791
260260msgid "In queue…"
261261msgstr "佇列中…"
262262
263−#: qml/Panel/Indicators/MenuItemFactory.qml:767
263+#: qml/Panel/Indicators/MenuItemFactory.qml:795
264264msgid "Downloading"
265265msgstr "下載中"
266266
267−#: qml/Panel/Indicators/MenuItemFactory.qml:769
267+#: qml/Panel/Indicators/MenuItemFactory.qml:797
268268msgid "Paused, tap to resume"
269269msgstr "已暫停,輕觸可繼續"
270270
271−#: qml/Panel/Indicators/MenuItemFactory.qml:771
271+#: qml/Panel/Indicators/MenuItemFactory.qml:799
272272msgid "Canceled"
273273msgstr "已取消"
274274
275−#: qml/Panel/Indicators/MenuItemFactory.qml:773
275+#: qml/Panel/Indicators/MenuItemFactory.qml:801
276276msgid "Finished"
277277msgstr "已完成"
278278
279−#: qml/Panel/Indicators/MenuItemFactory.qml:775
279+#: qml/Panel/Indicators/MenuItemFactory.qml:803
280280msgid "Failed, tap to retry"
281281msgstr "失敗,輕觸可重試"
282282
@@ -288,55 +288,55 @@ msgstr "為 SIM 卡解鎖"
288288msgid "Roaming"
289289msgstr "漫遊"
290290
291−#: qml/Shell.qml:381
291+#: qml/Shell.qml:391
292292msgid "Enter passphrase"
293293msgstr "輸入密語"
294294
295−#: qml/Shell.qml:382
295+#: qml/Shell.qml:392
296296msgid "Sorry, incorrect passphrase"
297297msgstr "抱歉,密語不對"
298298
299−#: qml/Shell.qml:383
299+#: qml/Shell.qml:393
300300msgid "Please re-enter"
301301msgstr "請再輸入"
302302
303−#: qml/Shell.qml:385
303+#: qml/Shell.qml:395
304304msgid "Enter passcode"
305305msgstr "輸入 passcode"
306306
307−#: qml/Shell.qml:386
307+#: qml/Shell.qml:396
308308msgid "Sorry, incorrect passcode"
309309msgstr "抱歉,passcode 不對"
310310
311−#: qml/Shell.qml:389
311+#: qml/Shell.qml:399
312312#, qt-format
313313msgid "Enter %1"
314314msgstr "輸入 %1"
315315
316−#: qml/Shell.qml:390
316+#: qml/Shell.qml:400
317317#, qt-format
318318msgid "Sorry, incorrect %1"
319319msgstr "抱歉,%1不對"
320320
321−#: qml/Shell.qml:431
321+#: qml/Shell.qml:441
322322msgid "Sorry, incorrect passphrase."
323323msgstr "抱歉,密語不對"
324324
325−#: qml/Shell.qml:432
325+#: qml/Shell.qml:442
326326msgid "Sorry, incorrect passcode."
327327msgstr "抱歉,passcode 不對。"
328328
329−#: qml/Shell.qml:433
329+#: qml/Shell.qml:443
330330msgid "This will be your last attempt."
331331msgstr "這將會是您最後一次嘗試的機會。"
332332
333−#: qml/Shell.qml:435
333+#: qml/Shell.qml:445
334334msgid ""
335335"If passphrase is entered incorrectly, your phone will conduct a factory "
336336"reset and all personal data will be deleted."
337337msgstr "如輸入的密語不對,本電話會進行重設,所有個人資料都會刪除。"
338338
339−#: qml/Shell.qml:436
339+#: qml/Shell.qml:446
340340msgid ""
341341"If passcode is entered incorrectly, your phone will conduct a factory reset "
342342"and all personal data will be deleted."
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/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+13−4
@@ -31,12 +31,22 @@ Showable {
3131 DashCommunicatorService {
3232 objectName: "dashCommunicatorService"
3333 onSetCurrentScopeRequested: {
34− if (!isSwipe || !window.active || bottomEdgeController.progress != 0) {
34+ if (!isSwipe || !window.active || bottomEdgeController.progress != 0 || scopeItem.scope || dashContent.subPageShown) {
3535 if (bottomEdgeController.progress != 0 && window.active) animate = false;
3636 dashContent.setCurrentScopeAtIndex(index, animate, isSwipe)
37+ // Close dash overview and nested temp scopes in it
3738 if (bottomEdgeController.progress != 0) {
38− bottomEdgeController.enableAnimation = window.active;
39+ bottomEdgeController.enableAnimation = window.active && !scopesOverview.showingNonFavoriteScope;
3940 bottomEdgeController.progress = 0;
41+ scopesOverview.closeTempScope();
42+ }
43+ // Close normal temp scopes (e.g. App Store)
44+ if (scopeItem.scope) {
45+ scopeItem.backClicked();
46+ }
47+ // Close previews
48+ if (dashContent.subPageShown) {
49+ dashContent.closePreview();
4050 }
4151 }
4252 }
@@ -268,7 +278,7 @@ Showable {
268278 id: orange
269279 anchors { top: parent.top; bottom: parent.bottom }
270280 width: parent.width / 4
271− color: Theme.palette.selected.foreground
281+ color: UbuntuColors.orange
272282
273283 SequentialAnimation {
274284 running: indicator.visible
@@ -350,5 +360,4 @@ Showable {
350360 }
351361 }
352362 }
353−
354363}
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/Shell.qml+6−2
@@ -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)
@@ -495,7 +499,7 @@ Item {
495499 // Just a tiny wrapper to adjust greeter's x without messing with its own dragging
496500 id: greeterWrapper
497501 objectName: "greeterWrapper"
498− x: greeter.narrowMode ? launcher.progress : 0
502+ x: (greeter.narrowMode && greeter.showProgress > 0) ? launcher.progress : 0
499503 y: panel.panelHeight
500504 width: parent.width
501505 height: parent.height - panel.panelHeight
@@ -574,7 +578,7 @@ Item {
574578 onShownChanged: {
575579 if (shown) {
576580 // Disable everything so that user can't swipe greeter or
577− // launcher until we get first prompt/authenticate, which
581+ // launcher until we get the next prompt/authenticate, which
578582 // will re-enable the shell.
579583 shell.enabled = false;
580584
qml/Stages/PhoneStage.qml+17−33
@@ -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
@@ -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+8−1
@@ -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
qml/Stages/TabletStage.qml+5−14
@@ -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/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+16
@@ -228,6 +228,22 @@ Item {
228228 tryCompare(dashContentList, "currentIndex", 1)
229229 }
230230
231+ function test_setCurrentScopeClosesPreview() {
232+ var dashContent = findChild(dash, "dashContent");
233+ waitForRendering(dash)
234+
235+ var delegate0 = findChild(dash, "delegate0");
236+ mouseClick(delegate0, delegate0.width / 2, delegate0.height / 2);
237+
238+ tryCompare(dashContent, "subPageShown", true)
239+ waitForRendering(dash);
240+
241+ var dashCommunicatorService = findInvisibleChild(dash, "dashCommunicatorService");
242+ dashCommunicatorService.mockSetCurrentScope(0, true, false);
243+
244+ tryCompare(dashContent, "subPageShown", false)
245+ }
246+
231247 function test_processing_indicator() {
232248 var processingIndicator = findChild(dash, "processingIndicator");
233249 verify(processingIndicator, "Can't find the processing indicator.");
tests/qmltests/Dash/tst_GenericScopeView.qml+1
@@ -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);
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+8−3
@@ -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
@@ -386,6 +389,8 @@ Item {
386389 compare(dragArea0.enabled, false);
387390 compare(dragArea1.enabled, false);
388391 compare(dragArea2.enabled, false);
392+
393+ tryCompare(spreadView, "contentX", -spreadView.shift)
389394 }
390395 }
391396}
tests/qmltests/Stages/tst_SpreadDelegate.qml+10−7
@@ -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,21 +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);
140139 var threshold = findChild(spreadDelegateLoader.item, "dragArea").threshold
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);
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+ }
144147
145148 touchRelease(spreadDelegateLoader.item, touchX, toY - units.gu(1));
146149
tests/qmltests/tst_Shell.qml+3−2
@@ -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;
@@ -501,8 +502,8 @@ Item {
501502 // Swipe upwards over the launcher to ensure that this icon
502503 // at the bottom is not folded and faded away.
503504 var touchStartX = launcherPanel.width / 2;
504− var touchStartY = launcherPanel.height / 2;
505− touchFlick(launcherPanel, touchStartX, touchStartY, touchStartX, 0);
505+ var touchEndY = launcherPanel.height / 2;
506+ touchFlick(launcherPanel, touchStartX, 0, touchStartX, touchEndY);
506507 tryCompare(launcherPanel, "moving", false);
507508
508509 tap(appIcon, appIcon.width / 2, appIcon.height / 2);
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 }