on xenial help sign in
Merge trunk

[ Albert Astals Cid ] * Add some context to tr calls (LP: #1431497) * Require binaries and .pc files we call from code * Test: More stubborn flick to the end [ Andrea Cimitan ] * Refactor PreviewOverlay to fix weird zoom out/in animations when previewing images from the Previews [ CI Train Bot ] * Resync trunk. [ Charles Kerr ] * Re-enable a rotation lock test now that the bug that broke that test has been fixed. (LP: #1410915) [ Daniel d'Andrada ] * Darkened area behind indicators menu should eat input until it fully disappears (LP: #1417967) * DesktopStage - fix focus switch when user taps on window (LP: #1431325) * Fix warnings when launching tutorial * Make MouseTouchAdaptor controllable from within QML * Make tst_Shell absorb tst_TabletShell [ Leo Arias ] * Changed the autopilot dependencies so they do not require qt4. (LP: #1429158) * Drop the support for python2 in autopilot tests. (LP: #1429163) * Stop using the deprecated toolkit emulators namespace in autopilot tests. (LP: #1341681) [ Michael Terry ] * Don't close wizard & edge tutorial when the unity8-dash closes (LP: #1425484) * Don't let the wizard sit indefinitely, waiting for a wizard page to finish preparing itself. (LP: #1425737) * Fix two broken qmluitest files by waiting for everything to settle before starting the tests. * Only call unlockAllModems once the wizard is done. (LP: #1425161) (LP: #1425161) * When we are locking the user out from too many login failures, notice when time passes even if the device is suspended. (LP: #1396817) (LP: #1396817) [ Michael Zanetti ] * Add a mouse area to the indicators panel so we can open them by clicking. (LP: #1417650) * fix launcher not reacting to first click when revealed by mouse hover, add tests * performance improvements (LP: #1430233, #1425087) [ Michał Sawicz ] * Remove the activity indicator from tests * Use targets instead of custom ld arguments for linking [ Mirco Müller ] * Updated the visuals of the SwipeToAct-widget for incoming-call snap- decision notifications according to new design-spec. * Updated the visuals of the SwipeToAct-widget for incoming-call snap- decision notifications according to new design-spec. * No-change rebuild against Qt 5.4.1.

commit5809e2d10b8455dd6df6bf1a4b288355617f47ba authorDaniel d'Andrada <daniel.dandrada@canonical.com> dateThu 19 Mar 2015, 09:55 (12 years ago) parentfcd86f34d5d38e
87 files changed+1742−1132
CODING+5−5 cmake/modules/autopilot.cmake−8 debian/changelog+72 debian/control+6−10 debian/rules+2−2 plugins/AccountsService/AccountsService.cpp+1−1 plugins/AccountsService/AccountsServiceDBusAdaptor.cpp+11−2 plugins/AccountsService/AccountsServiceDBusAdaptor.h+2 plugins/Unity/Launcher/gsettings.cpp+8−1 plugins/Unity/Launcher/gsettings.h+1 plugins/Utils/windowstatestorage.cpp+22−1 plugins/Utils/windowstatestorage.h+4 po/br.po+71−70 po/el.po+12−12 po/gd.po+55−54 po/pa.po+166−154 po/pt.po+56−55 po/pt_BR.po+4−4 po/unity8.pot+50−22 po/update-unity-pot+1 po/zh_TW.po+126−124 qml/Components/Dialogs.qml+10−10 qml/Dash/GenericScopeView.qml+1−1 qml/Dash/PageHeader.qml+3−3 qml/Dash/Previews/PreviewImageGallery.qml+25−6 qml/Dash/Previews/PreviewOverlay.qml+77−26 qml/Dash/Previews/PreviewZoomableImage.qml+3−3 qml/Greeter/Greeter.qml+28−17 qml/Launcher/Launcher.qml+1−1 qml/Notifications/SwipeToAct.qml+178−247 qml/Notifications/grip-large.svg+150 qml/Panel/Indicators/MessageMenuItemFactory.qml+1−1 qml/Panel/IndicatorsMenu.qml+16 qml/Panel/Panel.qml+1−1 qml/Panel/SearchIndicator.qml−82 qml/Shell.qml+12−1 qml/Stages/ApplicationWindow.qml+2−1 qml/Stages/DecoratedWindow.qml+5−4 qml/Stages/DesktopStage.qml+15−3 qml/Stages/WindowDecoration.qml+1 qml/Stages/WindowMoveResizeArea.qml+5−3 qml/Wizard/Page.qml+1−1 qml/Wizard/Pages.qml+14−1 qml/Wizard/Pages/30-passwd-type.qml+6−6 qml/Wizard/Wizard.qml+6−1 tests/autopilot/setup.py+2−2 tests/autopilot/unity8/application_lifecycle/tests/__init__.py+2−2 tests/autopilot/unity8/application_lifecycle/tests/test_application_lifecycle.py+2−4 tests/autopilot/unity8/application_lifecycle/tests/test_url_dispatcher.py+2−2 tests/autopilot/unity8/fixture_setup.py+4−4 tests/autopilot/unity8/indicators/__init__.py+1−1 tests/autopilot/unity8/indicators/tests/__init__.py+1−1 tests/autopilot/unity8/indicators/tests/test_display_indicator.py−3 tests/autopilot/unity8/indicators/tests/test_indicators.py+2−4 tests/autopilot/unity8/process_helpers.py+2−9 tests/autopilot/unity8/shell/__init__.py+2−2 tests/autopilot/unity8/shell/emulators/__init__.py+3−3 tests/autopilot/unity8/shell/emulators/create_interactive_notification.py+2−3 tests/autopilot/unity8/shell/emulators/dash.py+4−5 tests/autopilot/unity8/shell/fixture_setup.py+2−2 tests/autopilot/unity8/shell/tests/__init__.py+3−3 tests/autopilot/unity8/shell/tests/test_emulators.py+4−4 tests/autopilot/unity8/shell/tests/test_lock_screen.py+1−9 tests/autopilot/unity8/shell/tests/test_notifications.py+4−12 tests/autopilot/unity8/shell/tests/test_tutorial.py+2−2 tests/autopilot/unity8/shell/tests/test_upstart.py+1−7 tests/mocks/LightDM/CMakeLists.txt+2−5 tests/mocks/Unity/Application/ApplicationManager.cpp−4 tests/mocks/Unity/Application/ApplicationManager.h+3−1 tests/mocks/Unity/Indicators/CMakeLists.txt+1−3 tests/plugins/LightDM/CMakeLists.txt+2−4 tests/qmltests/CMakeLists.txt+1−1 tests/qmltests/Dash/Previews/tst_Preview.qml+1−3 tests/qmltests/Dash/Previews/tst_PreviewImageGallery.qml+1−1 tests/qmltests/Dash/tst_Dash.qml+1−3 tests/qmltests/Greeter/tst_Greeter.qml+15 tests/qmltests/Greeter/tst_WideView.qml+10−3 tests/qmltests/Launcher/tst_Launcher.qml+51−6 tests/qmltests/Panel/tst_Panel.qml+52 tests/qmltests/Panel/tst_SearchIndicator.qml−61 tests/qmltests/Stages/ApplicationCheckBox.qml+20−1 tests/qmltests/Stages/tst_DesktopStage.qml+201 tests/qmltests/Stages/tst_PhoneStage.qml+1−1 tests/qmltests/Wizard/tst_Wizard.qml+18−1 tests/qmltests/tst_Shell.qml+49 tests/utils/modules/Unity/Test/UnityTestCase.qml+29−6 tools/registry-tracker.cpp+2
CODING+5−5
@@ -24,7 +24,7 @@ $ ./build.sh --setup
2424
2525 this will:
2626 - install the required dependencies to build, as well as run on the desktop
27− - it should also install unity-scope-home and unity-lens-application which
27+ - it should also install unity-scope-home and unity-lens-application which
2828 are technically "recommends", not strict dependencies
2929
3030build Unity 8
@@ -104,8 +104,8 @@ Notes
104104 - it's unsafe - anyone can connect to your device
105105 - with TCP the Nexus 10 doesn't drop the adb connection when locking
106106 the screen
107−- exporting ANDROID_SERIAL=$your_device_serial or
108− ANDROID_SERIAL=$your_device_ip:5555 will make adb not complain about
107+- exporting ANDROID_SERIAL=$your_device_serial or
108+ ANDROID_SERIAL=$your_device_ip:5555 will make adb not complain about
109109 multiple devices
110110- you can export TARGET_IP=$your_device_ip TARGET_SSH_PORT=22 for run_on_device.sh
111111 to not use adb forwarding - useful if you use multiple devices
@@ -190,8 +190,8 @@ $ PYTHONPATH=../tests/autopilot autopilot list unity8
190190
191191And then run a single test with
192192
193−$ PYTHONPATH=../tests/autopilot autopilot run unity8.some.very.long.test.name
193+$ PYTHONPATH=../tests/autopilot autopilot3 run unity8.some.very.long.test.name
194194
195195or run them all with
196196
197−$ PYTHONPATH=../tests/autopilot autopilot run unity8
197+$ PYTHONPATH=../tests/autopilot autopilot3 run unity8
cmake/modules/autopilot.cmake−8
@@ -13,12 +13,4 @@ function(declare_autopilot_test TEST_NAME TEST_SUITE WORKING_DIR)
1313
1414 add_dependencies(autopilot autopilot-${TEST_NAME})
1515
16− add_custom_target(autopilot2-${TEST_NAME}
17− COMMAND UNITY_TESTING=1 LANG=C QML2_IMPORT_PATH=${SHELL_INSTALL_QML}/mocks python2 -m autopilot.run run ${TEST_SUITE}
18− WORKING_DIRECTORY ${WORKING_DIR}
19− DEPENDS fake_install
20− )
21−
22− add_dependencies(autopilot autopilot2-${TEST_NAME})
23−
2416endfunction()
debian/changelog+72
@@ -1,3 +1,75 @@
1+unity8 (8.02+15.04.20150318-0ubuntu1) vivid; urgency=medium
2+
3+ [ Albert Astals Cid ]
4+ * Add some context to tr calls (LP: #1431497)
5+ * Require binaries and .pc files we call from code
6+ * Test: More stubborn flick to the end
7+
8+ [ Andrea Cimitan ]
9+ * Refactor PreviewOverlay to fix weird zoom out/in animations when
10+ previewing images from the Previews
11+
12+ [ CI Train Bot ]
13+ * Resync trunk.
14+
15+ [ Charles Kerr ]
16+ * Re-enable a rotation lock test now that the bug that broke that test
17+ has been fixed. (LP: #1410915)
18+
19+ [ Daniel d'Andrada ]
20+ * Darkened area behind indicators menu should eat input until it fully
21+ disappears (LP: #1417967)
22+ * DesktopStage - fix focus switch when user taps on window (LP:
23+ #1431325)
24+ * Fix warnings when launching tutorial
25+ * Make MouseTouchAdaptor controllable from within QML
26+ * Make tst_Shell absorb tst_TabletShell
27+
28+ [ Leo Arias ]
29+ * Changed the autopilot dependencies so they do not require qt4. (LP:
30+ #1429158)
31+ * Drop the support for python2 in autopilot tests. (LP: #1429163)
32+ * Stop using the deprecated toolkit emulators namespace in autopilot
33+ tests. (LP: #1341681)
34+
35+ [ Michael Terry ]
36+ * Don't close wizard & edge tutorial when the unity8-dash closes (LP:
37+ #1425484)
38+ * Don't let the wizard sit indefinitely, waiting for a wizard page to
39+ finish preparing itself. (LP: #1425737)
40+ * Fix two broken qmluitest files by waiting for everything to settle
41+ before starting the tests.
42+ * Only call unlockAllModems once the wizard is done. (LP: #1425161)
43+ (LP: #1425161)
44+ * When we are locking the user out from too many login failures,
45+ notice when time passes even if the device is suspended. (LP:
46+ #1396817) (LP: #1396817)
47+
48+ [ Michael Zanetti ]
49+ * Add a mouse area to the indicators panel so we can open them by
50+ clicking. (LP: #1417650)
51+ * fix launcher not reacting to first click when revealed by mouse
52+ hover, add tests
53+ * performance improvements (LP: #1430233, #1425087)
54+
55+ [ Michał Sawicz ]
56+ * Remove the activity indicator from tests
57+ * Use targets instead of custom ld arguments for linking
58+
59+ [ Mirco Müller ]
60+ * Updated the visuals of the SwipeToAct-widget for incoming-call snap-
61+ decision notifications according to new design-spec.
62+ * Updated the visuals of the SwipeToAct-widget for incoming-call snap-
63+ decision notifications according to new design-spec.
64+
65+ -- CI Train Bot <ci-train-bot@canonical.com> Wed, 18 Mar 2015 10:19:06 +0000
66+
67+unity8 (8.02+15.04.20150302-0ubuntu2) vivid; urgency=medium
68+
69+ * No-change rebuild against Qt 5.4.1.
70+
71+ -- Timo Jyrinki <timo-jyrinki@ubuntu.com> Wed, 11 Mar 2015 10:27:23 +0200
72+
173unity8 (8.02+15.04.20150302-0ubuntu1) vivid; urgency=medium
274
375 [ Albert Astals ]
debian/control+6−10
@@ -31,10 +31,8 @@ Build-Depends: cmake,
3131 libusermetricsoutput1-dev,
3232 libxcb1-dev,
3333 pkg-config,
34− python-setuptools,
3534 python3-all:any,
3635 python3-setuptools,
37− python:any (>= 2.7),
3836 qml-module-qt-labs-folderlistmodel,
3937 qml-module-qtquick-layouts,
4038 qml-module-qtquick-xmllistmodel,
@@ -78,6 +76,9 @@ Depends: unity8-common (= ${source:Version}),
7876 unity8-private (= ${binary:Version}),
7977 ${misc:Depends},
8078 ${shlibs:Depends},
79+# We do call pkg-config libunity-scopes from the code
80+ pkg-config,
81+ libunity-scopes-dev,
8182Description: Development tool for Unity scopes
8283 This package contains the development tool for new generation Unity scopes, based
8384 on Unity8.
@@ -139,20 +140,16 @@ Description: Unity 8 shell (common files)
139140
140141Package: unity8-autopilot
141142Architecture: all
142−Depends: gir1.2-glib-2.0,
143+Depends: autopilot-qt5 (>= 1.4),
144+ gir1.2-glib-2.0,
143145 gir1.2-notify-0.7,
144− libautopilot-qt (>= 1.4),
145146 libqt5test5,
146147 libqt5widgets5,
147− python-autopilot,
148− python-evdev,
149− python-fixtures,
150− python-gi,
151− python-mock,
152148 python3-autopilot,
153149 python3-evdev,
154150 python3-fixtures,
155151 python3-gi,
152+ qttestability-autopilot (>= 1.4),
156153 ubuntu-ui-toolkit-autopilot,
157154 unity-scope-click,
158155 unity8 (= ${source:Version}),
@@ -160,7 +157,6 @@ Depends: gir1.2-glib-2.0,
160157 url-dispatcher-tools,
161158 ${misc:Depends},
162159 ${python3:Depends},
163− ${python:Depends},
164160 ${shlibs:Depends},
165161Description: Test package for Unity 8 shell
166162 Autopilot tests for the unity8 package
debian/rules+2−2
@@ -14,7 +14,7 @@ export CC=$(DEB_HOST_GNU_TYPE)-gcc-4.9
1414export CXX=$(DEB_HOST_GNU_TYPE)-g++-4.9
1515
1616%:
17− dh $@ --parallel --fail-missing --with python2,python3
17+ dh $@ --parallel --fail-missing --with python3
1818
1919override_dh_auto_clean:
2020 dh_auto_clean
@@ -32,7 +32,7 @@ override_dh_auto_build:
3232override_dh_install:
3333 # install autopilot tests
3434 cd tests/autopilot; \
35− set -ex; for python in $(shell pyversions -r) $(shell py3versions -r); do \
35+ set -ex; for python in $(shell py3versions -r); do \
3636 $$python setup.py install --root=$(CURDIR)/debian/tmp --install-layout=deb; \
3737 done; \
3838 cd $(CURDIR)
plugins/AccountsService/AccountsService.cpp+1−1
@@ -152,7 +152,7 @@ void AccountsService::updateEnableIndicatorsWhileLocked()
152152
153153void AccountsService::updateBackgroundFile()
154154{
155− auto backgroundFile = m_service->getUserProperty(m_user, "org.freedesktop.Accounts.User", "BackgroundFile").toString();
155+ QString backgroundFile = m_service->getUserProperty(m_user, "org.freedesktop.Accounts.User", "BackgroundFile").toString();
156156 if (m_backgroundFile != backgroundFile) {
157157 m_backgroundFile = backgroundFile;
158158 Q_EMIT backgroundFileChanged();
plugins/AccountsService/AccountsServiceDBusAdaptor.cpp+11−2
@@ -25,7 +25,8 @@
2525AccountsServiceDBusAdaptor::AccountsServiceDBusAdaptor(QObject* parent)
2626 : QObject(parent),
2727 m_accountsManager(nullptr),
28− m_users()
28+ m_users(),
29+ m_ignoreNextChanged(false)
2930{
3031 QDBusConnection connection = QDBusConnection::SM_BUSNAME();
3132 QDBusConnectionInterface *interface = connection.interface();
@@ -75,11 +76,19 @@ void AccountsServiceDBusAdaptor::propertiesChangedSlot(const QString &interface,
7576 combined.removeDuplicates();
7677
7778 Q_EMIT propertiesChanged(getUserForPath(message().path()), interface, combined);
79+
80+ // In case a non-builtin property changes, we're getting propertiesChanged *and* changed
81+ // As the generic changed requires asking back over DBus, it's quite slow to process.
82+ // We don't want to trigger that when we know it's not a built-in property change.
83+ m_ignoreNextChanged = true;
7884}
7985
8086void AccountsServiceDBusAdaptor::maybeChangedSlot()
8187{
82− Q_EMIT maybeChanged(getUserForPath(message().path()));
88+ if (!m_ignoreNextChanged) {
89+ Q_EMIT maybeChanged(getUserForPath(message().path()));
90+ }
91+ m_ignoreNextChanged = false;
8392}
8493
8594QString AccountsServiceDBusAdaptor::getUserForPath(const QString &path)
plugins/AccountsService/AccountsServiceDBusAdaptor.h+2
@@ -61,6 +61,8 @@ private:
6161
6262 QDBusInterface *m_accountsManager;
6363 QMap<QString, QDBusInterface *> m_users;
64+
65+ bool m_ignoreNextChanged;
6466};
6567
6668#endif
plugins/Unity/Launcher/gsettings.cpp+8−1
@@ -59,12 +59,19 @@ void GSettings::setStoredApplications(const QStringList &storedApplications)
5959 Q_FOREACH(const QString &entry, storedApplications) {
6060 gSettingsList << QString("appid://%1").arg(entry);
6161 }
62+ // GSettings will emit a changed signal to ourselves. Let's cache the items
63+ // and only forward the changed signal when the list did actually change.
64+ m_cachedItems = gSettingsList;
6265 m_gSettings->set("items", gSettingsList);
6366}
6467
6568void GSettings::onSettingsChanged(const QString &key)
6669{
6770 if (key == "items") {
68− Q_EMIT changed();
71+ QStringList cachedItems = m_gSettings->get("items").toStringList();
72+ if (m_cachedItems != cachedItems) {
73+ m_cachedItems = cachedItems;
74+ Q_EMIT changed();
75+ }
6976 }
7077}
plugins/Unity/Launcher/gsettings.h+1
@@ -41,6 +41,7 @@ private Q_SLOTS:
4141
4242private:
4343 QGSettings *m_gSettings;
44+ QStringList m_cachedItems;
4445};
4546
4647#endif
plugins/Utils/windowstatestorage.cpp+22−1
@@ -18,6 +18,7 @@
1818
1919#include <QtConcurrent>
2020#include <QDebug>
21+#include <QFutureSynchronizer>
2122#include <QSqlQuery>
2223#include <QSqlError>
2324#include <QSqlResult>
@@ -36,8 +37,20 @@ WindowStateStorage::WindowStateStorage(QObject *parent):
3637 initdb();
3738}
3839
40+WindowStateStorage::~WindowStateStorage()
41+{
42+ QFutureSynchronizer<void> futureSync;
43+ for (int i = 0; i < m_asyncQueries.count(); ++i) {
44+ futureSync.addFuture(m_asyncQueries[i]);
45+ }
46+ futureSync.waitForFinished();
47+ m_db.close();
48+}
49+
3950void WindowStateStorage::saveGeometry(const QString &windowId, const QRect &rect)
4051{
52+ QMutexLocker mutexLocker(&s_mutex);
53+
4154 QString queryString = QString("INSERT OR REPLACE INTO geometry (windowId, x, y, width, height) values ('%1', '%2', '%3', '%4', '%5');")
4255 .arg(windowId)
4356 .arg(rect.x())
@@ -45,7 +58,15 @@ void WindowStateStorage::saveGeometry(const QString &windowId, const QRect &rect
4558 .arg(rect.width())
4659 .arg(rect.height());
4760
48− QtConcurrent::run(executeAsyncQuery, queryString);
61+ QFuture<void> future = QtConcurrent::run(executeAsyncQuery, queryString);
62+ m_asyncQueries.append(future);
63+
64+ QFutureWatcher<void> *futureWatcher = new QFutureWatcher<void>();
65+ futureWatcher->setFuture(future);
66+ connect(futureWatcher, &QFutureWatcher<void>::finished,
67+ this,
68+ [=](){ m_asyncQueries.removeAll(futureWatcher->future());
69+ futureWatcher->deleteLater(); });
4970}
5071
5172void WindowStateStorage::executeAsyncQuery(const QString &queryString)
plugins/Utils/windowstatestorage.h+4
@@ -17,12 +17,14 @@
1717#include <QObject>
1818#include <QSqlDatabase>
1919#include <QMutex>
20+#include <QFuture>
2021
2122class WindowStateStorage: public QObject
2223{
2324 Q_OBJECT
2425public:
2526 WindowStateStorage(QObject *parent = 0);
27+ virtual ~WindowStateStorage();
2628
2729 Q_INVOKABLE void saveGeometry(const QString &windowId, const QRect &rect);
2830 Q_INVOKABLE QRect getGeometry(const QString &windowId, const QRect &defaultValue);
@@ -35,4 +37,6 @@ private:
3537
3638 // NB: This is accessed from threads. Make sure to mutex it.
3739 QSqlDatabase m_db;
40+
41+ QList< QFuture<void> > m_asyncQueries;
3842};
po/br.po+71−70
@@ -8,106 +8,107 @@ msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-02-25 08:57-0500\n"
11−"PO-Revision-Date: 2014-12-16 07:27+0000\n"
11+"PO-Revision-Date: 2015-03-13 13:01+0000\n"
1212"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
1313"Language-Team: Breton <br@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2015-03-04 05:56+0000\n"
19−"X-Generator: Launchpad (build 17361)\n"
18+"X-Launchpad-Export-Date: 2015-03-14 05:32+0000\n"
19+"X-Generator: Launchpad (build 17389)\n"
2020
21−#: plugins/LightDM/Greeter.cpp:112
21+#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
2323msgstr "Ger-tremen : "
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:45
26−#: plugins/Unity/Launcher/launcheritem.cpp:100
26+#: plugins/Unity/Launcher/launcheritem.cpp:91
2727msgid "Pin shortcut"
2828msgstr "Spilhennañ ar verradenn"
2929
30−#: plugins/Unity/Launcher/launcheritem.cpp:100
30+#: plugins/Unity/Launcher/launcheritem.cpp:91
3131msgid "Unpin shortcut"
3232msgstr "Dispilhennañ ar verradenn"
3333
34−#: qml/Components/DelayedLockscreen.qml:49
34+#: qml/Components/DelayedLockscreen.qml:47
3535msgid "Device Locked"
3636msgstr "Benveg prennet"
3737
38−#: qml/Components/DelayedLockscreen.qml:64
38+#: qml/Components/DelayedLockscreen.qml:62
3939msgid "You have been locked out due to too many failed passphrase attempts."
4040msgstr ""
4141"Prennet eo bet ho penveg abalamour da re a daolioù-esae c'hwitet evit merkañ "
4242"ho frazenn-dremen."
4343
44−#: qml/Components/DelayedLockscreen.qml:65
44+#: qml/Components/DelayedLockscreen.qml:63
4545msgid "You have been locked out due to too many failed passcode attempts."
4646msgstr ""
4747"Prennet eo bet ho penveg abalamour da re a daolioù-esae evit merkañ ho kod-"
4848"tremen."
4949
50−#: qml/Components/DelayedLockscreen.qml:74
50+#: qml/Components/DelayedLockscreen.qml:72
5151#, qt-format
5252msgid "Please wait %1 minute and then try again…"
5353msgid_plural "Please wait %1 minutes and then try again…"
5454msgstr[0] "Gortozit %1 vunutenn, mar plij, hag esaeit en-dro..."
5555msgstr[1] "Gortozit %1 a vunutoù, mar plij, hag esaeit en-dro..."
5656
57−#: qml/Components/Dialogs.qml:87
57+#: qml/Components/Dialogs.qml:74
5858msgid "Log out"
5959msgstr "Digevreañ"
6060
61−#: qml/Components/Dialogs.qml:88
61+#: qml/Components/Dialogs.qml:75
6262msgid "Are you sure you want to log out?"
6363msgstr "Ha sur oc'h e fell deoc'h digevreañ ?"
6464
6565#: qml/Components/Dialogs.qml:90
6666msgid "Lock"
67−msgstr ""
67+msgstr "Prennañ"
6868
6969#: qml/Components/Dialogs.qml:97
7070msgid "Log Out"
71−msgstr ""
71+msgstr "Digevreañ"
7272
73−#: qml/Components/Dialogs.qml:104 qml/Components/Dialogs.qml:135
74−#: qml/Components/Dialogs.qml:191
73+#: qml/Components/Dialogs.qml:171
7574msgid "Cancel"
7675msgstr "Nullañ"
7776
78−#: qml/Components/Dialogs.qml:116
77+#: qml/Components/Dialogs.qml:98
7978msgid "Shut down"
8079msgstr "Lazhañ ar benveg"
8180
82−#: qml/Components/Dialogs.qml:117
81+#: qml/Components/Dialogs.qml:99
8382msgid "Are you sure you want to shut down?"
8483msgstr "Ha sur oc'h e fell deoc'h lazhañ ar benveg ?"
8584
86−#: qml/Components/Dialogs.qml:119 qml/Components/Dialogs.qml:147
85+#: qml/Components/Dialogs.qml:123
8786msgid "Reboot"
8887msgstr "Adloc'hañ"
8988
9089#: qml/Components/Dialogs.qml:127
9190msgid "Shutdown"
92−msgstr ""
91+msgstr "Lazhañ"
9392
94−#: qml/Components/Dialogs.qml:148
93+#: qml/Components/Dialogs.qml:124
9594msgid "Are you sure you want to reboot?"
9695msgstr "Ha sur oc'h e fell deoc'h adloc'hañ ?"
9796
98−#: qml/Components/Dialogs.qml:150
97+#: qml/Components/Dialogs.qml:77 qml/Components/Dialogs.qml:101
98+#: qml/Components/Dialogs.qml:126
9999msgid "No"
100100msgstr "N'on ket"
101101
102−#: qml/Components/Dialogs.qml:156
102+#: qml/Components/Dialogs.qml:84 qml/Components/Dialogs.qml:108
103+#: qml/Components/Dialogs.qml:133
103104msgid "Yes"
104105msgstr "Ya"
105106
106−#: qml/Components/Dialogs.qml:170
107+#: qml/Components/Dialogs.qml:148
107108msgid "Power"
108109msgstr "Tredan"
109110
110−#: qml/Components/Dialogs.qml:171
111+#: qml/Components/Dialogs.qml:149
111112msgid ""
112113"Are you sure you would like\n"
113114"to power off?"
@@ -115,52 +116,52 @@ msgstr ""
115116"Ha sur oc'h e fell deoc'h\n"
116117"troc'hañ an tredan ?"
117118
118−#: qml/Components/Dialogs.qml:173
119+#: qml/Components/Dialogs.qml:151
119120msgid "Power off"
120121msgstr "Lazhañ"
121122
122−#: qml/Components/Dialogs.qml:182
123+#: qml/Components/Dialogs.qml:161
123124msgid "Restart"
124125msgstr "Adloc'hañ"
125126
126−#: qml/Components/Lockscreen.qml:238
127+#: qml/Components/Lockscreen.qml:223
127128msgid "Return to Call"
128129msgstr "Distreiñ d'ar bellgomzadenn"
129130
130−#: qml/Components/Lockscreen.qml:238
131+#: qml/Components/Lockscreen.qml:223
131132msgid "Emergency Call"
132133msgstr "Pellgomzadenn vallus"
133134
134−#: qml/Components/Lockscreen.qml:270
135+#: qml/Components/Lockscreen.qml:255
135136msgid "OK"
136137msgstr "Mat eo"
137138
138−#: qml/Dash/GenericScopeView.qml:528 qml/Dash/GenericScopeView.qml:686
139+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
139140msgid "See less"
140141msgstr "Gwelet nebeutoc'h"
141142
142−#: qml/Dash/GenericScopeView.qml:528
143+#: qml/Dash/GenericScopeView.qml:434
143144msgid "See all"
144145msgstr "Gwelet pep tra"
145146
146−#: qml/Dash/GenericScopeView.qml:590 qml/Dash/PageHeader.qml:276
147+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:268
147148#: qml/Panel/SearchIndicator.qml:27
148149msgid "Search"
149150msgstr "Klask"
150151
151−#: qml/Dash/PageHeader.qml:269
152+#: qml/Dash/PageHeader.qml:261
152153msgid "Store"
153154msgstr "Enrollañ"
154155
155−#: qml/Dash/PageHeader.qml:286
156+#: qml/Dash/PageHeader.qml:278
156157msgid "Settings"
157158msgstr "Arventennoù"
158159
159−#: qml/Dash/PageHeader.qml:293
160+#: qml/Dash/PageHeader.qml:285
160161msgid "Remove from Favorites"
161162msgstr "Lemel eus ar sinedoù"
162163
163−#: qml/Dash/PageHeader.qml:293
164+#: qml/Dash/PageHeader.qml:285
164165msgid "Add to Favorites"
165166msgstr "Ouzhpennañ d'ar sinedoù"
166167
@@ -194,45 +195,45 @@ msgstr "Lezel da vont evit freskaat..."
194195
195196#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
196197msgid "Enable location data"
197−msgstr ""
198+msgstr "Gweredekaat ar roadennoù lec'hiañ"
198199
199−#: qml/Dash/ScopesList.qml:66
200+#: qml/Dash/ScopesList.qml:63
200201msgid "Manage"
201202msgstr "Merañ"
202203
203−#: qml/Dash/ScopesList.qml:112
204+#: qml/Dash/ScopesList.qml:107
204205msgid "Home"
205206msgstr "Er gêr"
206207
207−#: qml/Dash/ScopesList.qml:113
208+#: qml/Dash/ScopesList.qml:108
208209msgid "Also installed"
209210msgstr "Staliet ivez"
210211
211−#: qml/Greeter/CoverPage.qml:107
212+#: qml/Greeter/Greeter.qml:174
212213msgid "Unlock"
213214msgstr "Dibrennañ"
214215
215216#: qml/Greeter/LoginList.qml:236
216217msgid "Retry"
217−msgstr ""
218+msgstr "Esaeañ en-dro"
218219
219220#: qml/Greeter/LoginList.qml:237
220221msgid "Tap to unlock"
221−msgstr ""
222+msgstr "Pouezañ evit dibrennañ"
222223
223−#: qml/Greeter/NarrowView.qml:53 qml/Wizard/Pages/passwd-confirm.qml:53
224+#: qml/Shell.qml:444
224225msgid "Sorry, incorrect passphrase."
225226msgstr "Siwazh, frazenn-dremen direizh"
226227
227−#: qml/Greeter/NarrowView.qml:54 qml/Wizard/Pages/passwd-confirm.qml:54
228+#: qml/Shell.qml:445
228229msgid "Sorry, incorrect passcode."
229230msgstr "Siwazh, kod-tremen direizh"
230231
231−#: qml/Greeter/NarrowView.qml:55
232+#: qml/Shell.qml:446
232233msgid "This will be your last attempt."
233234msgstr "Ho taol-esae diwezhañ e vo."
234235
235−#: qml/Greeter/NarrowView.qml:57
236+#: qml/Shell.qml:448
236237msgid ""
237238"If passphrase is entered incorrectly, your phone will conduct a factory "
238239"reset and all personal data will be deleted."
@@ -240,7 +241,7 @@ msgstr ""
240241"Ma vez ebarzhet ur frazenn-dremen direizh, e vo adderaouekaet ho pellgomzer "
241242"gant arventennoù al labouradeg hag e vo diverket an holl roadennoù personel"
242243
243−#: qml/Greeter/NarrowView.qml:58
244+#: qml/Shell.qml:449
244245msgid ""
245246"If passcode is entered incorrectly, your phone will conduct a factory reset "
246247"and all personal data will be deleted."
@@ -248,33 +249,33 @@ msgstr ""
248249"Ma vez ebarzhet ur c'hod-tremen direizh, e vo adderaouekaet ho pellgomzer "
249250"gant arventennoù al labouradeg hag e vo diverket an holl roadennoù personel."
250251
251−#: qml/Greeter/NarrowView.qml:115
252+#: qml/Shell.qml:402
252253#, qt-format
253254msgid "Enter %1"
254255msgstr "Merkañ %1"
255256
256−#: qml/Greeter/NarrowView.qml:116 qml/Wizard/Pages/passwd-set.qml:60
257+#: qml/Shell.qml:394
257258msgid "Enter passphrase"
258259msgstr "Merkañ ar frazenn-dremen"
259260
260−#: qml/Greeter/NarrowView.qml:117
261+#: qml/Shell.qml:398
261262msgid "Enter passcode"
262263msgstr "Merkañ ar c'hod-tremen"
263264
264−#: qml/Greeter/NarrowView.qml:118
265+#: qml/Shell.qml:403
265266#, qt-format
266267msgid "Sorry, incorrect %1"
267268msgstr "Siwazh, %1 direizh"
268269
269−#: qml/Greeter/NarrowView.qml:119
270+#: qml/Shell.qml:395
270271msgid "Sorry, incorrect passphrase"
271272msgstr "Siwazh, frazenn-dremen direizh"
272273
273−#: qml/Greeter/NarrowView.qml:120
274+#: qml/Shell.qml:396
274275msgid "Please re-enter"
275276msgstr "Adverkañ, mar plij"
276277
277−#: qml/Greeter/NarrowView.qml:121
278+#: qml/Shell.qml:399
278279msgid "Sorry, incorrect passcode"
279280msgstr "Digarezit, kod-tremen direizh"
280281
@@ -320,7 +321,7 @@ msgstr "C'hwitet, touchit evit adkregiñ"
320321
321322#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
322323msgid "Reply"
323−msgstr ""
324+msgstr "Respont"
324325
325326#: qml/Panel/Indicators/ModemInfoItem.qml:105
326327msgid "Unlock SIM"
@@ -332,55 +333,55 @@ msgstr "O kantren"
332333
333334#: qml/Tutorial/TutorialBottomFinish.qml:24
334335msgid "This action does different things for different apps"
335−msgstr ""
336+msgstr "An ober-mañ a ra meur a dra evit meur a arload"
336337
337338#: qml/Tutorial/TutorialBottomFinish.qml:25
338339msgid "Tap here to finish."
339−msgstr ""
340+msgstr "Pouezañ amañ evit echuiñ."
340341
341342#: qml/Tutorial/TutorialBottom.qml:28
342343msgid "Open special menus"
343−msgstr ""
344+msgstr "Digeriñ al lañserioù ispisial"
344345
345346#: qml/Tutorial/TutorialBottom.qml:29
346347msgid "Swipe up from the bottom edge."
347−msgstr ""
348+msgstr "Riklit war-du an nec'h adalek an traoñ"
348349
349350#: qml/Tutorial/TutorialLeftFinish.qml:24
350351msgid "These are the shortcuts to favorite apps"
351−msgstr ""
352+msgstr "Berradennoù war-du hoc'h arloadoù gwellañ-deuet eo ar re-mañ"
352353
353354#: qml/Tutorial/TutorialLeftFinish.qml:25 qml/Tutorial/TutorialRight.qml:144
354355msgid "Tap here to continue."
355−msgstr ""
356+msgstr "Pouzañ amañ evit kenderc'hel"
356357
357358#: qml/Tutorial/TutorialLeft.qml:26
358359msgid "Open the launcher"
359−msgstr ""
360+msgstr "Digeriñ al lañser"
360361
361362#: qml/Tutorial/TutorialLeft.qml:27
362363msgid "Short swipe from the left edge."
363−msgstr ""
364+msgstr "Riklik dousik adalek ar bord kleiz."
364365
365366#: qml/Tutorial/TutorialPage.qml:178
366367msgid "You almost got it!"
367−msgstr ""
368+msgstr "Deuet eo ganeoc'h pe dost ?"
368369
369370#: qml/Tutorial/TutorialPage.qml:195
370371msgid "Try again."
371−msgstr ""
372+msgstr "Esaeit en-dro."
372373
373374#: qml/Tutorial/TutorialRight.qml:31
374375msgid "To view open apps"
375−msgstr ""
376+msgstr "Evit gwelet an arloadoù digor"
376377
377378#: qml/Tutorial/TutorialRight.qml:32
378379msgid "Long swipe from the right edge."
379−msgstr ""
380+msgstr "Riklit pell adalek ar bord dehoù."
380381
381382#: qml/Tutorial/TutorialRight.qml:122
382383msgid "View all your running tasks."
383−msgstr ""
384+msgstr "Gwelet an holl drevelloù a ya en-dro."
384385
385386#: qml/Wizard/Page.qml:89
386387msgid "Back"
po/el.po+12−12
@@ -8,15 +8,15 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-02-25 08:57-0500\n"
11−"PO-Revision-Date: 2015-03-08 09:28+0000\n"
12−"Last-Translator: Aggelos Arnaoutis <angelosarn@hotmail.com>\n"
11+"PO-Revision-Date: 2015-03-15 22:25+0000\n"
12+"Last-Translator: Simos Xenitellis <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: 2015-03-09 06:00+0000\n"
19−"X-Generator: Launchpad (build 17383)\n"
18+"X-Launchpad-Export-Date: 2015-03-16 06:02+0000\n"
19+"X-Generator: Launchpad (build 17389)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
@@ -88,7 +88,7 @@ msgstr "Επανεκκίνηση"
8888
8989#: qml/Components/Dialogs.qml:127
9090msgid "Shutdown"
91−msgstr ""
91+msgstr "Τερματισμός"
9292
9393#: qml/Components/Dialogs.qml:124
9494msgid "Are you sure you want to reboot?"
@@ -215,11 +215,11 @@ msgstr "Ξεκλείδωμα"
215215
216216#: qml/Greeter/LoginList.qml:236
217217msgid "Retry"
218−msgstr ""
218+msgstr "Επανάληψη"
219219
220220#: qml/Greeter/LoginList.qml:237
221221msgid "Tap to unlock"
222−msgstr ""
222+msgstr "Ακουμπήστε για να ξεκλειδώσετε"
223223
224224#: qml/Shell.qml:444
225225msgid "Sorry, incorrect passphrase."
@@ -348,7 +348,7 @@ msgstr "Άνοιγμα ειδικών μενού"
348348
349349#: qml/Tutorial/TutorialBottom.qml:29
350350msgid "Swipe up from the bottom edge."
351−msgstr ""
351+msgstr "Σύρετε από την κάτω άκρη προς τα πάνω."
352352
353353#: qml/Tutorial/TutorialLeftFinish.qml:24
354354msgid "These are the shortcuts to favorite apps"
@@ -364,15 +364,15 @@ msgstr "Άνοιγμα του εκκινητή"
364364
365365#: qml/Tutorial/TutorialLeft.qml:27
366366msgid "Short swipe from the left edge."
367−msgstr ""
367+msgstr "Σύρετε ελάχιστα από την αριστερή άκρη."
368368
369369#: qml/Tutorial/TutorialPage.qml:178
370370msgid "You almost got it!"
371−msgstr ""
371+msgstr "Σχεδόν το είχατε!"
372372
373373#: qml/Tutorial/TutorialPage.qml:195
374374msgid "Try again."
375−msgstr ""
375+msgstr "Δοκιμάστε πάλι."
376376
377377#: qml/Tutorial/TutorialRight.qml:31
378378msgid "To view open apps"
@@ -380,7 +380,7 @@ msgstr "Για να δείτε τις ανοιχτές εφαρμογές"
380380
381381#: qml/Tutorial/TutorialRight.qml:32
382382msgid "Long swipe from the right edge."
383−msgstr ""
383+msgstr "Σύρετε παρατεταμένα από την δεξιά άκρη."
384384
385385#: qml/Tutorial/TutorialRight.qml:122
386386msgid "View all your running tasks."
po/gd.po+55−54
@@ -8,48 +8,48 @@ msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-02-25 08:57-0500\n"
11−"PO-Revision-Date: 2015-02-27 01:01+0000\n"
12−"Last-Translator: Akerbeltz <fios@akerbeltz.org>\n"
11+"PO-Revision-Date: 2015-03-12 17:56+0000\n"
12+"Last-Translator: GunChleoc <Unknown>\n"
1313"Language-Team: Fòram na Gàidhlig\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=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: 2015-03-04 05:56+0000\n"
20−"X-Generator: Launchpad (build 17361)\n"
19+"X-Launchpad-Export-Date: 2015-03-13 05:34+0000\n"
20+"X-Generator: Launchpad (build 17389)\n"
2121"Language: gd\n"
2222
23−#: plugins/LightDM/Greeter.cpp:112
23+#: plugins/LightDM/Greeter.cpp:130
2424msgid "Password: "
2525msgstr "Facal-faire: "
2626
2727#: plugins/Unity/Launcher/launcheritem.cpp:45
28−#: plugins/Unity/Launcher/launcheritem.cpp:100
28+#: plugins/Unity/Launcher/launcheritem.cpp:91
2929msgid "Pin shortcut"
3030msgstr "Prìnich ath-ghoirid"
3131
32−#: plugins/Unity/Launcher/launcheritem.cpp:100
32+#: plugins/Unity/Launcher/launcheritem.cpp:91
3333msgid "Unpin shortcut"
3434msgstr "Neo-phrìnich an ath-ghoirid"
3535
36−#: qml/Components/DelayedLockscreen.qml:49
36+#: qml/Components/DelayedLockscreen.qml:47
3737msgid "Device Locked"
3838msgstr "Tha glas air an uidheam"
3939
40−#: qml/Components/DelayedLockscreen.qml:64
40+#: qml/Components/DelayedLockscreen.qml:62
4141msgid "You have been locked out due to too many failed passphrase attempts."
4242msgstr ""
4343"Chaidh do glasadh a-mach às an uidheam on a chuir thu abairt-fhaire chearr a-"
4444"steach cus tursan."
4545
46−#: qml/Components/DelayedLockscreen.qml:65
46+#: qml/Components/DelayedLockscreen.qml:63
4747msgid "You have been locked out due to too many failed passcode attempts."
4848msgstr ""
4949"Chaidh do glasadh a-mach às an uidheam on a chuir thu còd-faire cearr a-"
5050"steach cus tursan."
5151
52−#: qml/Components/DelayedLockscreen.qml:74
52+#: qml/Components/DelayedLockscreen.qml:72
5353#, qt-format
5454msgid "Please wait %1 minute and then try again…"
5555msgid_plural "Please wait %1 minutes and then try again…"
@@ -58,11 +58,11 @@ msgstr[1] "Fuirich ort %1 dhiog 's feuch ris a-rithist an uairsin…"
5858msgstr[2] "Fuirich ort %1 diogan 's feuch ris a-rithist an uairsin…"
5959msgstr[3] "Fuirich ort %1 diog 's feuch ris a-rithist an uairsin…"
6060
61−#: qml/Components/Dialogs.qml:87
61+#: qml/Components/Dialogs.qml:74
6262msgid "Log out"
6363msgstr "Clàraich a-mach"
6464
65−#: qml/Components/Dialogs.qml:88
65+#: qml/Components/Dialogs.qml:75
6666msgid "Are you sure you want to log out?"
6767msgstr "A bheil thu cinnteach gu bheil thu airson clàradh a-mach?"
6868
@@ -72,22 +72,21 @@ msgstr ""
7272
7373#: qml/Components/Dialogs.qml:97
7474msgid "Log Out"
75−msgstr ""
75+msgstr "Clàraich a-mach"
7676
77−#: qml/Components/Dialogs.qml:104 qml/Components/Dialogs.qml:135
78−#: qml/Components/Dialogs.qml:191
77+#: qml/Components/Dialogs.qml:171
7978msgid "Cancel"
8079msgstr "Sguir dheth"
8180
82−#: qml/Components/Dialogs.qml:116
81+#: qml/Components/Dialogs.qml:98
8382msgid "Shut down"
8483msgstr "Dùin sìos"
8584
86−#: qml/Components/Dialogs.qml:117
85+#: qml/Components/Dialogs.qml:99
8786msgid "Are you sure you want to shut down?"
8887msgstr "A bheil thu cinnteach gu bheil thu airson a dhùnadh sìos?"
8988
90−#: qml/Components/Dialogs.qml:119 qml/Components/Dialogs.qml:147
89+#: qml/Components/Dialogs.qml:123
9190msgid "Reboot"
9291msgstr "Ath-thòisich an siostam"
9392
@@ -95,23 +94,25 @@ msgstr "Ath-thòisich an siostam"
9594msgid "Shutdown"
9695msgstr ""
9796
98−#: qml/Components/Dialogs.qml:148
97+#: qml/Components/Dialogs.qml:124
9998msgid "Are you sure you want to reboot?"
10099msgstr "A bheil thu cinnteach gu bheil thu airson tòiseachadh às ùr?"
101100
102−#: qml/Components/Dialogs.qml:150
101+#: qml/Components/Dialogs.qml:77 qml/Components/Dialogs.qml:101
102+#: qml/Components/Dialogs.qml:126
103103msgid "No"
104104msgstr "Chan eil"
105105
106−#: qml/Components/Dialogs.qml:156
106+#: qml/Components/Dialogs.qml:84 qml/Components/Dialogs.qml:108
107+#: qml/Components/Dialogs.qml:133
107108msgid "Yes"
108109msgstr "Tha"
109110
110−#: qml/Components/Dialogs.qml:170
111+#: qml/Components/Dialogs.qml:148
111112msgid "Power"
112113msgstr "Cumhachd"
113114
114−#: qml/Components/Dialogs.qml:171
115+#: qml/Components/Dialogs.qml:149
115116msgid ""
116117"Are you sure you would like\n"
117118"to power off?"
@@ -119,52 +120,52 @@ msgstr ""
119120"A bheil thu cinnteach gu bheil thu\n"
120121"airson a' chumhachd a chur dheth?"
121122
122−#: qml/Components/Dialogs.qml:173
123+#: qml/Components/Dialogs.qml:151
123124msgid "Power off"
124125msgstr "Cuir a' chumhachd dheth"
125126
126−#: qml/Components/Dialogs.qml:182
127+#: qml/Components/Dialogs.qml:161
127128msgid "Restart"
128129msgstr "Ath-thòisich"
129130
130−#: qml/Components/Lockscreen.qml:238
131+#: qml/Components/Lockscreen.qml:223
131132msgid "Return to Call"
132133msgstr "Till dhan ghairm"
133134
134−#: qml/Components/Lockscreen.qml:238
135+#: qml/Components/Lockscreen.qml:223
135136msgid "Emergency Call"
136137msgstr "Gairm èiginn"
137138
138−#: qml/Components/Lockscreen.qml:270
139+#: qml/Components/Lockscreen.qml:255
139140msgid "OK"
140141msgstr "Ceart ma-thà"
141142
142−#: qml/Dash/GenericScopeView.qml:528 qml/Dash/GenericScopeView.qml:686
143+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
143144msgid "See less"
144145msgstr "Seall nas lugha"
145146
146−#: qml/Dash/GenericScopeView.qml:528
147+#: qml/Dash/GenericScopeView.qml:434
147148msgid "See all"
148149msgstr "Seall na h-uile"
149150
150−#: qml/Dash/GenericScopeView.qml:590 qml/Dash/PageHeader.qml:276
151+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:268
151152#: qml/Panel/SearchIndicator.qml:27
152153msgid "Search"
153154msgstr "Lorg"
154155
155−#: qml/Dash/PageHeader.qml:269
156+#: qml/Dash/PageHeader.qml:261
156157msgid "Store"
157158msgstr "Am bùth"
158159
159−#: qml/Dash/PageHeader.qml:286
160+#: qml/Dash/PageHeader.qml:278
160161msgid "Settings"
161162msgstr "Roghainnean"
162163
163−#: qml/Dash/PageHeader.qml:293
164+#: qml/Dash/PageHeader.qml:285
164165msgid "Remove from Favorites"
165166msgstr "Thoir air falbh o na h-annsachdan"
166167
167−#: qml/Dash/PageHeader.qml:293
168+#: qml/Dash/PageHeader.qml:285
168169msgid "Add to Favorites"
169170msgstr "Cuir ris na h-annsachdan"
170171
@@ -200,43 +201,43 @@ msgstr "Leig às airson ath-nuadhachadh…"
200201msgid "Enable location data"
201202msgstr "Cuir an comas dàta an ionaid"
202203
203−#: qml/Dash/ScopesList.qml:66
204+#: qml/Dash/ScopesList.qml:63
204205msgid "Manage"
205206msgstr "Stiùirich"
206207
207−#: qml/Dash/ScopesList.qml:112
208+#: qml/Dash/ScopesList.qml:107
208209msgid "Home"
209210msgstr "Dhachaigh"
210211
211−#: qml/Dash/ScopesList.qml:113
212+#: qml/Dash/ScopesList.qml:108
212213msgid "Also installed"
213214msgstr "Air a stàladh cuideachd"
214215
215−#: qml/Greeter/CoverPage.qml:107
216+#: qml/Greeter/Greeter.qml:174
216217msgid "Unlock"
217218msgstr "Thoir a' ghlas dheth"
218219
219220#: qml/Greeter/LoginList.qml:236
220221msgid "Retry"
221−msgstr ""
222+msgstr "Feuch ris a-rithist"
222223
223224#: qml/Greeter/LoginList.qml:237
224225msgid "Tap to unlock"
225−msgstr ""
226+msgstr "Gnog gus a' ghlas a thoirt fo bharr"
226227
227−#: qml/Greeter/NarrowView.qml:53 qml/Wizard/Pages/passwd-confirm.qml:53
228+#: qml/Shell.qml:444
228229msgid "Sorry, incorrect passphrase."
229230msgstr "Duilich ach tha an abairt-fhaire cearr."
230231
231−#: qml/Greeter/NarrowView.qml:54 qml/Wizard/Pages/passwd-confirm.qml:54
232+#: qml/Shell.qml:445
232233msgid "Sorry, incorrect passcode."
233234msgstr "Duilich ach tha an còd-faire cearr."
234235
235−#: qml/Greeter/NarrowView.qml:55
236+#: qml/Shell.qml:446
236237msgid "This will be your last attempt."
237238msgstr "Seo an oidhirp mu dheireadh agad."
238239
239−#: qml/Greeter/NarrowView.qml:57
240+#: qml/Shell.qml:448
240241msgid ""
241242"If passphrase is entered incorrectly, your phone will conduct a factory "
242243"reset and all personal data will be deleted."
@@ -245,7 +246,7 @@ msgstr ""
245246"ath-shuidheachadh air roghainnean an fhactaraidh agus thèid gach dàta "
246247"pearsanta a sguabadh às."
247248
248−#: qml/Greeter/NarrowView.qml:58
249+#: qml/Shell.qml:449
249250msgid ""
250251"If passcode is entered incorrectly, your phone will conduct a factory reset "
251252"and all personal data will be deleted."
@@ -254,33 +255,33 @@ msgstr ""
254255"shuidheachadh air roghainnean an fhactaraidh agus thèid gach dàta pearsanta "
255256"a sguabadh às."
256257
257−#: qml/Greeter/NarrowView.qml:115
258+#: qml/Shell.qml:402
258259#, qt-format
259260msgid "Enter %1"
260261msgstr "Cuir a-steach %1"
261262
262−#: qml/Greeter/NarrowView.qml:116 qml/Wizard/Pages/passwd-set.qml:60
263+#: qml/Shell.qml:394
263264msgid "Enter passphrase"
264265msgstr "Cuir abairt-fhaire a-steach"
265266
266−#: qml/Greeter/NarrowView.qml:117
267+#: qml/Shell.qml:398
267268msgid "Enter passcode"
268269msgstr "Cuir còd-faire a-steach"
269270
270−#: qml/Greeter/NarrowView.qml:118
271+#: qml/Shell.qml:403
271272#, qt-format
272273msgid "Sorry, incorrect %1"
273274msgstr "Duilich ach tha a' %1 cearr"
274275
275−#: qml/Greeter/NarrowView.qml:119
276+#: qml/Shell.qml:395
276277msgid "Sorry, incorrect passphrase"
277278msgstr "Duilich ach tha an abairt-fhaire cearr"
278279
279−#: qml/Greeter/NarrowView.qml:120
280+#: qml/Shell.qml:396
280281msgid "Please re-enter"
281282msgstr "Cuir a-steach e a-rithist"
282283
283−#: qml/Greeter/NarrowView.qml:121
284+#: qml/Shell.qml:399
284285msgid "Sorry, incorrect passcode"
285286msgstr "Duilich ach tha an còd-faire cearr"
286287
po/pa.po+166−154
@@ -8,102 +8,103 @@ msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-02-25 08:57-0500\n"
11−"PO-Revision-Date: 2014-10-16 03:04+0000\n"
12−"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
11+"PO-Revision-Date: 2015-03-15 04:38+0000\n"
12+"Last-Translator: Gursharnjit_Singh <ubuntuser13@gmail.com>\n"
1313"Language-Team: Punjabi <pa@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: 2015-03-04 05:56+0000\n"
19−"X-Generator: Launchpad (build 17361)\n"
18+"X-Launchpad-Export-Date: 2015-03-16 06:02+0000\n"
19+"X-Generator: Launchpad (build 17389)\n"
2020
21−#: plugins/LightDM/Greeter.cpp:112
21+#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
2323msgstr "ਗੁਪਤ ਕੋਡ: "
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:45
26−#: plugins/Unity/Launcher/launcheritem.cpp:100
26+#: plugins/Unity/Launcher/launcheritem.cpp:91
2727msgid "Pin shortcut"
2828msgstr "ਸ਼ਾਰਟਕੱਟ ਪਿੰਨ ਲਗਾਓ"
2929
30−#: plugins/Unity/Launcher/launcheritem.cpp:100
30+#: plugins/Unity/Launcher/launcheritem.cpp:91
3131msgid "Unpin shortcut"
3232msgstr "ਸ਼ਾਰਟਕੱਟ ਪਿੰਨ ਹਟਾਓ"
3333
34−#: qml/Components/DelayedLockscreen.qml:49
34+#: qml/Components/DelayedLockscreen.qml:47
3535msgid "Device Locked"
3636msgstr "ਯੰਤਰ ਲਾਕ ਹੈ"
3737
38−#: qml/Components/DelayedLockscreen.qml:64
38+#: qml/Components/DelayedLockscreen.qml:62
3939msgid "You have been locked out due to too many failed passphrase attempts."
40−msgstr ""
40+msgstr "ਬਹੁਤ ਸਾਰੇ ਗਲਤ ਵਾਕਾਂ ਦੀ ਵਜ੍ਹਾ ਨਾਲ ਤੁਹਾਨੂੰ ਲਾਕ ਕੀਤਾ ਗਿਆ।"
4141
42−#: qml/Components/DelayedLockscreen.qml:65
42+#: qml/Components/DelayedLockscreen.qml:63
4343msgid "You have been locked out due to too many failed passcode attempts."
44−msgstr ""
44+msgstr "ਬਹੁਤ ਸਾਰੇ ਗਲਤ ਪਾਸਕੋਡਾਂ ਦੀ ਵਜ੍ਹਾ ਨਾਲ ਤੁਹਾਨੂੰ ਲਾਕ ਕੀਤਾ ਗਿਆ।"
4545
46−#: qml/Components/DelayedLockscreen.qml:74
46+#: qml/Components/DelayedLockscreen.qml:72
4747#, qt-format
4848msgid "Please wait %1 minute and then try again…"
4949msgid_plural "Please wait %1 minutes and then try again…"
5050msgstr[0] "%1 ਮਿੰਟ ਲਈ ਉਡੀਕੋ ਤੇ ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ..."
5151msgstr[1] "%1 ਮਿੰਟਾਂ ਲਈ ਉਡੀਕੋ ਤੇ ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ..."
5252
53−#: qml/Components/Dialogs.qml:87
53+#: qml/Components/Dialogs.qml:74
5454msgid "Log out"
5555msgstr "ਲਾਗ-ਆਉਟ"
5656
57−#: qml/Components/Dialogs.qml:88
57+#: qml/Components/Dialogs.qml:75
5858msgid "Are you sure you want to log out?"
5959msgstr "ਕੀ ਤੁਸੀਂ ਲਾਗ ਆਉਟ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"
6060
6161#: qml/Components/Dialogs.qml:90
6262msgid "Lock"
63−msgstr ""
63+msgstr "ਲਾਕ ਕਰੋ"
6464
6565#: qml/Components/Dialogs.qml:97
6666msgid "Log Out"
67−msgstr ""
67+msgstr "ਲਾਗ ਆਉਟ"
6868
69−#: qml/Components/Dialogs.qml:104 qml/Components/Dialogs.qml:135
70−#: qml/Components/Dialogs.qml:191
69+#: qml/Components/Dialogs.qml:171
7170msgid "Cancel"
7271msgstr "ਰੱਦ ਕਰੋ"
7372
74−#: qml/Components/Dialogs.qml:116
73+#: qml/Components/Dialogs.qml:98
7574msgid "Shut down"
7675msgstr "ਬੰਦ ਕਰੋ"
7776
78−#: qml/Components/Dialogs.qml:117
77+#: qml/Components/Dialogs.qml:99
7978msgid "Are you sure you want to shut down?"
8079msgstr "ਕੀ ਤੁਸੀਂ ਬੰਦ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"
8180
82−#: qml/Components/Dialogs.qml:119 qml/Components/Dialogs.qml:147
81+#: qml/Components/Dialogs.qml:123
8382msgid "Reboot"
8483msgstr "ਮੁਡ਼-ਚਾਲੂ"
8584
8685#: qml/Components/Dialogs.qml:127
8786msgid "Shutdown"
88−msgstr ""
87+msgstr "ਬੰਦ ਕਰੋ"
8988
90−#: qml/Components/Dialogs.qml:148
89+#: qml/Components/Dialogs.qml:124
9190msgid "Are you sure you want to reboot?"
9291msgstr "ਕੀ ਤੁਸੀਂ ਮੁੜ-ਚਾਲੂ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"
9392
94−#: qml/Components/Dialogs.qml:150
93+#: qml/Components/Dialogs.qml:77 qml/Components/Dialogs.qml:101
94+#: qml/Components/Dialogs.qml:126
9595msgid "No"
9696msgstr "ਨਹੀਂ"
9797
98−#: qml/Components/Dialogs.qml:156
98+#: qml/Components/Dialogs.qml:84 qml/Components/Dialogs.qml:108
99+#: qml/Components/Dialogs.qml:133
99100msgid "Yes"
100101msgstr "ਹਾਂ"
101102
102−#: qml/Components/Dialogs.qml:170
103+#: qml/Components/Dialogs.qml:148
103104msgid "Power"
104105msgstr "ਪਾਵਰ"
105106
106−#: qml/Components/Dialogs.qml:171
107+#: qml/Components/Dialogs.qml:149
107108msgid ""
108109"Are you sure you would like\n"
109110"to power off?"
@@ -111,363 +112,368 @@ msgstr ""
111112"ਕੀ ਤੁਸੀਂ ਪਾਵਰ-ਆਫ਼ ਕਰਨਾ\n"
112113"ਚਾਹੁੰਦੇ ਹੋ?"
113114
114−#: qml/Components/Dialogs.qml:173
115+#: qml/Components/Dialogs.qml:151
115116msgid "Power off"
116−msgstr ""
117+msgstr "ਬੰਦ ਕਰੋ"
117118
118−#: qml/Components/Dialogs.qml:182
119+#: qml/Components/Dialogs.qml:161
119120msgid "Restart"
120121msgstr "ਮੁੜ ਚਾਲੂ ਕਰੋ"
121122
122−#: qml/Components/Lockscreen.qml:238
123+#: qml/Components/Lockscreen.qml:223
123124msgid "Return to Call"
124−msgstr ""
125+msgstr "ਕਾਲ ਤੇ ਵਾਪਸ"
125126
126−#: qml/Components/Lockscreen.qml:238
127+#: qml/Components/Lockscreen.qml:223
127128msgid "Emergency Call"
128−msgstr ""
129+msgstr "ਅਪਾਤਕਾਲੀਨ ਕਾਲ"
129130
130−#: qml/Components/Lockscreen.qml:270
131+#: qml/Components/Lockscreen.qml:255
131132msgid "OK"
132−msgstr ""
133+msgstr "ਠੀਕ"
133134
134−#: qml/Dash/GenericScopeView.qml:528 qml/Dash/GenericScopeView.qml:686
135+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
135136msgid "See less"
136−msgstr ""
137+msgstr "ਘੱਟ ਵੇਖੋ"
137138
138−#: qml/Dash/GenericScopeView.qml:528
139+#: qml/Dash/GenericScopeView.qml:434
139140msgid "See all"
140−msgstr ""
141+msgstr "ਸਾਰਾ ਵੇਖੋ"
141142
142−#: qml/Dash/GenericScopeView.qml:590 qml/Dash/PageHeader.qml:276
143+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:268
143144#: qml/Panel/SearchIndicator.qml:27
144145msgid "Search"
145−msgstr ""
146+msgstr "ਖੋਜ"
146147
147−#: qml/Dash/PageHeader.qml:269
148+#: qml/Dash/PageHeader.qml:261
148149msgid "Store"
149−msgstr ""
150+msgstr "ਸਟੋਰ"
150151
151−#: qml/Dash/PageHeader.qml:286
152+#: qml/Dash/PageHeader.qml:278
152153msgid "Settings"
153−msgstr ""
154+msgstr "ਸੈਟਿੰਗ"
154155
155−#: qml/Dash/PageHeader.qml:293
156+#: qml/Dash/PageHeader.qml:285
156157msgid "Remove from Favorites"
157−msgstr ""
158+msgstr "ਪਸੰਦ ਵਿੱਚੋਂ ਹਟਾਓ"
158159
159−#: qml/Dash/PageHeader.qml:293
160+#: qml/Dash/PageHeader.qml:285
160161msgid "Add to Favorites"
161−msgstr ""
162+msgstr "ਪਸੰਦ ਵਿੱਚ ਜੋੜੋ"
162163
163164#: qml/Dash/Previews/PreviewActionCombo.qml:35
164165msgid "More..."
165−msgstr ""
166+msgstr "ਹੋਰ..."
166167
167168#: qml/Dash/Previews/PreviewActionCombo.qml:35
168169msgid "Less..."
169−msgstr ""
170+msgstr "ਘੱਟ..."
170171
171172#: qml/Dash/Previews/PreviewRatingInput.qml:81
172173msgid "Rate this"
173−msgstr ""
174+msgstr "ਇਸ ਨੂੰ ਰੇਟ ਕਰੋ"
174175
175176#: qml/Dash/Previews/PreviewRatingInput.qml:126
176177msgid "Add a review"
177−msgstr ""
178+msgstr "ਸਮੀਖਿਆ ਜੋੜੋ"
178179
179180#: qml/Dash/Previews/PreviewRatingInput.qml:166
180181msgid "Send"
181−msgstr ""
182+msgstr "ਭੇਜੋ"
182183
183184#: qml/Dash/PullToRefreshScopeStyle.qml:55
184185msgid "Pull to refresh…"
185−msgstr ""
186+msgstr "ਤਾਜ਼ਾ ਕਰਨ ਲਈ ਖਿੱਚੋ..."
186187
187188#: qml/Dash/PullToRefreshScopeStyle.qml:60
188189msgid "Release to refresh…"
189−msgstr ""
190+msgstr "ਤਾਜ਼ਾ ਕਰਨ ਲਈ ਛੱਡੋ..."
190191
191192#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
192193msgid "Enable location data"
193−msgstr ""
194+msgstr "ਸਥਿਤੀ ਡਾਟਾ ਚਾਲੂ ਕਰੋ"
194195
195−#: qml/Dash/ScopesList.qml:66
196+#: qml/Dash/ScopesList.qml:63
196197msgid "Manage"
197−msgstr ""
198+msgstr "ਸਾਂਭ-ਸੰਭਾਲ"
198199
199−#: qml/Dash/ScopesList.qml:112
200+#: qml/Dash/ScopesList.qml:107
200201msgid "Home"
201−msgstr ""
202+msgstr "ਘਰ"
202203
203−#: qml/Dash/ScopesList.qml:113
204+#: qml/Dash/ScopesList.qml:108
204205msgid "Also installed"
205−msgstr ""
206+msgstr "ਨਾਲ ਇੰਸਟਾਲ ਹੋਇਆ"
206207
207−#: qml/Greeter/CoverPage.qml:107
208+#: qml/Greeter/Greeter.qml:174
208209msgid "Unlock"
209−msgstr ""
210+msgstr "ਅਣ-ਲਾਕ"
210211
211212#: qml/Greeter/LoginList.qml:236
212213msgid "Retry"
213−msgstr ""
214+msgstr "ਮੁੜ-ਕੋਸ਼ਿਸ਼"
214215
215216#: qml/Greeter/LoginList.qml:237
216217msgid "Tap to unlock"
217−msgstr ""
218+msgstr "ਅਣਲਾਕ ਲਈ ਛੂਹੋ"
218219
219−#: qml/Greeter/NarrowView.qml:53 qml/Wizard/Pages/passwd-confirm.qml:53
220+#: qml/Shell.qml:444
220221msgid "Sorry, incorrect passphrase."
221−msgstr ""
222+msgstr "ਮੁਆਫ਼ੀ, ਗਲਤ ਵਾਕ।"
222223
223−#: qml/Greeter/NarrowView.qml:54 qml/Wizard/Pages/passwd-confirm.qml:54
224+#: qml/Shell.qml:445
224225msgid "Sorry, incorrect passcode."
225−msgstr ""
226+msgstr "ਮੁਆਫ਼ੀ, ਗਲਤ ਪਾਸਕੋਡ।"
226227
227−#: qml/Greeter/NarrowView.qml:55
228+#: qml/Shell.qml:446
228229msgid "This will be your last attempt."
229−msgstr ""
230+msgstr "ਇਹ ਤੁਹਾਡੀ ਆਖਰੀ ਕੋਸ਼ਿਸ਼ ਹੋਵੇਗੀ।"
230231
231−#: qml/Greeter/NarrowView.qml:57
232+#: qml/Shell.qml:448
232233msgid ""
233234"If passphrase is entered incorrectly, your phone will conduct a factory "
234235"reset and all personal data will be deleted."
235236msgstr ""
237+"ਜੇਕਰ ਗਲਤ ਵਾਕ ਦਰਜ ਹੋਇਆ, ਤੁਹਾਡਾ ਫ਼ੋਨ ਇੱਕ ਫ਼ੋਨ ਇੱਕ ਫ਼ੈਕਟਰੀ ਰੀਸੈੱਟ ਚਾਲੂ ਕਰੇਗਾ ਅਤੇ "
238+"ਸਾਰਾ ਨਿੱਜੀ ਡਾਟਾ ਹਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।"
236239
237−#: qml/Greeter/NarrowView.qml:58
240+#: qml/Shell.qml:449
238241msgid ""
239242"If passcode is entered incorrectly, your phone will conduct a factory reset "
240243"and all personal data will be deleted."
241244msgstr ""
245+"ਜੇਕਰ ਗਲਤ ਪਾਸਕੋਡ ਦਰਜ ਹੋਇਆ, ਤੁਹਾਡਾ ਫ਼ੋਨ ਇੱਕ ਫ਼ੋਨ ਇੱਕ ਫ਼ੈਕਟਰੀ ਰੀਸੈੱਟ ਚਾਲੂ ਕਰੇਗਾ "
246+"ਅਤੇ ਸਾਰਾ ਨਿੱਜੀ ਡਾਟਾ ਹਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।"
242247
243−#: qml/Greeter/NarrowView.qml:115
248+#: qml/Shell.qml:402
244249#, qt-format
245250msgid "Enter %1"
246−msgstr ""
251+msgstr "ਦਰਜ %1"
247252
248−#: qml/Greeter/NarrowView.qml:116 qml/Wizard/Pages/passwd-set.qml:60
253+#: qml/Shell.qml:394
249254msgid "Enter passphrase"
250−msgstr ""
255+msgstr "ਵਾਕ ਦਿਓ"
251256
252−#: qml/Greeter/NarrowView.qml:117
257+#: qml/Shell.qml:398
253258msgid "Enter passcode"
254−msgstr ""
259+msgstr "ਪਾਸਕੋਡ ਦਿਓ"
255260
256−#: qml/Greeter/NarrowView.qml:118
261+#: qml/Shell.qml:403
257262#, qt-format
258263msgid "Sorry, incorrect %1"
259−msgstr ""
264+msgstr "ਮੁਆਫ਼ੀ, ਗਲਤ %1"
260265
261−#: qml/Greeter/NarrowView.qml:119
266+#: qml/Shell.qml:395
262267msgid "Sorry, incorrect passphrase"
263−msgstr ""
268+msgstr "ਮੁਆਫ਼ੀ, ਗਲਤ ਵਾਕ"
264269
265−#: qml/Greeter/NarrowView.qml:120
270+#: qml/Shell.qml:396
266271msgid "Please re-enter"
267−msgstr ""
272+msgstr "ਕਿਰਪਾ ਕਰਕੇ ਮੁੜ-ਦਰਜ ਕਰੋ"
268273
269−#: qml/Greeter/NarrowView.qml:121
274+#: qml/Shell.qml:399
270275msgid "Sorry, incorrect passcode"
271−msgstr ""
276+msgstr "ਮੁਆਫ਼ੀ, ਗਲਤ ਪਾਸਕੋਡ"
272277
273278#: qml/Notifications/NotificationMenuItemFactory.qml:128
274279msgid "Show password"
275−msgstr ""
280+msgstr "ਪਾਸਵਰਡ ਵਿਖਾਓ"
276281
277282#: qml/Panel/ActiveCallHint.qml:79
278283msgid "Tap to return to call..."
279−msgstr ""
284+msgstr "ਕਾਲ ਤੇ ਵਾਪਸ ਜਾਣ ਲਈ ਛੁਹੋ..."
280285
281286#: qml/Panel/ActiveCallHint.qml:92
282287msgid "Conference"
283−msgstr ""
288+msgstr "ਕਨਫਰੰਸ"
284289
285290#: qml/Panel/Indicators/MenuItemFactory.qml:643
286291msgid "Nothing is playing"
287−msgstr ""
292+msgstr "ਕੁੱਝ ਨਹੀਂ ਚੱਲ ਰਿਹਾ"
288293
289294#: qml/Panel/Indicators/MenuItemFactory.qml:791
290295msgid "In queue…"
291−msgstr ""
296+msgstr "ਕਤਾਰ ਵਿੱਚ..."
292297
293298#: qml/Panel/Indicators/MenuItemFactory.qml:795
294299msgid "Downloading"
295−msgstr ""
300+msgstr "ਡਾਊਨਲੋਡ ਕਰ ਰਿਹਾ"
296301
297302#: qml/Panel/Indicators/MenuItemFactory.qml:797
298303msgid "Paused, tap to resume"
299−msgstr ""
304+msgstr "ਵਿਰਾਮ, ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਛੂਹੋ"
300305
301306#: qml/Panel/Indicators/MenuItemFactory.qml:799
302307msgid "Canceled"
303−msgstr ""
308+msgstr "ਰੱਦ ਕੀਤਾ"
304309
305310#: qml/Panel/Indicators/MenuItemFactory.qml:801
306311msgid "Finished"
307−msgstr ""
312+msgstr "ਮੁਕੰਮਲ"
308313
309314#: qml/Panel/Indicators/MenuItemFactory.qml:803
310315msgid "Failed, tap to retry"
311−msgstr ""
316+msgstr "ਫ਼ੇਲ੍ਹ ਹੋਇਆ, ਮੁੜ-ਕੋਸ਼ਿਸ ਲਈ ਛੂਹੋ"
312317
313318#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
314319msgid "Reply"
315−msgstr ""
320+msgstr "ਜਵਾਬ"
316321
317322#: qml/Panel/Indicators/ModemInfoItem.qml:105
318323msgid "Unlock SIM"
319−msgstr ""
324+msgstr "ਅਣਲਾਕ SIM"
320325
321326#: qml/Panel/Indicators/RoamingIndication.qml:27
322327msgid "Roaming"
323−msgstr ""
328+msgstr "ਰੋਮਿੰਗ"
324329
325330#: qml/Tutorial/TutorialBottomFinish.qml:24
326331msgid "This action does different things for different apps"
327−msgstr ""
332+msgstr "ਇਹ ਕਾਰਵਾਈ ਵੱਖ ਐਪਾਂ ਲਈ ਵੱਖ ਵੱਖ ਚੀਜ਼ਾਂ ਕਰਦੀ ਹੈ"
328333
329334#: qml/Tutorial/TutorialBottomFinish.qml:25
330335msgid "Tap here to finish."
331−msgstr ""
336+msgstr "ਨਬੇੜਣ ਲਈ ਇੱਥੇ ਛੂਹੋ"
332337
333338#: qml/Tutorial/TutorialBottom.qml:28
334339msgid "Open special menus"
335−msgstr ""
340+msgstr "ਖਾਸ਼ ਮੀਨੂੰ ਖੋਲ੍ਹੋ"
336341
337342#: qml/Tutorial/TutorialBottom.qml:29
338343msgid "Swipe up from the bottom edge."
339−msgstr ""
344+msgstr "ਹੇਠਲੇ ਕਿਨਾਰੇ ਤੋਂ ਉੱਪਰ ਵੱਲੋਂ ਖਿੱਚੋ।"
340345
341346#: qml/Tutorial/TutorialLeftFinish.qml:24
342347msgid "These are the shortcuts to favorite apps"
343−msgstr ""
348+msgstr "ਇੱਥੇ ਤੁਹਾਡੀ ਪਸੰਦੀਦਾ ਐਪਾਂ ਲਈ ਸ਼ਾਰਟਕੱਟ ਹਨ"
344349
345350#: qml/Tutorial/TutorialLeftFinish.qml:25 qml/Tutorial/TutorialRight.qml:144
346351msgid "Tap here to continue."
347−msgstr ""
352+msgstr "ਜਾਰੀ ਰੱਖਣ ਲਈ ਇੱਥੇ ਛੂਹੋ।"
348353
349354#: qml/Tutorial/TutorialLeft.qml:26
350355msgid "Open the launcher"
351−msgstr ""
356+msgstr "ਲਾਂਚਰ ਨੂੰ ਖੋਲੋ"
352357
353358#: qml/Tutorial/TutorialLeft.qml:27
354359msgid "Short swipe from the left edge."
355−msgstr ""
360+msgstr "ਖੱਬੇ ਕਿਨਾਰੇ ਤੋਂ ਥੋੜ੍ਹਾ ਖਿੱਚੋ।"
356361
357362#: qml/Tutorial/TutorialPage.qml:178
358363msgid "You almost got it!"
359−msgstr ""
364+msgstr "ਤੁਸੀਂ ਲਗਭਗ ਸਮਝ ਗਏ ਹੋ!"
360365
361366#: qml/Tutorial/TutorialPage.qml:195
362367msgid "Try again."
363−msgstr ""
368+msgstr "ਮੁੜ-ਕੋਸ਼ਿਸ ਕਰੋ।"
364369
365370#: qml/Tutorial/TutorialRight.qml:31
366371msgid "To view open apps"
367−msgstr ""
372+msgstr "ਖੁੱਲੀਆਂ ਐਪਾਂ ਵੇਖਣ ਲਈ"
368373
369374#: qml/Tutorial/TutorialRight.qml:32
370375msgid "Long swipe from the right edge."
371−msgstr ""
376+msgstr "ਸੱਜੇ ਪਾਸੇ ਤੋਂ ਲੰਬਾ ਖਿੱਚੋ।"
372377
373378#: qml/Tutorial/TutorialRight.qml:122
374379msgid "View all your running tasks."
375−msgstr ""
380+msgstr "ਆਪਣੇ ਸਾਰੇ ਚੱਲਦੇ ਕੰਮ ਵੇਖੋ।"
376381
377382#: qml/Wizard/Page.qml:89
378383msgid "Back"
379−msgstr ""
384+msgstr "ਪਿੱਛੇ"
380385
381386#: qml/Wizard/Pages/10-welcome.qml:27
382387msgid "Hi!"
383−msgstr ""
388+msgstr "ਹੈਲੋ!"
384389
385390#: qml/Wizard/Pages/10-welcome.qml:44
386391msgid "Welcome to your Ubuntu phone."
387−msgstr ""
392+msgstr "ਉਬੰਤੂ ਫ਼ੋਨ ਵਿੱਚ ਤੁਹਾਨੂੰ ਜੀ ਆਇਆ ਨੂੰ।"
388393
389394#: qml/Wizard/Pages/10-welcome.qml:52
390395msgid "Let’s get started."
391−msgstr ""
396+msgstr "ਚਲੋ ਸ਼ੁਰੂ ਕਰੀਏ।"
392397
393398#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:128
394399#: qml/Wizard/Pages/40-wifi.qml:215 qml/Wizard/Pages/50-location.qml:131
395400#: qml/Wizard/Pages/60-reporting.qml:50 qml/Wizard/Pages/passwd-confirm.qml:82
396401#: qml/Wizard/Pages/passwd-set.qml:90
397402msgid "Continue"
398−msgstr ""
403+msgstr "ਜਾਰੀ"
399404
400405#: qml/Wizard/Pages/20-sim.qml:25
401406msgid "Add a SIM card and restart your device"
402−msgstr ""
407+msgstr "ਸਿਮ ਕਾਰਡ ਦਾਖਲ ਕਰੋ ਅਤੇ ਜੰਤਰ ਨੂੰ ਮੁੜ-ਚਾਲੂ ਕਰੋ"
403408
404409#: qml/Wizard/Pages/20-sim.qml:59
405410msgid "Without it, you won’t be able to make calls or use text messaging."
406−msgstr ""
411+msgstr "ਇਸ ਤੋਂ ਬਿਨਾਂ, ਤੁਸੀਂ ਨਾ ਹੀ ਕਾਲਾਂ ਕਰ ਜਾਂ ਸੁਨੇਹੇ ਨਹੀਂ ਭੇਜ ਸਕੋਗੇ।"
407412
408413#: qml/Wizard/Pages/20-sim.qml:73 qml/Wizard/Pages/40-wifi.qml:215
409414msgid "Skip"
410−msgstr ""
415+msgstr "ਛੱਡੋ"
411416
412417#: qml/Wizard/Pages/30-passwd-type.qml:39
413418msgid "Lock security"
414−msgstr ""
419+msgstr "ਲਾਕ ਸੁਰੱਖਿਆ"
415420
416421#: qml/Wizard/Pages/30-passwd-type.qml:74
417422msgid "Please select how you’d like to unlock your phone."
418423msgstr ""
424+"ਕਿਰਪਾ ਕਰਕੇ ਚੁਣੋ ਤੁਸੀਂ ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਕਿਸ ਤਰ੍ਹਾਂ ਅਣ-ਲਾਕ ਕਰਨਾ ਪਸੰਦ ਕਰੋਗੇ।"
419425
420426#: qml/Wizard/Pages/30-passwd-type.qml:97
421427msgid "Swipe"
422−msgstr ""
428+msgstr "ਖਿੱਚੋ"
423429
424430#: qml/Wizard/Pages/30-passwd-type.qml:98
425431msgid "No security"
426−msgstr ""
432+msgstr "ਸੁਰੱਖਿਆ ਨਹੀਂ"
427433
428434#: qml/Wizard/Pages/30-passwd-type.qml:100
429435msgid "Passcode"
430−msgstr ""
436+msgstr "ਪਾਸਕੋਡ"
431437
432438#: qml/Wizard/Pages/30-passwd-type.qml:101
433439msgid "4 digits only"
434−msgstr ""
440+msgstr "ਕੇਵਲ 4 ਅੰਕ"
435441
436442#: qml/Wizard/Pages/30-passwd-type.qml:103
437443msgid "Passphrase"
438−msgstr ""
444+msgstr "ਵਾਕ"
439445
440446#: qml/Wizard/Pages/30-passwd-type.qml:104
441447msgid "Numbers and letters"
442−msgstr ""
448+msgstr "ਨੰਬਰਾਂ ਅਤੇ ਅੱਖਰਾਂ"
443449
444450#: qml/Wizard/Pages/40-wifi.qml:29
445451msgid "Connect to Wi‑Fi"
446−msgstr ""
452+msgstr "ਵਾਈ-ਫ਼ਾਈ ਨਾਲ ਕੁਨੇਕਟ ਹੋਵੋ"
447453
448454#: qml/Wizard/Pages/40-wifi.qml:168
449455msgid "Available networks…"
450−msgstr ""
456+msgstr "ਮੌਜੂਦ ਨੈੱਟਵਰਕ..."
451457
452458#: qml/Wizard/Pages/40-wifi.qml:169
453459msgid "No available networks."
454−msgstr ""
460+msgstr "ਕੋਈ ਨੈੱਟਵਰਕ ਮੌਜੂਦ ਨਹੀਂ।"
455461
456462#: qml/Wizard/Pages/50-location.qml:27
457463msgid "Location"
458−msgstr ""
464+msgstr "ਟਿਕਾਣਾ"
459465
460466#: qml/Wizard/Pages/50-location.qml:62
461467msgid "Let the phone detect your location:"
462−msgstr ""
468+msgstr "ਫ਼ੋਨ ਨੂੰ ਤੁਹਾਡੇ ਟਿਕਾਣੇ ਦਾ ਪਤਾ ਲਗਾਉਣ ਦਿਓ:"
463469
464470#: qml/Wizard/Pages/50-location.qml:69
465471msgid "Using GPS only (less accurate)"
466−msgstr ""
472+msgstr "ਕੇਵਲ GPS ਦੀ ਵਰਤੋਂ (ਘੱਟ ਦਰੁਸਤ)"
467473
468474#: qml/Wizard/Pages/50-location.qml:86
469475msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
470−msgstr ""
476+msgstr "GPS ਦੀ ਵਰਤੋਂ, ਅਣਜਾਣ Wi-Fi ਅਤੇ ਸੈਲੂਲਰ ਨੈੱਟਵਰਕ ਇੰਫ਼ੋ (ਸ਼ਿਫ਼ਾਰਸ)"
471477
472478#. TRANSLATORS: HERE is a trademark for Nokia's location service, you probably shouldn't translate it
473479#: qml/Wizard/Pages/50-location.qml:103
@@ -475,81 +481,87 @@ msgid ""
475481"By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
476482"conditions</a>."
477483msgstr ""
484+"ਇਸ ਵਿਕਲਪ ਨੂੰ ਚੁਣਨ ਦੁਆਰਾ, ਤੁਸੀਂ ਨੋਕੀਆ HERE <a href='#'>ਨਿਯਮ ਅਤੇ ਸ਼ਰਤਾਂ</a>ਨੂੰ "
485+"ਪ੍ਰਵਾਨ ਕਰਦੇ ਹੋ।"
478486
479487#: qml/Wizard/Pages/50-location.qml:112
480488msgid "Not at all"
481−msgstr ""
489+msgstr "ਬਿਲਕੁਲ ਨਹੀਂ"
482490
483491#: qml/Wizard/Pages/50-location.qml:124
484492msgid "You can change your mind later in <b>System Settings</b>."
485−msgstr ""
493+msgstr "ਤੁਸੀਂ ਬਾਅਦ ਵਿੱਚ <b>ਸਿਸਟਮ ਸੈਟਿੰਗ</b>ਵਿੱਚ ਆਪਣਾ ਮਨ ਬਦਲ ਸਕਦੇ ਹੋ।"
486494
487495#: qml/Wizard/Pages/60-reporting.qml:24
488496msgid "Improving your experience"
489−msgstr ""
497+msgstr "ਤੁਹਾਡਾ ਅਨੁਭਵ ਵਧਾ ਰਿਹਾ"
490498
491499#: qml/Wizard/Pages/60-reporting.qml:36
492500msgid ""
493501"Your phone is set up to automatically report errors to Canonical and its "
494502"partners, the makers of the operating system."
495503msgstr ""
504+"ਤੁਹਾਡੇ ਫ਼ੋਨ ਨੂੰ ਕੈਨੋਨੀਕਲ ਅਤੇ ਉਸਦੇ ਸਾਥੀਆਂ, ਓਪਰੇਟਿੰਗ ਸਿਸਟਮ ਦੇ ਨਿਰਮਾਤਾਵਾਂ ਨੂੰ "
505+"ਆਪਣੇ ਆਪ ਖਾਮੀ ਸੂਚਨਾਵਾਂ ਭੇਜਣ ਲਈ ਸੈੱਟ ਕੀਤਾ ਗਿਆ ਹੈ।"
496506
497507#: qml/Wizard/Pages/60-reporting.qml:43
498508msgid ""
499509"This can be disabled in <b>System Settings</b> under <b>Security &amp; "
500510"Privacy</b>"
501511msgstr ""
512+"ਇਸ ਨੂੰ <b>ਸਿਸਟਮ ਸੈਟਿੰਗ</b> ਅਧੀਨ <b>ਸੁਰੱਖਿਆ &amp; ਪਰਦੇਦਾਰੀ</b>ਵਿੱਚ ਬੰਦ ਕੀਤਾ "
513+"ਜਾ ਸਕਦਾ"
502514
503515#: qml/Wizard/Pages/80-finished.qml:24
504516msgid "All done"
505−msgstr ""
517+msgstr "ਸੱਭ ਮੁਕੰਮਲ"
506518
507519#: qml/Wizard/Pages/80-finished.qml:39
508520msgid "Nice work!"
509−msgstr ""
521+msgstr "ਚੰਗਾ ਕੰਮ!"
510522
511523#: qml/Wizard/Pages/80-finished.qml:46
512524msgid "Your phone is now ready to use."
513−msgstr ""
525+msgstr "ਤੁਹਾਡਾ ਫ਼ੋਨ ਹੁਣ ਵਰਤੋਂ ਲਈ ਤਿਆਰ ਹੈ।"
514526
515527#: qml/Wizard/Pages/80-finished.qml:53
516528msgid "Finish"
517−msgstr ""
529+msgstr "ਮੁਕੰਮਲ"
518530
519531#: qml/Wizard/Pages/here-terms.qml:27
520532msgid "Terms & Conditions"
521−msgstr ""
533+msgstr "ਨਿਯਮ ਅਤੇ ਸ਼ਰਤਾਂ"
522534
523535#: qml/Wizard/Pages/passwd-confirm.qml:49
524536msgid "Confirm passphrase"
525−msgstr ""
537+msgstr "ਵਾਕ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ"
526538
527539#: qml/Wizard/Pages/passwd-confirm.qml:50
528540msgid "Confirm passcode"
529−msgstr ""
541+msgstr "ਪਾਸਕੋਡ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ"
530542
531543#: qml/Wizard/Pages/passwd-confirm.qml:53
532544#: qml/Wizard/Pages/passwd-confirm.qml:54
533545msgid "Please try again."
534−msgstr ""
546+msgstr "ਕਿਰਪਾ ਕਰਕੇ ਮੁੜ ਕੋਸ਼ਿਸ ਕਰੋ।"
535547
536548#: qml/Wizard/Pages/passwd-set.qml:61
537549msgid "Choose your passcode"
538−msgstr ""
550+msgstr "ਆਪਣਾ ਪਾਸਕੋਡ ਚੁਣੋ"
539551
540552#: qml/Wizard/Pages/passwd-set.qml:68
541553msgid "Passphrase must be 4 characters long"
542−msgstr ""
554+msgstr "ਵਾਕ 4 ਅੱਖਰ ਜਿੰਨ੍ਹਾ ਵੱਡਾ ਹੋਣਾ ਚਾਹੀਦਾ"
543555
544556#: qml/Wizard/StackButton.qml:39
545557#, qt-format
546558msgid "〈 %1"
547−msgstr ""
559+msgstr "〈 %1"
548560
549561#: qml/Wizard/StackButton.qml:42
550562#, qt-format
551563msgid "%1 〉"
552−msgstr ""
564+msgstr "%1 〉"
553565
554566#~ msgid "Top edge"
555567#~ msgstr "ਉੱਪਰੀ ਕੰਢਾ"
po/pt.po+56−55
@@ -8,102 +8,103 @@ msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-02-25 08:57-0500\n"
11−"PO-Revision-Date: 2015-02-20 19:06+0000\n"
11+"PO-Revision-Date: 2015-03-11 15:32+0000\n"
1212"Last-Translator: António Miranda <Unknown>\n"
1313"Language-Team: Portuguese <pt@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2015-03-04 05:56+0000\n"
19−"X-Generator: Launchpad (build 17361)\n"
18+"X-Launchpad-Export-Date: 2015-03-12 04:59+0000\n"
19+"X-Generator: Launchpad (build 17389)\n"
2020
21−#: plugins/LightDM/Greeter.cpp:112
21+#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
2323msgstr "Palavra-passe: "
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:45
26−#: plugins/Unity/Launcher/launcheritem.cpp:100
26+#: plugins/Unity/Launcher/launcheritem.cpp:91
2727msgid "Pin shortcut"
2828msgstr "Afixar atalho"
2929
30−#: plugins/Unity/Launcher/launcheritem.cpp:100
30+#: plugins/Unity/Launcher/launcheritem.cpp:91
3131msgid "Unpin shortcut"
3232msgstr "Remover atalho"
3333
34−#: qml/Components/DelayedLockscreen.qml:49
34+#: qml/Components/DelayedLockscreen.qml:47
3535msgid "Device Locked"
3636msgstr "Dispositivo bloqueado"
3737
38−#: qml/Components/DelayedLockscreen.qml:64
38+#: qml/Components/DelayedLockscreen.qml:62
3939msgid "You have been locked out due to too many failed passphrase attempts."
4040msgstr "Foi bloqueado devido a muitas tentativas falhadas da frase-senha."
4141
42−#: qml/Components/DelayedLockscreen.qml:65
42+#: qml/Components/DelayedLockscreen.qml:63
4343msgid "You have been locked out due to too many failed passcode attempts."
4444msgstr "Foi bloqueado devido a muitas tentativas falhadas da senha."
4545
46−#: qml/Components/DelayedLockscreen.qml:74
46+#: qml/Components/DelayedLockscreen.qml:72
4747#, qt-format
4848msgid "Please wait %1 minute and then try again…"
4949msgid_plural "Please wait %1 minutes and then try again…"
5050msgstr[0] "Por favor, aguarde %1 minuto e tente novamente…"
5151msgstr[1] "Por favor, aguarde %1 minutos e tente novamente…"
5252
53−#: qml/Components/Dialogs.qml:87
53+#: qml/Components/Dialogs.qml:74
5454msgid "Log out"
5555msgstr "Terminar sessão"
5656
57−#: qml/Components/Dialogs.qml:88
57+#: qml/Components/Dialogs.qml:75
5858msgid "Are you sure you want to log out?"
5959msgstr "Tem a certeza de que quer sair?"
6060
6161#: qml/Components/Dialogs.qml:90
6262msgid "Lock"
63−msgstr ""
63+msgstr "Bloquear"
6464
6565#: qml/Components/Dialogs.qml:97
6666msgid "Log Out"
67−msgstr ""
67+msgstr "Terminar sessão"
6868
69−#: qml/Components/Dialogs.qml:104 qml/Components/Dialogs.qml:135
70−#: qml/Components/Dialogs.qml:191
69+#: qml/Components/Dialogs.qml:171
7170msgid "Cancel"
7271msgstr "Cancelar"
7372
74−#: qml/Components/Dialogs.qml:116
73+#: qml/Components/Dialogs.qml:98
7574msgid "Shut down"
7675msgstr "Encerrar"
7776
78−#: qml/Components/Dialogs.qml:117
77+#: qml/Components/Dialogs.qml:99
7978msgid "Are you sure you want to shut down?"
8079msgstr "Tem a certeza de que quer encerrar?"
8180
82−#: qml/Components/Dialogs.qml:119 qml/Components/Dialogs.qml:147
81+#: qml/Components/Dialogs.qml:123
8382msgid "Reboot"
8483msgstr "Reiniciar"
8584
8685#: qml/Components/Dialogs.qml:127
8786msgid "Shutdown"
88−msgstr ""
87+msgstr "Encerrar"
8988
90−#: qml/Components/Dialogs.qml:148
89+#: qml/Components/Dialogs.qml:124
9190msgid "Are you sure you want to reboot?"
9291msgstr "Tem a certeza de que quer reiniciar?"
9392
94−#: qml/Components/Dialogs.qml:150
93+#: qml/Components/Dialogs.qml:77 qml/Components/Dialogs.qml:101
94+#: qml/Components/Dialogs.qml:126
9595msgid "No"
9696msgstr "Não"
9797
98−#: qml/Components/Dialogs.qml:156
98+#: qml/Components/Dialogs.qml:84 qml/Components/Dialogs.qml:108
99+#: qml/Components/Dialogs.qml:133
99100msgid "Yes"
100101msgstr "Sim"
101102
102−#: qml/Components/Dialogs.qml:170
103+#: qml/Components/Dialogs.qml:148
103104msgid "Power"
104105msgstr "Energia"
105106
106−#: qml/Components/Dialogs.qml:171
107+#: qml/Components/Dialogs.qml:149
107108msgid ""
108109"Are you sure you would like\n"
109110"to power off?"
@@ -111,52 +112,52 @@ msgstr ""
111112"Tem a certeza de quer\n"
112113"desligar?"
113114
114−#: qml/Components/Dialogs.qml:173
115+#: qml/Components/Dialogs.qml:151
115116msgid "Power off"
116117msgstr "Desligar"
117118
118−#: qml/Components/Dialogs.qml:182
119+#: qml/Components/Dialogs.qml:161
119120msgid "Restart"
120121msgstr "Reiniciar"
121122
122−#: qml/Components/Lockscreen.qml:238
123+#: qml/Components/Lockscreen.qml:223
123124msgid "Return to Call"
124125msgstr "Retorne para chamar"
125126
126−#: qml/Components/Lockscreen.qml:238
127+#: qml/Components/Lockscreen.qml:223
127128msgid "Emergency Call"
128129msgstr "Chamada de emergência"
129130
130−#: qml/Components/Lockscreen.qml:270
131+#: qml/Components/Lockscreen.qml:255
131132msgid "OK"
132133msgstr "OK"
133134
134−#: qml/Dash/GenericScopeView.qml:528 qml/Dash/GenericScopeView.qml:686
135+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
135136msgid "See less"
136137msgstr "Ver menos"
137138
138−#: qml/Dash/GenericScopeView.qml:528
139+#: qml/Dash/GenericScopeView.qml:434
139140msgid "See all"
140141msgstr "Ver todos"
141142
142−#: qml/Dash/GenericScopeView.qml:590 qml/Dash/PageHeader.qml:276
143+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:268
143144#: qml/Panel/SearchIndicator.qml:27
144145msgid "Search"
145146msgstr "Procurar"
146147
147−#: qml/Dash/PageHeader.qml:269
148+#: qml/Dash/PageHeader.qml:261
148149msgid "Store"
149150msgstr "Store"
150151
151−#: qml/Dash/PageHeader.qml:286
152+#: qml/Dash/PageHeader.qml:278
152153msgid "Settings"
153154msgstr "Definições"
154155
155−#: qml/Dash/PageHeader.qml:293
156+#: qml/Dash/PageHeader.qml:285
156157msgid "Remove from Favorites"
157158msgstr "Remover dos favoritos"
158159
159−#: qml/Dash/PageHeader.qml:293
160+#: qml/Dash/PageHeader.qml:285
160161msgid "Add to Favorites"
161162msgstr "Adicionar aos favoritos"
162163
@@ -192,43 +193,43 @@ msgstr "Solte para atualizar..."
192193msgid "Enable location data"
193194msgstr "Ativar dados de localização"
194195
195−#: qml/Dash/ScopesList.qml:66
196+#: qml/Dash/ScopesList.qml:63
196197msgid "Manage"
197198msgstr "Gerir"
198199
199−#: qml/Dash/ScopesList.qml:112
200+#: qml/Dash/ScopesList.qml:107
200201msgid "Home"
201202msgstr "Página inicial"
202203
203−#: qml/Dash/ScopesList.qml:113
204+#: qml/Dash/ScopesList.qml:108
204205msgid "Also installed"
205206msgstr "Também instalado"
206207
207−#: qml/Greeter/CoverPage.qml:107
208+#: qml/Greeter/Greeter.qml:174
208209msgid "Unlock"
209210msgstr "Desbloquear"
210211
211212#: qml/Greeter/LoginList.qml:236
212213msgid "Retry"
213−msgstr ""
214+msgstr "Tentar novamente"
214215
215216#: qml/Greeter/LoginList.qml:237
216217msgid "Tap to unlock"
217−msgstr ""
218+msgstr "Toque para desbloquear"
218219
219−#: qml/Greeter/NarrowView.qml:53 qml/Wizard/Pages/passwd-confirm.qml:53
220+#: qml/Shell.qml:444
220221msgid "Sorry, incorrect passphrase."
221222msgstr "Desculpe, frase de acesso incorreta."
222223
223−#: qml/Greeter/NarrowView.qml:54 qml/Wizard/Pages/passwd-confirm.qml:54
224+#: qml/Shell.qml:445
224225msgid "Sorry, incorrect passcode."
225226msgstr "Desculpe, senha incorreta."
226227
227−#: qml/Greeter/NarrowView.qml:55
228+#: qml/Shell.qml:446
228229msgid "This will be your last attempt."
229230msgstr "Esta será a sua última tentativa."
230231
231−#: qml/Greeter/NarrowView.qml:57
232+#: qml/Shell.qml:448
232233msgid ""
233234"If passphrase is entered incorrectly, your phone will conduct a factory "
234235"reset and all personal data will be deleted."
@@ -236,7 +237,7 @@ msgstr ""
236237"Se a frase de acesso for introduzida incorretamente, o seu telemóvel vai "
237238"proceder ao restauro de fábrica e apagará toda a sua informação pessoal."
238239
239−#: qml/Greeter/NarrowView.qml:58
240+#: qml/Shell.qml:449
240241msgid ""
241242"If passcode is entered incorrectly, your phone will conduct a factory reset "
242243"and all personal data will be deleted."
@@ -244,33 +245,33 @@ msgstr ""
244245"Se a senha for introduzida incorretamente, o seu telemóvel vai apagar todos "
245246"os seus dados pessoais."
246247
247−#: qml/Greeter/NarrowView.qml:115
248+#: qml/Shell.qml:402
248249#, qt-format
249250msgid "Enter %1"
250251msgstr "Introduziu %1"
251252
252−#: qml/Greeter/NarrowView.qml:116 qml/Wizard/Pages/passwd-set.qml:60
253+#: qml/Shell.qml:394
253254msgid "Enter passphrase"
254255msgstr "Indique a frase-senha"
255256
256−#: qml/Greeter/NarrowView.qml:117
257+#: qml/Shell.qml:398
257258msgid "Enter passcode"
258259msgstr "Introduza senha"
259260
260−#: qml/Greeter/NarrowView.qml:118
261+#: qml/Shell.qml:403
261262#, qt-format
262263msgid "Sorry, incorrect %1"
263264msgstr "Desculpe, incorreto %1"
264265
265−#: qml/Greeter/NarrowView.qml:119
266+#: qml/Shell.qml:395
266267msgid "Sorry, incorrect passphrase"
267268msgstr "Desculpe, frase-senha incorreta"
268269
269−#: qml/Greeter/NarrowView.qml:120
270+#: qml/Shell.qml:396
270271msgid "Please re-enter"
271272msgstr "Por favor, volte a introduzir"
272273
273−#: qml/Greeter/NarrowView.qml:121
274+#: qml/Shell.qml:399
274275msgid "Sorry, incorrect passcode"
275276msgstr "Desculpe, senha incorreta"
276277
po/pt_BR.po+4−4
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-02-25 08:57-0500\n"
11−"PO-Revision-Date: 2015-03-09 12:47+0000\n"
12−"Last-Translator: Rafael Neri <Unknown>\n"
11+"PO-Revision-Date: 2015-03-13 17:03+0000\n"
12+"Last-Translator: Tiago Hillebrandt <tiagohillebrandt@gmail.com>\n"
1313"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2015-03-10 05:47+0000\n"
18+"X-Launchpad-Export-Date: 2015-03-14 05:32+0000\n"
1919"X-Generator: Launchpad (build 17389)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -258,7 +258,7 @@ msgstr "Digite a frase secreta"
258258
259259#: qml/Shell.qml:398
260260msgid "Enter passcode"
261−msgstr "Digite o código de acesso"
261+msgstr "Informe sua senha"
262262
263263#: qml/Shell.qml:403
264264#, qt-format
po/unity8.pot+50−22
@@ -8,7 +8,7 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity8\n"
1010"Report-Msgid-Bugs-To: \n"
11−"POT-Creation-Date: 2015-02-25 08:57-0500\n"
11+"POT-Creation-Date: 2015-03-13 11:06+0100\n"
1212"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1313"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1414"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -50,70 +50,84 @@ msgid_plural "Please wait %1 minutes and then try again…"
5050msgstr[0] ""
5151msgstr[1] ""
5252
53−#: qml/Components/Dialogs.qml:87
53+#: qml/Components/Dialogs.qml:67
54+msgctxt "Title: Lock/Log out dialog"
5455msgid "Log out"
5556msgstr ""
5657
57−#: qml/Components/Dialogs.qml:88
58+#: qml/Components/Dialogs.qml:68
5859msgid "Are you sure you want to log out?"
5960msgstr ""
6061
61−#: qml/Components/Dialogs.qml:90
62+#: qml/Components/Dialogs.qml:70
63+msgctxt "Button: Lock the system"
6264msgid "Lock"
6365msgstr ""
6466
65−#: qml/Components/Dialogs.qml:97
67+#: qml/Components/Dialogs.qml:77
68+msgctxt "Button: Log out from the system"
6669msgid "Log Out"
6770msgstr ""
6871
69−#: qml/Components/Dialogs.qml:104 qml/Components/Dialogs.qml:135
70−#: qml/Components/Dialogs.qml:191
72+#: qml/Components/Dialogs.qml:84 qml/Components/Dialogs.qml:115
73+#: qml/Components/Dialogs.qml:171
7174msgid "Cancel"
7275msgstr ""
7376
74−#: qml/Components/Dialogs.qml:116
77+#: qml/Components/Dialogs.qml:96
78+msgctxt "Title: Reboot/Shut down dialog"
7579msgid "Shut down"
7680msgstr ""
7781
78−#: qml/Components/Dialogs.qml:117
82+#: qml/Components/Dialogs.qml:97
7983msgid "Are you sure you want to shut down?"
8084msgstr ""
8185
82−#: qml/Components/Dialogs.qml:119 qml/Components/Dialogs.qml:147
86+#: qml/Components/Dialogs.qml:99
87+msgctxt "Button: Reboot the system"
8388msgid "Reboot"
8489msgstr ""
8590
91+#: qml/Components/Dialogs.qml:107
92+msgctxt "Button: Shut down the system"
93+msgid "Shut down"
94+msgstr ""
95+
8696#: qml/Components/Dialogs.qml:127
87−msgid "Shutdown"
97+msgctxt "Title: Reboot dialog"
98+msgid "Reboot"
8899msgstr ""
89100
90−#: qml/Components/Dialogs.qml:148
101+#: qml/Components/Dialogs.qml:128
91102msgid "Are you sure you want to reboot?"
92103msgstr ""
93104
94−#: qml/Components/Dialogs.qml:150
105+#: qml/Components/Dialogs.qml:130
95106msgid "No"
96107msgstr ""
97108
98−#: qml/Components/Dialogs.qml:156
109+#: qml/Components/Dialogs.qml:136
99110msgid "Yes"
100111msgstr ""
101112
102−#: qml/Components/Dialogs.qml:170
113+#: qml/Components/Dialogs.qml:150
114+msgctxt "Title: Power off/Restart dialog"
103115msgid "Power"
104116msgstr ""
105117
106−#: qml/Components/Dialogs.qml:171
118+#: qml/Components/Dialogs.qml:151
107119msgid ""
108120"Are you sure you would like\n"
109121"to power off?"
110122msgstr ""
111123
112−#: qml/Components/Dialogs.qml:173
124+#: qml/Components/Dialogs.qml:153
125+msgctxt "Button: Power off the system"
113126msgid "Power off"
114127msgstr ""
115128
116−#: qml/Components/Dialogs.qml:182
129+#: qml/Components/Dialogs.qml:162
130+msgctxt "Button: Restart the system"
117131msgid "Restart"
118132msgstr ""
119133
@@ -129,23 +143,29 @@ msgstr ""
129143msgid "OK"
130144msgstr ""
131145
132−#: qml/Dash/GenericScopeView.qml:528 qml/Dash/GenericScopeView.qml:686
146+#: qml/Dash/GenericScopeView.qml:533 qml/Dash/GenericScopeView.qml:691
133147msgid "See less"
134148msgstr ""
135149
136−#: qml/Dash/GenericScopeView.qml:528
150+#: qml/Dash/GenericScopeView.qml:533
137151msgid "See all"
138152msgstr ""
139153
140−#: qml/Dash/GenericScopeView.qml:590 qml/Dash/PageHeader.qml:276
141−#: qml/Panel/SearchIndicator.qml:27
154+#: qml/Dash/GenericScopeView.qml:595
155+msgctxt "Label: Hint for dash search line edit"
142156msgid "Search"
143157msgstr ""
144158
145159#: qml/Dash/PageHeader.qml:269
160+msgctxt "Button: The Ubuntu Store"
146161msgid "Store"
147162msgstr ""
148163
164+#: qml/Dash/PageHeader.qml:276
165+msgctxt "Button: Shown in Page Header Menu"
166+msgid "Search"
167+msgstr ""
168+
149169#: qml/Dash/PageHeader.qml:286
150170msgid "Settings"
151171msgstr ""
@@ -309,6 +329,7 @@ msgid "Failed, tap to retry"
309329msgstr ""
310330
311331#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
332+msgctxt "Label: Hint in message indicator line edit"
312333msgid "Reply"
313334msgstr ""
314335
@@ -373,6 +394,7 @@ msgid "View all your running tasks."
373394msgstr ""
374395
375396#: qml/Wizard/Page.qml:89
397+msgctxt "Button: Go back one page in the Wizard"
376398msgid "Back"
377399msgstr ""
378400
@@ -416,26 +438,32 @@ msgid "Please select how you’d like to unlock your phone."
416438msgstr ""
417439
418440#: qml/Wizard/Pages/30-passwd-type.qml:97
441+msgctxt "Label: Type of security method"
419442msgid "Swipe"
420443msgstr ""
421444
422445#: qml/Wizard/Pages/30-passwd-type.qml:98
446+msgctxt "Label: Description of security method"
423447msgid "No security"
424448msgstr ""
425449
426450#: qml/Wizard/Pages/30-passwd-type.qml:100
451+msgctxt "Label: Type of security method"
427452msgid "Passcode"
428453msgstr ""
429454
430455#: qml/Wizard/Pages/30-passwd-type.qml:101
456+msgctxt "Label: Description of security method"
431457msgid "4 digits only"
432458msgstr ""
433459
434460#: qml/Wizard/Pages/30-passwd-type.qml:103
461+msgctxt "Label: Type of security method"
435462msgid "Passphrase"
436463msgstr ""
437464
438465#: qml/Wizard/Pages/30-passwd-type.qml:104
466+msgctxt "Label: Description of security method"
439467msgid "Numbers and letters"
440468msgstr ""
441469
po/update-unity-pot+1
@@ -22,6 +22,7 @@ xgettext \
2222 --keyword=tr \
2323 --keyword=tr:1,2 \
2424 --keyword=dtr:2 \
25+ --keyword=ctr:1c,2 \
2526 --package-name="unity8" \
2627 --copyright-holder="Canonical Ltd." \
2728 --from-code="UTF-8"
po/zh_TW.po+126−124
@@ -8,152 +8,154 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-02-25 08:57-0500\n"
11−"PO-Revision-Date: 2014-11-19 15:05+0000\n"
12−"Last-Translator: Walter Cheuk <wwycheuk@gmail.com>\n"
11+"PO-Revision-Date: 2015-03-15 06:06+0000\n"
12+"Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n"
1313"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2015-03-04 05:57+0000\n"
19−"X-Generator: Launchpad (build 17361)\n"
18+"X-Launchpad-Export-Date: 2015-03-16 06:02+0000\n"
19+"X-Generator: Launchpad (build 17389)\n"
20+"Language: zh_TW\n"
2021
21−#: plugins/LightDM/Greeter.cpp:112
22+#: plugins/LightDM/Greeter.cpp:130
2223msgid "Password: "
2324msgstr "密碼: "
2425
2526#: plugins/Unity/Launcher/launcheritem.cpp:45
26−#: plugins/Unity/Launcher/launcheritem.cpp:100
27+#: plugins/Unity/Launcher/launcheritem.cpp:91
2728msgid "Pin shortcut"
2829msgstr "釘住捷徑"
2930
30−#: plugins/Unity/Launcher/launcheritem.cpp:100
31+#: plugins/Unity/Launcher/launcheritem.cpp:91
3132msgid "Unpin shortcut"
3233msgstr "取消捷徑釘選"
3334
34−#: qml/Components/DelayedLockscreen.qml:49
35+#: qml/Components/DelayedLockscreen.qml:47
3536msgid "Device Locked"
3637msgstr "裝置已鎖定"
3738
38−#: qml/Components/DelayedLockscreen.qml:64
39+#: qml/Components/DelayedLockscreen.qml:62
3940msgid "You have been locked out due to too many failed passphrase attempts."
4041msgstr "因為嘗試輸入太多次錯誤的密碼,裝置已經被鎖定。"
4142
42−#: qml/Components/DelayedLockscreen.qml:65
43+#: qml/Components/DelayedLockscreen.qml:63
4344msgid "You have been locked out due to too many failed passcode attempts."
4445msgstr "因為嘗試輸入太多次錯誤的密碼,裝置已經被鎖定。"
4546
46−#: qml/Components/DelayedLockscreen.qml:74
47+#: qml/Components/DelayedLockscreen.qml:72
4748#, qt-format
4849msgid "Please wait %1 minute and then try again…"
4950msgid_plural "Please wait %1 minutes and then try again…"
5051msgstr[0] "請等候 %1 分鐘再試…"
5152
52−#: qml/Components/Dialogs.qml:87
53+#: qml/Components/Dialogs.qml:74
5354msgid "Log out"
5455msgstr "登出"
5556
56−#: qml/Components/Dialogs.qml:88
57+#: qml/Components/Dialogs.qml:75
5758msgid "Are you sure you want to log out?"
5859msgstr "確定要登出?"
5960
6061#: qml/Components/Dialogs.qml:90
6162msgid "Lock"
62−msgstr ""
63+msgstr "鎖定"
6364
6465#: qml/Components/Dialogs.qml:97
6566msgid "Log Out"
66−msgstr ""
67+msgstr "登出"
6768
68−#: qml/Components/Dialogs.qml:104 qml/Components/Dialogs.qml:135
69−#: qml/Components/Dialogs.qml:191
69+#: qml/Components/Dialogs.qml:171
7070msgid "Cancel"
7171msgstr "取消"
7272
73−#: qml/Components/Dialogs.qml:116
73+#: qml/Components/Dialogs.qml:98
7474msgid "Shut down"
7575msgstr "關機"
7676
77−#: qml/Components/Dialogs.qml:117
77+#: qml/Components/Dialogs.qml:99
7878msgid "Are you sure you want to shut down?"
7979msgstr "確定要關機?"
8080
81−#: qml/Components/Dialogs.qml:119 qml/Components/Dialogs.qml:147
81+#: qml/Components/Dialogs.qml:123
8282msgid "Reboot"
8383msgstr "重新開機"
8484
8585#: qml/Components/Dialogs.qml:127
8686msgid "Shutdown"
87−msgstr ""
87+msgstr "關機"
8888
89−#: qml/Components/Dialogs.qml:148
89+#: qml/Components/Dialogs.qml:124
9090msgid "Are you sure you want to reboot?"
9191msgstr "確定要重新開機?"
9292
93−#: qml/Components/Dialogs.qml:150
93+#: qml/Components/Dialogs.qml:77 qml/Components/Dialogs.qml:101
94+#: qml/Components/Dialogs.qml:126
9495msgid "No"
9596msgstr "否"
9697
97−#: qml/Components/Dialogs.qml:156
98+#: qml/Components/Dialogs.qml:84 qml/Components/Dialogs.qml:108
99+#: qml/Components/Dialogs.qml:133
98100msgid "Yes"
99101msgstr "是"
100102
101−#: qml/Components/Dialogs.qml:170
103+#: qml/Components/Dialogs.qml:148
102104msgid "Power"
103105msgstr "關閉電源"
104106
105−#: qml/Components/Dialogs.qml:171
107+#: qml/Components/Dialogs.qml:149
106108msgid ""
107109"Are you sure you would like\n"
108110"to power off?"
109111msgstr "確定要關閉電源?"
110112
111−#: qml/Components/Dialogs.qml:173
113+#: qml/Components/Dialogs.qml:151
112114msgid "Power off"
113115msgstr "關閉電源"
114116
115−#: qml/Components/Dialogs.qml:182
117+#: qml/Components/Dialogs.qml:161
116118msgid "Restart"
117119msgstr "重新啟動"
118120
119−#: qml/Components/Lockscreen.qml:238
121+#: qml/Components/Lockscreen.qml:223
120122msgid "Return to Call"
121−msgstr ""
123+msgstr "返回通話"
122124
123−#: qml/Components/Lockscreen.qml:238
125+#: qml/Components/Lockscreen.qml:223
124126msgid "Emergency Call"
125127msgstr "緊急通話"
126128
127−#: qml/Components/Lockscreen.qml:270
129+#: qml/Components/Lockscreen.qml:255
128130msgid "OK"
129131msgstr "確定"
130132
131−#: qml/Dash/GenericScopeView.qml:528 qml/Dash/GenericScopeView.qml:686
133+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
132134msgid "See less"
133135msgstr "縮減查看"
134136
135−#: qml/Dash/GenericScopeView.qml:528
137+#: qml/Dash/GenericScopeView.qml:434
136138msgid "See all"
137139msgstr "查看全部"
138140
139−#: qml/Dash/GenericScopeView.qml:590 qml/Dash/PageHeader.qml:276
141+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:268
140142#: qml/Panel/SearchIndicator.qml:27
141143msgid "Search"
142144msgstr "搜尋"
143145
144−#: qml/Dash/PageHeader.qml:269
146+#: qml/Dash/PageHeader.qml:261
145147msgid "Store"
146148msgstr "商城"
147149
148−#: qml/Dash/PageHeader.qml:286
150+#: qml/Dash/PageHeader.qml:278
149151msgid "Settings"
150152msgstr "設定"
151153
152−#: qml/Dash/PageHeader.qml:293
154+#: qml/Dash/PageHeader.qml:285
153155msgid "Remove from Favorites"
154156msgstr "自「最愛」移除"
155157
156−#: qml/Dash/PageHeader.qml:293
158+#: qml/Dash/PageHeader.qml:285
157159msgid "Add to Favorites"
158160msgstr "加入到「最愛」"
159161
@@ -187,85 +189,85 @@ msgstr "放開以重新整理..."
187189
188190#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
189191msgid "Enable location data"
190−msgstr ""
192+msgstr "啟用位置資料"
191193
192−#: qml/Dash/ScopesList.qml:66
194+#: qml/Dash/ScopesList.qml:63
193195msgid "Manage"
194−msgstr ""
196+msgstr "管理"
195197
196−#: qml/Dash/ScopesList.qml:112
198+#: qml/Dash/ScopesList.qml:107
197199msgid "Home"
198−msgstr ""
200+msgstr "家屋"
199201
200−#: qml/Dash/ScopesList.qml:113
202+#: qml/Dash/ScopesList.qml:108
201203msgid "Also installed"
202−msgstr ""
204+msgstr "也有安裝"
203205
204−#: qml/Greeter/CoverPage.qml:107
206+#: qml/Greeter/Greeter.qml:174
205207msgid "Unlock"
206208msgstr "解鎖"
207209
208210#: qml/Greeter/LoginList.qml:236
209211msgid "Retry"
210−msgstr ""
212+msgstr "重試"
211213
212214#: qml/Greeter/LoginList.qml:237
213215msgid "Tap to unlock"
214−msgstr ""
216+msgstr "點按以解鎖"
215217
216−#: qml/Greeter/NarrowView.qml:53 qml/Wizard/Pages/passwd-confirm.qml:53
218+#: qml/Shell.qml:444
217219msgid "Sorry, incorrect passphrase."
218220msgstr "抱歉,密語不對"
219221
220−#: qml/Greeter/NarrowView.qml:54 qml/Wizard/Pages/passwd-confirm.qml:54
222+#: qml/Shell.qml:445
221223msgid "Sorry, incorrect passcode."
222−msgstr "抱歉,passcode 不對。"
224+msgstr "抱歉,通關碼不對。"
223225
224−#: qml/Greeter/NarrowView.qml:55
226+#: qml/Shell.qml:446
225227msgid "This will be your last attempt."
226228msgstr "這將會是您最後一次嘗試的機會。"
227229
228−#: qml/Greeter/NarrowView.qml:57
230+#: qml/Shell.qml:448
229231msgid ""
230232"If passphrase is entered incorrectly, your phone will conduct a factory "
231233"reset and all personal data will be deleted."
232234msgstr "如輸入的密語不對,本電話會進行重設,所有個人資料都會刪除。"
233235
234−#: qml/Greeter/NarrowView.qml:58
236+#: qml/Shell.qml:449
235237msgid ""
236238"If passcode is entered incorrectly, your phone will conduct a factory reset "
237239"and all personal data will be deleted."
238−msgstr "如輸入的 passcode 不對,本電話會進行重設,所有個人資料都會刪除。"
240+msgstr "如輸入的通關碼不對,本電話會進行重設,所有個人資料都會刪除。"
239241
240−#: qml/Greeter/NarrowView.qml:115
242+#: qml/Shell.qml:402
241243#, qt-format
242244msgid "Enter %1"
243245msgstr "輸入 %1"
244246
245−#: qml/Greeter/NarrowView.qml:116 qml/Wizard/Pages/passwd-set.qml:60
247+#: qml/Shell.qml:394
246248msgid "Enter passphrase"
247249msgstr "輸入密語"
248250
249−#: qml/Greeter/NarrowView.qml:117
251+#: qml/Shell.qml:398
250252msgid "Enter passcode"
251−msgstr "輸入 passcode"
253+msgstr "輸入通關碼"
252254
253−#: qml/Greeter/NarrowView.qml:118
255+#: qml/Shell.qml:403
254256#, qt-format
255257msgid "Sorry, incorrect %1"
256258msgstr "抱歉,%1不對"
257259
258−#: qml/Greeter/NarrowView.qml:119
260+#: qml/Shell.qml:395
259261msgid "Sorry, incorrect passphrase"
260262msgstr "抱歉,密語不對"
261263
262−#: qml/Greeter/NarrowView.qml:120
264+#: qml/Shell.qml:396
263265msgid "Please re-enter"
264266msgstr "請再輸入"
265267
266−#: qml/Greeter/NarrowView.qml:121
268+#: qml/Shell.qml:399
267269msgid "Sorry, incorrect passcode"
268−msgstr "抱歉,passcode 不對"
270+msgstr "抱歉,通關碼不對"
269271
270272#: qml/Notifications/NotificationMenuItemFactory.qml:128
271273msgid "Show password"
@@ -273,7 +275,7 @@ msgstr "顯示密碼"
273275
274276#: qml/Panel/ActiveCallHint.qml:79
275277msgid "Tap to return to call..."
276−msgstr "輕觸可返回通話…"
278+msgstr "點按可返回通話…"
277279
278280#: qml/Panel/ActiveCallHint.qml:92
279281msgid "Conference"
@@ -293,7 +295,7 @@ msgstr "下載中"
293295
294296#: qml/Panel/Indicators/MenuItemFactory.qml:797
295297msgid "Paused, tap to resume"
296−msgstr "已暫停,輕觸可繼續"
298+msgstr "已暫停,點按可繼續"
297299
298300#: qml/Panel/Indicators/MenuItemFactory.qml:799
299301msgid "Canceled"
@@ -305,15 +307,15 @@ msgstr "已完成"
305307
306308#: qml/Panel/Indicators/MenuItemFactory.qml:803
307309msgid "Failed, tap to retry"
308−msgstr "失敗,輕觸可重試"
310+msgstr "失敗,點按可重試"
309311
310312#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
311313msgid "Reply"
312−msgstr ""
314+msgstr "回覆"
313315
314316#: qml/Panel/Indicators/ModemInfoItem.qml:105
315317msgid "Unlock SIM"
316−msgstr "為 SIM 卡解鎖"
318+msgstr "解鎖 SIM 卡"
317319
318320#: qml/Panel/Indicators/RoamingIndication.qml:27
319321msgid "Roaming"
@@ -321,232 +323,232 @@ msgstr "漫遊"
321323
322324#: qml/Tutorial/TutorialBottomFinish.qml:24
323325msgid "This action does different things for different apps"
324−msgstr ""
326+msgstr "這個動作在不同的程式中有不同的效果"
325327
326328#: qml/Tutorial/TutorialBottomFinish.qml:25
327329msgid "Tap here to finish."
328−msgstr ""
330+msgstr "點按這裡完成。"
329331
330332#: qml/Tutorial/TutorialBottom.qml:28
331333msgid "Open special menus"
332−msgstr ""
334+msgstr "開啟特殊選單"
333335
334336#: qml/Tutorial/TutorialBottom.qml:29
335337msgid "Swipe up from the bottom edge."
336−msgstr ""
338+msgstr "從底部邊緣向上滑動。"
337339
338340#: qml/Tutorial/TutorialLeftFinish.qml:24
339341msgid "These are the shortcuts to favorite apps"
340−msgstr ""
342+msgstr "這些是喜愛程式的捷徑"
341343
342344#: qml/Tutorial/TutorialLeftFinish.qml:25 qml/Tutorial/TutorialRight.qml:144
343345msgid "Tap here to continue."
344−msgstr ""
346+msgstr "點按這裡繼續。"
345347
346348#: qml/Tutorial/TutorialLeft.qml:26
347349msgid "Open the launcher"
348−msgstr ""
350+msgstr "開啟啟動欄"
349351
350352#: qml/Tutorial/TutorialLeft.qml:27
351353msgid "Short swipe from the left edge."
352−msgstr ""
354+msgstr "從左側邊緣小幅滑動。"
353355
354356#: qml/Tutorial/TutorialPage.qml:178
355357msgid "You almost got it!"
356−msgstr ""
358+msgstr "您快學會了!"
357359
358360#: qml/Tutorial/TutorialPage.qml:195
359361msgid "Try again."
360−msgstr ""
362+msgstr "重試一次。"
361363
362364#: qml/Tutorial/TutorialRight.qml:31
363365msgid "To view open apps"
364−msgstr ""
366+msgstr "檢視開啟的程式"
365367
366368#: qml/Tutorial/TutorialRight.qml:32
367369msgid "Long swipe from the right edge."
368−msgstr ""
370+msgstr "從右側邊緣大幅滑動。"
369371
370372#: qml/Tutorial/TutorialRight.qml:122
371373msgid "View all your running tasks."
372−msgstr ""
374+msgstr "檢視您所有執行中的作業項目。"
373375
374376#: qml/Wizard/Page.qml:89
375377msgid "Back"
376−msgstr ""
378+msgstr "返回"
377379
378380#: qml/Wizard/Pages/10-welcome.qml:27
379381msgid "Hi!"
380−msgstr ""
382+msgstr "您好!"
381383
382384#: qml/Wizard/Pages/10-welcome.qml:44
383385msgid "Welcome to your Ubuntu phone."
384−msgstr ""
386+msgstr "歡迎使用您的 Ubuntu 手機。"
385387
386388#: qml/Wizard/Pages/10-welcome.qml:52
387389msgid "Let’s get started."
388−msgstr ""
390+msgstr "讓我們開始吧。"
389391
390392#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:128
391393#: qml/Wizard/Pages/40-wifi.qml:215 qml/Wizard/Pages/50-location.qml:131
392394#: qml/Wizard/Pages/60-reporting.qml:50 qml/Wizard/Pages/passwd-confirm.qml:82
393395#: qml/Wizard/Pages/passwd-set.qml:90
394396msgid "Continue"
395−msgstr ""
397+msgstr "繼續"
396398
397399#: qml/Wizard/Pages/20-sim.qml:25
398400msgid "Add a SIM card and restart your device"
399−msgstr ""
401+msgstr "插入 SIM 卡並重新啟動您的裝置"
400402
401403#: qml/Wizard/Pages/20-sim.qml:59
402404msgid "Without it, you won’t be able to make calls or use text messaging."
403−msgstr ""
405+msgstr "沒有它,您便無法撥打電話,或是傳送文字簡訊。"
404406
405407#: qml/Wizard/Pages/20-sim.qml:73 qml/Wizard/Pages/40-wifi.qml:215
406408msgid "Skip"
407−msgstr ""
409+msgstr "略過"
408410
409411#: qml/Wizard/Pages/30-passwd-type.qml:39
410412msgid "Lock security"
411−msgstr ""
413+msgstr "安全鎖"
412414
413415#: qml/Wizard/Pages/30-passwd-type.qml:74
414416msgid "Please select how you’d like to unlock your phone."
415−msgstr ""
417+msgstr "請選取您想要的手機解鎖方式。"
416418
417419#: qml/Wizard/Pages/30-passwd-type.qml:97
418420msgid "Swipe"
419−msgstr ""
421+msgstr "滑開"
420422
421423#: qml/Wizard/Pages/30-passwd-type.qml:98
422424msgid "No security"
423−msgstr ""
425+msgstr "不安全"
424426
425427#: qml/Wizard/Pages/30-passwd-type.qml:100
426428msgid "Passcode"
427−msgstr ""
429+msgstr "通關碼"
428430
429431#: qml/Wizard/Pages/30-passwd-type.qml:101
430432msgid "4 digits only"
431−msgstr ""
433+msgstr "僅 4 位數"
432434
433435#: qml/Wizard/Pages/30-passwd-type.qml:103
434436msgid "Passphrase"
435−msgstr ""
437+msgstr "密語"
436438
437439#: qml/Wizard/Pages/30-passwd-type.qml:104
438440msgid "Numbers and letters"
439−msgstr ""
441+msgstr "數字和字母"
440442
441443#: qml/Wizard/Pages/40-wifi.qml:29
442444msgid "Connect to Wi‑Fi"
443−msgstr ""
445+msgstr "連接 Wi-Fi"
444446
445447#: qml/Wizard/Pages/40-wifi.qml:168
446448msgid "Available networks…"
447−msgstr ""
449+msgstr "可用的網路…"
448450
449451#: qml/Wizard/Pages/40-wifi.qml:169
450452msgid "No available networks."
451−msgstr ""
453+msgstr "無可用網路。"
452454
453455#: qml/Wizard/Pages/50-location.qml:27
454456msgid "Location"
455−msgstr ""
457+msgstr "位置"
456458
457459#: qml/Wizard/Pages/50-location.qml:62
458460msgid "Let the phone detect your location:"
459−msgstr ""
461+msgstr "讓手機偵測您的所在位置:"
460462
461463#: qml/Wizard/Pages/50-location.qml:69
462464msgid "Using GPS only (less accurate)"
463−msgstr ""
465+msgstr "僅使用 GPS (較不精確)"
464466
465467#: qml/Wizard/Pages/50-location.qml:86
466468msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
467−msgstr ""
469+msgstr "使用 GPS、匿名化 Wi-Fi 與巢狀行動網路資訊 (建議)"
468470
469471#. TRANSLATORS: HERE is a trademark for Nokia's location service, you probably shouldn't translate it
470472#: qml/Wizard/Pages/50-location.qml:103
471473msgid ""
472474"By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
473475"conditions</a>."
474−msgstr ""
476+msgstr "選取此項代表您同意 Nokia HERE 的<a href='#'>服務條款與細則</a>。"
475477
476478#: qml/Wizard/Pages/50-location.qml:112
477479msgid "Not at all"
478−msgstr ""
480+msgstr "一點也不"
479481
480482#: qml/Wizard/Pages/50-location.qml:124
481483msgid "You can change your mind later in <b>System Settings</b>."
482−msgstr ""
484+msgstr "您稍後若改變心意,可以到<b>系統設定</b>中更改。"
483485
484486#: qml/Wizard/Pages/60-reporting.qml:24
485487msgid "Improving your experience"
486−msgstr ""
488+msgstr "改善您的使用體驗"
487489
488490#: qml/Wizard/Pages/60-reporting.qml:36
489491msgid ""
490492"Your phone is set up to automatically report errors to Canonical and its "
491493"partners, the makers of the operating system."
492−msgstr ""
494+msgstr "您的手機已設置為會自動向 Canonical 及其合作夥伴 (作業系統的製作者) 回報錯誤問題。"
493495
494496#: qml/Wizard/Pages/60-reporting.qml:43
495497msgid ""
496498"This can be disabled in <b>System Settings</b> under <b>Security &amp; "
497499"Privacy</b>"
498−msgstr ""
500+msgstr "這可隨時在<b>系統設定</b>的<b>安全與隱私</b>中停用。"
499501
500502#: qml/Wizard/Pages/80-finished.qml:24
501503msgid "All done"
502−msgstr ""
504+msgstr "大功告成"
503505
504506#: qml/Wizard/Pages/80-finished.qml:39
505507msgid "Nice work!"
506−msgstr ""
508+msgstr "做得漂亮!"
507509
508510#: qml/Wizard/Pages/80-finished.qml:46
509511msgid "Your phone is now ready to use."
510−msgstr ""
512+msgstr "您的手機現在已準備好使用。"
511513
512514#: qml/Wizard/Pages/80-finished.qml:53
513515msgid "Finish"
514−msgstr ""
516+msgstr "完成"
515517
516518#: qml/Wizard/Pages/here-terms.qml:27
517519msgid "Terms & Conditions"
518−msgstr ""
520+msgstr "使用條款與細則"
519521
520522#: qml/Wizard/Pages/passwd-confirm.qml:49
521523msgid "Confirm passphrase"
522−msgstr ""
524+msgstr "確認密語"
523525
524526#: qml/Wizard/Pages/passwd-confirm.qml:50
525527msgid "Confirm passcode"
526−msgstr ""
528+msgstr "確認通關碼"
527529
528530#: qml/Wizard/Pages/passwd-confirm.qml:53
529531#: qml/Wizard/Pages/passwd-confirm.qml:54
530532msgid "Please try again."
531−msgstr ""
533+msgstr "請重試一次。"
532534
533535#: qml/Wizard/Pages/passwd-set.qml:61
534536msgid "Choose your passcode"
535−msgstr ""
537+msgstr "決定您的通關碼"
536538
537539#: qml/Wizard/Pages/passwd-set.qml:68
538540msgid "Passphrase must be 4 characters long"
539−msgstr ""
541+msgstr "密語必須 4 個字元長"
540542
541543#: qml/Wizard/StackButton.qml:39
542544#, qt-format
543545msgid "〈 %1"
544−msgstr ""
546+msgstr "〈 %1"
545547
546548#: qml/Wizard/StackButton.qml:42
547549#, qt-format
548550msgid "%1 〉"
549−msgstr ""
551+msgstr "%1 〉"
550552
551553#~ msgid "Confirm"
552554#~ msgstr "確認"
qml/Components/Dialogs.qml+10−10
@@ -64,17 +64,17 @@ Item {
6464 id: logoutDialogComponent
6565 ShellDialog {
6666 id: logoutDialog
67− title: i18n.tr("Log out")
67+ title: i18n.ctr("Title: Lock/Log out dialog", "Log out")
6868 text: i18n.tr("Are you sure you want to log out?")
6969 Button {
70− text: i18n.tr("Lock")
70+ text: i18n.ctr("Button: Lock the system", "Lock")
7171 onClicked: {
7272 LightDM.Greeter.showGreeter()
7373 logoutDialog.hide();
7474 }
7575 }
7676 Button {
77− text: i18n.tr("Log Out")
77+ text: i18n.ctr("Button: Log out from the system", "Log Out")
7878 onClicked: {
7979 unitySessionService.logout();
8080 logoutDialog.hide();
@@ -93,10 +93,10 @@ Item {
9393 id: shutdownDialogComponent
9494 ShellDialog {
9595 id: shutdownDialog
96− title: i18n.tr("Shut down")
96+ title: i18n.ctr("Title: Reboot/Shut down dialog", "Shut down")
9797 text: i18n.tr("Are you sure you want to shut down?")
9898 Button {
99− text: i18n.tr("Reboot")
99+ text: i18n.ctr("Button: Reboot the system", "Reboot")
100100 onClicked: {
101101 root.closeAllApps();
102102 unitySessionService.reboot();
@@ -104,7 +104,7 @@ Item {
104104 }
105105 }
106106 Button {
107− text: i18n.tr("Shutdown")
107+ text: i18n.ctr("Button: Shut down the system", "Shut down")
108108 onClicked: {
109109 root.closeAllApps();
110110 unitySessionService.shutdown();
@@ -124,7 +124,7 @@ Item {
124124 id: rebootDialogComponent
125125 ShellDialog {
126126 id: rebootDialog
127− title: i18n.tr("Reboot")
127+ title: i18n.ctr("Title: Reboot dialog", "Reboot")
128128 text: i18n.tr("Are you sure you want to reboot?")
129129 Button {
130130 text: i18n.tr("No")
@@ -147,10 +147,10 @@ Item {
147147 id: powerDialogComponent
148148 ShellDialog {
149149 id: powerDialog
150− title: i18n.tr("Power")
150+ title: i18n.ctr("Title: Power off/Restart dialog", "Power")
151151 text: i18n.tr("Are you sure you would like\nto power off?")
152152 Button {
153− text: i18n.tr("Power off")
153+ text: i18n.ctr("Button: Power off the system", "Power off")
154154 onClicked: {
155155 root.closeAllApps();
156156 powerDialog.hide();
@@ -159,7 +159,7 @@ Item {
159159 color: UbuntuColors.red
160160 }
161161 Button {
162− text: i18n.tr("Restart")
162+ text: i18n.ctr("Button: Restart the system", "Restart")
163163 onClicked: {
164164 root.closeAllApps();
165165 unitySessionService.reboot();
qml/Dash/GenericScopeView.qml+1−1
@@ -592,7 +592,7 @@ FocusScope {
592592 objectName: "scopePageHeader"
593593 width: parent.width
594594 title: scopeView.scope ? scopeView.scope.name : ""
595− searchHint: scopeView.scope && scopeView.scope.searchHint || i18n.tr("Search")
595+ searchHint: scopeView.scope && scopeView.scope.searchHint || i18n.ctr("Label: Hint for dash search line edit", "Search")
596596 showBackButton: scopeView.hasBackAction
597597 searchEntryEnabled: true
598598 settingsEnabled: scopeView.scope && scopeView.scope.settings && scopeView.scope.settings.count > 0 || false
qml/Dash/PageHeader.qml+3−3
@@ -266,14 +266,14 @@ Item {
266266 actions: [
267267 Action {
268268 objectName: "store"
269− text: i18n.tr("Store")
269+ text: i18n.ctr("Button: Open the Ubuntu Store", "Store")
270270 iconName: "ubuntu-store-symbolic"
271271 visible: root.storeEntryEnabled
272272 onTriggered: root.storeClicked();
273273 },
274274 Action {
275275 objectName: "search"
276− text: i18n.tr("Search")
276+ text: i18n.ctr("Button: Start a search in the current dash scope", "Search")
277277 iconName: "search"
278278 visible: root.searchEntryEnabled
279279 onTriggered: {
@@ -283,7 +283,7 @@ Item {
283283 },
284284 Action {
285285 objectName: "settings"
286− text: i18n.tr("Settings")
286+ text: i18n.ctr("Button: Show the current dash scope settings", "Settings")
287287 iconName: "settings"
288288 visible: root.settingsEnabled
289289 onTriggered: root.settingsClicked()
qml/Dash/Previews/PreviewImageGallery.qml+25−6
@@ -38,6 +38,8 @@ PreviewWidget {
3838 model: root.widgetData["sources"]
3939 clip: true
4040
41+ onCurrentIndexChanged: overlay.updateInitialItem()
42+
4143 LazyImage {
4244 objectName: "placeholderScreenshot"
4345 anchors {
@@ -65,9 +67,8 @@ PreviewWidget {
6567 id: mouseArea
6668 anchors.fill: parent
6769 onClicked: {
68− overlay.delegateItem.currentIndex = index;
69− overlay.initialX = rootItem.mapFromItem(parent, 0, 0).x;
70− overlay.initialY = rootItem.mapFromItem(parent, 0, 0).y;
70+ previewImageListView.currentIndex = index;
71+ overlay.updateInitialItem();
7172 overlay.show();
7273 }
7374 }
@@ -78,9 +79,14 @@ PreviewWidget {
7879 id: overlay
7980 objectName: "overlay"
8081 parent: rootItem
81− width: parent.width
82− height: parent.height
83− initialScale: previewImageListView.height / rootItem.height
82+ anchors.fill: parent
83+
84+ function updateInitialItem() {
85+ initialX = rootItem.mapFromItem(previewImageListView.currentItem, 0, 0).x;
86+ initialY = rootItem.mapFromItem(previewImageListView.currentItem, 0, 0).y;
87+ initialWidth = previewImageListView.currentItem.width;
88+ initialHeight = previewImageListView.currentItem.height;
89+ }
8490
8591 delegate: ListView {
8692 id: overlayListView
@@ -92,6 +98,19 @@ PreviewWidget {
9298 snapMode: ListView.SnapOneItem
9399 boundsBehavior: Flickable.DragAndOvershootBounds
94100 model: root.widgetData["sources"]
101+ currentIndex: previewImageListView.currentIndex
102+
103+ onCurrentIndexChanged: {
104+ // if the index changed while overlay is visible, it was from user interaction,
105+ // let's update the index of the original listview
106+ if (overlay.visible) {
107+ previewImageListView.highlightMoveDuration = 0;
108+ previewImageListView.highlightResizeDuration = 0;
109+ previewImageListView.currentIndex = currentIndex;
110+ previewImageListView.highlightMoveDuration = -1;
111+ previewImageListView.highlightResizeDuration = -1;
112+ }
113+ }
95114
96115 delegate: Image {
97116 id: screenshot
qml/Dash/Previews/PreviewOverlay.qml+77−26
@@ -22,48 +22,99 @@ Rectangle {
2222 id: overlay
2323 objectName: "overlay"
2424
25− readonly property real scaleProgress: (scale - initialScale) / (1.0 - initialScale)
25+ readonly property real aspectRatio: width / height
26+ readonly property real initialAspectRatio: initialWidth / initialHeight
27+ readonly property real initialXScale: initialWidth / width
28+ readonly property real initialYScale: initialHeight / height
2629
2730 property alias delegate: loader.sourceComponent
2831 property alias delegateItem: loader.item
2932 property alias headerShown: overlayHeader.shown
30− property bool shown: false
31− property bool opening: false
3233 property real initialX: 0
3334 property real initialY: 0
34− property real initialScale: 0
35−
36− visible: scale > initialScale
37− clip: visible && scale < 1.0
38− scale: shown ? 1.0 : initialScale
35+ property real initialWidth: 1
36+ property real initialHeight: 1
37+
38+ property real xScale: initialXScale
39+ property real yScale: initialYScale
40+ property real progress: 0
41+
42+ implicitWidth: 1
43+ implicitHeight: 1
44+ visible: progress > 0
45+ clip: progress > 0 && progress < 1
46+ color: Qt.rgba(0, 0, 0, progress)
3947 transformOrigin: Item.TopLeft
40− transform: Translate {
41− x: overlay.initialX - overlay.initialX * overlay.scaleProgress
42− y: overlay.initialY - overlay.initialY * overlay.scaleProgress
43− }
44− color: Qt.rgba(0, 0, 0, scaleProgress)
45− radius: units.gu(1) - units.gu(1) * scaleProgress
48+ transform: [
49+ Scale {
50+ origin.x: 0
51+ origin.y: 0
52+ xScale: overlay.xScale
53+ yScale: overlay.yScale
54+ },
55+ Translate {
56+ x: overlay.initialX - overlay.initialX * overlay.progress
57+ y: overlay.initialY - overlay.initialY * overlay.progress
58+ }
59+ ]
60+ state: "hidden"
61+ states: [
62+ State {
63+ name: "shown"
64+ PropertyChanges { target: overlay; progress: 1; xScale: 1; yScale: 1 }
65+ },
66+ State {
67+ name: "hidden"
68+ PropertyChanges { target: overlay; progress: 0; xScale: initialXScale; yScale: initialYScale }
69+ }
70+ ]
71+ transitions: [
72+ Transition {
73+ from: "hidden"
74+ to: "shown"
75+ UbuntuNumberAnimation {
76+ target: overlay
77+ properties: "progress,xScale,yScale"
78+ duration: UbuntuAnimation.FastDuration
79+ }
80+ },
81+ Transition {
82+ from: "shown"
83+ to: "hidden"
84+ UbuntuNumberAnimation {
85+ target: overlay
86+ properties: "progress,xScale,yScale"
87+ duration: UbuntuAnimation.FastDuration / 2
88+ }
89+ }
90+ ]
4691
4792 function show() {
48− opening = true;
49− shown = true;
93+ state = "shown"
5094 }
5195
5296 function hide() {
53− opening = false;
54− shown = false;
55− }
56−
57− Behavior on scale {
58− UbuntuNumberAnimation {
59− duration: overlay.opening ? UbuntuAnimation.FastDuration :
60− UbuntuAnimation.FastDuration / 2
61− }
97+ state = "hidden"
6298 }
6399
64100 Loader {
65101 id: loader
66102 anchors.fill: parent
103+
104+ readonly property bool verticalScaling: initialAspectRatio / aspectRatio >= 1
105+ readonly property real initialXScale: verticalScaling ? 1 : aspectRatio / initialAspectRatio
106+ readonly property real initialYScale: verticalScaling ? initialAspectRatio / aspectRatio : 1
107+ readonly property real xScale: verticalScaling ? loader.initialXScale - loader.initialXScale * overlay.progress + overlay.progress :
108+ loader.yScale * overlay.yScale / overlay.xScale
109+ readonly property real yScale: verticalScaling ? loader.xScale * overlay.xScale / overlay.yScale :
110+ loader.initialYScale - loader.initialYScale * overlay.progress + overlay.progress
111+
112+ transform: Scale {
113+ origin.x: parent.width / 2
114+ origin.y: parent.height / 2
115+ xScale: loader.xScale
116+ yScale: loader.yScale
117+ }
67118 }
68119
69120 Rectangle {
@@ -77,7 +128,7 @@ Rectangle {
77128 }
78129 height: units.gu(7)
79130 visible: opacity > 0
80− opacity: overlay.scaleProgress > 0.6 && shown ? 0.8 : 0
131+ opacity: overlay.state == "shown" && overlay.progress > 0.8 && shown ? 0.8 : 0
81132 color: "black"
82133
83134 Behavior on opacity {
qml/Dash/Previews/PreviewZoomableImage.qml+3−3
@@ -59,9 +59,9 @@ PreviewWidget {
5959 id: overlay
6060 objectName: "overlay"
6161 parent: rootItem
62− width: parent.width
63− height: parent.height
64− initialScale: lazyImage.height / rootItem.height
62+ anchors.fill: parent
63+ initialWidth: lazyImage.width
64+ initialHeight: lazyImage.height
6565
6666 delegate: ZoomableImage {
6767 anchors.fill: parent
qml/Greeter/Greeter.qml+28−17
@@ -19,7 +19,6 @@ import AccountsService 0.1
1919import LightDM 0.1 as LightDM
2020import Ubuntu.Components 1.1
2121import Ubuntu.SystemImage 0.1
22−import Unity.Connectivity 0.1
2322import Unity.Launcher 0.1
2423import "../Components"
2524
@@ -51,7 +50,7 @@ Showable {
5150
5251 property int maxFailedLogins: -1 // disabled by default for now, will enable via settings in future
5352 property int failedLoginsDelayAttempts: 7 // number of failed logins
54− property int failedLoginsDelayMinutes: 5 // minutes of forced waiting
53+ property real failedLoginsDelayMinutes: 5 // minutes of forced waiting
5554
5655 signal tease()
5756 signal sessionStarted()
@@ -110,7 +109,6 @@ Showable {
110109
111110 readonly property bool multiUser: LightDM.Users.count > 1
112111 property int currentIndex
113− property int delayMinutes
114112 property bool waiting
115113
116114 // We want 'launcherOffset' to animate down to zero. But not to animate
@@ -179,19 +177,31 @@ Showable {
179177 }
180178 }
181179
182− Component.onCompleted: {
183− Connectivity.unlockAllModems();
184− }
185−
186180 Timer {
187181 id: forcedDelayTimer
188− interval: 1000 * 60
182+
183+ // We use a short interval and check against the system wall clock
184+ // because we have to consider the case that the system is suspended
185+ // for a few minutes. When we wake up, we want to quickly be correct.
186+ interval: 500
187+
188+ property var delayTarget;
189+ property int delayMinutes;
190+
191+ function forceDelay(delay /* in minutes */) {
192+ delayTarget = new Date();
193+ delayTarget.setTime(delayTarget.getTime() + delay * 60000);
194+ delayMinutes = Math.ceil(delay);
195+ start();
196+ }
197+
189198 onTriggered: {
190− if (d.delayMinutes > 0) {
191− d.delayMinutes -= 1;
192− if (d.delayMinutes > 0) {
193− start(); // go again
194− }
199+ var diff = delayTarget - new Date();
200+ if (diff > 0) {
201+ delayMinutes = Math.ceil(diff / 60000);
202+ start(); // go again
203+ } else {
204+ delayMinutes = 0;
195205 }
196206 }
197207 }
@@ -262,7 +272,7 @@ Showable {
262272 Binding {
263273 target: loader.item
264274 property: "delayMinutes"
265− value: d.delayMinutes
275+ value: forcedDelayTimer.delayMinutes
266276 }
267277
268278 Binding {
@@ -363,9 +373,10 @@ Showable {
363373 }
364374
365375 // Check if we should initiate a forced login delay
366− if (failedLoginsDelayAttempts > 0 && AccountsService.failedLogins % failedLoginsDelayAttempts == 0) {
367− d.delayMinutes = failedLoginsDelayMinutes;
368− forcedDelayTimer.start();
376+ if (failedLoginsDelayAttempts > 0
377+ && AccountsService.failedLogins > 0
378+ && AccountsService.failedLogins % failedLoginsDelayAttempts == 0) {
379+ forcedDelayTimer.forceDelay(failedLoginsDelayMinutes);
369380 }
370381
371382 loader.item.notifyAuthenticationFailed();
qml/Launcher/Launcher.qml+1−1
@@ -203,7 +203,7 @@ Item {
203203 LauncherPanel {
204204 id: panel
205205 objectName: "launcherPanel"
206− enabled: root.available && root.state == "visible"
206+ enabled: root.available && root.state == "visible" || root.state == "visibleTemporary"
207207 width: root.panelWidth
208208 anchors {
209209 top: parent.top
qml/Notifications/SwipeToAct.qml+178−247
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014 Canonical, Ltd.
2+ * Copyright (C) 20014-2015 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -16,12 +16,10 @@
1616
1717import QtQuick 2.3
1818import Ubuntu.Components 1.1
19−import QtGraphicalEffects 1.0
2019
2120Item {
2221 id: swipeToAct
2322
24− width: parent.width
2523 height: childrenRect.height
2624
2725 signal leftTriggered()
@@ -29,280 +27,213 @@ Item {
2927
3028 property string leftIconName
3129 property string rightIconName
32− readonly property double sliderHeight: units.gu(6)
33− readonly property double gap: units.gu(1)
34− readonly property double halfWay: mouseArea.drag.maximumX / 2
3530
36− Rectangle {
37− id: gradient
38− width: parent.width * 5
39− height: sliderHeight
40− visible: false
41− LinearGradient {
42− anchors.fill: parent
43− start: Qt.point(parent.x, parent.y)
44− end: Qt.point(parent.width, parent.y)
45− gradient: Gradient {
46− GradientStop { position: 0.0; color: UbuntuColors.red }
47− GradientStop { position: 0.2; color: UbuntuColors.red }
48− GradientStop { position: 0.4; color: "#dddddd" }
49− GradientStop { position: 0.6; color: "#dddddd" }
50− GradientStop { position: 0.8; color: UbuntuColors.green }
51− GradientStop { position: 1.0; color: UbuntuColors.green }
52− }
31+ QtObject {
32+ id: priv
33+
34+ property double opacityDelta
35+ readonly property double sliderHeight: units.gu(8)
36+ readonly property double gap: units.gu(1)
37+ readonly property color sliderMainColor: "#b2b2b2"
38+ readonly property color sliderBGColor: "#f4f4f4"
39+ readonly property double halfWay: mouseArea.drag.maximumX / 2
40+
41+ UbuntuNumberAnimation on opacityDelta {
42+ from: 0
43+ to: .5
44+ loops: Animation.Infinite
45+ duration: UbuntuAnimation.SleepyDuration
46+ easing.type: Easing.Linear
5347 }
54− }
5548
56− ShaderEffectSource {
57− id: effectSourceGradient
58− sourceItem: gradient
59− width: gradient.width
60− height: gradient.height
61− sourceRect: Qt.rect(0.4 * gradient.width * (slider.x / halfWay), 0, mask.width, mask.height)
62− visible: false
63− hideSource: true
49+ // linearly interpolate between start- and end-color
50+ // with a normalized weight-factor
51+ // 0.0 meaning just the start-color being taken into
52+ // account and 1.0 only taking the end-color into
53+ // account
54+ function interpolate(start, end, factor) {
55+ var rdiff = start.r > end.r ? end.r - start.r : end.r - start.r
56+ var gdiff = start.g > end.g ? end.g - start.g : end.g - start.g
57+ var bdiff = start.b > end.b ? end.b - start.b : end.b - start.b
58+ var adiff = start.a > end.a ? end.a - start.a : end.a - start.a
59+ var r = start.r + factor * rdiff
60+ var g = start.g + factor * gdiff
61+ var b = start.b + factor * bdiff
62+ var a = start.a + factor * adiff
63+ return Qt.rgba(r,g,b,a)
64+ }
6465 }
6566
6667 UbuntuShape {
67− id: mask
68− color: "black"
68+ id: row
6969 width: parent.width
70− height: sliderHeight
70+ height: priv.sliderHeight
71+ color: priv.sliderBGColor
7172 borderSource: "none"
72− visible: false
73− }
7473
75− ShaderEffectSource {
76− id: effectSourceMask
77− sourceItem: mask
78− width: mask.width
79− height: mask.height
80− visible: false
81− hideSource: true
82− }
83−
84− ShaderEffect {
85− width: parent.width
86− height: sliderHeight
87− property variant mask: effectSourceMask
88− property variant gradient: effectSourceGradient
89− vertexShader: "
90− uniform highp mat4 qt_Matrix;
91− attribute highp vec4 qt_Vertex;
92− attribute highp vec2 qt_MultiTexCoord0;
93− varying highp vec2 coord;
94− void main() {
95− coord = qt_MultiTexCoord0;
96− gl_Position = qt_Matrix * qt_Vertex;
97− }"
98− fragmentShader: "
99− varying highp vec2 coord;
100− uniform sampler2D mask;
101− uniform sampler2D gradient;
102− void main() {
103− lowp vec4 texMask = texture2D(mask, coord);
104− lowp vec4 texGradient = texture2D(gradient, coord);
105− gl_FragColor = texGradient.rgba * texMask.a ;
106− }"
74+ UbuntuShape {
75+ id: leftShape
76+ anchors.top: parent.top
77+ anchors.left: parent.left
78+ anchors.margins: priv.gap
79+ color: UbuntuColors.red
80+ borderSource: "none"
81+
82+ state: "normal"
83+ height: units.gu(6)
84+ width: units.gu(6)
85+ radius: "medium"
86+ opacity: slider.x <= priv.halfWay ? 1.0 : 1.0 - ((slider.x - priv.halfWay) / priv.halfWay)
87+
88+ Icon {
89+ anchors.centerIn: parent
90+ width: units.gu(3.5)
91+ height: units.gu(3.5)
92+ name: leftIconName
93+ color: "white"
94+ }
95+ }
10796
10897 Row {
109− id: row
110− anchors.fill: parent
111− spacing: gap
112− anchors.margins: gap
113−
114− UbuntuShape {
115− id: leftShape
116− states: [
117− State {
118− name: "normal"
119− PropertyChanges {
120− target: leftShape
121− color: UbuntuColors.red
122− }
123− PropertyChanges {
124− target: innerLeftShape
125− color: UbuntuColors.red
126− visible: false
127− }
128− },
129− State {
130− name: "selected"
131− PropertyChanges {
132− target: leftShape
133− color: "white"
134− }
135− PropertyChanges {
136− target: innerLeftShape
137− color: UbuntuColors.red
138− visible: true
139− }
140− }
141− ]
142− state: "normal"
143− height: units.gu(4)
144− width: units.gu(7)
145− borderSource: "none"
146− opacity: slider.x <= halfWay ? 1.0 : 1.0 - ((slider.x - halfWay) / halfWay)
147− UbuntuShape {
148− id: innerLeftShape
149− anchors.centerIn: parent
150− borderSource: "none"
151− width: parent.width - units.gu(.5)
152− height: parent.height - units.gu(.5)
153− }
154− Icon {
155− anchors.centerIn: parent
156− width: units.gu(2)
157− height: units.gu(2)
158− name: leftIconName
159− color: "white"
160− }
98+ anchors.verticalCenter: parent.verticalCenter
99+ anchors.right: slider.left
100+ anchors.rightMargin: units.gu(1.5)
101+ spacing: -units.gu(1)
102+ visible: slider.x === priv.halfWay
103+ Icon {
104+ name: "back"
105+ height: units.gu(2.5)
106+ color: priv.sliderMainColor
107+ opacity: .5 + priv.opacityDelta
161108 }
162−
163− Rectangle {
164− id: leftSpacer
165− width: (row.width - (leftShape.width + slider.width + rightShape.width + 4 * row.spacing)) / 2
166− height: units.gu(4)
167− opacity: 0
109+ Icon {
110+ name: "back"
111+ height: units.gu(2.5)
112+ color: priv.sliderMainColor
113+ opacity: 1 - priv.opacityDelta
168114 }
115+ }
169116
170− UbuntuShape {
171− id: slider
172− objectName: "slider"
117+ UbuntuShape {
118+ id: slider
119+ objectName: "slider"
120+ anchors.top: parent.top
121+ anchors.margins: priv.gap
122+ x: priv.halfWay
173123
174− Behavior on x {
175− UbuntuNumberAnimation {
176− duration: UbuntuAnimation.FastDuration
177− easing.type: Easing.OutBounce
178− }
179− }
124+ Component.onCompleted: {
125+ xBehavior.enabled = true
126+ }
180127
181− Behavior on opacity {
182− UbuntuNumberAnimation {
183− duration: UbuntuAnimation.FastDuration
184− }
128+ Behavior on x {
129+ id: xBehavior
130+ enabled: false
131+ UbuntuNumberAnimation {
132+ duration: UbuntuAnimation.FastDuration
133+ easing.type: Easing.OutBounce
185134 }
135+ }
186136
187− onOpacityChanged: {
188− if (opacity === 0) {
189− if (rightShape.state === "selected") {
190− rightTriggered()
191− }
192− if (leftShape.state === "selected") {
193− leftTriggered()
194− }
195− }
137+ Behavior on opacity {
138+ UbuntuNumberAnimation {
139+ duration: UbuntuAnimation.FastDuration
196140 }
141+ }
197142
198− z: 1
199− color: "white"
200− height: units.gu(4)
201− width: units.gu(7)
202− borderSource: "none"
203− Row {
204− anchors.fill: parent
205− spacing: 2 * gap
206− anchors.leftMargin: units.gu(.5)
207− anchors.rightMargin: units.gu(.5)
208− Icon {
209− anchors.verticalCenter: parent.verticalCenter
210− name: "back"
211− width: units.gu(2)
212− height: units.gu(2)
213− }
214− Icon {
215− anchors.verticalCenter: parent.verticalCenter
216− name: "next"
217− width: units.gu(2)
218− height: units.gu(2)
219− }
143+ onXChanged: {
144+ var factor
145+ if (slider.x <= priv.gap + leftShape.width)
146+ {
147+ factor = (slider.x - priv.gap) / leftShape.width
148+ slider.color = priv.interpolate(leftShape.color, priv.sliderMainColor, factor)
149+ } else if (slider.x >= rightShape.x - slider.width) {
150+ factor = (slider.x - rightShape.x + rightShape.width) / rightShape.width
151+ slider.color = priv.interpolate(priv.sliderMainColor, rightShape.color, factor)
152+ } else {
153+ slider.color = priv.sliderMainColor
220154 }
221155 }
222156
223− Rectangle {
224− id: rightSpacer
225− width: leftSpacer.width
226− height: units.gu(4)
227− opacity: 0
157+ z: 1
158+ color: priv.sliderMainColor
159+ height: units.gu(6)
160+ width: units.gu(6)
161+ borderSource: "none"
162+ radius: "medium"
163+ Icon {
164+ anchors.fill: parent
165+ anchors.margins: units.gu(1.5)
166+ source: "grip-large.svg"
167+ color: "white"
228168 }
169+ }
170+ Row {
171+ anchors.verticalCenter: parent.verticalCenter
172+ anchors.left: slider.right
173+ anchors.leftMargin: units.gu(1.5)
174+ spacing: -units.gu(1)
175+ visible: slider.x === priv.halfWay
176+ Icon {
177+ name: "next"
178+ height: units.gu(2.5)
179+ color: priv.sliderMainColor
180+ opacity: 1 - priv.opacityDelta
181+ }
182+ Icon {
183+ name: "next"
184+ height: units.gu(2.5)
185+ color: priv.sliderMainColor
186+ opacity: 0.5 + priv.opacityDelta
187+ }
188+ }
229189
230− UbuntuShape {
231− id: rightShape
232− states: [
233− State {
234− name: "normal"
235− PropertyChanges {
236− target: rightShape
237− color: UbuntuColors.green
238− }
239− PropertyChanges {
240− target: innerRightShape
241− color: UbuntuColors.green
242− visible: false
243− }
244− },
245− State {
246− name: "selected"
247− PropertyChanges {
248− target: rightShape
249− color: "white"
250− }
251− PropertyChanges {
252− target: innerRightShape
253− color: UbuntuColors.green
254− visible: true
255− }
256− }
257− ]
258− state: "normal"
259− height: units.gu(4)
260− width: units.gu(7)
261− borderSource: "none"
262− opacity: slider.x >= halfWay ? 1.0 : slider.x / halfWay
263− UbuntuShape {
264− id: innerRightShape
265− anchors.centerIn: parent
266− borderSource: "none"
267− width: parent.width - units.gu(.5)
268− height: parent.height - units.gu(.5)
269− }
270− Icon {
271− anchors.centerIn: parent
272− width: units.gu(2)
273− height: units.gu(2)
274− name: rightIconName
275− color: "white"
276− }
190+ UbuntuShape {
191+ id: rightShape
192+ anchors.top: parent.top
193+ anchors.right: parent.right
194+ anchors.margins: priv.gap
195+ color: UbuntuColors.green
196+ borderSource: "none"
197+
198+ state: "normal"
199+ height: units.gu(6)
200+ width: units.gu(6)
201+ radius: "medium"
202+ opacity: slider.x >= priv.halfWay ? 1.0 : slider.x / priv.halfWay
203+
204+ Icon {
205+ anchors.centerIn: parent
206+ width: units.gu(3.5)
207+ height: units.gu(3.5)
208+ name: rightIconName
209+ color: "white"
277210 }
278211 }
212+ }
279213
280− MouseArea {
281− id: mouseArea
282− objectName: "swipeMouseArea"
214+ MouseArea {
215+ id: mouseArea
216+ objectName: "swipeMouseArea"
283217
284− anchors.fill: row
285− drag.target: slider
286− drag.axis: Drag.XAxis
287− drag.minimumX: 0
288− drag.maximumX: row.width - slider.width
218+ anchors.fill: row
219+ drag.target: slider
220+ drag.axis: Drag.XAxis
221+ drag.minimumX: priv.gap
222+ drag.maximumX: row.width - slider.width - priv.gap
289223
290− onReleased: {
291− if (slider.x !== drag.minimumX || slider.x !== drag.maximumX) {
292− slider.x = halfWay
293− }
294− if (slider.x === drag.minimumX) {
295− slider.x = drag.minimumX
296− slider.opacity = 0
297− enabled = false
298− leftShape.state = "selected"
299− }
300− if (slider.x === drag.maximumX) {
301− slider.x = drag.maximumX
302− slider.opacity = 0
303− enabled = false
304− rightShape.state = "selected"
305− }
224+ onReleased: {
225+ if (slider.x !== drag.minimumX || slider.x !== drag.maximumX) {
226+ slider.x = priv.halfWay
227+ }
228+ if (slider.x === drag.minimumX) {
229+ slider.x = drag.minimumX
230+ enabled = false
231+ leftTriggered()
232+ }
233+ if (slider.x === drag.maximumX) {
234+ slider.x = drag.maximumX
235+ enabled = false
236+ rightTriggered()
306237 }
307238 }
308239 }
qml/Notifications/grip-large.svgnew file+150
@@ -0,0 +1,150 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="90"
13+ height="90"
14+ id="svg4874"
15+ version="1.1"
16+ inkscape:version="0.91+devel r"
17+ viewBox="0 0 90 90.000001"
18+ sodipodi:docname="grip-large01.svg">
19+ <defs
20+ id="defs4876" />
21+ <sodipodi:namedview
22+ id="base"
23+ pagecolor="#ffffff"
24+ bordercolor="#666666"
25+ borderopacity="1.0"
26+ inkscape:pageopacity="0.0"
27+ inkscape:pageshadow="2"
28+ inkscape:zoom="7.9580786"
29+ inkscape:cx="13.632541"
30+ inkscape:cy="49.591116"
31+ inkscape:document-units="px"
32+ inkscape:current-layer="g1708"
33+ showgrid="true"
34+ showborder="true"
35+ fit-margin-top="0"
36+ fit-margin-left="0"
37+ fit-margin-right="0"
38+ fit-margin-bottom="0"
39+ inkscape:snap-bbox="true"
40+ inkscape:bbox-paths="true"
41+ inkscape:bbox-nodes="true"
42+ inkscape:snap-bbox-edge-midpoints="true"
43+ inkscape:snap-bbox-midpoints="true"
44+ inkscape:object-paths="true"
45+ inkscape:snap-intersection-paths="true"
46+ inkscape:object-nodes="true"
47+ inkscape:snap-smooth-nodes="true"
48+ inkscape:snap-midpoints="true"
49+ inkscape:snap-object-midpoints="true"
50+ inkscape:snap-center="true"
51+ showguides="true"
52+ inkscape:guide-bbox="true">
53+ <inkscape:grid
54+ type="xygrid"
55+ id="grid5451"
56+ empspacing="6" />
57+ <sodipodi:guide
58+ orientation="1,0"
59+ position="6,77"
60+ id="guide4063" />
61+ <sodipodi:guide
62+ orientation="1,0"
63+ position="3,78"
64+ id="guide4065" />
65+ <sodipodi:guide
66+ orientation="0,1"
67+ position="55,84"
68+ id="guide4067" />
69+ <sodipodi:guide
70+ orientation="0,1"
71+ position="53,87"
72+ id="guide4069" />
73+ <sodipodi:guide
74+ orientation="0,1"
75+ position="20,3"
76+ id="guide4071" />
77+ <sodipodi:guide
78+ orientation="0,1"
79+ position="20,6"
80+ id="guide4073" />
81+ <sodipodi:guide
82+ orientation="1,0"
83+ position="87,7"
84+ id="guide4075" />
85+ <sodipodi:guide
86+ orientation="1,0"
87+ position="84,7"
88+ id="guide4077" />
89+ <sodipodi:guide
90+ orientation="0,1"
91+ position="58,81"
92+ id="guide4074" />
93+ <sodipodi:guide
94+ orientation="1,0"
95+ position="9,74"
96+ id="guide4076" />
97+ <sodipodi:guide
98+ orientation="0,1"
99+ position="21,9"
100+ id="guide4078" />
101+ <sodipodi:guide
102+ orientation="1,0"
103+ position="81,4"
104+ id="guide4080" />
105+ </sodipodi:namedview>
106+ <metadata
107+ id="metadata4879">
108+ <rdf:RDF>
109+ <cc:Work
110+ rdf:about="">
111+ <dc:format>image/svg+xml</dc:format>
112+ <dc:type
113+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
114+ <dc:title></dc:title>
115+ </cc:Work>
116+ </rdf:RDF>
117+ </metadata>
118+ <g
119+ inkscape:label="Layer 1"
120+ inkscape:groupmode="layer"
121+ id="layer1"
122+ transform="translate(67.857146,-84.50504)">
123+ <g
124+ transform="matrix(0,-1,-1,0,373.50506,516.50504)"
125+ id="g4845"
126+ style="display:inline">
127+ <g
128+ inkscape:label="Layer 1"
129+ id="g1708"
130+ transform="matrix(0,-1,-1,0,1394.3622,441.36221)"
131+ inkscape:export-filename="add01.png"
132+ inkscape:export-xdpi="90"
133+ inkscape:export-ydpi="90">
134+ <rect
135+ style="color:#000000;fill:none;stroke:none;stroke-width:7.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
136+ id="rect1710"
137+ width="90"
138+ height="90"
139+ x="0"
140+ y="962.36218" />
141+ <path
142+ style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
143+ d="m 9.000004,971.3622 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m -72,16 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m -72,16 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m -72,16 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m -72,16 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z"
144+ id="path4169"
145+ inkscape:connector-curvature="0"
146+ sodipodi:nodetypes="sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss" />
147+ </g>
148+ </g>
149+ </g>
150+</svg>
qml/Panel/Indicators/MessageMenuItemFactory.qml+1−1
@@ -146,7 +146,7 @@ Loader {
146146 time: timeFormatter.timeString
147147 body: getExtendedProperty(extendedData, "xCanonicalText", "")
148148 replyButtonText: getExtendedProperty(replyActionDescription, "label", "Send")
149− replyHintText: i18n.tr("Reply")
149+ replyHintText: i18n.ctr("Label: Hint in message indicator line edit", "Reply")
150150 // icons
151151 avatar: getExtendedProperty(extendedData, "icon", "image://theme/contact")
152152 icon: getExtendedProperty(extendedData, "xCanonicalAppIcon", "image://theme/message")
qml/Panel/IndicatorsMenu.qml+16
@@ -162,8 +162,18 @@ Showable {
162162 onScroll: bar.addScrollOffset(scrollAmount);
163163 }
164164
165+ MouseArea {
166+ anchors.fill: __showDragHandle
167+ enabled: __showDragHandle.enabled
168+ onClicked: {
169+ bar.selectItemAt(mouseX)
170+ root.show()
171+ }
172+ }
173+
165174 DragHandle {
166175 id: __showDragHandle
176+ objectName: "showDragHandle"
167177 anchors.bottom: parent.bottom
168178 anchors.left: parent.left
169179 anchors.right: parent.right
@@ -182,6 +192,12 @@ Showable {
182192 hintDisplacement: enableHint ? expandedPanelHeight - minimizedPanelHeight + handle.height : 0
183193 }
184194
195+ MouseArea {
196+ anchors.fill: __hideDragHandle
197+ enabled: __hideDragHandle.enabled
198+ onClicked: root.hide()
199+ }
200+
185201 DragHandle {
186202 id: __hideDragHandle
187203 anchors.fill: handle
qml/Panel/Panel.qml+1−1
@@ -40,10 +40,10 @@ Item {
4040 }
4141 color: "black"
4242 opacity: indicators.unitProgress * darkenedOpacity
43+ visible: !indicators.fullyClosed
4344
4445 MouseArea {
4546 anchors.fill: parent
46− enabled: indicators.shown
4747 onClicked: if (indicators.fullyOpened) indicators.hide();
4848 }
4949 }
qml/Panel/SearchIndicator.qmldeleted−82
@@ -1,82 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import "../Components"
20−
21−Item {
22− id: search
23−
24− width: container.width + units.gu(2)
25− height: units.gu(3)
26−
27− property string headerText: i18n.tr("Search")
28−
29− signal clicked
30−
31− // eater
32− MouseArea {
33− anchors.fill: parent
34− onClicked: search.clicked()
35− }
36−
37− Row {
38− id: container
39− objectName: "container"
40−
41− height: parent.height
42− width: childrenRect.width
43− anchors {
44− left: parent.left
45− leftMargin: units.gu(1)
46− }
47− spacing: units.gu(1)
48−
49− Behavior on opacity { StandardAnimation { duration: 300 } }
50−
51− Image {
52− id: icon
53− source: "graphics/search.png"
54− anchors.verticalCenter: parent.verticalCenter
55− }
56−
57− Label {
58− text: search.headerText
59− color: Qt.rgba(0.8, 0.8, 0.8, 1.0)
60− fontSize: "small"
61− font.capitalization: Font.AllUppercase
62− anchors.verticalCenter: parent.verticalCenter
63− }
64− }
65−
66− states: [
67− State {
68− name: "visible"
69− PropertyChanges {
70− target: container
71− opacity: 1
72− }
73− },
74− State {
75− name: "hidden"
76− PropertyChanges {
77− target: container
78− opacity: 0
79− }
80− }
81− ]
82−}
qml/Shell.qml+12−1
@@ -23,6 +23,7 @@ import Ubuntu.Components 0.1
2323import Ubuntu.Components.Popups 1.0
2424import Ubuntu.Gestures 0.1
2525import Ubuntu.Telephony 0.1 as Telephony
26+import Unity.Connectivity 0.1
2627import Unity.Launcher 0.1
2728import Utils 0.1
2829import LightDM 0.1 as LightDM
@@ -191,7 +192,7 @@ Item {
191192 onFocusedApplicationIdChanged: {
192193 var appId = ApplicationManager.focusedApplicationId;
193194
194− if (tutorial.running && appId != "unity8-dash") {
195+ if (tutorial.running && appId != "" && appId != "unity8-dash") {
195196 // If this happens on first boot, we may be in edge
196197 // tutorial or wizard while receiving a call. But a call
197198 // is more important than wizard so just bail out of those.
@@ -508,8 +509,18 @@ Item {
508509
509510 Wizard {
510511 id: wizard
512+ objectName: "wizard"
511513 anchors.fill: parent
512514 background: shell.background
515+
516+ function unlockWhenDoneWithWizard() {
517+ if (!active) {
518+ Connectivity.unlockAllModems();
519+ }
520+ }
521+
522+ Component.onCompleted: unlockWhenDoneWithWizard()
523+ onActiveChanged: unlockWhenDoneWithWizard()
513524 }
514525
515526 Rectangle {
qml/Stages/ApplicationWindow.qml+2−1
@@ -110,7 +110,8 @@ FocusScope {
110110
111111 SessionContainer {
112112 id: sessionContainer
113− session: application ? application.session : null
113+ // A fake application might not even have a session property.
114+ session: application && application.session ? application.session : null
114115 anchors.fill: parent
115116 orientation: root.orientation
116117
qml/Stages/DecoratedWindow.qml+5−4
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014 Canonical, Ltd.
2+ * Copyright (C) 2014-2015 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -20,13 +20,12 @@ import QtQuick 2.3
2020import Ubuntu.Components 1.1
2121import Unity.Application 0.1
2222
23−Item {
23+FocusScope {
2424 id: root
2525
2626 property alias application: applicationWindow.application
2727 property alias active: decoration.active
2828
29− signal requestFocus();
3029 signal close();
3130 signal maximize();
3231 signal minimize();
@@ -53,8 +52,10 @@ Item {
5352
5453 ApplicationWindow {
5554 id: applicationWindow
55+ objectName: application ? "appWindow_" + application.appId : "appWindow_null"
5656 anchors.fill: parent
5757 anchors.topMargin: units.gu(3)
58− interactive: index == 0
58+ interactive: true
59+ focus: true
5960 }
6061}
qml/Stages/DesktopStage.qml+15−3
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014 Canonical, Ltd.
2+ * Copyright (C) 2014-2015 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -20,14 +20,17 @@ import QtQuick 2.3
2020import Ubuntu.Components 1.1
2121import Unity.Application 0.1
2222import "../Components/PanelState"
23+import Utils 0.1
2324
24−Item {
25+FocusScope {
2526 id: root
2627
2728 anchors.fill: parent
2829
2930 property alias background: wallpaper.source
3031
32+ property var windowStateStorage: WindowStateStorage
33+
3134 CrossFadeImage {
3235 id: wallpaper
3336 anchors.fill: parent
@@ -116,20 +119,29 @@ Item {
116119 ]
117120
118121 WindowMoveResizeArea {
122+ windowStateStorage: root.windowStateStorage
119123 target: appDelegate
120124 minWidth: appDelegate.minWidth
121125 minHeight: appDelegate.minHeight
122126 resizeHandleWidth: units.gu(0.5)
123127 windowId: model.appId // FIXME: Change this to point to windowId once we have such a thing
124128
125− onPressed: ApplicationManager.requestFocusApplication(model.appId)
129+ onPressed: decoratedWindow.focus = true;
126130 }
127131
128132 DecoratedWindow {
133+ id: decoratedWindow
134+ objectName: "decoratedWindow_" + appId
129135 anchors.fill: parent
130136 application: ApplicationManager.get(index)
131137 active: ApplicationManager.focusedApplicationId === model.appId
132138
139+ onFocusChanged: {
140+ if (focus) {
141+ ApplicationManager.requestFocusApplication(model.appId);
142+ }
143+ }
144+
133145 onClose: ApplicationManager.stopApplication(model.appId)
134146 onMaximize: appDelegate.state = (appDelegate.state == "maximized" ? "normal" : "maximized")
135147 onMinimize: appDelegate.state = "minimized"
qml/Stages/WindowDecoration.qml+1
@@ -55,6 +55,7 @@ Item {
5555
5656 Label {
5757 id: titleLabel
58+ objectName: "windowDecorationTitle"
5859 color: "#DFDBD2"
5960 height: parent.height
6061 verticalAlignment: Text.AlignVCenter
qml/Stages/WindowMoveResizeArea.qml+5−3
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014 Canonical, Ltd.
2+ * Copyright (C) 2014-2015 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -25,6 +25,8 @@ MouseArea {
2525 anchors.fill: target
2626 anchors.margins: -resizeHandleWidth
2727
28+ property var windowStateStorage: WindowStateStorage
29+
2830 // The target item managed by this. Must be a parent or a sibling
2931 // The area will anchor to it and manage move and resize events
3032 property Item target: null
@@ -48,7 +50,7 @@ MouseArea {
4850 }
4951
5052 Component.onCompleted: {
51− var windowState = WindowStateStorage.getGeometry(root.windowId, Qt.rect(target.x, target.y, target.width, target.height))
53+ var windowState = windowStateStorage.getGeometry(root.windowId, Qt.rect(target.x, target.y, target.width, target.height))
5254 if (windowState !== undefined) {
5355 target.x = windowState.x
5456 target.y = windowState.y
@@ -102,6 +104,6 @@ MouseArea {
102104 }
103105
104106 Component.onDestruction: {
105− WindowStateStorage.saveGeometry(root.windowId, Qt.rect(target.x, target.y, target.width, target.height))
107+ windowStateStorage.saveGeometry(root.windowId, Qt.rect(target.x, target.y, target.width, target.height))
106108 }
107109}
qml/Wizard/Page.qml+1−1
@@ -86,7 +86,7 @@ Item {
8686 bottomMargin: buttonMargin
8787 }
8888 z: 1
89− text: i18n.tr("Back")
89+ text: i18n.ctr("Button: Go back one page in the Wizard", "Back")
9090 visible: pageStack.depth > 1 && hasBackButton
9191 backArrow: true
9292
qml/Wizard/Pages.qml+14−1
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013,2014,2015 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -110,6 +110,8 @@ Item {
110110 // this page, and either skip it or continue.
111111 push(path, {"opacity": 0, "enabled": false})
112112
113+ timeout.restart();
114+
113115 // Check for immediate skip or not. We may have to wait for
114116 // skipValid to be assigned (see Connections object below)
115117 checkSkip()
@@ -124,10 +126,21 @@ Item {
124126 } else {
125127 currentPage.opacity = 1
126128 currentPage.enabled = true
129+ timeout.stop();
127130 }
128131 }
129132 }
130133
134+ Timer {
135+ id: timeout
136+ objectName: "timeout"
137+ interval: 2000 // wizard pages shouldn't take long
138+ onTriggered: {
139+ pageStack.currentPage.skip = true;
140+ pageStack.currentPage.skipValid = true;
141+ }
142+ }
143+
131144 Connections {
132145 target: pageStack.currentPage
133146 onSkipValidChanged: pageStack.checkSkip()
qml/Wizard/Pages/30-passwd-type.qml+6−6
@@ -94,14 +94,14 @@ LocalComponents.Page {
9494 var name = ""
9595 var desc = ""
9696 if (method === UbuntuSecurityPrivacyPanel.Swipe) {
97− name = i18n.tr("Swipe")
98− desc = i18n.tr("No security")
97+ name = i18n.ctr("Label: Type of security method", "Swipe")
98+ desc = i18n.ctr("Label: Description of security method", "No security")
9999 } else if (method === UbuntuSecurityPrivacyPanel.Passcode) {
100− name = i18n.tr("Passcode")
101− desc = i18n.tr("4 digits only")
100+ name = i18n.ctr("Label: Type of security method", "Passcode")
101+ desc = i18n.ctr("Label: Description of security method", "4 digits only")
102102 } else {
103− name = i18n.tr("Passphrase")
104− desc = i18n.tr("Numbers and letters")
103+ name = i18n.ctr("Label: Type of security method", "Passphrase")
104+ desc = i18n.ctr("Label: Description of security method", "Numbers and letters")
105105 }
106106 return "<b>%1</b> (%2)".arg(name).arg(desc)
107107 }
qml/Wizard/Wizard.qml+6−1
@@ -25,7 +25,12 @@ Showable {
2525 // The background wallpaper to use
2626 property string background
2727
28− readonly property alias active: loader.active
28+ // This is a bool instead of an alias because Loader classes like to emit
29+ // changed signals for 'active' during startup even if they aren't actually
30+ // changing values. Having it cached as a proper Qml bool property prevents
31+ // unnecessary 'changed' emissions and provides consuming classes the
32+ // expected behavior of no emission on startup.
33+ readonly property bool active: loader.active
2934
3035 hideAnimation: StandardAnimation { property: "opacity"; to: 0 }
3136
tests/autopilot/setup.py+2−2
@@ -1,8 +1,8 @@
1−#!/usr/bin/python
1+#!/usr/bin/python3
22# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
33#
44# Unity Autopilot Test Suite
5−# Copyright (C) 2012-2013 Canonical
5+# Copyright (C) 2012, 2013, 2015 Canonical
66#
77# This program is free software: you can redistribute it and/or modify
88# it under the terms of the GNU General Public License as published by
tests/autopilot/unity8/application_lifecycle/tests/__init__.py+2−2
@@ -1,7 +1,7 @@
11# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
22#
33# Unity Autopilot Test Suite
4−# Copyright (C) 2014 Canonical
4+# Copyright (C) 2014, 2015 Canonical
55#
66# This program is free software: you can redistribute it and/or modify
77# it under the terms of the GNU General Public License as published by
@@ -28,7 +28,7 @@ from unity8.shell import tests
2828class ApplicationLifeCycleTestCase(tests.UnityTestCase):
2929
3030 def setUp(self):
31− super(ApplicationLifeCycleTestCase, self).setUp()
31+ super().setUp()
3232 self._qml_mock_enabled = False
3333 self._data_dirs_mock_enabled = False
3434 unity_proxy = self.launch_unity()
tests/autopilot/unity8/application_lifecycle/tests/test_application_lifecycle.py+2−4
@@ -1,7 +1,7 @@
11# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
22#
33# Unity Autopilot Test Suite
4−# Copyright (C) 2013, 2014 Canonical
4+# Copyright (C) 2013, 2014, 2015 Canonical
55#
66# This program is free software: you can redistribute it and/or modify
77# it under the terms of the GNU General Public License as published by
@@ -19,8 +19,6 @@
1919
2020"""Tests for the application lifecycle."""
2121
22−from __future__ import absolute_import
23−
2422import logging
2523import os
2624
@@ -40,7 +38,7 @@ class ApplicationLifecycleTests(tests.ApplicationLifeCycleTestCase):
4038 def setUp(self):
4139 if model() == 'Desktop':
4240 self.skipTest('Test cannot be run on the desktop.')
43− super(ApplicationLifecycleTests, self).setUp()
41+ super().setUp()
4442
4543 def swipe_screen_from_right(self):
4644 width = self.main_window.width
tests/autopilot/unity8/application_lifecycle/tests/test_url_dispatcher.py+2−2
@@ -1,7 +1,7 @@
11# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
22#
33# Unity Autopilot Test Suite
4−# Copyright (C) 2014 Canonical
4+# Copyright (C) 2014, 2015 Canonical
55#
66# This program is free software: you can redistribute it and/or modify
77# it under the terms of the GNU General Public License as published by
@@ -32,7 +32,7 @@ class URLDispatcherTestCase(tests.ApplicationLifeCycleTestCase):
3232 def setUp(self):
3333 if platform.model() == 'Desktop':
3434 self.skipTest("URL dispatcher doesn't work on the desktop.")
35− super(URLDispatcherTestCase, self).setUp()
35+ super().setUp()
3636
3737 def test_swipe_out_application_started_by_url_dispatcher(self):
3838 _, desktop_file_path = self.create_test_application()
tests/autopilot/unity8/fixture_setup.py+4−4
@@ -38,13 +38,13 @@ class LaunchDashApp(fixtures.Fixture):
3838 :type variables: A dictionary.
3939
4040 """
41− super(LaunchDashApp, self).__init__()
41+ super().__init__()
4242 self.binary_path = binary_path
4343 self.variables = variables
4444
4545 def setUp(self):
4646 """Launch the dash app when the fixture is used."""
47− super(LaunchDashApp, self).setUp()
47+ super().setUp()
4848 self.addCleanup(self.stop_application)
4949 self.application_proxy = self.launch_application()
5050
@@ -69,11 +69,11 @@ class LaunchDashApp(fixtures.Fixture):
6969class DisplayRotationLock(fixtures.Fixture):
7070
7171 def __init__(self, enable):
72− super(DisplayRotationLock, self).__init__()
72+ super().__init__()
7373 self.enable = enable
7474
7575 def setUp(self):
76− super(DisplayRotationLock, self).setUp()
76+ super().setUp()
7777 original_state = self._is_rotation_lock_enabled()
7878 if self.enable != original_state:
7979 self.addCleanup(self._set_rotation_lock, original_state)
tests/autopilot/unity8/indicators/__init__.py+1−1
@@ -34,7 +34,7 @@ class IndicatorPage(emulators.UnityEmulatorBase):
3434 return False
3535
3636
37−class DisplayIndicator(object):
37+class DisplayIndicator():
3838
3939 def __init__(self, main_window):
4040 self._main_window = main_window
tests/autopilot/unity8/indicators/tests/__init__.py+1−1
@@ -29,6 +29,6 @@ class IndicatorTestCase(tests.UnityTestCase):
2929 def setUp(self):
3030 if platform.model() == 'Desktop':
3131 self.skipTest('Test cannot be run on the desktop.')
32− super(IndicatorTestCase, self).setUp()
32+ super().setUp()
3333 self.unity_proxy = self.launch_unity()
3434 process_helpers.unlock_unity(self.unity_proxy)
tests/autopilot/unity8/indicators/tests/test_display_indicator.py−3
@@ -26,9 +26,6 @@ from unity8.indicators import tests
2626class DisplayIndicatorTestCase(tests.IndicatorTestCase):
2727
2828 def test_indicator_icon_must_be_visible_after_rotation_locked(self):
29− # TODO remove the skip when the bug is fixed. --elopio - 2015-01-20
30− self.skipTest(
31− 'This test fails because of bug http://pad.lv/1410915')
3229 rotation_unlocked = fixture_setup.DisplayRotationLock(False)
3330 self.useFixture(rotation_unlocked)
3431 display_indicator = indicators.DisplayIndicator(self.main_window)
tests/autopilot/unity8/indicators/tests/test_indicators.py+2−4
@@ -16,8 +16,6 @@
1616# You should have received a copy of the GNU General Public License
1717# along with this program. If not, see <http://www.gnu.org/licenses/>.
1818
19−from __future__ import absolute_import
20−
2119from testscenarios import multiply_scenarios
2220
2321from autopilot import platform
@@ -42,7 +40,7 @@ class IndicatorExistsTestCase(tests.IndicatorTestCase):
4240 )
4341
4442 def setUp(self):
45− super(IndicatorExistsTestCase, self).setUp()
43+ super().setUp()
4644 if (platform.model() == 'Nexus 10' and
4745 self.indicator_name == 'indicator-bluetooth'):
4846 self.skipTest('Nexus 10 does not have bluetooth at the moment.')
@@ -77,7 +75,7 @@ class IndicatorPageTitleMatchesWidgetTestCase(tests.IndicatorTestCase):
7775 )
7876
7977 def setUp(self):
80− super(IndicatorPageTitleMatchesWidgetTestCase, self).setUp()
78+ super().setUp()
8179 if (platform.model() == 'Nexus 10' and
8280 self.indicator_name == 'indicator-bluetooth'):
8381 self.skipTest('Nexus 10 does not have bluetooth at the moment.')
tests/autopilot/unity8/process_helpers.py+2−9
@@ -1,7 +1,7 @@
11# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
22#
33# Unity Autopilot Utilities
4−# Copyright (C) 2013, 2014 Canonical
4+# Copyright (C) 2013, 2014, 2015 Canonical
55#
66# This program is free software: you can redistribute it and/or modify
77# it under the terms of the GNU General Public License as published by
@@ -19,16 +19,9 @@
1919
2020import logging
2121import subprocess
22−import sys
2322import dbus
2423
25−# This has to work in both python 3 (ap 1.5) and py2 (ap legacy 1.4.1) so we
26−# pick the correct location in each case. Remove the py2 branch once we no
27−# longer need to support python 2.
28−if sys.version >= '3':
29− from autopilot.exceptions import ProcessSearchError
30−else:
31− from autopilot.introspection import ProcessSearchError
24+from autopilot.exceptions import ProcessSearchError
3225from autopilot.introspection import get_proxy_object_for_existing_process
3326
3427from unity8.shell import emulators
tests/autopilot/unity8/shell/__init__.py+2−2
@@ -1,7 +1,7 @@
11# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
22#
33# Unity Autopilot Test Suite
4−# Copyright (C) 2012-2013 Canonical
4+# Copyright (C) 2012-2015 Canonical
55#
66# This program is free software: you can redistribute it and/or modify
77# it under the terms of the GNU General Public License as published by
@@ -38,7 +38,7 @@ def disable_qml_mocking(fn):
3838 return wrapper
3939
4040
41−class DragMixin(object):
41+class DragMixin():
4242 def _drag(self, x1, y1, x2, y2):
4343 # XXX This ugly code is here just temporarily, waiting for drag
4444 # improvements to land on autopilot so we don't have to access device
tests/autopilot/unity8/shell/emulators/__init__.py+3−3
@@ -1,7 +1,7 @@
11# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
22#
33# Unity Autopilot Test Suite
4−# Copyright (C) 2012, 2013, 2014 Canonical
4+# Copyright (C) 2012, 2013, 2014, 2015 Canonical
55#
66# This program is free software: you can redistribute it and/or modify
77# it under the terms of the GNU General Public License as published by
@@ -17,10 +17,10 @@
1717# along with this program. If not, see <http://www.gnu.org/licenses/>.
1818#
1919
20−from ubuntuuitoolkit import emulators as toolkit_emulators
20+import ubuntuuitoolkit
2121
2222
23−class UnityEmulatorBase(toolkit_emulators.UbuntuUIToolkitEmulatorBase):
23+class UnityEmulatorBase(ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase):
2424 """A base class for all unity emulators."""
2525
2626
tests/autopilot/unity8/shell/emulators/create_interactive_notification.py+2−3
@@ -1,10 +1,9 @@
1−#!/usr/bin/env python
2−from __future__ import print_function
1+#!/usr/bin/env python3
32
43# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
54#
65# Unity Autopilot Test Suite
7−# Copyright (C) 2012-2013 Canonical
6+# Copyright (C) 2012, 2013, 2014, 2015 Canonical
87#
98# This program is free software: you can redistribute it and/or modify
109# it under the terms of the GNU General Public License as published by
tests/autopilot/unity8/shell/emulators/dash.py+4−5
@@ -1,7 +1,7 @@
11# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
22#
33# Unity Autopilot Test Suite
4−# Copyright (C) 2012, 2013, 2014 Canonical
4+# Copyright (C) 2012, 2013, 2014, 2015 Canonical
55#
66# This program is free software: you can redistribute it and/or modify
77# it under the terms of the GNU General Public License as published by
@@ -24,20 +24,19 @@ from unity8.shell import emulators
2424
2525from autopilot import logging as autopilot_logging
2626from autopilot.introspection import dbus
27−from ubuntuuitoolkit import emulators as toolkit_emulators
2827
2928
3029logger = logging.getLogger(__name__)
3130
3231
33−class DashApp(object):
32+class DashApp():
3433
3534 """Autopilot helper for the Dash app."""
3635
3736 def __init__(self, app_proxy):
3837 self.app_proxy = app_proxy
3938 self.main_view = self.app_proxy.select_single(
40− toolkit_emulators.MainView)
39+ ubuntuuitoolkit.MainView)
4140 self.dash = self.main_view.select_single(Dash)
4241
4342
@@ -45,7 +44,7 @@ class Dash(emulators.UnityEmulatorBase):
4544 """An emulator that understands the Dash."""
4645
4746 def __init__(self, *args):
48− super(Dash, self).__init__(*args)
47+ super().__init__(*args)
4948 self.dash_content_list = self.wait_select_single(
5049 'QQuickListView', objectName='dashContentList')
5150
tests/autopilot/unity8/shell/fixture_setup.py+2−2
@@ -1,7 +1,7 @@
11# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
22#
33# Unity Autopilot Test Suite
4−# Copyright (C) 2014 Canonical
4+# Copyright (C) 2014, 2015 Canonical
55#
66# This program is free software: you can redistribute it and/or modify
77# it under the terms of the GNU General Public License as published by
@@ -31,7 +31,7 @@ import unity8
3131class FakeScopes(fixtures.Fixture):
3232
3333 def setUp(self):
34− super(FakeScopes, self).setUp()
34+ super().setUp()
3535 self.useFixture(
3636 fixtures.EnvironmentVariable(
3737 'QML2_IMPORT_PATH',
tests/autopilot/unity8/shell/tests/__init__.py+3−3
@@ -1,7 +1,7 @@
11# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
22#
33# Unity Autopilot Test Suite
4−# Copyright (C) 2012, 2013, 2014 Canonical
4+# Copyright (C) 2012, 2013, 2014, 2015 Canonical
55#
66# This program is free software: you can redistribute it and/or modify
77# it under the terms of the GNU General Public License as published by
@@ -148,7 +148,7 @@ class UnityTestCase(AutopilotTestCase):
148148 sys.exit(2)
149149
150150 def setUp(self):
151− super(UnityTestCase, self).setUp()
151+ super().setUp()
152152 if is_unity7_running():
153153 self.useFixture(toolkit_fixtures.HideUnity7Launcher())
154154
@@ -399,7 +399,7 @@ class DashBaseTestCase(AutopilotTestCase):
399399 environment = {}
400400
401401 def setUp(self):
402− super(DashBaseTestCase, self).setUp()
402+ super().setUp()
403403
404404 if is_unity7_running():
405405 self.useFixture(toolkit_fixtures.HideUnity7Launcher())
tests/autopilot/unity8/shell/tests/test_emulators.py+4−4
@@ -1,7 +1,7 @@
11# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
22#
33# Unity Autopilot Test Suite
4−# Copyright (C) 2014 Canonical
4+# Copyright (C) 2014, 2015 Canonical
55#
66# This program is free software: you can redistribute it and/or modify
77# it under the terms of the GNU General Public License as published by
@@ -38,7 +38,7 @@ class MainWindowTestCase(tests.UnityTestCase):
3838 scenarios = tests._get_device_emulation_scenarios()
3939
4040 def setUp(self):
41− super(MainWindowTestCase, self).setUp()
41+ super().setUp()
4242 unity_proxy = self.launch_unity()
4343 process_helpers.unlock_unity(unity_proxy)
4444
@@ -110,7 +110,7 @@ class GenericScopeViewEmulatorTestCase(tests.DashBaseTestCase):
110110 def setUp(self):
111111 # Set up the fake scopes before launching unity.
112112 self.useFixture(fixture_setup.FakeScopes())
113− super(GenericScopeViewEmulatorTestCase, self).setUp()
113+ super().setUp()
114114 self.generic_scope = self.dash.open_scope('MockScope1')
115115
116116 def test_open_preview(self):
@@ -129,7 +129,7 @@ class DashAppsEmulatorTestCase(tests.DashBaseTestCase):
129129 def setUp(self):
130130 # Set up the fake scopes before launching unity.
131131 self.useFixture(fixture_setup.FakeScopes())
132− super(DashAppsEmulatorTestCase, self).setUp()
132+ super().setUp()
133133 self.applications_scope = self.dash.open_scope('clickscope')
134134
135135 def test_get_applications_should_return_correct_applications(self):
tests/autopilot/unity8/shell/tests/test_lock_screen.py+1−9
@@ -1,7 +1,7 @@
11# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
22#
33# Unity Autopilot Test Suite
4−# Copyright (C) 2012, 2013, 2014 Canonical
4+# Copyright (C) 2012, 2013, 2014, 2015 Canonical
55#
66# This program is free software: you can redistribute it and/or modify
77# it under the terms of the GNU General Public License as published by
@@ -17,22 +17,14 @@
1717# along with this program. If not, see <http://www.gnu.org/licenses/>.
1818#
1919
20−
21−from __future__ import absolute_import
22−
2320from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
2421
2522from autopilot.matchers import Eventually
26−import sys
2723from testtools.matchers import Equals
2824import logging
2925
3026logger = logging.getLogger(__name__)
3127
32−# py2 compatible alias for py3
33−if sys.version >= '3':
34− basestring = str
35−
3628
3729class TestLockscreen(UnityTestCase):
3830
tests/autopilot/unity8/shell/tests/test_notifications.py+4−12
@@ -1,7 +1,7 @@
11# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
22#
33# Unity Autopilot Test Suite
4−# Copyright (C) 2012, 2013, 2014 Canonical
4+# Copyright (C) 2012, 2013, 2014, 2015 Canonical
55#
66# This program is free software: you can redistribute it and/or modify
77# it under the terms of the GNU General Public License as published by
@@ -19,8 +19,6 @@
1919
2020"""Tests for Notifications"""
2121
22−from __future__ import absolute_import
23−
2422from unity8 import shell
2523from unity8.process_helpers import unlock_unity
2624from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
@@ -34,15 +32,9 @@ import os
3432import logging
3533import signal
3634import subprocess
37−import sys
3835
3936logger = logging.getLogger(__name__)
4037
41−# from __future__ import range
42−# (python3's range, is same as python2's xrange)
43−if sys.version_info < (3,):
44− range = xrange
45−
4638
4739class NotificationsBase(UnityTestCase):
4840 """Base class for all notification tests that provides helper methods."""
@@ -118,7 +110,7 @@ class InteractiveNotificationBase(NotificationsBase):
118110 """Collection of test for Interactive tests including snap decisions."""
119111
120112 def setUp(self):
121− super(InteractiveNotificationBase, self).setUp()
113+ super().setUp()
122114 # Need to keep track when we launch the notification script.
123115 self._notify_proc = None
124116
@@ -338,7 +330,7 @@ class InteractiveNotificationBase(NotificationsBase):
338330 action_string = "%s,%s" % (action_id, action_label)
339331 script_args.extend(['--action', action_string])
340332
341− python_bin = subprocess.check_output(['which', 'python']).strip()
333+ python_bin = subprocess.check_output(['which', 'python3']).strip()
342334 command = [python_bin, self._get_notify_script()] + script_args
343335 logger.info("Launching snap-decision notification as: %s", command)
344336 self._notify_proc = subprocess.Popen(
@@ -410,7 +402,7 @@ class EphemeralNotificationsTests(NotificationsBase):
410402 """Collection of tests for Emphemeral notifications (non-interactive.)"""
411403
412404 def setUp(self):
413− super(EphemeralNotificationsTests, self).setUp()
405+ super().setUp()
414406 # Because we are using the Notify library we need to init and un-init
415407 # otherwise we get crashes.
416408 Notify.init("Autopilot Ephemeral Notification Tests")
tests/autopilot/unity8/shell/tests/test_tutorial.py+2−2
@@ -1,7 +1,7 @@
11# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
22#
33# Unity Autopilot Test Suite
4−# Copyright (C) 2014 Canonical
4+# Copyright (C) 2014, 2015 Canonical
55#
66# This program is free software: you can redistribute it and/or modify
77# it under the terms of the GNU General Public License as published by
@@ -31,7 +31,7 @@ from unity8.shell.emulators import tutorial # NOQA
3131class TutorialTestCase(tests.UnityTestCase):
3232
3333 def setUp(self):
34− super(TutorialTestCase, self).setUp()
34+ super().setUp()
3535 self._qml_mock_enabled = False
3636 self._data_dirs_mock_enabled = False
3737
tests/autopilot/unity8/shell/tests/test_upstart.py+1−7
@@ -38,12 +38,6 @@ import logging
3838
3939logger = logging.getLogger(__name__)
4040
41−# from __future__ import range
42−# (python3's range, is same as python2's xrange)
43−import sys
44−if sys.version_info < (3,):
45− range = xrange
46−
4741
4842class UpstartIntegrationTests(UnityTestCase):
4943
@@ -95,7 +89,7 @@ class UpstartIntegrationTests(UnityTestCase):
9589 self.addCleanup(ensure_stopped)
9690
9791 def _set_proxy(self):
98− super(UpstartIntegrationTests, self)._set_proxy(
92+ super()._set_proxy(
9993 get_proxy_object_for_existing_process(
10094 pid=self.process.pid,
10195 emulator_base=UnityEmulatorBase,))
tests/mocks/LightDM/CMakeLists.txt+2−5
@@ -34,12 +34,9 @@ add_library(MockLightDM-qml MODULE
3434# installed on the system. So we make sure we link to our full fake version
3535# At run time, we can point to whichever version we happen to be using via
3636# LD_LIBRARY_PATH.
37−add_dependencies(MockLightDM-qml MockLightDM MockUserMetrics)
3837target_link_libraries(MockLightDM-qml
39− -L${CMAKE_CURRENT_BINARY_DIR}/liblightdm
40− -llightdm-qt5-2
41− -L${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics
42− -lusermetricsoutput
38+ MockLightDM
39+ MockUserMetrics
4340 unity8-private
4441 )
4542
tests/mocks/Unity/Application/ApplicationManager.cpp−4
@@ -241,10 +241,6 @@ ApplicationInfo* ApplicationManager::add(QString appId)
241241
242242bool ApplicationManager::stopApplication(const QString &appId)
243243{
244− if (appId == "unity8-dash") {
245− return false;
246− }
247−
248244 ApplicationInfo *application = findApplication(appId);
249245 if (application == nullptr)
250246 return false;
tests/mocks/Unity/Application/ApplicationManager.h+3−1
@@ -34,6 +34,7 @@ class ApplicationManager : public ApplicationManagerInterface {
3434 Q_FLAGS(ExecFlags)
3535
3636 Q_PROPERTY(bool empty READ isEmpty NOTIFY emptyChanged)
37+ Q_PROPERTY(QStringList availableApplications READ availableApplications NOTIFY availableApplicationsChanged)
3738
3839 public:
3940 ApplicationManager(QObject *parent = nullptr);
@@ -75,7 +76,7 @@ class ApplicationManager : public ApplicationManagerInterface {
7576 void setForceDashActive(bool forceDashActive) override;
7677
7778 // Only for testing
78− Q_INVOKABLE QStringList availableApplications();
79+ QStringList availableApplications();
7980 Q_INVOKABLE ApplicationInfo* add(QString appId);
8081
8182 QModelIndex findIndex(ApplicationInfo* application);
@@ -85,6 +86,7 @@ class ApplicationManager : public ApplicationManagerInterface {
8586 Q_SIGNALS:
8687 void focusRequested(const QString &appId);
8788 void emptyChanged(bool empty);
89+ void availableApplicationsChanged(QStringList list);
8890
8991 private Q_SLOTS:
9092 void onWindowCreatedTimerTimeout();
tests/mocks/Unity/Indicators/CMakeLists.txt+1−3
@@ -26,10 +26,8 @@ add_library(IndicatorsFakeQml SHARED
2626)
2727add_definitions(-DUNITYINDICATORS_LIBRARY)
2828
29−add_dependencies(IndicatorsFakeQml QMenuModelQml)
3029target_link_libraries(IndicatorsFakeQml
31− -L${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel
32− -lqmenumodel
30+ QMenuModelQml
3331)
3432
3533qt5_use_modules(IndicatorsFakeQml Core Qml Quick)
tests/plugins/LightDM/CMakeLists.txt+2−4
@@ -19,13 +19,11 @@ include_directories(
1919 )
2020
2121target_link_libraries(GreeterDBusTestExec
22− -L${CMAKE_BINARY_DIR}/tests/mocks/LightDM/liblightdm
23− -llightdm-qt5-2
22+ MockLightDM
2423 )
2524
2625target_link_libraries(GreeterUsersModelTestExec
27− -L${CMAKE_BINARY_DIR}/tests/mocks/LightDM/liblightdm
28− -llightdm-qt5-2
26+ MockLightDM
2927 )
3028
3129add_definitions(-DCURRENT_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}")
tests/qmltests/CMakeLists.txt+1−1
@@ -78,12 +78,12 @@ add_qml_test(Panel IndicatorsBar)
7878add_qml_test(Panel IndicatorsMenu)
7979add_qml_test(Panel MenuContent)
8080add_qml_test(Panel Panel)
81−add_qml_test(Panel SearchIndicator)
8281add_qml_test(Panel/Indicators IndicatorsLight ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
8382# These MenuItemFactory tests need the test/mocks/ to come before plugins/
8483add_qml_test(Panel/Indicators MenuItemFactory IMPORT_PATHS ${CMAKE_BINARY_DIR}/tests/mocks ${qmltest_DEFAULT_IMPORT_PATHS})
8584add_qml_test(Panel/Indicators MessageMenuItemFactory IMPORT_PATHS ${CMAKE_BINARY_DIR}/tests/mocks ${qmltest_DEFAULT_IMPORT_PATHS})
8685add_qml_test(Stages ApplicationWindow)
86+add_qml_test(Stages DesktopStage)
8787add_qml_test(Stages PhoneStage ENVIRONMENT)
8888add_qml_test(Stages SpreadDelegate ENVIRONMENT)
8989add_qml_test(Stages SurfaceContainer ENVIRONMENT)
tests/qmltests/Dash/Previews/tst_Preview.qml+1−3
@@ -113,9 +113,7 @@ Rectangle {
113113
114114 // Scroll down
115115 var previewListRow0 = findChild(preview, "previewListRow0");
116− touchFlick(preview, preview.width / 2, units.gu(20), preview.width / 2, units.gu(1));
117− tryCompare(previewListRow0, "atYEnd", true);
118− tryCompare(previewListRow0, "moving", false);
116+ flickToYEnd(previewListRow0);
119117
120118 // Click on the combo
121119 var widget = findChild(preview, "widget-21");
tests/qmltests/Dash/Previews/tst_PreviewImageGallery.qml+1−1
@@ -22,7 +22,7 @@ import Unity.Test 0.1 as UT
2222Rectangle {
2323 id: root
2424 width: units.gu(80)
25− height: units.gu(80)
25+ height: units.gu(70)
2626 color: "lightgrey"
2727
2828 property var sourcesModel0: {
tests/qmltests/Dash/tst_Dash.qml+1−3
@@ -497,9 +497,7 @@ Item {
497497 tryCompare(subPageLoader, "x", 0);
498498 tryCompare(findChild(dashTempScopeItem, "categoryListView"), "visible", false);
499499 var previewListRow0 = findChild(subPageLoader, "previewListRow0");
500− touchFlick(previewListRow0, previewListRow0.width / 2, units.gu(20), previewListRow0.width / 2, units.gu(1));
501− tryCompare(previewListRow0, "atYEnd", true);
502− tryCompare(previewListRow0, "moving", false);
500+ flickToYEnd(previewListRow0);
503501 var widget = findChild(subPageLoader, "widget-21");
504502 var initialWidgetHeight = widget.height;
505503 var openButton = findChild(widget, "buttonopen_click");
tests/qmltests/Greeter/tst_Greeter.qml+15
@@ -146,6 +146,8 @@ Item {
146146 tryCompare(greeter, "waiting", false);
147147 view = findChild(greeter, "testView");
148148 verifySelected(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
149+ greeter.failedLoginsDelayAttempts = 7;
150+ greeter.failedLoginsDelayMinutes = 5;
149151 }
150152
151153 function cleanup() {
@@ -429,6 +431,19 @@ Item {
429431 compare(LightDM.Infographic.username, "has-password");
430432 }
431433
434+ function test_forcedDelay() {
435+ greeter.failedLoginsDelayAttempts = 1;
436+ greeter.failedLoginsDelayMinutes = 0.001; // make delay very short
437+
438+ selectUser("has-password");
439+ tryCompare(viewShowPromptSpy, "count", 1);
440+
441+ compare(view.delayMinutes, 0);
442+ view.responded("wr0ng p4ssw0rd");
443+ tryCompare(view, "delayMinutes", 1);
444+ tryCompare(view, "delayMinutes", 0);
445+ }
446+
432447 function test_dbusRequestAuthenticationUser() {
433448 selectUser("no-password");
434449 LightDM.Greeter.requestAuthenticationUser("has-password");
tests/qmltests/Greeter/tst_WideView.qml+10−3
@@ -313,7 +313,7 @@ Item {
313313 property Item view: loader.status === Loader.Ready ? loader.item : null
314314
315315 function init() {
316− view.currentIndex = 0; // break binding with text field
316+ selectIndex(0); // break binding with text field
317317 selectedSpy.clear();
318318 respondedSpy.clear();
319319 teaseSpy.clear();
@@ -343,9 +343,15 @@ Item {
343343 return -1;
344344 }
345345
346+ function selectIndex(i) {
347+ view.currentIndex = i;
348+ var userList = findChild(view, "userList");
349+ tryCompare(userList, "movingInternally", false);
350+ }
351+
346352 function selectUser(name) {
347353 var i = getIndexOf(name);
348− view.currentIndex = i;
354+ selectIndex(i);
349355 return i;
350356 }
351357
@@ -441,7 +447,8 @@ Item {
441447
442448 // Escape is used to reset the authentication, especially if PAM is unresponsive
443449 function test_escape() {
444− view.currentIndex = 1;
450+ selectIndex(1);
451+ selectedSpy.clear();
445452 view.locked = true;
446453 view.showPrompt("Prompt", true, true);
447454 var passwordInput = findChild(view, "passwordInput");
tests/qmltests/Launcher/tst_Launcher.qml+51−6
@@ -17,7 +17,7 @@
1717import QtQuick 2.0
1818import QtQuick.Layouts 1.1
1919import QtTest 1.0
20−import Unity.Test 0.1 as UT
20+import Unity.Test 0.1
2121import Ubuntu.Components 1.1
2222import ".."
2323import "../../../qml/Launcher"
@@ -78,7 +78,9 @@ Item {
7878 ColumnLayout {
7979 anchors { bottom: parent.bottom; right: parent.right; margins: units.gu(1) }
8080 spacing: units.gu(1)
81− width: units.gu(20)
81+ width: childrenRect.width
82+
83+ MouseTouchEmulationCheckbox {}
8284
8385 Button {
8486 text: "emit hinting signal"
@@ -98,7 +100,7 @@ Item {
98100 target: LauncherModel
99101 }
100102
101− UT.UnityTestCase {
103+ UnityTestCase {
102104 id: testCase
103105 name: "Launcher"
104106 when: windowShown
@@ -116,6 +118,9 @@ Item {
116118 launcherLoader.active = true;
117119 }
118120 function init() {
121+ // Make sure we don't start the test with the mouse hovering the launcher
122+ mouseMove(root, root.width, root.height / 2);
123+
119124 var listView = findChild(launcher, "launcherListView");
120125 // wait for it to settle before doing the flick. Otherwise the flick
121126 // might fail.
@@ -148,6 +153,17 @@ Item {
148153 tryCompare(launcher, "state", "visible");
149154 }
150155
156+ function revealByHover() {
157+ mouseMove(root, 1, root.height / 2);
158+
159+ var panel = findChild(launcher, "launcherPanel");
160+ verify(panel != undefined);
161+
162+ // wait until it gets fully extended
163+ tryCompare(panel, "x", 0);
164+ tryCompare(launcher, "state", "visibleTemporary");
165+ }
166+
151167 function waitUntilLauncherDisappears() {
152168 var panel = findChild(launcher, "launcherPanel");
153169 tryCompare(panel, "x", -panel.width, 1000);
@@ -189,8 +205,19 @@ Item {
189205 Launcher::launcherApplicationSelected signal should be emitted with the
190206 corresponding desktop file. E.g. clicking on phone icon should yield
191207 launcherApplicationSelected("[...]dialer-app.desktop") */
192− function test_clickingOnAppIconCausesSignalEmission() {
193− dragLauncherIntoView();
208+ function test_clickingOnAppIconCausesSignalEmission_data() {
209+ return [
210+ {tag: "by mouse", mouse: true},
211+ {tag: "by touch", mouse: false}
212+ ]
213+ }
214+
215+ function test_clickingOnAppIconCausesSignalEmission(data) {
216+ if (data.mouse) {
217+ revealByHover();
218+ } else {
219+ dragLauncherIntoView();
220+ }
194221 launcher.lastSelectedApplication = "";
195222 launcher.inverted = false;
196223
@@ -200,7 +227,11 @@ Item {
200227
201228 verify(appIcon != undefined);
202229
203− mouseClick(appIcon);
230+ if (data.mouse) {
231+ mouseClick(appIcon);
232+ } else {
233+ tap(appIcon);
234+ }
204235
205236 tryCompare(launcher, "lastSelectedApplication",
206237 appIcon.appId);
@@ -559,5 +590,19 @@ Item {
559590
560591 tryCompare(quickList, "state", "");
561592 }
593+
594+ function test_revealByHover() {
595+ var panel = findChild(launcher, "launcherPanel");
596+ verify(panel != undefined);
597+
598+ revealByHover();
599+ tryCompare(launcher, "state", "visibleTemporary");
600+
601+ // Now move the mouse away and make sure it hides in less than a second
602+ mouseMove(root, root.width, root.height / 2)
603+
604+ tryCompare(launcher, "state", "", 1000, "Launcher didn't hide after moving mouse away from it");
605+ waitUntilLauncherDisappears();
606+ }
562607 }
563608}
tests/qmltests/Panel/tst_Panel.qml+52
@@ -171,6 +171,16 @@ IndicatorTest {
171171 return indicatorItem;
172172 }
173173
174+ function pullDownIndicatorsMenu() {
175+ var showDragHandle = findChild(panel, "showDragHandle");
176+ touchFlick(showDragHandle,
177+ showDragHandle.width / 2,
178+ showDragHandle.height / 2,
179+ showDragHandle.width / 2,
180+ showDragHandle.height / 2 + (showDragHandle.autoCompleteDragThreshold * 1.1));
181+ tryCompare(panel.indicators, "fullyOpened", true);
182+ }
183+
174184 function test_drag_show_data() {
175185 return [
176186 { tag: "pinned", fullscreen: false, call: null,
@@ -338,5 +348,47 @@ IndicatorTest {
338348
339349 compare(backgroundPressedSpy.count, 0);
340350 }
351+
352+ function test_darkenedAreaEatsAllEvents() {
353+
354+ // The center of the area not covered by the indicators menu
355+ // Ie, the visible darkened area behind the menu
356+ var touchPosX = (panel.width - panel.indicators.width) / 2
357+ var touchPosY = panel.indicators.minimizedPanelHeight +
358+ ((panel.height - panel.indicators.minimizedPanelHeight) / 2)
359+
360+ // input goes through while the indicators menu is closed
361+ tryCompare(panel.indicators, "fullyClosed", true);
362+ compare(backgroundPressedSpy.count, 0);
363+ tap(panel, touchPosX, touchPosY);
364+ compare(backgroundPressedSpy.count, 2);
365+
366+ pullDownIndicatorsMenu();
367+
368+ // Darkened area eats input when the indicators menu is fully opened
369+ tap(panel, touchPosX, touchPosY);
370+ compare(backgroundPressedSpy.count, 2);
371+ backgroundPressedSpy.clear();
372+
373+ // And should continue to eat inpunt until the indicators menu is fully closed
374+ wait(10);
375+ while (!panel.indicators.fullyClosed) {
376+ tap(panel, touchPosX, touchPosY);
377+
378+ // it could have got fully closed during the tap
379+ // so we have to double check here
380+ if (!panel.indicators.fullyClosed) {
381+ compare(backgroundPressedSpy.count, 0);
382+ }
383+
384+ // let the animation go a bit further
385+ wait(50);
386+ }
387+
388+ // Now that's fully closed, input should go through again
389+ backgroundPressedSpy.clear();
390+ tap(panel, touchPosX, touchPosY);
391+ compare(backgroundPressedSpy.count, 2);
392+ }
341393 }
342394}
tests/qmltests/Panel/tst_SearchIndicator.qmldeleted−61
@@ -1,61 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import QtTest 1.0
19−import "../../../qml/Panel"
20−import Ubuntu.Components 0.1
21−import Unity.Test 0.1 as UT
22−
23−Item {
24− width: units.gu(9)
25− height: units.gu(3)
26−
27− SignalSpy {
28− id: clickedSpy
29− target: searchIndicator
30− signalName: "clicked"
31− }
32−
33− SearchIndicator {
34− id: searchIndicator
35− anchors.fill: parent
36− }
37−
38− UT.UnityTestCase {
39− name: "SearchIndicator"
40− when: windowShown
41−
42− function test_clickedSignal() {
43− clickedSpy.clear();
44− mouseClick(searchIndicator,
45− searchIndicator.width / 2, searchIndicator.height / 2);
46− compare(clickedSpy.count, 1);
47− }
48−
49− function test_hideUp() {
50− var container = findChild(searchIndicator, "container");
51− searchIndicator.state = "hidden";
52− tryCompare(container, "opacity", 0);
53− }
54−
55− function test_show() {
56− var container = findChild(searchIndicator, "container");
57− searchIndicator.state = "visible";
58− tryCompare(container, "opacity", 1);
59− }
60− }
61−}
tests/qmltests/Stages/ApplicationCheckBox.qml+20−1
@@ -24,15 +24,23 @@ RowLayout {
2424 property string appId
2525 property alias checked: checkbox.checked
2626
27+ enabled: appId !== "unity8-dash"
28+
2729 Layout.fillWidth: true
2830 CheckBox {
2931 id: checkbox
3032 checked: false
3133 activeFocusOnPress: false
34+ property bool noop: false
3235 onCheckedChanged: {
36+ if (noop) {
37+ return;
38+ }
3339 if (checked) {
34− ApplicationManager.startApplication(root.appId);
40+ var application = ApplicationManager.startApplication(root.appId);
41+ appConnections.target = application;
3542 } else {
43+ appConnections.target = null;
3644 ApplicationManager.stopApplication(root.appId);
3745 }
3846 }
@@ -42,4 +50,15 @@ RowLayout {
4250 color: "white"
4351 anchors.verticalCenter: parent.verticalCenter
4452 }
53+
54+ Connections {
55+ id: appConnections
56+ onStateChanged: {
57+ if (target.state == ApplicationInfoInterface.Stopped) {
58+ checkbox.noop = true;
59+ checkbox.checked = false;
60+ checkbox.noop = false;
61+ }
62+ }
63+ }
4564}
tests/qmltests/Stages/tst_DesktopStage.qmlnew file+201
@@ -0,0 +1,201 @@
1+/*
2+ * Copyright (C) 2015 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import QtTest 1.0
19+import Ubuntu.Components 1.1
20+import Ubuntu.Components.ListItems 1.0 as ListItem
21+import Unity.Application 0.1
22+import Unity.Test 0.1
23+
24+import "../../../qml/Stages"
25+
26+Rectangle {
27+ id: root
28+ color: "darkblue"
29+ width: desktopStageLoader.width + controls.width
30+ height: desktopStageLoader.height
31+
32+ QtObject {
33+ id: fakeWindowStateStorage
34+
35+ property var storedGeom: [
36+ ["unity8-dash", Qt.rect(units.gu(2), units.gu(2), units.gu(50), units.gu(50))],
37+ ["webbrowser-app", Qt.rect(units.gu(60), units.gu(2), units.gu(50), units.gu(50))]
38+ ]
39+
40+ function saveGeometry(windowId, geometry) {
41+ for (var i = 0; i < storedGeom.length; ++i) {
42+ if (storedGeom[i][0] === windowId) {
43+ storedGeom[i][1] = geometry;
44+ return;
45+ }
46+ }
47+ // if new
48+ storedGeom[storedGeom.length] = [windowId, geometry];
49+ }
50+ function getGeometry(windowId, defaultGeometry) {
51+ for (var i = 0; i < storedGeom.length; ++i) {
52+ if (storedGeom[i][0] === windowId) {
53+ return storedGeom[i][1];
54+ }
55+ }
56+ return defaultGeometry;
57+ }
58+ }
59+
60+ Loader {
61+ id: desktopStageLoader
62+ x: ((root.width - controls.width) - width) / 2
63+ y: (root.height - height) / 2
64+ width: units.gu(160*0.9)
65+ height: units.gu(100*0.9)
66+
67+ focus: true
68+
69+ property bool itemDestroyed: false
70+ sourceComponent: Component {
71+ DesktopStage {
72+ anchors.fill: parent
73+ windowStateStorage: fakeWindowStateStorage
74+ Component.onDestruction: {
75+ desktopStageLoader.itemDestroyed = true;
76+ }
77+ focus: true
78+ }
79+ }
80+ }
81+
82+ Rectangle {
83+ id: controls
84+ color: "darkgrey"
85+ width: units.gu(30)
86+ anchors {
87+ top: parent.top
88+ bottom: parent.bottom
89+ right: parent.right
90+ }
91+
92+ Column {
93+ anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
94+ spacing: units.gu(1)
95+ Repeater {
96+ model: ApplicationManager.availableApplications
97+ ApplicationCheckBox {
98+ appId: modelData
99+ }
100+ }
101+ }
102+ }
103+
104+ UnityTestCase {
105+ id: testCase
106+ name: "DesktopStage"
107+ when: windowShown
108+
109+ property Item desktopStage: desktopStageLoader.status === Loader.Ready ? desktopStageLoader.item : null
110+
111+ function init() {
112+ }
113+
114+ function cleanup() {
115+ desktopStageLoader.itemDestroyed = false;
116+ desktopStageLoader.active = false;
117+
118+ tryCompare(desktopStageLoader, "status", Loader.Null);
119+ tryCompare(desktopStageLoader, "item", null);
120+ // Loader.status might be Loader.Null and Loader.item might be null but the Loader
121+ // actually took place. Likely because Loader waits until the next event loop
122+ // iteration to do its work. So to ensure the reload, we will wait until the
123+ // Shell instance gets destroyed.
124+ tryCompare(desktopStageLoader, "itemDestroyed", true);
125+
126+ killAllRunningApps();
127+
128+ desktopStageLoader.active = true;
129+ tryCompare(desktopStageLoader, "status", Loader.Ready);
130+ }
131+
132+ function killAllRunningApps() {
133+ while (ApplicationManager.count > 1) {
134+ var appIndex = ApplicationManager.get(0).appId == "unity8-dash" ? 1 : 0
135+ ApplicationManager.stopApplication(ApplicationManager.get(appIndex).appId);
136+ }
137+ compare(ApplicationManager.count, 1)
138+ }
139+
140+ function waitUntilAppSurfaceShowsUp(appId) {
141+ var appWindow = findChild(desktopStage, "appWindow_" + appId);
142+ verify(appWindow);
143+ var appWindowStates = findInvisibleChild(appWindow, "applicationWindowStateGroup");
144+ verify(appWindowStates);
145+ tryCompare(appWindowStates, "state", "surface");
146+ }
147+
148+ function rectsIntersect(aLocal, bLocal) {
149+
150+ var a = aLocal.mapToItem(null, 0, 0, aLocal.width, aLocal.height);
151+ var b = bLocal.mapToItem(null, 0, 0, bLocal.width, bLocal.height);
152+
153+ return !((a.y+a.height) < b.y
154+ || a.y > (b.y+b.height)
155+ || (a.x+a.width) < b.x
156+ || a.x > (b.x+b.width));
157+ }
158+
159+ function test_tappingOnWindowChangesFocusedApp() {
160+ ApplicationManager.startApplication("webbrowser-app");
161+ waitUntilAppSurfaceShowsUp("webbrowser-app");
162+
163+ var webbrowserWindow = findChild(desktopStage, "appWindow_webbrowser-app");
164+ verify(webbrowserWindow);
165+ var dashWindow = findChild(desktopStage, "appWindow_unity8-dash");
166+ verify(dashWindow);
167+
168+ // some sanity check
169+ compare(rectsIntersect(dashWindow, webbrowserWindow), false);
170+
171+ tap(dashWindow);
172+ compare(dashWindow.application.session.surface.activeFocus, true);
173+
174+ tap(webbrowserWindow);
175+ compare(webbrowserWindow.application.session.surface.activeFocus, true);
176+ }
177+
178+ function test_tappingOnWindowTitleChangesFocusedApp() {
179+ ApplicationManager.startApplication("webbrowser-app");
180+ waitUntilAppSurfaceShowsUp("webbrowser-app");
181+
182+ var webbrowserWindow = findChild(desktopStage, "decoratedWindow_webbrowser-app");
183+ verify(webbrowserWindow);
184+ var webbrowserWindowTitle = findChild(webbrowserWindow, "windowDecorationTitle");
185+ verify(webbrowserWindowTitle);
186+ var dashWindow = findChild(desktopStage, "decoratedWindow_unity8-dash");
187+ verify(dashWindow);
188+ var dashWindowTitle = findChild(dashWindow, "windowDecorationTitle");
189+ verify(dashWindowTitle);
190+
191+ // some sanity check
192+ compare(rectsIntersect(dashWindow, webbrowserWindow), false);
193+
194+ tap(dashWindowTitle);
195+ compare(dashWindow.application.session.surface.activeFocus, true);
196+
197+ tap(webbrowserWindowTitle);
198+ compare(webbrowserWindow.application.session.surface.activeFocus, true);
199+ }
200+ }
201+}
tests/qmltests/Stages/tst_PhoneStage.qml+1−1
@@ -116,7 +116,7 @@ Item {
116116 function addApps(count) {
117117 if (count == undefined) count = 1;
118118 for (var i = 0; i < count; i++) {
119− var app = ApplicationManager.startApplication(ApplicationManager.availableApplications()[ApplicationManager.count])
119+ var app = ApplicationManager.startApplication(ApplicationManager.availableApplications[ApplicationManager.count])
120120 tryCompare(app, "state", ApplicationInfoInterface.Running)
121121 var spreadView = findChild(phoneStage, "spreadView");
122122 tryCompare(spreadView, "contentX", -spreadView.shift);
tests/qmltests/Wizard/tst_Wizard.qml+18−1
@@ -1,5 +1,5 @@
11/*
2− * Copyright 2014 Canonical Ltd.
2+ * Copyright 2014,2015 Canonical Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -285,6 +285,23 @@ Item {
285285 waitForPage("simPage");
286286 }
287287
288+ function test_simWaitTimeout() {
289+ MockQOfono.setModems(["a"], [false], [false]);
290+
291+ // Go to SIM page, which will be waiting for skip to be valid
292+ var page = goToPage("languagePage");
293+ tap(findChild(page, "forwardButton"));
294+ verifyPageIsBlocked("simPage");
295+
296+ var timeout = findInvisibleChild(wizard, "timeout");
297+ timeout.interval = 100; // reduce our delay
298+
299+ // Now just wait for timeout
300+ compare(timeout.running, true);
301+ waitForPage("passwdPage");
302+ compare(timeout.running, false);
303+ }
304+
288305 function enterPasscode(passcode) {
289306 for (var i = 0; i < passcode.length; ++i) {
290307 var character = passcode.charAt(i);
tests/qmltests/tst_Shell.qml+49
@@ -31,6 +31,7 @@ import Unity.Indicators 0.1
3131import Unity.Notifications 1.0
3232import Unity.Test 0.1
3333import Powerd 0.1
34+import Wizard 0.1 as Wizard
3435
3536import "../../qml"
3637
@@ -289,6 +290,7 @@ Rectangle {
289290 setLightDMMockMode("single"); // back to the default value
290291
291292 AccountsService.demoEdges = false;
293+ Wizard.System.wizardEnabled = false;
292294
293295 // kill all (fake) running apps
294296 killApps(ApplicationManager);
@@ -535,6 +537,7 @@ Rectangle {
535537 tryCompare(userlist, "currentIndex", next)
536538 tryCompare(userlist, "movingInternally", false)
537539 }
540+ tryCompare(shell, "enabled", true); // wait for PAM to settle
538541 }
539542
540543 function selectUser(name) {
@@ -941,6 +944,52 @@ Rectangle {
941944 tryCompare(unlockAllModemsSpy, "count", 1)
942945 }
943946
947+ function test_unlockAllModemsAfterWizard() {
948+ Wizard.System.wizardEnabled = true;
949+ loadShell("phone");
950+
951+ var wizard = findChild(shell, "wizard");
952+ compare(wizard.active, true);
953+ compare(Wizard.System.wizardEnabled, true);
954+ compare(unlockAllModemsSpy.count, 0);
955+
956+ wizard.hide();
957+ tryCompare(wizard, "active", false);
958+ compare(Wizard.System.wizardEnabled, false);
959+ compare(unlockAllModemsSpy.count, 1);
960+ }
961+
962+ function test_wizardEarlyExit() {
963+ Wizard.System.wizardEnabled = true;
964+ AccountsService.demoEdges = true;
965+ loadShell("phone");
966+
967+ var wizard = findChild(shell, "wizard");
968+ var tutorial = findChild(shell, "tutorial");
969+ tryCompare(wizard, "active", true);
970+ tryCompare(tutorial, "running", true);
971+ tryCompare(ApplicationManager, "focusedApplicationId", "unity8-dash");
972+
973+ // Make sure we stay running when nothing focused (can happen for
974+ // a moment when we restart the dash after switching language)
975+ ApplicationManager.stopApplication("unity8-dash");
976+ tryCompare(ApplicationManager, "focusedApplicationId", "");
977+ compare(wizard.shown, true);
978+ compare(tutorial.running, true);
979+
980+ // And make sure we stay running when dash focused again
981+ ApplicationManager.startApplication("unity8-dash");
982+ tryCompare(ApplicationManager, "focusedApplicationId", "unity8-dash");
983+ compare(wizard.shown, true);
984+ compare(tutorial.running, true);
985+
986+ // And make sure we stop when something else is focused
987+ ApplicationManager.startApplication("gallery-app");
988+ tryCompare(ApplicationManager, "focusedApplicationId", "gallery-app");
989+ compare(wizard.shown, false);
990+ compare(tutorial.running, false);
991+ }
992+
944993 function test_tapOnRightEdgeReachesApplicationSurface() {
945994 loadShell("phone");
946995 swipeAwayGreeter();
tests/utils/modules/Unity/Test/UnityTestCase.qml+29−6
@@ -23,12 +23,22 @@ TestCase {
2323 id: testCase
2424 TestUtil {id:util}
2525
26− ActivityIndicator {
27− visible: testCase.running
28− anchors.centerIn: parent
29− Component.onCompleted: parent = testCase.parent
30− z: 100
31− running: visible
26+ // This is needed for waitForRendering calls to return
27+ // if the watched element already got rendered
28+ Rectangle {
29+ width: units.gu(1)
30+ height: width
31+ parent: testCase.parent
32+ border { width: units.dp(1); color: "black" }
33+ opacity: 0.6
34+
35+ RotationAnimation on rotation {
36+ running: true
37+ from: 0
38+ to: 360
39+ loops: Animation.Infinite
40+ duration: 1000
41+ }
3242 }
3343
3444 // Fake implementation to be provided to items under test
@@ -221,6 +231,19 @@ TestCase {
221231 }
222232 }
223233
234+ function flickToYEnd(item) {
235+ var i = 0;
236+ var x = item.width / 2;
237+ var y = item.height - units.gu(1);
238+ var toY = units.gu(1);
239+ while (i < 5 && !item.atYEnd) {
240+ touchFlick(item, x, y, x, toY);
241+ tryCompare(item, "moving", false);
242+ ++i;
243+ }
244+ tryCompare(item, "atYEnd", true);
245+ }
246+
224247 function touchEvent(item) {
225248 return UT.Util.touchEvent(item)
226249 }
tools/registry-tracker.cpp+2
@@ -75,6 +75,8 @@ void RegistryTracker::runRegistry()
7575 return;
7676 }
7777
78+ // FIXME At the moment we use pkg-config but ideally the library
79+ // would just have a function that returns these values
7880 QString scopeInstallDir;
7981 QString scopeRegistryBin;
8082 QString scopeRunnerBin;