on xenial help sign in
merge prereq
b168494Lukáš Tinkl
CMakeLists.txt+1−1
@@ -131,7 +131,7 @@ if(NOT QUIET_LOGGER)
131 set(STDOUT_LOGGER "-o" "-,txt")
131 set(STDOUT_LOGGER "-o" "-,txt")
132endif()
132endif()
133
133
134−execute_process(COMMAND arch OUTPUT_VARIABLE ARCH)
134+execute_process(COMMAND dpkg-architecture -qDEB_HOST_ARCH OUTPUT_VARIABLE ARCH)
135if (NOT ARCH MATCHES "arm*")
135if (NOT ARCH MATCHES "arm*")
136 set(ENABLE_TOUCH_EMULATION true)
136 set(ENABLE_TOUCH_EMULATION true)
137 add_definitions(-DUNITY8_ENABLE_TOUCH_EMULATION)
137 add_definitions(-DUNITY8_ENABLE_TOUCH_EMULATION)
cmake/modules/QmlTest.cmake+1−1
@@ -183,7 +183,7 @@ function(add_manual_test COMPONENT_NAME TARGET)
183 cmake_parse_arguments(QMLTEST "${QMLTEST_OPTIONS}" "${QMLTEST_SINGLE}" "${QMLTEST_MULTI}" ${ARGN})
183 cmake_parse_arguments(QMLTEST "${QMLTEST_OPTIONS}" "${QMLTEST_SINGLE}" "${QMLTEST_MULTI}" ${ARGN})
184 mangle_arguments()
184 mangle_arguments()
185
185
186− bake_arguments("${QMLTEST_ARG_PREFIX}" args -qmljsdebugger=port:3768)
186+ bake_arguments("${QMLTEST_ARG_PREFIX}" args -qmljsdebugger=port:3768,3800)
187
187
188 set(qmltry_command
188 set(qmltry_command
189 $<TARGET_FILE:${TARGET}>
189 $<TARGET_FILE:${TARGET}>
data/com.canonical.Unity8.gschema.xml+11
@@ -27,6 +27,17 @@
27 <summary>Maximum push needed to overcome edge barrier</summary>
27 <summary>Maximum push needed to overcome edge barrier</summary>
28 <description>How much you have to push (in grid units) the mouse against an edge barrier when sensibility is 1.</description>
28 <description>How much you have to push (in grid units) the mouse against an edge barrier when sensibility is 1.</description>
29 </key>
29 </key>
30+ <key type="b" name="autohide-launcher">
31+ <default>true</default>
32+ <summary>Autohide the launcher</summary>
33+ <description>This will only be applied in windowed mode. In staged mode, the launcher will always hide.</description>
34+ </key>
35+ <key type="u" name="launcher-width">
36+ <default>8</default>
37+ <range min="6" max="12"/>
38+ <summary>Width of the launcher in grid units.</summary>
39+ <description>Changes the width of the launcher in all usage modes.</description>
40+ </key>
30 </schema>
41 </schema>
31
42
32 <schema path="/com/canonical/unity8/greeter/" id="com.canonical.Unity8.Greeter" gettext-domain="unity8">
43 <schema path="/com/canonical/unity8/greeter/" id="com.canonical.Unity8.Greeter" gettext-domain="unity8">
data/unity8-dash.conf+1
@@ -14,6 +14,7 @@ kill timeout 120
14oom score 50
14oom score 50
15
15
16respawn
16respawn
17+respawn limit unlimited
17
18
18env APP_ID=unity8-dash
19env APP_ID=unity8-dash
19
20
debian/changelog+126
@@ -1,3 +1,129 @@
1+unity8 (8.11+16.04.20160310.4-0ubuntu1) xenial; urgency=medium
2+
3+ [ Albert Astals Cid ]
4+ * Add context for Re-dock as asked by translators (LP: #1534608)
5+ * Add emblem to the preview header widget (LP: #1424720)
6+ * Add haptics to ScopesListCategoryItem buttons
7+ * Audio Cards: Make some of the image loading async (LP: #1533432)
8+ * Do not create fallback code for the card tool fake card (LP:
9+ #1545865)
10+ * Fix resizing the dash bringing temp scopes size out of sync (LP:
11+ #1543130)
12+ * Minor fixes for unity-scope-tool
13+ * Resolve title alignment on card creator time instead of on runtime
14+ * Use fixedHeaderHeight only in the non cardtool cards
15+ * Use the new undeprecated connectivityqt::Connectivity
16+ * asynchronous is only false on the fake card in cardtool
17+ * clazy fixes
18+
19+ [ Albert Astals Cid, CI Train Bot ]
20+ * click scope: Add the else branch so we reset the card size in all
21+ situations
22+
23+ [ Andrea Cimitan ]
24+ * PreviewSharing widget now accepts both string and array of
25+ widgetData["share-data"]["uri"] (LP: #1549056)
26+ * Update AP tests for new single preview
27+ * Use Text.Wrap for body notification text (LP: #1544909)
28+
29+ [ Andrea Cimitan, Lukáš Tinkl, Michael Zanetti, Nick Dedekind ]
30+ * some fixes for the new palette (LP: #1554616)
31+
32+ [ CI Train Bot ]
33+ * Resync trunk.
34+ * Update translation template
35+
36+ [ CI Train Bot, Daniel d'Andrada ]
37+ * Ensure the QML engine doesn't delete our mock MirSurfaces on its
38+ own.
39+
40+ [ Daniel d'Andrada ]
41+ * tst_Shell: Remove unused qml items
42+
43+ [ Josh Arenson ]
44+ * Allow the shell to blacklist input devices and force the OSK shown.
45+ (LP: #1542224)
46+
47+ [ Lukáš Tinkl ]
48+ * Disallow resizing windows up, past the Panel (LP: #1544766)
49+ * Elide the window title not to let it overflow into the indicators
50+ area (LP: #1535767)
51+ * Enable the PIN lockscreen to be used with a HW keyboard (LP:
52+ #1550359)
53+ * Fix tiny windows when switching stages
54+ * Provide a range of ports to QML JS Debugger
55+ * Watch for launcher item icon changes (LP: #1543290)
56+
57+ [ Michael Terry ]
58+ * Proxy more mouse and touchpad properties to USC (LP: #1540398) (LP:
59+ #1543344, #1540398)
60+ * Refactor the AccountsService plugin and make it slightly faster.
61+ * To let the user log in if a mouse is connected, hide the greeter
62+ cover page on a mouse click (but NOT a touch click). (LP: #1540497)
63+ * Watch AccountsService for changes to the user's real name. This was
64+ preventing us from noticing when the user set their name in the
65+ welcome wizard.
66+
67+ [ Michael Zanetti ]
68+ * Allow alt+tabbing in staged mode too (LP: #1540502)
69+ * Allow invoking the staged mode spreads by mouse right edge pushes
70+ too (LP: #1540392)
71+ * Allow loading the device configuration from an external file
72+ * Implement Launcher's keyboard navigation and updated pip design
73+ * Make launcher scalable, allow it locking (LP: #1511015)
74+ * Properly parent launcher items in all cases (LP: #1495732)
75+ * Read inputMethod surface from the new property int QtMir (LP:
76+ #1545286)
77+ * Some visual updates and rotation lock for the virtual touchpad (LP:
78+ #1549087)
79+ * Visual updates for the windowed spread (LP: #1488148)
80+ * stabilize swipeAwayGreeter()
81+
82+ [ Michał Sawicz ]
83+ * Add udev rules to make sure we have access to uinput
84+ * Make dash respawn indefinitely (LP: #1550056)
85+ * Use dpkg-architecture, not arch, to disable touch emulation
86+
87+ [ Vesa Rautiainen ]
88+ * Fixing the vertical position of desktop spread item icon.
89+
90+ -- Michał Sawicz <michal.sawicz@canonical.com> Thu, 10 Mar 2016 22:44:16 +0000
91+
92+unity8 (8.11+16.04.20160308-0ubuntu1) xenial; urgency=medium
93+
94+ [ Albert Astals Cid ]
95+ * Make these tests pass with the new SDK
96+
97+ [ Andrea Cimitan, Nick Dedekind ]
98+ * replace selected.backgroundText with normal.backgroundText in
99+ Splash, Notifications, Wizard
100+
101+ [ CI Train Bot ]
102+ * Update translation template
103+
104+ [ Michał Sawicz, Nick Dedekind ]
105+ * Fixed colours palette value set. Moved ModemItem to USC.
106+
107+ [ Michał Sawicz, Tim Peeters ]
108+ * Update headers for Dash and Splash to work properly with the new UI
109+ toolkit release.
110+
111+ [ Zoltán Balogh, Zsombor Egri ]
112+ * Use SuruDark theme instead of the deprecated SuruGradient.
113+
114+ -- Zoltan Balogh <zoltan.balogh@canonical.com> Tue, 08 Mar 2016 20:59:34 +0000
115+
116+unity8 (8.11+16.04.20160307-0ubuntu1) xenial; urgency=medium
117+
118+ [ CI Train Bot ]
119+ * Resync trunk.
120+ * Update translation template
121+
122+ [ Rodney Dawes ]
123+ * Re-enable the purchaseCancelled signal.
124+
125+ -- Rodney Dawes <ci-train-bot@canonical.com> Mon, 07 Mar 2016 14:12:08 +0000
126+
1unity8 (8.11+16.04.20160301-0ubuntu1) xenial; urgency=medium
127unity8 (8.11+16.04.20160301-0ubuntu1) xenial; urgency=medium
2
128
3 [ Albert Astals Cid ]
129 [ Albert Astals Cid ]
debian/control+9−8
@@ -13,7 +13,7 @@ Build-Depends: cmake,
13 libandroid-properties-dev,
13 libandroid-properties-dev,
14 graphviz,
14 graphviz,
15 gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
15 gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
16− libconnectivity-qt1-dev,
16+ libconnectivity-qt1-dev (>= 0.7.1),
17 libevdev-dev,
17 libevdev-dev,
18 libgl1-mesa-dev[!armhf] | libgl-dev[!armhf],
18 libgl1-mesa-dev[!armhf] | libgl-dev[!armhf],
19 libgl1-mesa-dri,
19 libgl1-mesa-dri,
@@ -54,8 +54,8 @@ Build-Depends: cmake,
54 qtdeclarative5-private-dev (>= 5.4),
54 qtdeclarative5-private-dev (>= 5.4),
55 qtdeclarative5-qtmultimedia-plugin (>= 5.4.1-1ubuntu19~overlay2),
55 qtdeclarative5-qtmultimedia-plugin (>= 5.4.1-1ubuntu19~overlay2),
56 qtdeclarative5-ubuntu-content1,
56 qtdeclarative5-ubuntu-content1,
57− qtdeclarative5-ubuntu-settings-components (>= 0.6),
57+ qtdeclarative5-ubuntu-settings-components (>= 0.7),
58− qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3.1676) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3.1676),
58+ qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3.1845) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3.1845),
59 qtdeclarative5-ubuntu-web-plugin,
59 qtdeclarative5-ubuntu-web-plugin,
60 ttf-ubuntu-font-family,
60 ttf-ubuntu-font-family,
61Standards-Version: 3.9.4
61Standards-Version: 3.9.4
@@ -70,7 +70,7 @@ X-Ubuntu-Use-Langpack: yes
70Package: indicators-client
70Package: indicators-client
71Architecture: amd64 armhf i386
71Architecture: amd64 armhf i386
72Depends: qmenumodel-qml (>= 0.2.9),
72Depends: qmenumodel-qml (>= 0.2.9),
73− qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3.1627) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3.1627),
73+ qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3.1845) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3.1845),
74 unity8 (= ${binary:Version}),
74 unity8 (= ${binary:Version}),
75 ${misc:Depends},
75 ${misc:Depends},
76 ${shlibs:Depends},
76 ${shlibs:Depends},
@@ -101,7 +101,6 @@ Depends: dmz-cursor-theme,
101 qml-module-qt-labs-folderlistmodel,
101 qml-module-qt-labs-folderlistmodel,
102 qml-module-qtquick-xmllistmodel,
102 qml-module-qtquick-xmllistmodel,
103 qml-module-qtsysteminfo,
103 qml-module-qtsysteminfo,
104− qtdeclarative5-gsettings1.0,
105 qtdeclarative5-qtmir-plugin (>= 0.4.5),
104 qtdeclarative5-qtmir-plugin (>= 0.4.5),
106 qtdeclarative5-ubuntu-telephony0.1,
105 qtdeclarative5-ubuntu-telephony0.1,
107 qtdeclarative5-ubuntu-web-plugin,
106 qtdeclarative5-ubuntu-web-plugin,
@@ -126,9 +125,9 @@ Description: Unity 8 shell
126Package: unity8-common
125Package: unity8-common
127Architecture: all
126Architecture: all
128Depends: qml-module-qtquick-layouts,
127Depends: qml-module-qtquick-layouts,
129− qtdeclarative5-ubuntu-settings-components (>= 0.6),
128+ qtdeclarative5-ubuntu-settings-components (>= 0.7),
130 qtdeclarative5-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
129 qtdeclarative5-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
131− qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3.1627) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3.1627),
130+ qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3.1845) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3.1845),
132 qtdeclarative5-unity-notifications-plugin (>= 0.1.2) | unity-notifications-impl,
131 qtdeclarative5-unity-notifications-plugin (>= 0.1.2) | unity-notifications-impl,
133 ubuntu-thumbnailer-impl-0,
132 ubuntu-thumbnailer-impl-0,
134 unity-application-impl-13,
133 unity-application-impl-13,
@@ -159,7 +158,7 @@ Depends: autopilot-qt5 (>= 1.4),
159 python3-fixtures,
158 python3-fixtures,
160 python3-gi,
159 python3-gi,
161 qttestability-autopilot (>= 1.4),
160 qttestability-autopilot (>= 1.4),
162− ubuntu-ui-toolkit-autopilot (>= 1.2.1485+15.04.20150417.1-0ubuntu1),
161+ ubuntu-ui-toolkit-autopilot (>= 1.3.1845),
163 unity-scope-click,
162 unity-scope-click,
164 unity8 (= ${source:Version}),
163 unity8 (= ${source:Version}),
165 unity8-fake-env (= ${source:Version}),
164 unity8-fake-env (= ${source:Version}),
@@ -193,6 +192,8 @@ Depends: accountsservice-ubuntu-schemas (>= 0.0.5),
193 libhardware2,
192 libhardware2,
194 pay-service,
193 pay-service,
195 unity-schemas (>= 7.3.1+14.10.20140915),
194 unity-schemas (>= 7.3.1+14.10.20140915),
195+ qtdeclarative5-gsettings1.0,
196+ qml-module-qtmultimedia,
196 ${misc:Depends},
197 ${misc:Depends},
197 ${shlibs:Depends},
198 ${shlibs:Depends},
198Provides: unity-launcher-impl,
199Provides: unity-launcher-impl,
debian/unity8-common.udevnew file+2
@@ -0,0 +1,2 @@
1+# Make local foreground session able to inject input
2+KERNEL=="uinput", SUBSYSTEM=="misc", TAG+="uaccess"
debian/unity8-doc.install+1
@@ -1 +1,2 @@
1+doc/devices.conf usr/share/doc/unity8/
1usr/share/doc/unity8/*
2usr/share/doc/unity8/*
doc/devices.confnew file+30
@@ -0,0 +1,30 @@
1+# This file can hold multiple device configs. Devices are separated by sections.
2+#
3+# SupportedOrientations holds a list of all enabled orientations. A standard
4+# phone will usually have Portrait,Landcape,InvertedLandscape in order to
5+# disable upside down usage.
6+#
7+# PrimaryOrientation gives the orientation the device will start up with
8+# when there is no orientations sensor input available (yet) or lock to
9+# when an application specifies to be locked to PrimaryOrientation.
10+#
11+# The other Orientation settings can be used to re-map the orientations.
12+# A device might be used with different orientations than how the screen
13+# is physically mounted on the hardware.
14+#
15+# Category can be phone, tablet, or desktop. This option determines
16+# whether the side stage is shown (tablet) or not (phone). Using
17+# desktop will load the shell in windowed mode. Note that the user
18+# can override/change this by connecting input hardware or change
19+# user settings.
20+#
21+# Any options not listed will default to the values of the example below.
22+
23+[devicename]
24+SupportedOrientations=Portrait,InvertedPortrait,Landscape,InvertedLandscape
25+PrimaryOrientation=PrimaryOrienation
26+PortraitOrientation=Portrait
27+InvertedPortraitOrientation=InvertedPortrait
28+LandscapeOrientation=Landscape
29+InvertedLandscapeOrientation=InvertedLandscape
30+Category=phone
plugins/AccountsService/AccountsService.cpp+189−342
@@ -24,17 +24,52 @@
24#include <QStringList>
24#include <QStringList>
25#include <QDebug>
25#include <QDebug>
26
26
27+#define IFACE_ACCOUNTS_USER QStringLiteral("org.freedesktop.Accounts.User")
28+#define IFACE_LOCATION_HERE QStringLiteral("com.ubuntu.location.providers.here.AccountsService")
29+#define IFACE_UBUNTU_INPUT QStringLiteral("com.ubuntu.AccountsService.Input")
30+#define IFACE_UBUNTU_SECURITY QStringLiteral("com.ubuntu.AccountsService.SecurityPrivacy")
31+#define IFACE_UBUNTU_SECURITY_OLD QStringLiteral("com.ubuntu.touch.AccountsService.SecurityPrivacy")
32+#define IFACE_UNITY QStringLiteral("com.canonical.unity.AccountsService")
33+#define IFACE_UNITY_PRIVATE QStringLiteral("com.canonical.unity.AccountsService.Private")
34+
35+#define PROP_BACKGROUND_FILE QStringLiteral("BackgroundFile")
36+#define PROP_DEMO_EDGES QStringLiteral("demo-edges")
37+#define PROP_ENABLE_INDICATORS_WHILE_LOCKED QStringLiteral("EnableIndicatorsWhileLocked")
38+#define PROP_ENABLE_LAUNCHER_WHILE_LOCKED QStringLiteral("EnableLauncherWhileLocked")
39+#define PROP_FAILED_LOGINS QStringLiteral("FailedLogins")
40+#define PROP_LICENSE_ACCEPTED QStringLiteral("LicenseAccepted")
41+#define PROP_LICENSE_BASE_PATH QStringLiteral("LicenseBasePath")
42+#define PROP_MOUSE_CURSOR_SPEED QStringLiteral("MouseCursorSpeed")
43+#define PROP_MOUSE_DOUBLE_CLICK_SPEED QStringLiteral("MouseDoubleClickSpeed")
44+#define PROP_MOUSE_PRIMARY_BUTTON QStringLiteral("MousePrimaryButton")
45+#define PROP_MOUSE_SCROLL_SPEED QStringLiteral("MouseScrollSpeed")
46+#define PROP_PASSWORD_DISPLAY_HINT QStringLiteral("PasswordDisplayHint")
47+#define PROP_STATS_WELCOME_SCREEN QStringLiteral("StatsWelcomeScreen")
48+#define PROP_TOUCHPAD_CURSOR_SPEED QStringLiteral("TouchpadCursorSpeed")
49+#define PROP_TOUCHPAD_DISABLE_WHILE_TYPING QStringLiteral("TouchpadDisableWhileTyping")
50+#define PROP_TOUCHPAD_DISABLE_WITH_MOUSE QStringLiteral("TouchpadDisableWithMouse")
51+#define PROP_TOUCHPAD_DOUBLE_CLICK_SPEED QStringLiteral("TouchpadDoubleClickSpeed")
52+#define PROP_TOUCHPAD_PRIMARY_BUTTON QStringLiteral("TouchpadPrimaryButton")
53+#define PROP_TOUCHPAD_SCROLL_SPEED QStringLiteral("TouchpadScrollSpeed")
54+#define PROP_TOUCHPAD_TAP_TO_CLICK QStringLiteral("TouchpadTapToClick")
55+#define PROP_TOUCHPAD_TWO_FINGER_SCROLL QStringLiteral("TouchpadTwoFingerScroll")
56+
57+
58+QVariant primaryButtonConverter(const QVariant &value)
59+{
60+ QString stringValue = value.toString();
61+ if (stringValue == "left") {
62+ return QVariant::fromValue(0);
63+ } else if (stringValue == "right") {
64+ return QVariant::fromValue(1); // Mir is less clear on this -- any non-zero value is the same
65+ } else {
66+ return QVariant::fromValue(0); // default to left
67+ }
68+}
69+
27AccountsService::AccountsService(QObject* parent, const QString &user)
70AccountsService::AccountsService(QObject* parent, const QString &user)
28− : QObject(parent),
71+ : QObject(parent)
29− m_service(new AccountsServiceDBusAdaptor(this)),
72+ , m_service(new AccountsServiceDBusAdaptor(this))
30− m_demoEdges(false),
31− m_enableLauncherWhileLocked(false),
32− m_enableIndicatorsWhileLocked(false),
33− m_statsWelcomeScreen(false),
34− m_passwordDisplayHint(Keyboard),
35− m_failedLogins(0),
36− m_hereEnabled(false),
37− m_hereLicensePath() // null means not set yet
38{
73{
39 m_unityInput = new QDBusInterface(QStringLiteral("com.canonical.Unity.Input"),
74 m_unityInput = new QDBusInterface(QStringLiteral("com.canonical.Unity.Input"),
40 QStringLiteral("/com/canonical/Unity/Input"),
75 QStringLiteral("/com/canonical/Unity/Input"),
@@ -44,6 +79,43 @@ AccountsService::AccountsService(QObject* parent, const QString &user)
44 connect(m_service, &AccountsServiceDBusAdaptor::propertiesChanged, this, &AccountsService::onPropertiesChanged);
79 connect(m_service, &AccountsServiceDBusAdaptor::propertiesChanged, this, &AccountsService::onPropertiesChanged);
45 connect(m_service, &AccountsServiceDBusAdaptor::maybeChanged, this, &AccountsService::onMaybeChanged);
80 connect(m_service, &AccountsServiceDBusAdaptor::maybeChanged, this, &AccountsService::onMaybeChanged);
46
81
82+ registerProperty(IFACE_ACCOUNTS_USER, PROP_BACKGROUND_FILE, QStringLiteral("backgroundFileChanged"));
83+ registerProperty(IFACE_LOCATION_HERE, PROP_LICENSE_ACCEPTED, QStringLiteral("hereEnabledChanged"));
84+ registerProperty(IFACE_LOCATION_HERE, PROP_LICENSE_BASE_PATH, QStringLiteral("hereLicensePathChanged"));
85+ registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_LAUNCHER_WHILE_LOCKED, QStringLiteral("enableLauncherWhileLockedChanged"));
86+ registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_INDICATORS_WHILE_LOCKED, QStringLiteral("enableIndicatorsWhileLockedChanged"));
87+ registerProperty(IFACE_UBUNTU_SECURITY, PROP_PASSWORD_DISPLAY_HINT, QStringLiteral("passwordDisplayHintChanged"));
88+ registerProperty(IFACE_UBUNTU_SECURITY_OLD, PROP_STATS_WELCOME_SCREEN, QStringLiteral("statsWelcomeScreenChanged"));
89+ registerProperty(IFACE_UNITY, PROP_DEMO_EDGES, QStringLiteral("demoEdgesChanged"));
90+ registerProperty(IFACE_UNITY_PRIVATE, PROP_FAILED_LOGINS, QStringLiteral("failedLoginsChanged"));
91+
92+ registerProxy(IFACE_UBUNTU_INPUT, PROP_MOUSE_CURSOR_SPEED,
93+ m_unityInput, QStringLiteral("setMouseCursorSpeed"));
94+ registerProxy(IFACE_UBUNTU_INPUT, PROP_MOUSE_DOUBLE_CLICK_SPEED,
95+ m_unityInput, QStringLiteral("setMouseDoubleClickSpeed"));
96+ registerProxy(IFACE_UBUNTU_INPUT, PROP_MOUSE_PRIMARY_BUTTON,
97+ m_unityInput, QStringLiteral("setMousePrimaryButton"),
98+ primaryButtonConverter);
99+ registerProxy(IFACE_UBUNTU_INPUT, PROP_MOUSE_SCROLL_SPEED,
100+ m_unityInput, QStringLiteral("setMouseScrollSpeed"));
101+ registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_CURSOR_SPEED,
102+ m_unityInput, QStringLiteral("setTouchpadCursorSpeed"));
103+ registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_SCROLL_SPEED,
104+ m_unityInput, QStringLiteral("setTouchpadScrollSpeed"));
105+ registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_DISABLE_WHILE_TYPING,
106+ m_unityInput, QStringLiteral("setTouchpadDisableWhileTyping"));
107+ registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_DISABLE_WITH_MOUSE,
108+ m_unityInput, QStringLiteral("setTouchpadDisableWithMouse"));
109+ registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_DOUBLE_CLICK_SPEED,
110+ m_unityInput, QStringLiteral("setTouchpadDoubleClickSpeed"));
111+ registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_PRIMARY_BUTTON,
112+ m_unityInput, QStringLiteral("setTouchpadPrimaryButton"),
113+ primaryButtonConverter);
114+ registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_TAP_TO_CLICK,
115+ m_unityInput, QStringLiteral("setTouchpadTapToClick"));
116+ registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_TWO_FINGER_SCROLL,
117+ m_unityInput, QStringLiteral("setTouchpadTwoFingerScroll"));
118+
47 setUser(!user.isEmpty() ? user : QString::fromUtf8(qgetenv("USER")));
119 setUser(!user.isEmpty() ? user : QString::fromUtf8(qgetenv("USER")));
48}
120}
49
121
@@ -57,410 +129,200 @@ void AccountsService::setUser(const QString &user)
57 if (user.isEmpty() || m_user == user)
129 if (user.isEmpty() || m_user == user)
58 return;
130 return;
59
131
132+ bool wasEmpty = m_user.isEmpty();
133+
60 m_user = user;
134 m_user = user;
61 Q_EMIT userChanged();
135 Q_EMIT userChanged();
62
136
63− updateDemoEdges(false);
137+ // Do the first update synchronously, as a cheap way to block rendering
64− updateEnableLauncherWhileLocked(false);
138+ // until we have the right values on bootup.
65− updateEnableIndicatorsWhileLocked(false);
139+ refresh(!wasEmpty);
66− updateBackgroundFile(false);
67− updateMouseCursorSpeed();
68− updateTouchpadCursorSpeed();
69− updateStatsWelcomeScreen(false);
70− updatePasswordDisplayHint(false);
71− updateFailedLogins(false);
72− updateHereEnabled(false);
73− updateHereLicensePath(false);
74}
140}
75
141
76bool AccountsService::demoEdges() const
142bool AccountsService::demoEdges() const
77{
143{
78− return m_demoEdges;
144+ auto value = getProperty(IFACE_UNITY, PROP_DEMO_EDGES);
145+ return value.toBool();
79}
146}
80
147
81void AccountsService::setDemoEdges(bool demoEdges)
148void AccountsService::setDemoEdges(bool demoEdges)
82{
149{
83− if (m_demoEdges != demoEdges) {
150+ setProperty(IFACE_UNITY, PROP_DEMO_EDGES, demoEdges);
84− m_demoEdges = demoEdges;
85− m_service->setUserPropertyAsync(m_user, QStringLiteral("com.canonical.unity.AccountsService"), QStringLiteral("demo-edges"), demoEdges);
86−
87− Q_EMIT demoEdgesChanged();
88− }
89}
151}
90
152
91bool AccountsService::enableLauncherWhileLocked() const
153bool AccountsService::enableLauncherWhileLocked() const
92{
154{
93− return m_enableLauncherWhileLocked;
155+ auto value = getProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_LAUNCHER_WHILE_LOCKED);
156+ return value.toBool();
94}
157}
95
158
96bool AccountsService::enableIndicatorsWhileLocked() const
159bool AccountsService::enableIndicatorsWhileLocked() const
97{
160{
98− return m_enableIndicatorsWhileLocked;
161+ auto value = getProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_INDICATORS_WHILE_LOCKED);
162+ return value.toBool();
99}
163}
100
164
101QString AccountsService::backgroundFile() const
165QString AccountsService::backgroundFile() const
102{
166{
103− return m_backgroundFile;
167+ auto value = getProperty(IFACE_ACCOUNTS_USER, PROP_BACKGROUND_FILE);
168+ return value.toString();
104}
169}
105
170
106bool AccountsService::statsWelcomeScreen() const
171bool AccountsService::statsWelcomeScreen() const
107{
172{
108− return m_statsWelcomeScreen;
173+ auto value = getProperty(IFACE_UBUNTU_SECURITY_OLD, PROP_STATS_WELCOME_SCREEN);
174+ return value.toBool();
109}
175}
110
176
111AccountsService::PasswordDisplayHint AccountsService::passwordDisplayHint() const
177AccountsService::PasswordDisplayHint AccountsService::passwordDisplayHint() const
112{
178{
113− return m_passwordDisplayHint;
179+ auto value = getProperty(IFACE_UBUNTU_SECURITY, PROP_PASSWORD_DISPLAY_HINT);
180+ return (PasswordDisplayHint)value.toInt();
114}
181}
115
182
116bool AccountsService::hereEnabled() const
183bool AccountsService::hereEnabled() const
117{
184{
118− return m_hereEnabled;
185+ auto value = getProperty(IFACE_LOCATION_HERE, PROP_LICENSE_ACCEPTED);
186+ return value.toBool();
119}
187}
120
188
121void AccountsService::setHereEnabled(bool enabled)
189void AccountsService::setHereEnabled(bool enabled)
122{
190{
123− if (m_hereEnabled != enabled) {
191+ setProperty(IFACE_LOCATION_HERE, PROP_LICENSE_ACCEPTED, enabled);
124− m_hereEnabled = enabled;
125− m_service->setUserPropertyAsync(m_user, QStringLiteral("com.ubuntu.location.providers.here.AccountsService"), QStringLiteral("LicenseAccepted"), enabled);
126−
127− Q_EMIT hereEnabledChanged();
128− }
129}
192}
130
193
131QString AccountsService::hereLicensePath() const
194QString AccountsService::hereLicensePath() const
132{
195{
133− return m_hereLicensePath;
196+ auto value = getProperty(IFACE_LOCATION_HERE, PROP_LICENSE_BASE_PATH);
197+ QString hereLicensePath = value.toString();
198+ if (hereLicensePath.isEmpty() || !QFile::exists(hereLicensePath))
199+ hereLicensePath = QStringLiteral("");
200+ return hereLicensePath;
134}
201}
135
202
136bool AccountsService::hereLicensePathValid() const
203bool AccountsService::hereLicensePathValid() const
137{
204{
138− return !m_hereLicensePath.isNull();
205+ auto value = getProperty(IFACE_LOCATION_HERE, PROP_LICENSE_BASE_PATH);
139−}
206+ return !value.toString().isNull();
140−
141−void AccountsService::updateDemoEdges(bool async)
142−{
143− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
144− QStringLiteral("com.canonical.unity.AccountsService"),
145− QStringLiteral("demo-edges"));
146− QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
147−
148− connect(watcher, &QDBusPendingCallWatcher::finished,
149− this, [this](QDBusPendingCallWatcher* watcher) {
150−
151− QDBusPendingReply<QDBusVariant> reply = *watcher;
152− watcher->deleteLater();
153− if (reply.isError()) {
154− qWarning() << "Failed to get 'demo-edges' property - " << reply.error().message();
155− return;
156− }
157−
158− auto demoEdges = reply.value().variant().toBool();
159− if (m_demoEdges != demoEdges) {
160− m_demoEdges = demoEdges;
161− Q_EMIT demoEdgesChanged();
162− }
163− });
164− if (!async) {
165− watcher->waitForFinished();
166− delete watcher;
167− }
168}
207}
169
208
170−void AccountsService::updateEnableLauncherWhileLocked(bool async)
209+uint AccountsService::failedLogins() const
171{
210{
172− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
211+ return getProperty(IFACE_UNITY_PRIVATE, PROP_FAILED_LOGINS).toUInt();
173− QStringLiteral("com.ubuntu.AccountsService.SecurityPrivacy"),
174− QStringLiteral("EnableLauncherWhileLocked"));
175− QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
176−
177− connect(watcher, &QDBusPendingCallWatcher::finished,
178− this, [this](QDBusPendingCallWatcher* watcher) {
179−
180− QDBusPendingReply<QVariant> reply = *watcher;
181− watcher->deleteLater();
182− if (reply.isError()) {
183− qWarning() << "Failed to get 'EnableLauncherWhileLocked' property - " << reply.error().message();
184− return;
185− }
186−
187− const bool enableLauncherWhileLocked = reply.value().toBool();
188− if (m_enableLauncherWhileLocked != enableLauncherWhileLocked) {
189− m_enableLauncherWhileLocked = enableLauncherWhileLocked;
190− Q_EMIT enableLauncherWhileLockedChanged();
191− }
192− });
193− if (!async) {
194− watcher->waitForFinished();
195− delete watcher;
196− }
197}
212}
198
213
199−void AccountsService::updateEnableIndicatorsWhileLocked(bool async)
214+void AccountsService::setFailedLogins(uint failedLogins)
200{
215{
201− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
216+ setProperty(IFACE_UNITY_PRIVATE, PROP_FAILED_LOGINS, failedLogins);
202− QStringLiteral("com.ubuntu.AccountsService.SecurityPrivacy"),
203− QStringLiteral("EnableIndicatorsWhileLocked"));
204− QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
205−
206− connect(watcher, &QDBusPendingCallWatcher::finished,
207− this, [this](QDBusPendingCallWatcher* watcher) {
208−
209− QDBusPendingReply<QVariant> reply = *watcher;
210− watcher->deleteLater();
211− if (reply.isError()) {
212− qWarning() << "Failed to get 'EnableIndicatorsWhileLocked' property - " << reply.error().message();
213− return;
214− }
215−
216− const bool enableIndicatorsWhileLocked = reply.value().toBool();
217− if (m_enableIndicatorsWhileLocked != enableIndicatorsWhileLocked) {
218− m_enableIndicatorsWhileLocked = enableIndicatorsWhileLocked;
219− Q_EMIT enableIndicatorsWhileLockedChanged();
220− }
221− });
222− if (!async) {
223− watcher->waitForFinished();
224− delete watcher;
225− }
226}
217}
227
218
228−void AccountsService::updateBackgroundFile(bool async)
219+// ====================================================
229−{
220+// Everything below this line is generic helper methods
230− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
221+// ====================================================
231− QStringLiteral("org.freedesktop.Accounts.User"),
232− QStringLiteral("BackgroundFile"));
233− QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
234−
235− connect(watcher, &QDBusPendingCallWatcher::finished,
236− this, [this](QDBusPendingCallWatcher* watcher) {
237−
238− QDBusPendingReply<QVariant> reply = *watcher;
239− watcher->deleteLater();
240− if (reply.isError()) {
241− qWarning() << "Failed to get 'BackgroundFile' property - " << reply.error().message();
242− return;
243− }
244−
245− const QString backgroundFile = reply.value().toString();
246− if (m_backgroundFile != backgroundFile) {
247− m_backgroundFile = backgroundFile;
248− Q_EMIT backgroundFileChanged();
249− }
250− });
251− if (!async) {
252− watcher->waitForFinished();
253− delete watcher;
254− }
255−}
256
222
257−void AccountsService::updateMouseCursorSpeed()
223+void AccountsService::emitChangedForProperty(const QString &interface, const QString &property)
258{
224{
259− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
225+ QString signalName = m_properties[interface][property].signal;
260− QStringLiteral("com.ubuntu.AccountsService.Input"),
226+ QMetaObject::invokeMethod(this, signalName.toUtf8().data());
261− QStringLiteral("MouseCursorSpeed"));
262− QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
263−
264− connect(watcher, &QDBusPendingCallWatcher::finished,
265− this, [this](QDBusPendingCallWatcher* watcher) {
266−
267− QDBusPendingReply<QVariant> reply = *watcher;
268− watcher->deleteLater();
269− if (reply.isError()) {
270− qWarning() << "Failed to get 'MouseCursorSpeed' property - " << reply.error().message();
271− return;
272− }
273−
274− // Merely proxy this along to USC. We don't care about keeping a copy
275− // or exporting it internally.
276− m_unityInput->asyncCall(QStringLiteral("setMouseCursorSpeed"), reply.value());
277− });
278}
227}
279
228
280−void AccountsService::updateTouchpadCursorSpeed()
229+QVariant AccountsService::getProperty(const QString &interface, const QString &property) const
281{
230{
282− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
231+ return m_properties[interface][property].value;
283− QStringLiteral("com.ubuntu.AccountsService.Input"),
284− QStringLiteral("TouchpadCursorSpeed"));
285− QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
286−
287− connect(watcher, &QDBusPendingCallWatcher::finished,
288− this, [this](QDBusPendingCallWatcher* watcher) {
289−
290− QDBusPendingReply<QVariant> reply = *watcher;
291− watcher->deleteLater();
292− if (reply.isError()) {
293− qWarning() << "Failed to get 'TouchpadCursorSpeed' property - " << reply.error().message();
294− return;
295− }
296−
297− // Merely proxy this along to USC. We don't care about keeping a copy
298− // or exporting it internally.
299− m_unityInput->asyncCall(QStringLiteral("setTouchpadCursorSpeed"), reply.value());
300− });
301}
232}
302
233
303−void AccountsService::updateStatsWelcomeScreen(bool async)
234+void AccountsService::setProperty(const QString &interface, const QString &property, const QVariant &value)
304{
235{
305− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
236+ if (m_properties[interface][property].value != value) {
306− QStringLiteral("com.ubuntu.touch.AccountsService.SecurityPrivacy"),
237+ m_properties[interface][property].value = value;
307− QStringLiteral("StatsWelcomeScreen"));
238+ m_service->setUserPropertyAsync(m_user, interface, property, value);
308− QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
239+ emitChangedForProperty(interface, property);
309−
310− connect(watcher, &QDBusPendingCallWatcher::finished,
311− this, [this](QDBusPendingCallWatcher* watcher) {
312−
313− QDBusPendingReply<QVariant> reply = *watcher;
314− watcher->deleteLater();
315− if (reply.isError()) {
316− qWarning() << "Failed to get 'StatsWelcomeScreen' property - " << reply.error().message();
317− return;
318− }
319−
320− const bool statsWelcomeScreen = reply.value().toBool();
321− if (m_statsWelcomeScreen != statsWelcomeScreen) {
322− m_statsWelcomeScreen = statsWelcomeScreen;
323− Q_EMIT statsWelcomeScreenChanged();
324− }
325− });
326− if (!async) {
327− watcher->waitForFinished();
328− delete watcher;
329 }
240 }
330}
241}
331
242
332−void AccountsService::updatePasswordDisplayHint(bool async)
243+void AccountsService::updateCache(const QString &interface, const QString &property, const QVariant &value)
333{
244{
334− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
245+ PropertyInfo &info = m_properties[interface][property];
335− QStringLiteral("com.ubuntu.AccountsService.SecurityPrivacy"),
246+
336− QStringLiteral("PasswordDisplayHint"));
247+ if (info.proxyInterface) {
337− QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
248+ QVariant finalValue;
338−
249+ if (info.proxyConverter) {
339− connect(watcher, &QDBusPendingCallWatcher::finished,
250+ finalValue = info.proxyConverter(value);
340− this, [this](QDBusPendingCallWatcher* watcher) {
251+ } else {
341−
252+ finalValue = value;
342− QDBusPendingReply<QVariant> reply = *watcher;
343− watcher->deleteLater();
344− if (reply.isError()) {
345− qWarning() << "Failed to get 'PasswordDisplayHint' property - " << reply.error().message();
346− return;
347− }
348−
349− const PasswordDisplayHint passwordDisplayHint = (PasswordDisplayHint)reply.value().toInt();
350− if (m_passwordDisplayHint != passwordDisplayHint) {
351− m_passwordDisplayHint = passwordDisplayHint;
352− Q_EMIT passwordDisplayHintChanged();
353 }
253 }
354− });
254+ info.proxyInterface->asyncCall(info.proxyMethod, finalValue);
355− if (!async) {
255+ return; // don't bother saving a copy
356− watcher->waitForFinished();
357− delete watcher;
358 }
256 }
359−}
360−
361−void AccountsService::updateFailedLogins(bool async)
362−{
363− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
364− QStringLiteral("com.canonical.unity.AccountsService.Private"),
365− QStringLiteral("FailedLogins"));
366− QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
367−
368− connect(watcher, &QDBusPendingCallWatcher::finished,
369− this, [this](QDBusPendingCallWatcher* watcher) {
370−
371− QDBusPendingReply<QVariant> reply = *watcher;
372− watcher->deleteLater();
373− if (reply.isError()) {
374− qWarning() << "Failed to get 'FailedLogins' property - " << reply.error().message();
375− return;
376− }
377
257
378− const uint failedLogins = reply.value().toUInt();
258+ if (info.value != value) {
379− if (m_failedLogins != failedLogins) {
259+ info.value = value;
380− m_failedLogins = failedLogins;
260+ emitChangedForProperty(interface, property);
381− Q_EMIT failedLoginsChanged();
382− }
383− });
384− if (!async) {
385− watcher->waitForFinished();
386− delete watcher;
387 }
261 }
388}
262}
389
263
390−void AccountsService::updateHereEnabled(bool async)
264+void AccountsService::updateProperty(const QString &interface, const QString &property)
391{
265{
392 QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
266 QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
393− QStringLiteral("com.ubuntu.location.providers.here.AccountsService"),
267+ interface,
394− QStringLiteral("LicenseAccepted"));
268+ property);
395 QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
269 QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
396
270
397 connect(watcher, &QDBusPendingCallWatcher::finished,
271 connect(watcher, &QDBusPendingCallWatcher::finished,
398− this, [this](QDBusPendingCallWatcher* watcher) {
272+ this, [this, interface, property](QDBusPendingCallWatcher* watcher) {
399
273
400 QDBusPendingReply<QVariant> reply = *watcher;
274 QDBusPendingReply<QVariant> reply = *watcher;
401 watcher->deleteLater();
275 watcher->deleteLater();
402 if (reply.isError()) {
276 if (reply.isError()) {
403− qWarning() << "Failed to get 'LicenseAccepted' property - " << reply.error().message();
277+ qWarning() << "Failed to get '" << property << "' property:" << reply.error().message();
404 return;
278 return;
405 }
279 }
406
280
407− const bool hereEnabled = reply.value().toBool();
281+ updateCache(interface, property, reply.value());
408− if (m_hereEnabled != hereEnabled) {
409− m_hereEnabled = hereEnabled;
410− Q_EMIT hereEnabledChanged();
411− }
412 });
282 });
413− if (!async) {
414− watcher->waitForFinished();
415− delete watcher;
416− }
417}
283}
418
284
419−void AccountsService::updateHereLicensePath(bool async)
285+void AccountsService::updateAllProperties(const QString &interface, bool async)
420{
286{
421− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
287+ QDBusPendingCall pendingReply = m_service->getAllPropertiesAsync(m_user,
422− QStringLiteral("com.ubuntu.location.providers.here.AccountsService"),
288+ interface);
423− QStringLiteral("LicenseBasePath"));
424 QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
289 QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
425
290
426 connect(watcher, &QDBusPendingCallWatcher::finished,
291 connect(watcher, &QDBusPendingCallWatcher::finished,
427− this, [this](QDBusPendingCallWatcher* watcher) {
292+ this, [this, interface](QDBusPendingCallWatcher* watcher) {
428
293
429− QDBusPendingReply<QVariant> reply = *watcher;
294+ QDBusPendingReply< QHash<QString, QVariant> > reply = *watcher;
430 watcher->deleteLater();
295 watcher->deleteLater();
431 if (reply.isError()) {
296 if (reply.isError()) {
432− qWarning() << "Failed to get 'LicenseBasePath' property - " << reply.error().message();
297+ qWarning() << "Failed to get all properties for" << interface << ":" << reply.error().message();
433 return;
298 return;
434 }
299 }
435
300
436− QString hereLicensePath = reply.value().toString();
301+ auto valueHash = reply.value();
437− if (hereLicensePath.isEmpty() || !QFile::exists(hereLicensePath))
302+ auto i = valueHash.constBegin();
438− hereLicensePath = QLatin1String("");
303+ while (i != valueHash.constEnd()) {
439−
304+ updateCache(interface, i.key(), i.value());
440− if (m_hereLicensePath.isNull() || m_hereLicensePath != hereLicensePath) {
305+ ++i;
441− m_hereLicensePath = hereLicensePath;
442− Q_EMIT hereLicensePathChanged();
443 }
306 }
444 });
307 });
445 if (!async) {
308 if (!async) {
446 watcher->waitForFinished();
309 watcher->waitForFinished();
447− delete watcher;
448 }
310 }
449}
311}
450
312
451−uint AccountsService::failedLogins() const
313+void AccountsService::registerProxy(const QString &interface, const QString &property, QDBusInterface *iface, const QString &method, ProxyConverter converter)
452{
314{
453− return m_failedLogins;
315+ registerProperty(interface, property, nullptr);
316+
317+ m_properties[interface][property].proxyInterface = iface;
318+ m_properties[interface][property].proxyMethod = method;
319+ m_properties[interface][property].proxyConverter = converter;
454}
320}
455
321
456−void AccountsService::setFailedLogins(uint failedLogins)
322+void AccountsService::registerProperty(const QString &interface, const QString &property, const QString &signal)
457{
323{
458− if (m_failedLogins != failedLogins) {
324+ m_properties[interface][property] = PropertyInfo();
459− m_failedLogins = failedLogins;
325+ m_properties[interface][property].signal = signal;
460− m_service->setUserPropertyAsync(m_user, QStringLiteral("com.canonical.unity.AccountsService.Private"), QStringLiteral("FailedLogins"), failedLogins);
461−
462− Q_EMIT failedLoginsChanged();
463− }
464}
326}
465
327
466void AccountsService::onPropertiesChanged(const QString &user, const QString &interface, const QStringList &changed)
328void AccountsService::onPropertiesChanged(const QString &user, const QString &interface, const QStringList &changed)
@@ -469,42 +331,13 @@ void AccountsService::onPropertiesChanged(const QString &user, const QString &in
469 return;
331 return;
470 }
332 }
471
333
472− if (interface == QLatin1String("com.canonical.unity.AccountsService")) {
334+ auto propHash = m_properties.value(interface);
473− if (changed.contains(QStringLiteral("demo-edges"))) {
335+ auto i = propHash.constBegin();
474− updateDemoEdges();
336+ while (i != propHash.constEnd()) {
475− }
476− } else if (interface == QLatin1String("com.canonical.unity.AccountsService.Private")) {
477− if (changed.contains(QStringLiteral("FailedLogins"))) {
478− updateFailedLogins();
479− }
480− } else if (interface == QLatin1String("com.ubuntu.AccountsService.Input")) {
481− if (changed.contains(QStringLiteral("MouseCursorSpeed"))) {
482− updateMouseCursorSpeed();
483− }
484− if (changed.contains(QStringLiteral("TouchpadCursorSpeed"))) {
485− updateTouchpadCursorSpeed();
486− }
487− } else if (interface == QLatin1String("com.ubuntu.touch.AccountsService.SecurityPrivacy")) {
488− if (changed.contains(QStringLiteral("StatsWelcomeScreen"))) {
489− updateStatsWelcomeScreen();
490− }
491− } else if (interface == QLatin1String("com.ubuntu.AccountsService.SecurityPrivacy")) {
492− if (changed.contains(QStringLiteral("PasswordDisplayHint"))) {
493− updatePasswordDisplayHint();
494− }
495− if (changed.contains(QStringLiteral("EnableLauncherWhileLocked"))) {
337+ if (changed.contains(i.key())) {
496− updateEnableLauncherWhileLocked();
338+ updateProperty(interface, i.key());
497− }
498− if (changed.contains(QStringLiteral("EnableIndicatorsWhileLocked"))) {
499− updateEnableIndicatorsWhileLocked();
500− }
501− } else if (interface == QLatin1String("com.ubuntu.location.providers.here.AccountsService")) {
502− if (changed.contains(QStringLiteral("LicenseAccepted"))) {
503− updateHereEnabled();
504− }
505− if (changed.contains(QStringLiteral("LicenseBasePath"))) {
506− updateHereLicensePath();
507 }
339 }
340+ ++i;
508 }
341 }
509}
342}
510
343
@@ -514,6 +347,20 @@ void AccountsService::onMaybeChanged(const QString &user)
514 return;
347 return;
515 }
348 }
516
349
517− // Standard properties might have changed
350+ // Any of the standard properties might have changed!
518− updateBackgroundFile();
351+ auto propHash = m_properties.value(IFACE_ACCOUNTS_USER);
352+ auto i = propHash.constBegin();
353+ while (i != propHash.constEnd()) {
354+ updateProperty(IFACE_ACCOUNTS_USER, i.key());
355+ ++i;
356+ }
357+}
358+
359+void AccountsService::refresh(bool async)
360+{
361+ auto i = m_properties.constBegin();
362+ while (i != m_properties.constEnd()) {
363+ updateAllProperties(i.key(), async);
364+ ++i;
365+ }
519}
366}
plugins/AccountsService/AccountsService.h+25−20
@@ -19,8 +19,10 @@
19#ifndef UNITY_ACCOUNTSSERVICE_H
19#ifndef UNITY_ACCOUNTSSERVICE_H
20#define UNITY_ACCOUNTSSERVICE_H
20#define UNITY_ACCOUNTSSERVICE_H
21
21
22+#include <QHash>
22#include <QObject>
23#include <QObject>
23#include <QString>
24#include <QString>
25+#include <QVariant>
24
26
25class AccountsServiceDBusAdaptor;
27class AccountsServiceDBusAdaptor;
26class QDBusInterface;
28class QDBusInterface;
@@ -109,30 +111,33 @@ private Q_SLOTS:
109 void onMaybeChanged(const QString &user);
111 void onMaybeChanged(const QString &user);
110
112
111private:
113private:
112− void updateDemoEdges(bool async = true);
114+ typedef QVariant (*ProxyConverter)(const QVariant &);
113− void updateEnableLauncherWhileLocked(bool async = true);
114− void updateEnableIndicatorsWhileLocked(bool async = true);
115− void updateBackgroundFile(bool async = true);
116− void updateMouseCursorSpeed();
117− void updateTouchpadCursorSpeed();
118− void updateStatsWelcomeScreen(bool async = true);
119− void updatePasswordDisplayHint(bool async = true);
120− void updateFailedLogins(bool async = true);
121− void updateHereEnabled(bool async = true);
122− void updateHereLicensePath(bool async = true);
123
115
116+ void refresh(bool async);
117+ void registerProperty(const QString &interface, const QString &property, const QString &signal);
118+ void registerProxy(const QString &interface, const QString &property, QDBusInterface *iface, const QString &method, ProxyConverter converter = nullptr);
119+
120+ void updateAllProperties(const QString &interface, bool async);
121+ void updateProperty(const QString &interface, const QString &property);
122+ void updateCache(const QString &interface, const QString &property, const QVariant &value);
123+
124+ void setProperty(const QString &interface, const QString &property, const QVariant &value);
125+ QVariant getProperty(const QString &interface, const QString &property) const;
126+
127+ void emitChangedForProperty(const QString &interface, const QString &property);
128+
129+ struct PropertyInfo {
130+ QVariant value{};
131+ QString signal{};
132+ QDBusInterface *proxyInterface{};
133+ QString proxyMethod{};
134+ ProxyConverter proxyConverter{};
135+ };
136+ typedef QHash< QString, QHash<QString, PropertyInfo> > PropertyHash;
137+ PropertyHash m_properties;
124 AccountsServiceDBusAdaptor *m_service;
138 AccountsServiceDBusAdaptor *m_service;
125 QDBusInterface *m_unityInput;
139 QDBusInterface *m_unityInput;
126 QString m_user;
140 QString m_user;
127− bool m_demoEdges;
128− bool m_enableLauncherWhileLocked;
129− bool m_enableIndicatorsWhileLocked;
130− QString m_backgroundFile;
131− bool m_statsWelcomeScreen;
132− PasswordDisplayHint m_passwordDisplayHint;
133− uint m_failedLogins;
134− bool m_hereEnabled;
135− QString m_hereLicensePath;
136};
141};
137
142
138#endif
143#endif
plugins/AccountsService/AccountsServiceDBusAdaptor.cpp+11−4
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -12,8 +12,6 @@
12 *
12 *
13 * You should have received a copy of the GNU General Public License
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/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Author: Michael Terry <michael.terry@canonical.com>
17 */
15 */
18
16
19#include "AccountsServiceDBusAdaptor.h"
17#include "AccountsServiceDBusAdaptor.h"
@@ -37,6 +35,15 @@ AccountsServiceDBusAdaptor::AccountsServiceDBusAdaptor(QObject* parent)
37 connection, this);
35 connection, this);
38}
36}
39
37
38+QDBusPendingReply<QVariantMap> AccountsServiceDBusAdaptor::getAllPropertiesAsync(const QString &user, const QString &interface)
39+{
40+ QDBusInterface *iface = getUserInterface(user);
41+ if (iface != nullptr && iface->isValid()) {
42+ return iface->asyncCall(QStringLiteral("GetAll"), interface);
43+ }
44+ return QDBusPendingReply<QVariantMap>(QDBusMessage::createError(QDBusError::Other, QStringLiteral("Invalid Interface")));
45+}
46+
40QDBusPendingReply<QVariant> AccountsServiceDBusAdaptor::getUserPropertyAsync(const QString &user, const QString &interface, const QString &property)
47QDBusPendingReply<QVariant> AccountsServiceDBusAdaptor::getUserPropertyAsync(const QString &user, const QString &interface, const QString &property)
41{
48{
42 QDBusInterface *iface = getUserInterface(user);
49 QDBusInterface *iface = getUserInterface(user);
@@ -80,7 +87,7 @@ void AccountsServiceDBusAdaptor::maybeChangedSlot()
80 m_ignoreNextChanged = false;
87 m_ignoreNextChanged = false;
81}
88}
82
89
83−QString AccountsServiceDBusAdaptor::getUserForPath(const QString &path)
90+QString AccountsServiceDBusAdaptor::getUserForPath(const QString &path) const
84{
91{
85 QMap<QString, QDBusInterface *>::const_iterator i;
92 QMap<QString, QDBusInterface *>::const_iterator i;
86 for (i = m_users.constBegin(); i != m_users.constEnd(); ++i) {
93 for (i = m_users.constBegin(); i != m_users.constEnd(); ++i) {
plugins/AccountsService/AccountsServiceDBusAdaptor.h+5−6
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -12,8 +12,6 @@
12 *
12 *
13 * You should have received a copy of the GNU General Public License
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/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors: Michael Terry <michael.terry@canonical.com>
17 */
15 */
18
16
19#ifndef UNITY_ACCOUNTSSERVICEDBUSADAPTOR_H
17#ifndef UNITY_ACCOUNTSSERVICEDBUSADAPTOR_H
@@ -35,8 +33,9 @@ public:
35 explicit AccountsServiceDBusAdaptor(QObject *parent = 0);
33 explicit AccountsServiceDBusAdaptor(QObject *parent = 0);
36 ~AccountsServiceDBusAdaptor() = default;
34 ~AccountsServiceDBusAdaptor() = default;
37
35
36+ QDBusPendingReply<QVariantMap> getAllPropertiesAsync(const QString &user, const QString &interface);
38− Q_INVOKABLE QDBusPendingReply<QVariant> getUserPropertyAsync(const QString &user, const QString &interface, const QString &property);
37+ QDBusPendingReply<QVariant> getUserPropertyAsync(const QString &user, const QString &interface, const QString &property);
39− Q_INVOKABLE QDBusPendingCall setUserPropertyAsync(const QString &user, const QString &interface, const QString &property, const QVariant &value);
38+ QDBusPendingCall setUserPropertyAsync(const QString &user, const QString &interface, const QString &property, const QVariant &value);
40
39
41Q_SIGNALS:
40Q_SIGNALS:
42 void propertiesChanged(const QString &user, const QString &interface, const QStringList &changed);
41 void propertiesChanged(const QString &user, const QString &interface, const QStringList &changed);
@@ -48,7 +47,7 @@ private Q_SLOTS:
48
47
49private:
48private:
50 QDBusInterface *getUserInterface(const QString &user);
49 QDBusInterface *getUserInterface(const QString &user);
51− QString getUserForPath(const QString &path);
50+ QString getUserForPath(const QString &path) const;
52
51
53 QDBusInterface *m_accountsManager;
52 QDBusInterface *m_accountsManager;
54 QMap<QString, QDBusInterface *> m_users;
53 QMap<QString, QDBusInterface *> m_users;
plugins/Dash/AudioProgressBar.qml+1
@@ -31,6 +31,7 @@ Item {
31 anchors { left: parent.left; right: parent.right }
31 anchors { left: parent.left; right: parent.right }
32 height: units.dp(6)
32 height: units.dp(6)
33 source: "graphics/music_progress_bg.png"
33 source: "graphics/music_progress_bg.png"
34+ asynchronous: true
34 sourceSize.width: width
35 sourceSize.width: width
35 sourceSize.height: height
36 sourceSize.height: height
36 }
37 }
plugins/Dash/CardCreator.js+69−34
@@ -18,12 +18,13 @@
18
18
19// %1 is the template["card-background"]["elements"][0]
19// %1 is the template["card-background"]["elements"][0]
20// %2 is the template["card-background"]["elements"][1]
20// %2 is the template["card-background"]["elements"][1]
21+// %3 is whether the loader should be asynchronous or not
21−// %3 is the template["card-background"] string
22+// %4 is the template["card-background"] string
22var kBackgroundLoaderCode = 'Loader {\n\
23var kBackgroundLoaderCode = 'Loader {\n\
23 id: backgroundLoader; \n\
24 id: backgroundLoader; \n\
24 objectName: "backgroundLoader"; \n\
25 objectName: "backgroundLoader"; \n\
25 anchors.fill: parent; \n\
26 anchors.fill: parent; \n\
26− asynchronous: root.asynchronous; \n\
27+ asynchronous: %3; \n\
27 visible: status == Loader.Ready; \n\
28 visible: status == Loader.Ready; \n\
28 sourceComponent: UbuntuShape { \n\
29 sourceComponent: UbuntuShape { \n\
29 objectName: "background"; \n\
30 objectName: "background"; \n\
@@ -46,7 +47,7 @@ var kBackgroundLoaderCode = 'Loader {\n\
46 objectName: "backgroundImage"; \n\
47 objectName: "backgroundImage"; \n\
47 source: { \n\
48 source: { \n\
48 if (cardData && typeof cardData["background"] === "string") return cardData["background"]; \n\
49 if (cardData && typeof cardData["background"] === "string") return cardData["background"]; \n\
49− else return %3; \n\
50+ else return %4; \n\
50 } \n\
51 } \n\
51 } \n\
52 } \n\
52 function getColor(index) { \n\
53 function getColor(index) { \n\
@@ -63,8 +64,9 @@ var kBackgroundLoaderCode = 'Loader {\n\
63// %3 is used as image height
64// %3 is used as image height
64// %4 is used for artShapeSource.hideSource and inner Loader visible
65// %4 is used for artShapeSource.hideSource and inner Loader visible
65// %5 is used as aspect ratio fallback
66// %5 is used as aspect ratio fallback
67+// %6 is whether the loader should be asynchronous or not
66−// %6 is injected as code to artImage
68+// %7 is injected as code to artImage
67−// %7 is used as image fallback
69+// %8 is used as image fallback
68var kArtShapeHolderCode = 'Item { \n\
70var kArtShapeHolderCode = 'Item { \n\
69 id: artShapeHolder; \n\
71 id: artShapeHolder; \n\
70 height: root.fixedArtShapeSize.height > 0 ? root.fixedArtShapeSize.height : artShapeLoader.height; \n\
72 height: root.fixedArtShapeSize.height > 0 ? root.fixedArtShapeSize.height : artShapeLoader.height; \n\
@@ -73,9 +75,9 @@ var kArtShapeHolderCode = 'Item { \n\
73 Loader { \n\
75 Loader { \n\
74 id: artShapeLoader; \n\
76 id: artShapeLoader; \n\
75 objectName: "artShapeLoader"; \n\
77 objectName: "artShapeLoader"; \n\
76− readonly property string cardArt: cardData && cardData["art"] || %7; \n\
78+ readonly property string cardArt: cardData && cardData["art"] || %8; \n\
77 active: cardArt != ""; \n\
79 active: cardArt != ""; \n\
78− asynchronous: root.asynchronous; \n\
80+ asynchronous: %6; \n\
79 visible: status == Loader.Ready; \n\
81 visible: status == Loader.Ready; \n\
80 sourceComponent: Item { \n\
82 sourceComponent: Item { \n\
81 id: artShape; \n\
83 id: artShape; \n\
@@ -132,10 +134,10 @@ var kArtShapeHolderCode = 'Item { \n\
132 id: artImage; \n\
134 id: artImage; \n\
133 objectName: "artImage"; \n\
135 objectName: "artImage"; \n\
134 source: artShapeLoader.cardArt; \n\
136 source: artShapeLoader.cardArt; \n\
135− asynchronous: root.asynchronous; \n\
137+ asynchronous: %6; \n\
136 width: %2; \n\
138 width: %2; \n\
137 height: %3; \n\
139 height: %3; \n\
138− %6 \n\
140+ %7 \n\
139 } \n\
141 } \n\
140 } \n\
142 } \n\
141 } \n\
143 } \n\
@@ -144,6 +146,7 @@ var kArtShapeHolderCode = 'Item { \n\
144// %1 is anchors.fill
146// %1 is anchors.fill
145// %2 is width
147// %2 is width
146// %3 is height
148// %3 is height
149+// %4 is whether the icon should be asynchronous or not
147var kAudioButtonCode = 'AbstractButton { \n\
150var kAudioButtonCode = 'AbstractButton { \n\
148 id: audioButton; \n\
151 id: audioButton; \n\
149 anchors.fill: %1; \n\
152 anchors.fill: %1; \n\
@@ -169,6 +172,7 @@ var kAudioButtonCode = 'AbstractButton { \n\
169 opacity: 0.9; \n\
172 opacity: 0.9; \n\
170 name: DashAudioPlayer.playing && AudioUrlComparer.compare(parent.source, DashAudioPlayer.currentSource) ? "media-playback-pause" : "media-playback-start"; \n\
173 name: DashAudioPlayer.playing && AudioUrlComparer.compare(parent.source, DashAudioPlayer.currentSource) ? "media-playback-pause" : "media-playback-start"; \n\
171 color: "white"; \n\
174 color: "white"; \n\
175+ asynchronous: %4; \n\
172 } \n\
176 } \n\
173 onClicked: { \n\
177 onClicked: { \n\
174 if (AudioUrlComparer.compare(source, DashAudioPlayer.currentSource)) { \n\
178 if (AudioUrlComparer.compare(source, DashAudioPlayer.currentSource)) { \n\
@@ -187,12 +191,14 @@ var kAudioButtonCode = 'AbstractButton { \n\
187 } \n\
191 } \n\
188 }';
192 }';
189
193
194+// %1 is whether the loader should be asynchronous or not
195+// %2 is the header height code
190var kOverlayLoaderCode = 'Loader { \n\
196var kOverlayLoaderCode = 'Loader { \n\
191 id: overlayLoader; \n\
197 id: overlayLoader; \n\
192− readonly property real overlayHeight: (fixedHeaderHeight > 0 ? fixedHeaderHeight : headerHeight) + units.gu(2); \n\
198+ readonly property real overlayHeight: %2 + units.gu(2); \n\
193 anchors.fill: artShapeHolder; \n\
199 anchors.fill: artShapeHolder; \n\
194 active: artShapeLoader.active && artShapeLoader.item && artShapeLoader.item.image.status === Image.Ready || false; \n\
200 active: artShapeLoader.active && artShapeLoader.item && artShapeLoader.item.image.status === Image.Ready || false; \n\
195− asynchronous: root.asynchronous; \n\
201+ asynchronous: %1; \n\
196 visible: showHeader && status == Loader.Ready; \n\
202 visible: showHeader && status == Loader.Ready; \n\
197 sourceComponent: UbuntuShapeOverlay { \n\
203 sourceComponent: UbuntuShapeOverlay { \n\
198 id: overlay; \n\
204 id: overlay; \n\
@@ -211,17 +217,19 @@ function kHeaderRowCodeGenerator() {
211 objectName: "outerRow"; \n\
217 objectName: "outerRow"; \n\
212 property real margins: units.gu(1); \n\
218 property real margins: units.gu(1); \n\
213 spacing: margins; \n\
219 spacing: margins; \n\
214− height: root.fixedHeaderHeight != -1 ? root.fixedHeaderHeight : implicitHeight; \n\
220+ %2\
215 anchors { %1 } \n\
221 anchors { %1 } \n\
216 anchors.right: parent.right; \n\
222 anchors.right: parent.right; \n\
217 anchors.margins: margins; \n\
223 anchors.margins: margins; \n\
218 anchors.rightMargin: 0; \n\
224 anchors.rightMargin: 0; \n\
219 data: [ \n\
225 data: [ \n\
220− %2 \n\
226+ %3 \n\
221 ] \n\
227 ] \n\
222 }\n';
228 }\n';
223 var args = Array.prototype.slice.call(arguments);
229 var args = Array.prototype.slice.call(arguments);
230+ var isCardTool = args.shift();
231+ var heightCode = isCardTool ? "" : "height: root.fixedHeaderHeight; \n";
224− var code = kHeaderRowCodeTemplate.arg(args.shift()).arg(args.join(',\n'));
232+ var code = kHeaderRowCodeTemplate.arg(args.shift()).arg(heightCode).arg(args.join(',\n'));
225 return code;
233 return code;
226}
234}
227
235
@@ -242,10 +250,11 @@ function kHeaderContainerCodeGenerator() {
242}
250}
243
251
244// %1 is used as anchors of mascotShapeLoader
252// %1 is used as anchors of mascotShapeLoader
253+// %2 is whether the loader should be asynchronous or not
245var kMascotShapeLoaderCode = 'Loader { \n\
254var kMascotShapeLoaderCode = 'Loader { \n\
246 id: mascotShapeLoader; \n\
255 id: mascotShapeLoader; \n\
247 objectName: "mascotShapeLoader"; \n\
256 objectName: "mascotShapeLoader"; \n\
248− asynchronous: root.asynchronous; \n\
257+ asynchronous: %2; \n\
249 active: mascotImage.status === Image.Ready; \n\
258 active: mascotImage.status === Image.Ready; \n\
250 visible: showHeader && active && status == Loader.Ready; \n\
259 visible: showHeader && active && status == Loader.Ready; \n\
251 width: units.gu(6); \n\
260 width: units.gu(6); \n\
@@ -275,6 +284,7 @@ var kMascotImageCode = 'CroppedImageMinimumSourceSize { \n\
275// %2 is used as color of titleLabel
284// %2 is used as color of titleLabel
276// %3 is used as extra condition for visible of titleLabel
285// %3 is used as extra condition for visible of titleLabel
277// %4 is used as title width
286// %4 is used as title width
287+// %5 is used as horizontal alignment
278var kTitleLabelCode = 'Label { \n\
288var kTitleLabelCode = 'Label { \n\
279 id: titleLabel; \n\
289 id: titleLabel; \n\
280 objectName: "titleLabel"; \n\
290 objectName: "titleLabel"; \n\
@@ -289,7 +299,7 @@ var kTitleLabelCode = 'Label { \n\
289 width: %4; \n\
299 width: %4; \n\
290 text: root.title; \n\
300 text: root.title; \n\
291 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal; \n\
301 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal; \n\
292− horizontalAlignment: root.titleAlignment; \n\
302+ horizontalAlignment: %5; \n\
293 }\n';
303 }\n';
294
304
295// %1 is used as extra anchors of emblemIcon
305// %1 is used as extra anchors of emblemIcon
@@ -398,7 +408,7 @@ function sanitizeColor(colorString) {
398 return colorString;
408 return colorString;
399}
409}
400
410
401−function cardString(template, components) {
411+function cardString(template, components, isCardTool) {
402 var code;
412 var code;
403
413
404 var templateInteractive = (template == null ? true : (template["non-interactive"] !== undefined ? !template["non-interactive"] : true)) ? "true" : "false";
414 var templateInteractive = (template == null ? true : (template["non-interactive"] !== undefined ? !template["non-interactive"] : true)) ? "true" : "false";
@@ -410,16 +420,16 @@ function cardString(template, components) {
410 property string backgroundShapeStyle: "inset"; \n\
420 property string backgroundShapeStyle: "inset"; \n\
411 property real fontScale: 1.0; \n\
421 property real fontScale: 1.0; \n\
412 property var scopeStyle: null; \n\
422 property var scopeStyle: null; \n\
413− property int titleAlignment: Text.AlignLeft; \n\
423+ %2\
414− property int fixedHeaderHeight: -1; \n\
415 property size fixedArtShapeSize: Qt.size(-1, -1); \n\
424 property size fixedArtShapeSize: Qt.size(-1, -1); \n\
416 readonly property string title: cardData && cardData["title"] || ""; \n\
425 readonly property string title: cardData && cardData["title"] || ""; \n\
417− property bool asynchronous: true; \n\
418 property bool showHeader: true; \n\
426 property bool showHeader: true; \n\
419 implicitWidth: childrenRect.width; \n\
427 implicitWidth: childrenRect.width; \n\
420 enabled: %1; \n\
428 enabled: %1; \n\
421 \n'.arg(templateInteractive);
429 \n'.arg(templateInteractive);
422
430
431+ code = code.arg(isCardTool ? "" : "property int fixedHeaderHeight: -1; \n");
432+
423 var hasArt = components["art"] && components["art"]["field"] || false;
433 var hasArt = components["art"] && components["art"]["field"] || false;
424 var hasSummary = components["summary"] || false;
434 var hasSummary = components["summary"] || false;
425 var isConciergeMode = components["art"] && components["art"]["conciergeMode"] || false;
435 var isConciergeMode = components["art"] && components["art"]["conciergeMode"] || false;
@@ -435,6 +445,7 @@ function cardString(template, components) {
435 var hasHeaderRow = hasMascot && hasTitle;
445 var hasHeaderRow = hasMascot && hasTitle;
436 var hasAttributes = hasTitle && components["attributes"] && components["attributes"]["field"] || false;
446 var hasAttributes = hasTitle && components["attributes"] && components["attributes"]["field"] || false;
437 var isAudio = template["quick-preview-type"] === "audio";
447 var isAudio = template["quick-preview-type"] === "audio";
448+ var asynchronous = isCardTool ? "false" : "true";
438
449
439 if (isAudio) {
450 if (isAudio) {
440 // For now we only support audio cards with [optional] art, title, subtitle
451 // For now we only support audio cards with [optional] art, title, subtitle
@@ -468,7 +479,7 @@ function cardString(template, components) {
468 backgroundElements1 = '"%1"'.arg(element1);
479 backgroundElements1 = '"%1"'.arg(element1);
469 }
480 }
470 }
481 }
471− code += kBackgroundLoaderCode.arg(backgroundElements0).arg(backgroundElements1).arg(templateCardBackground);
482+ code += kBackgroundLoaderCode.arg(backgroundElements0).arg(backgroundElements1).arg(asynchronous).arg(templateCardBackground);
472 }
483 }
473
484
474 if (hasArt) {
485 if (hasArt) {
@@ -497,23 +508,31 @@ function cardString(template, components) {
497 if (isNaN(aspectRatio)) {
508 if (isNaN(aspectRatio)) {
498 aspectRatio = 1;
509 aspectRatio = 1;
499 }
510 }
500− var fallback = components["art"] && components["art"]["fallback"] || "";
511+ var fallback = !isCardTool && components["art"] && components["art"]["fallback"] || "";
501 fallback = encodeURI(fallback);
512 fallback = encodeURI(fallback);
502 var fallbackStatusCode = "";
513 var fallbackStatusCode = "";
503 var fallbackURICode = '""';
514 var fallbackURICode = '""';
504 if (fallback !== "") {
515 if (fallback !== "") {
505 // fallbackStatusCode has %6 in it because we want to substitute it for fallbackURICode
516 // fallbackStatusCode has %6 in it because we want to substitute it for fallbackURICode
506− // which in kArtShapeHolderCode is %7
517+ // which in kArtShapeHolderCode is %8
507− fallbackStatusCode += 'onStatusChanged: if (status === Image.Error) source = %7;';
518+ fallbackStatusCode += 'onStatusChanged: if (status === Image.Error) source = %8;';
508 fallbackURICode = 'decodeURI("%1")'.arg(fallback);
519 fallbackURICode = 'decodeURI("%1")'.arg(fallback);
509 }
520 }
510− code += kArtShapeHolderCode.arg(artAnchors).arg(widthCode).arg(heightCode).arg(isConciergeMode ? "false" : "true").arg(aspectRatio).arg(fallbackStatusCode).arg(fallbackURICode);
521+ code += kArtShapeHolderCode.arg(artAnchors)
522+ .arg(widthCode)
523+ .arg(heightCode)
524+ .arg(isConciergeMode ? "false" : "true")
525+ .arg(aspectRatio)
526+ .arg(asynchronous)
527+ .arg(fallbackStatusCode)
528+ .arg(fallbackURICode);
511 } else {
529 } else {
512 code += 'readonly property size artShapeSize: Qt.size(-1, -1);\n'
530 code += 'readonly property size artShapeSize: Qt.size(-1, -1);\n'
513 }
531 }
514
532
515 if (headerAsOverlay) {
533 if (headerAsOverlay) {
534+ var headerHeightCode = isCardTool ? "headerHeight" : "root.fixedHeaderHeight";
516− code += kOverlayLoaderCode;
535+ code += kOverlayLoaderCode.arg(asynchronous).arg(headerHeightCode);
517 }
536 }
518
537
519 var headerVerticalAnchors;
538 var headerVerticalAnchors;
@@ -595,11 +614,11 @@ function cardString(template, components) {
595 }
614 }
596
615
597 if (useMascotShape) {
616 if (useMascotShape) {
598− mascotShapeCode = kMascotShapeLoaderCode.arg(mascotAnchors);
617+ mascotShapeCode = kMascotShapeLoaderCode.arg(mascotAnchors).arg(asynchronous);
599 }
618 }
600
619
601 var mascotImageVisible = useMascotShape ? 'false' : 'showHeader';
620 var mascotImageVisible = useMascotShape ? 'false' : 'showHeader';
602− var fallback = components["mascot"] && components["mascot"]["fallback"] || "";
621+ var fallback = !isCardTool && components["mascot"] && components["mascot"]["fallback"] || "";
603 fallback = encodeURI(fallback);
622 fallback = encodeURI(fallback);
604 var fallbackStatusCode = "";
623 var fallbackStatusCode = "";
605 var fallbackURICode = '""';
624 var fallbackURICode = '""';
@@ -715,9 +734,24 @@ function cardString(template, components) {
715 }
734 }
716 }
735 }
717
736
737+ var titleAlignment = "Text.AlignHCenter";
738+ if (template["card-layout"] === "horizontal"
739+ || typeof components["title"] !== "object"
740+ || components["title"]["align"] === "left") titleAlignment = "Text.AlignLeft";
741+ var keys = ["mascot", "emblem", "subtitle", "attributes", "summary"];
742+ for (var key in keys) {
743+ key = keys[key];
744+ try {
745+ if (typeof components[key] === "string"
746+ || typeof components[key]["field"] === "string") titleAlignment = "Text.AlignLeft";
747+ } catch (e) {
748+ continue;
749+ }
750+ }
751+
718 // code for different elements
752 // code for different elements
719 var titleLabelVisibleExtra = (headerAsOverlay ? '&& overlayLoader.active': '');
753 var titleLabelVisibleExtra = (headerAsOverlay ? '&& overlayLoader.active': '');
720− var titleCode = kTitleLabelCode.arg(titleAnchors).arg(titleColor).arg(titleLabelVisibleExtra).arg(titleWidth);
754+ var titleCode = kTitleLabelCode.arg(titleAnchors).arg(titleColor).arg(titleLabelVisibleExtra).arg(titleWidth).arg(titleAlignment);
721 var subtitleCode;
755 var subtitleCode;
722 var attributesCode;
756 var attributesCode;
723
757
@@ -759,7 +793,7 @@ function cardString(template, components) {
759 if (mascotShapeCode != '') {
793 if (mascotShapeCode != '') {
760 rowCode.unshift(mascotShapeCode);
794 rowCode.unshift(mascotShapeCode);
761 }
795 }
762− code += kHeaderRowCodeGenerator(headerVerticalAnchors + headerLeftAnchor, rowCode)
796+ code += kHeaderRowCodeGenerator(isCardTool, headerVerticalAnchors + headerLeftAnchor, rowCode)
763 } else {
797 } else {
764 code += mascotShapeCode + mascotCode + titleSubtitleCode;
798 code += mascotShapeCode + mascotCode + titleSubtitleCode;
765 }
799 }
@@ -783,9 +817,10 @@ function cardString(template, components) {
783 } else {
817 } else {
784 audioButtonAnchorsFill = 'undefined';
818 audioButtonAnchorsFill = 'undefined';
785 audioButtonWidth = 'height';
819 audioButtonWidth = 'height';
786− audioButtonHeight = '(root.fixedHeaderHeight > 0 ? root.fixedHeaderHeight : headerHeight) + 2 * units.gu(1)';
820+ audioButtonHeight = isCardTool ? 'headerHeight + 2 * units.gu(1)'
821+ : 'root.fixedHeaderHeight + 2 * units.gu(1)';
787 }
822 }
788− code += kAudioButtonCode.arg(audioButtonAnchorsFill).arg(audioButtonWidth).arg(audioButtonHeight);
823+ code += kAudioButtonCode.arg(audioButtonAnchorsFill).arg(audioButtonWidth).arg(audioButtonHeight).arg(asynchronous);
789 }
824 }
790
825
791 if (hasSummary) {
826 if (hasSummary) {
@@ -854,13 +889,13 @@ function cardString(template, components) {
854 return code;
889 return code;
855}
890}
856
891
857−function createCardComponent(parent, template, components, identifier) {
892+function createCardComponent(parent, template, components, isCardTool, identifier) {
858 var imports = 'import QtQuick 2.4; \n\
893 var imports = 'import QtQuick 2.4; \n\
859 import Ubuntu.Components 1.3; \n\
894 import Ubuntu.Components 1.3; \n\
860 import Ubuntu.Settings.Components 0.1; \n\
895 import Ubuntu.Settings.Components 0.1; \n\
861 import Dash 0.1;\n\
896 import Dash 0.1;\n\
862 import Utils 0.1;\n';
897 import Utils 0.1;\n';
863− var card = cardString(template, components);
898+ var card = cardString(template, components, isCardTool);
864 var code = imports + 'Component {\n' + card + '}\n';
899 var code = imports + 'Component {\n' + card + '}\n';
865
900
866 try {
901 try {
plugins/Dash/CardCreatorCache.qml+3−3
@@ -23,16 +23,16 @@ QtObject {
23
23
24 property var cache: new Object();
24 property var cache: new Object();
25
25
26− function getCardComponent(template, components) {
26+ function getCardComponent(template, components, isCardTool) {
27 if (template === undefined || components === undefined)
27 if (template === undefined || components === undefined)
28 return undefined;
28 return undefined;
29
29
30 var tString = JSON.stringify(template);
30 var tString = JSON.stringify(template);
31 var cString = JSON.stringify(components);
31 var cString = JSON.stringify(components);
32− var allString = tString + cString;
32+ var allString = tString + cString + isCardTool;
33 var component = cache[allString];
33 var component = cache[allString];
34 if (component === undefined) {
34 if (component === undefined) {
35− component = CardCreator.createCardComponent(root, template, components, allString);
35+ component = CardCreator.createCardComponent(root, template, components, isCardTool, allString);
36 cache[allString] = component;
36 cache[allString] = component;
37 }
37 }
38 return component;
38 return component;
plugins/Dash/plugin.cpp+6−6
@@ -28,12 +28,12 @@
28static QUrl oauthCleanedUrl(QUrl u)
28static QUrl oauthCleanedUrl(QUrl u)
29{
29{
30 QUrlQuery q(u);
30 QUrlQuery q(u);
31− q.removeQueryItem("oauth_nonce");
31+ q.removeQueryItem(QStringLiteral("oauth_nonce"));
32− q.removeQueryItem("oauth_timestamp");
32+ q.removeQueryItem(QStringLiteral("oauth_timestamp"));
33− q.removeQueryItem("oauth_consumer_key");
33+ q.removeQueryItem(QStringLiteral("oauth_consumer_key"));
34− q.removeQueryItem("oauth_signature_method");
34+ q.removeQueryItem(QStringLiteral("oauth_signature_method"));
35− q.removeQueryItem("oauth_version");
35+ q.removeQueryItem(QStringLiteral("oauth_version"));
36− q.removeQueryItem("oauth_signature");
36+ q.removeQueryItem(QStringLiteral("oauth_signature"));
37 u.setQuery(q);
37 u.setQuery(q);
38 return u;
38 return u;
39}
39}
plugins/GlobalShortcut/globalshortcutregistry.cpp+4−4
@@ -35,13 +35,13 @@ GlobalShortcutList GlobalShortcutRegistry::shortcuts() const
35
35
36bool GlobalShortcutRegistry::hasShortcut(const QVariant &seq) const
36bool GlobalShortcutRegistry::hasShortcut(const QVariant &seq) const
37{
37{
38− return m_shortcuts.keys().contains(seq);
38+ return m_shortcuts.contains(seq);
39}
39}
40
40
41void GlobalShortcutRegistry::addShortcut(const QVariant &seq, GlobalShortcut *sc)
41void GlobalShortcutRegistry::addShortcut(const QVariant &seq, GlobalShortcut *sc)
42{
42{
43 if (sc) {
43 if (sc) {
44− if (!m_shortcuts.keys().contains(seq)) { // create a new entry
44+ if (!m_shortcuts.contains(seq)) { // create a new entry
45 m_shortcuts.insert(seq, {sc});
45 m_shortcuts.insert(seq, {sc});
46 } else { // append to an existing one
46 } else { // append to an existing one
47 auto shortcuts = m_shortcuts[seq];
47 auto shortcuts = m_shortcuts[seq];
@@ -75,8 +75,8 @@ bool GlobalShortcutRegistry::eventFilter(QObject *obj, QEvent *event)
75
75
76 if (event->type() == QEvent::KeyPress) {
76 if (event->type() == QEvent::KeyPress) {
77 QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
77 QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
78− QKeySequence seq = QKeySequence(keyEvent->key() + keyEvent->modifiers());
78+ int seq = keyEvent->key() + keyEvent->modifiers();
79− if (m_shortcuts.keys().contains(seq)) {
79+ if (m_shortcuts.contains(seq)) {
80 const auto shortcuts = m_shortcuts.value(seq);
80 const auto shortcuts = m_shortcuts.value(seq);
81 Q_FOREACH(const auto &shortcut, shortcuts) {
81 Q_FOREACH(const auto &shortcut, shortcuts) {
82 if (shortcut) {
82 if (shortcut) {
plugins/IntegratedLightDM/liblightdm/CMakeLists.txt+16−3
@@ -5,13 +5,16 @@ set(LibLightDM_SOURCES
5 UsersModel.cpp
5 UsersModel.cpp
6 GreeterPrivate.cpp
6 GreeterPrivate.cpp
7 UsersModelPrivate.cpp
7 UsersModelPrivate.cpp
8+ ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsServiceDBusAdaptor.cpp
8 ${CMAKE_SOURCE_DIR}/plugins/Utils/qvariantlistmodel.cpp
9 ${CMAKE_SOURCE_DIR}/plugins/Utils/qvariantlistmodel.cpp
9 )
10 )
10
11
11add_library(integratedLightDM STATIC ${LibLightDM_SOURCES})
12add_library(integratedLightDM STATIC ${LibLightDM_SOURCES})
13+add_library(integratedLightDMSession STATIC ${LibLightDM_SOURCES})
12add_library(MockLightDM-demo-shared SHARED ${LibLightDM_SOURCES})
14add_library(MockLightDM-demo-shared SHARED ${LibLightDM_SOURCES})
13
15
14include_directories(
16include_directories(
17+ ${CMAKE_SOURCE_DIR}/plugins/AccountsService
15 ${CMAKE_CURRENT_BINARY_DIR}
18 ${CMAKE_CURRENT_BINARY_DIR}
16 ${GLIB_INCLUDE_DIRS}
19 ${GLIB_INCLUDE_DIRS}
17 ${LIBUSERMETRICSOUTPUT_INCLUDE_DIRS}
20 ${LIBUSERMETRICSOUTPUT_INCLUDE_DIRS}
@@ -22,17 +25,27 @@ target_link_libraries(integratedLightDM
22 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
25 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
23 -lpam
26 -lpam
24)
27)
28+target_link_libraries(integratedLightDMSession
29+ ${GLIB_LIBRARIES}
30+ ${LIBUSERMETRICSOUTPUT_LDFLAGS}
31+ -lpam
32+)
25target_link_libraries(MockLightDM-demo-shared
33target_link_libraries(MockLightDM-demo-shared
26 ${GLIB_LIBRARIES}
34 ${GLIB_LIBRARIES}
27 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
35 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
28 -lpam
36 -lpam
29)
37)
30
38
31−qt5_use_modules(integratedLightDM Concurrent Gui)
39+qt5_use_modules(integratedLightDM Concurrent DBus Gui)
40+qt5_use_modules(integratedLightDMSession Concurrent DBus Gui)
32−qt5_use_modules(MockLightDM-demo-shared Concurrent Gui)
41+qt5_use_modules(MockLightDM-demo-shared Concurrent DBus Gui)
33
42
34−set_target_properties(integratedLightDM PROPERTIES COMPILE_FLAGS -fPIC)
43+set_target_properties(integratedLightDM PROPERTIES
44+ COMPILE_FLAGS "-DSM_BUSNAME=systemBus -fPIC")
45+set_target_properties(integratedLightDMSession PROPERTIES
46+ COMPILE_FLAGS "-DSM_BUSNAME=sessionBus -fPIC")
35set_target_properties(MockLightDM-demo-shared PROPERTIES
47set_target_properties(MockLightDM-demo-shared PROPERTIES
48+ COMPILE_FLAGS "-DSM_BUSNAME=systemBus"
36 OUTPUT_NAME lightdm-qt5-2)
49 OUTPUT_NAME lightdm-qt5-2)
37
50
38install(TARGETS MockLightDM-demo-shared
51install(TARGETS MockLightDM-demo-shared
plugins/IntegratedLightDM/liblightdm/UsersModel.cpp+4−18
@@ -54,24 +54,10 @@ UsersModel::UsersModel(QObject *parent) :
54 roles[ImagePathRole] = "imagePath";
54 roles[ImagePathRole] = "imagePath";
55 setRoleNames(roles);
55 setRoleNames(roles);
56
56
57− // Now modify our mock user backgrounds
57+ connect(d_ptr, &UsersModelPrivate::dataChanged, this, [this](int i) {
58− QDir bgdir = QDir(QStringLiteral("/usr/share/demo-assets/shell/backgrounds/"));
58+ QModelIndex index = createIndex(i, 0);
59− QStringList backgrounds = bgdir.entryList(QDir::Files | QDir::NoDotAndDotDot);
59+ Q_EMIT dataChanged(index, index);
60−
60+ });
61− for (int i = 0, j = 0; i < d->entries.size(); i++) {
62− Entry &entry = d->entries[i];
63− if (entry.background.isNull() && !backgrounds.isEmpty()) {
64− entry.background = bgdir.filePath(backgrounds[j++]);
65− if (j >= backgrounds.length()) {
66− j = 0;
67− }
68− }
69− }
70−}
71−
72−UsersModel::~UsersModel()
73−{
74− delete d_ptr;
75}
61}
76
62
77int UsersModel::rowCount(const QModelIndex &parent) const
63int UsersModel::rowCount(const QModelIndex &parent) const
plugins/IntegratedLightDM/liblightdm/UsersModel.h+1−1
@@ -41,7 +41,7 @@ class Q_DECL_EXPORT UsersModel : public QAbstractListModel
41
41
42public:
42public:
43 explicit UsersModel(QObject *parent = 0);
43 explicit UsersModel(QObject *parent = 0);
44− virtual ~UsersModel();
44+ virtual ~UsersModel() = default;
45
45
46 enum UserModelRoles {NameRole = Qt::UserRole,
46 enum UserModelRoles {NameRole = Qt::UserRole,
47 RealNameRole,
47 RealNameRole,
plugins/IntegratedLightDM/liblightdm/UsersModelPrivate.cpp+43−9
@@ -18,7 +18,11 @@
18
18
19#include "UsersModelPrivate.h"
19#include "UsersModelPrivate.h"
20
20
21+#include "AccountsServiceDBusAdaptor.h"
22+#include "UsersModel.h"
23+
21#include <glib.h>
24#include <glib.h>
25+#include <QDebug>
22#include <QDir>
26#include <QDir>
23#include <QSettings>
27#include <QSettings>
24#include <QStringList>
28#include <QStringList>
@@ -27,7 +31,9 @@ namespace QLightDM
27{
31{
28
32
29UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
33UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
34+ : QObject(parent),
30− : q_ptr(parent)
35+ q_ptr(parent),
36+ m_service(new AccountsServiceDBusAdaptor(this))
31{
37{
32 QFileInfo demoFile(QDir::homePath() + "/.unity8-greeter-demo");
38 QFileInfo demoFile(QDir::homePath() + "/.unity8-greeter-demo");
33 QString currentUser = g_get_user_name();
39 QString currentUser = g_get_user_name();
@@ -43,15 +49,43 @@ UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
43 entries.append({user, name, 0, 0, false, false, 0, 0});
49 entries.append({user, name, 0, 0, false, false, 0, 0});
44 }
50 }
45 } else {
51 } else {
46− // If we were using the actual liblightdm, we could just ask it
52+ entries.append({currentUser, 0, 0, 0, false, false, 0, 0});
47− // for the user's real name. But we aren't. We *should* ask
53+
48− // AccountsService for the real name, like liblightdm does internally,
54+ connect(m_service, &AccountsServiceDBusAdaptor::maybeChanged,
49− // but this is close enough since AS and passwd are always in sync.
55+ this, [this](const QString &user) {
50− QString realName = QString::fromUtf8(g_get_real_name()); // gets name from passwd entry
56+ if (user == entries[0].username) {
51− if (realName == QStringLiteral("Unknown")) { // glib doesn't translate this string
57+ updateName(true);
52− realName.clear();
58+ }
59+ });
60+ updateName(false);
61+ }
62+}
63+
64+void UsersModelPrivate::updateName(bool async)
65+{
66+ auto pendingReply = m_service->getUserPropertyAsync(entries[0].username,
67+ QStringLiteral("org.freedesktop.Accounts.User"),
68+ QStringLiteral("RealName"));
69+ auto *watcher = new QDBusPendingCallWatcher(pendingReply, this);
70+
71+ connect(watcher, &QDBusPendingCallWatcher::finished,
72+ this, [this](QDBusPendingCallWatcher* watcher) {
73+
74+ QDBusPendingReply<QVariant> reply = *watcher;
75+ watcher->deleteLater();
76+ if (reply.isError()) {
77+ qWarning() << "Failed to get 'RealName' property - " << reply.error().message();
78+ return;
79+ }
80+
81+ const QString realName = reply.value().toString();
82+ if (entries[0].real_name != realName) {
83+ entries[0].real_name = realName;
84+ Q_EMIT dataChanged(0);
53 }
85 }
54− entries.append({currentUser, realName, 0, 0, false, false, 0, 0});
86+ });
87+ if (!async) {
88+ watcher->waitForFinished();
55 }
89 }
56}
90}
57
91
plugins/IntegratedLightDM/liblightdm/UsersModelPrivate.h+15−3
@@ -19,8 +19,11 @@
19#ifndef UNITY_MOCK_USERSMODEL_PRIVATE_H
19#ifndef UNITY_MOCK_USERSMODEL_PRIVATE_H
20#define UNITY_MOCK_USERSMODEL_PRIVATE_H
20#define UNITY_MOCK_USERSMODEL_PRIVATE_H
21
21
22−#include <QtCore/QList>
22+#include <QList>
23−#include <QtCore/QString>
23+#include <QObject>
24+#include <QString>
25+
26+class AccountsServiceDBusAdaptor;
24
27
25namespace QLightDM
28namespace QLightDM
26{
29{
@@ -39,19 +42,28 @@ public:
39 QString infographic;
42 QString infographic;
40};
43};
41
44
42−class UsersModelPrivate
45+class UsersModelPrivate : public QObject
43{
46{
47+ Q_OBJECT
48+
44public:
49public:
45 explicit UsersModelPrivate(UsersModel *parent = 0);
50 explicit UsersModelPrivate(UsersModel *parent = 0);
46 virtual ~UsersModelPrivate() = default;
51 virtual ~UsersModelPrivate() = default;
47
52
48 QList<Entry> entries;
53 QList<Entry> entries;
49
54
55+Q_SIGNALS:
56+ void dataChanged(int);
57+
50protected:
58protected:
51 UsersModel * const q_ptr;
59 UsersModel * const q_ptr;
52
60
53private:
61private:
54 Q_DECLARE_PUBLIC(UsersModel)
62 Q_DECLARE_PUBLIC(UsersModel)
63+
64+ void updateName(bool async);
65+
66+ AccountsServiceDBusAdaptor *m_service;
55};
67};
56
68
57}
69}
plugins/Unity/Indicators/indicatorsmanager.cpp+2−2
@@ -114,7 +114,7 @@ void IndicatorsManager::loadFile(const QFileInfo& file_info)
114 QSettings indicator_settings(file_info.absoluteFilePath(), QSettings::IniFormat, this);
114 QSettings indicator_settings(file_info.absoluteFilePath(), QSettings::IniFormat, this);
115 const QString name = indicator_settings.value(QStringLiteral("Indicator Service/Name")).toString();
115 const QString name = indicator_settings.value(QStringLiteral("Indicator Service/Name")).toString();
116
116
117− if (m_platform.isPC() && name == "indicator-keyboard") {
117+ if (m_platform.isPC() && name == QLatin1String("indicator-keyboard")) {
118 return; // convergence: skip this indicator until it works in Mir
118 return; // convergence: skip this indicator until it works in Mir
119 }
119 }
120
120
@@ -291,7 +291,7 @@ Indicator::Ptr IndicatorsManager::indicator(const QString& indicator_name)
291 // The rest of the indicators respect their default profile (which is "phone", even on desktop PCs)
291 // The rest of the indicators respect their default profile (which is "phone", even on desktop PCs)
292 if ((new_indicator->identifier() == QStringLiteral("indicator-session"))
292 if ((new_indicator->identifier() == QStringLiteral("indicator-session"))
293 || (new_indicator->identifier() == QStringLiteral("indicator-power") && m_platform.isPC())) {
293 || (new_indicator->identifier() == QStringLiteral("indicator-power") && m_platform.isPC())) {
294− new_indicator->setProfile("desktop");
294+ new_indicator->setProfile(QStringLiteral("desktop"));
295 } else {
295 } else {
296 new_indicator->setProfile(m_profile);
296 new_indicator->setProfile(m_profile);
297 }
297 }
plugins/Unity/Indicators/rootstateparser.h+1
@@ -23,6 +23,7 @@
23
23
24class UNITYINDICATORS_EXPORT RootStateParser : public ActionStateParser
24class UNITYINDICATORS_EXPORT RootStateParser : public ActionStateParser
25{
25{
26+Q_OBJECT
26public:
27public:
27 RootStateParser(QObject* parent = nullptr);
28 RootStateParser(QObject* parent = nullptr);
28 virtual QVariant toQVariant(GVariant* state) const override;
29 virtual QVariant toQVariant(GVariant* state) const override;
plugins/Unity/Launcher/desktopfilehandler.cpp+2−2
@@ -146,9 +146,9 @@ QString DesktopFileHandler::icon() const
146 QString iconString = settings.value(QStringLiteral("Icon")).toString();
146 QString iconString = settings.value(QStringLiteral("Icon")).toString();
147 QString pathString = settings.value(QStringLiteral("Path")).toString();
147 QString pathString = settings.value(QStringLiteral("Path")).toString();
148
148
149− if (QFileInfo(iconString).exists()) {
149+ if (QFileInfo::exists(iconString)) {
150 return QFileInfo(iconString).absoluteFilePath();
150 return QFileInfo(iconString).absoluteFilePath();
151− } else if (QFileInfo(pathString + '/' + iconString).exists()) {
151+ } else if (QFileInfo::exists(pathString + '/' + iconString)) {
152 return pathString + '/' + iconString;
152 return pathString + '/' + iconString;
153 }
153 }
154 return "image://theme/" + iconString;
154 return "image://theme/" + iconString;
plugins/Unity/Launcher/launcheritem.cpp+1
@@ -37,6 +37,7 @@ LauncherItem::LauncherItem(const QString &appId, const QString &name, const QStr
37 m_alerting(false),
37 m_alerting(false),
38 m_quickList(new QuickListModel(this))
38 m_quickList(new QuickListModel(this))
39{
39{
40+ Q_ASSERT(parent != nullptr);
40 QuickListEntry nameAction;
41 QuickListEntry nameAction;
41 nameAction.setActionId(QStringLiteral("launch_item"));
42 nameAction.setActionId(QStringLiteral("launch_item"));
42 nameAction.setText(m_name);
43 nameAction.setText(m_name);
plugins/Unity/Launcher/launcheritem.h+1−1
@@ -32,7 +32,7 @@ class LauncherItem: public LauncherItemInterface
32{
32{
33 Q_OBJECT
33 Q_OBJECT
34public:
34public:
35− LauncherItem(const QString &appId, const QString &name, const QString &icon, QObject *parent = 0);
35+ LauncherItem(const QString &appId, const QString &name, const QString &icon, QObject *parent);
36
36
37 QString appId() const override;
37 QString appId() const override;
38 QString name() const override;
38 QString name() const override;
plugins/Unity/Launcher/launchermodel.cpp+15−5
@@ -103,7 +103,7 @@ void LauncherModel::setAlerting(const QString &appId, bool alerting) {
103 LauncherItem *item = m_list.at(index);
103 LauncherItem *item = m_list.at(index);
104 if (!item->focused()) {
104 if (!item->focused()) {
105 item->setAlerting(alerting);
105 item->setAlerting(alerting);
106− Q_EMIT dataChanged(modelIndex, modelIndex, QVector<int>() << RoleAlerting);
106+ Q_EMIT dataChanged(modelIndex, modelIndex, {RoleAlerting});
107 }
107 }
108 }
108 }
109}
109}
@@ -389,7 +389,8 @@ void LauncherModel::countVisibleChanged(const QString &appId, bool countVisible)
389 if (countVisible && desktopFile.isValid()) {
389 if (countVisible && desktopFile.isValid()) {
390 LauncherItem *item = new LauncherItem(appId,
390 LauncherItem *item = new LauncherItem(appId,
391 desktopFile.displayName(),
391 desktopFile.displayName(),
392− desktopFile.icon());
392+ desktopFile.icon(),
393+ this);
393 item->setCountVisible(true);
394 item->setCountVisible(true);
394 beginInsertRows(QModelIndex(), m_list.count(), m_list.count());
395 beginInsertRows(QModelIndex(), m_list.count(), m_list.count());
395 m_list.append(item);
396 m_list.append(item);
@@ -414,10 +415,19 @@ void LauncherModel::refresh()
414 } else {
415 } else {
415 int idx = m_list.indexOf(item);
416 int idx = m_list.indexOf(item);
416 item->setName(desktopFile.displayName());
417 item->setName(desktopFile.displayName());
417− item->setIcon(desktopFile.icon());
418 item->setPinned(item->pinned()); // update pinned text if needed
418 item->setPinned(item->pinned()); // update pinned text if needed
419 item->setRunning(item->running());
419 item->setRunning(item->running());
420− Q_EMIT dataChanged(index(idx), index(idx), {RoleName, RoleIcon, RoleRunning});
420+ Q_EMIT dataChanged(index(idx), index(idx), {RoleName, RoleRunning});
421+
422+ const QString oldIcon = item->icon();
423+ if (oldIcon == desktopFile.icon()) { // same icon file, perhaps different contents, simulate changing the icon name to force reload
424+ item->setIcon(QString());
425+ Q_EMIT dataChanged(index(idx), index(idx), {RoleIcon});
426+ }
427+
428+ // now set the icon for real
429+ item->setIcon(desktopFile.icon());
430+ Q_EMIT dataChanged(index(idx), index(idx), {RoleIcon});
421 }
431 }
422 }
432 }
423
433
@@ -489,7 +499,7 @@ void LauncherModel::alert(const QString &appId)
489 if (idx >= 0) {
499 if (idx >= 0) {
490 LauncherItem *item = m_list.at(idx);
500 LauncherItem *item = m_list.at(idx);
491 setAlerting(item->appId(), true);
501 setAlerting(item->appId(), true);
492− Q_EMIT dataChanged(index(idx), index(idx), QVector<int>() << RoleAlerting);
502+ Q_EMIT dataChanged(index(idx), index(idx), {RoleAlerting});
493 }
503 }
494}
504}
495
505
plugins/Unity/Launcher/launchermodel.h+1−1
@@ -38,7 +38,7 @@ class LauncherModel: public LauncherModelInterface
38 Q_OBJECT
38 Q_OBJECT
39
39
40public:
40public:
41− LauncherModel(QObject *parent = 0);
41+ LauncherModel(QObject *parent = nullptr);
42 ~LauncherModel();
42 ~LauncherModel();
43
43
44 int rowCount(const QModelIndex &parent = QModelIndex()) const override;
44 int rowCount(const QModelIndex &parent = QModelIndex()) const override;
plugins/Utils/CMakeLists.txt+1
@@ -23,6 +23,7 @@ set(QMLPLUGIN_SRC
23 windowstatestorage.cpp
23 windowstatestorage.cpp
24 timezoneFormatter.cpp
24 timezoneFormatter.cpp
25 inputeventgenerator.cpp
25 inputeventgenerator.cpp
26+ deviceconfigparser.cpp
26 plugin.cpp
27 plugin.cpp
27 )
28 )
28
29
plugins/Utils/deviceconfigparser.cppnew file+150
@@ -0,0 +1,150 @@
1+/*
2+ * Copyright 2016 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "deviceconfigparser.h"
18+
19+#include <QSettings>
20+#include <QFileInfo>
21+#include <QDebug>
22+#include <QStandardPaths>
23+
24+DeviceConfigParser::DeviceConfigParser(QObject *parent): QObject(parent)
25+{
26+ QString path;
27+ Q_FOREACH (const QString &standardPath, QStandardPaths::standardLocations(QStandardPaths::GenericConfigLocation)) {
28+ if (QFileInfo(standardPath + "/devices.conf").exists()) {
29+ path = standardPath + "/devices.conf";
30+ break;
31+ }
32+ }
33+
34+ if (path.isEmpty()) {
35+ path = "/etc/ubuntu/devices.conf";
36+ }
37+ qDebug() << "Using" << path << "as device configuration file";
38+ m_config = new QSettings(path, QSettings::IniFormat, this);
39+}
40+
41+QString DeviceConfigParser::name() const
42+{
43+ return m_name;
44+}
45+
46+void DeviceConfigParser::setName(const QString &name)
47+{
48+ if (m_name == name) {
49+ return;
50+ }
51+ m_name = name;
52+ Q_EMIT changed();
53+}
54+
55+Qt::ScreenOrientation DeviceConfigParser::primaryOrientation() const
56+{
57+ return stringToOrientation(readOrientationFromConfig("PrimaryOrientation"), Qt::PrimaryOrientation);
58+}
59+
60+Qt::ScreenOrientations DeviceConfigParser::supportedOrientations() const
61+{
62+ QStringList values = readOrientationsFromConfig("SupportedOrientations");
63+ if (values.isEmpty()) {
64+ return Qt::PortraitOrientation
65+ | Qt::InvertedPortraitOrientation
66+ | Qt::LandscapeOrientation
67+ | Qt::InvertedLandscapeOrientation;
68+ }
69+
70+ Qt::ScreenOrientations ret = Qt::PrimaryOrientation;
71+ Q_FOREACH(const QString &orientationString, values) {
72+ ret |= stringToOrientation(orientationString, Qt::PrimaryOrientation);
73+ }
74+ return ret;
75+}
76+
77+Qt::ScreenOrientation DeviceConfigParser::landscapeOrientation() const
78+{
79+ return stringToOrientation(readOrientationFromConfig("LandscapeOrientation"), Qt::LandscapeOrientation);
80+}
81+
82+Qt::ScreenOrientation DeviceConfigParser::invertedLandscapeOrientation() const
83+{
84+ return stringToOrientation(readOrientationFromConfig("InvertedLandscapeOrientation"), Qt::InvertedLandscapeOrientation);
85+}
86+
87+Qt::ScreenOrientation DeviceConfigParser::portraitOrientation() const
88+{
89+ return stringToOrientation(readOrientationFromConfig("PortraitOrientation"), Qt::PortraitOrientation);
90+}
91+
92+Qt::ScreenOrientation DeviceConfigParser::invertedPortraitOrientation() const
93+{
94+ return stringToOrientation(readOrientationFromConfig("InvertedPortraitOrientation"), Qt::InvertedPortraitOrientation);
95+}
96+
97+QString DeviceConfigParser::category() const
98+{
99+ QStringList supportedValues = {"phone", "tablet", "desktop"};
100+ m_config->beginGroup(m_name);
101+ QString value = m_config->value("Category", "phone").toString();
102+ if (!supportedValues.contains(value)) {
103+ qWarning().nospace().noquote() << "Unknown option \"" << value << "\" in " << m_config->fileName()
104+ << ". Supported options are: " << supportedValues.join(", ") << ".";
105+ return "phone";
106+ }
107+ m_config->endGroup();
108+ return value;
109+}
110+
111+QStringList DeviceConfigParser::readOrientationsFromConfig(const QString &key) const
112+{
113+ m_config->beginGroup(m_name);
114+
115+ QStringList ret;
116+ if (m_config->contains(key)) {
117+ ret = m_config->value(key).toStringList();
118+ }
119+
120+ m_config->endGroup();
121+ return ret;
122+}
123+
124+QString DeviceConfigParser::readOrientationFromConfig(const QString &key) const
125+{
126+ QStringList ret = readOrientationsFromConfig(key);
127+ return ret.count() > 0 ? ret.first() : QString();
128+}
129+
130+Qt::ScreenOrientation DeviceConfigParser::stringToOrientation(const QString &orientationString, Qt::ScreenOrientation defaultValue) const
131+{
132+ if (orientationString == "Landscape") {
133+ return Qt::LandscapeOrientation;
134+ }
135+ if (orientationString == "InvertedLandscape") {
136+ return Qt::InvertedLandscapeOrientation;
137+ }
138+ if (orientationString == "Portrait") {
139+ return Qt::PortraitOrientation;
140+ }
141+ if (orientationString == "InvertedPortrait") {
142+ return Qt::InvertedPortraitOrientation;
143+ }
144+ if (!orientationString.isEmpty()) {
145+ // Some option we don't know. Give some hint on what went wrong.
146+ qWarning().nospace().noquote() << "Unknown option \"" << orientationString << "\" in " << m_config->fileName()
147+ << ". Supported options are: Landscape, InvertedLandscape, Portrait and InvertedPortrait.";
148+ }
149+ return defaultValue;
150+}
plugins/Utils/deviceconfigparser.hnew file+62
@@ -0,0 +1,62 @@
1+/*
2+ * Copyright 2016 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef DEVICECONFIGPARSER_H
18+#define DEVICECONFIGPARSER_H
19+
20+#include <QObject>
21+#include <QSettings>
22+
23+class DeviceConfigParser: public QObject
24+{
25+ Q_OBJECT
26+ Q_PROPERTY(QString name READ name WRITE setName NOTIFY changed)
27+
28+ Q_PROPERTY(Qt::ScreenOrientation primaryOrientation READ primaryOrientation NOTIFY changed)
29+ Q_PROPERTY(Qt::ScreenOrientations supportedOrientations READ supportedOrientations NOTIFY changed)
30+ Q_PROPERTY(Qt::ScreenOrientation landscapeOrientation READ landscapeOrientation NOTIFY changed)
31+ Q_PROPERTY(Qt::ScreenOrientation invertedLandscapeOrientation READ invertedLandscapeOrientation NOTIFY changed)
32+ Q_PROPERTY(Qt::ScreenOrientation portraitOrientation READ portraitOrientation NOTIFY changed)
33+ Q_PROPERTY(Qt::ScreenOrientation invertedPortraitOrientation READ invertedPortraitOrientation NOTIFY changed)
34+ Q_PROPERTY(QString category READ category NOTIFY changed)
35+
36+public:
37+ DeviceConfigParser(QObject *parent = nullptr);
38+
39+ QString name() const;
40+ void setName(const QString &name);
41+
42+ Qt::ScreenOrientation primaryOrientation() const;
43+ Qt::ScreenOrientations supportedOrientations() const;
44+ Qt::ScreenOrientation landscapeOrientation() const;
45+ Qt::ScreenOrientation invertedLandscapeOrientation() const;
46+ Qt::ScreenOrientation portraitOrientation() const;
47+ Qt::ScreenOrientation invertedPortraitOrientation() const;
48+ QString category() const;
49+
50+Q_SIGNALS:
51+ void changed();
52+
53+private:
54+ QString m_name;
55+ QSettings *m_config;
56+
57+ QStringList readOrientationsFromConfig(const QString &key) const;
58+ QString readOrientationFromConfig(const QString &key) const;
59+ Qt::ScreenOrientation stringToOrientation(const QString &orientationString, Qt::ScreenOrientation defaultValue) const;
60+};
61+
62+#endif
plugins/Utils/plugin.cpp+2
@@ -37,6 +37,7 @@
37#include "timezoneFormatter.h"
37#include "timezoneFormatter.h"
38#include "applicationsfiltermodel.h"
38#include "applicationsfiltermodel.h"
39#include "inputeventgenerator.h"
39#include "inputeventgenerator.h"
40+#include "deviceconfigparser.h"
40
41
41static QObject *createWindowStateStorage(QQmlEngine *engine, QJSEngine *scriptEngine)
42static QObject *createWindowStateStorage(QQmlEngine *engine, QJSEngine *scriptEngine)
42{
43{
@@ -70,6 +71,7 @@ void UtilsPlugin::registerTypes(const char *uri)
70 qmlRegisterType<ActiveFocusLogger>(uri, 0, 1, "ActiveFocusLogger");
71 qmlRegisterType<ActiveFocusLogger>(uri, 0, 1, "ActiveFocusLogger");
71 qmlRegisterType<ApplicationsFilterModel>(uri, 0, 1, "ApplicationsFilterModel");
72 qmlRegisterType<ApplicationsFilterModel>(uri, 0, 1, "ApplicationsFilterModel");
72 qmlRegisterType<InputEventGenerator>(uri, 0, 1, "InputEventGenerator");
73 qmlRegisterType<InputEventGenerator>(uri, 0, 1, "InputEventGenerator");
74+ qmlRegisterType<DeviceConfigParser>(uri, 0, 1, "DeviceConfigParser");
73}
75}
74
76
75void UtilsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
77void UtilsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
po/aa.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2016-02-12 10:18+0000\n"
11"PO-Revision-Date: 2016-02-12 10:18+0000\n"
12"Last-Translator: Charif AYFARAH <ayfarah@ymail.com>\n"
12"Last-Translator: Charif AYFARAH <ayfarah@ymail.com>\n"
13"Language-Team: Afar <aa@li.org>\n"
13"Language-Team: Afar <aa@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr "Inkih alif"
172msgstr "Inkih alif"
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr ""
177msgstr ""
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr "Goranto"
182msgstr "Goranto"
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr "Massosu"
187msgstr "Massosu"
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr ""
195msgstr ""
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr ""
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
po/am.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-11-19 19:27+0000\n"
11"PO-Revision-Date: 2015-11-19 19:27+0000\n"
12"Last-Translator: samson <Unknown>\n"
12"Last-Translator: samson <Unknown>\n"
13"Language-Team: Amharic <am@li.org>\n"
13"Language-Team: Amharic <am@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -173,26 +173,26 @@ msgstr "አሁን እንደገና መገናኛ!"
173msgid "Close all"
173msgid "Close all"
174msgstr "ሁሉንም መዝጊያ"
174msgstr "ሁሉንም መዝጊያ"
175
175
176−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
177msgctxt "Button: Open the Ubuntu Store"
177msgctxt "Button: Open the Ubuntu Store"
178msgid "Store"
178msgid "Store"
179msgstr "ማስቀመጫ"
179msgstr "ማስቀመጫ"
180
180
181−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
182msgctxt "Button: Start a search in the current dash scope"
182msgctxt "Button: Start a search in the current dash scope"
183msgid "Search"
183msgid "Search"
184msgstr "መፈለጊያ"
184msgstr "መፈለጊያ"
185
185
186−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
187msgctxt "Button: Show the current dash scope settings"
187msgctxt "Button: Show the current dash scope settings"
188msgid "Settings"
188msgid "Settings"
189msgstr "ማሰናጃዎች"
189msgstr "ማሰናጃዎች"
190
190
191−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
192msgid "Remove from Favorites"
192msgid "Remove from Favorites"
193msgstr "ከምወዳቸው ማስወገጃ"
193msgstr "ከምወዳቸው ማስወገጃ"
194
194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196msgid "Add to Favorites"
196msgid "Add to Favorites"
197msgstr "ወደምወዳቸው መጨመሪያ"
197msgstr "ወደምወዳቸው መጨመሪያ"
198
198
@@ -423,14 +423,6 @@ msgctxt "Button: Call back on phone"
423msgid "Call back"
423msgid "Call back"
424msgstr "መልሶ መደወያ"
424msgstr "መልሶ መደወያ"
425
425
426−#: qml/Panel/Indicators/ModemInfoItem.qml:105
427−msgid "Unlock SIM"
428−msgstr "ሲም መክፈቻ"
429−
430−#: qml/Panel/Indicators/RoamingIndication.qml:27
431−msgid "Roaming"
432−msgstr "ማዘዋወሪያ"
433−
434#: qml/Tutorial/TutorialBottom.qml:28
426#: qml/Tutorial/TutorialBottom.qml:28
435msgid "Open special menus"
427msgid "Open special menus"
436msgstr "የተለዩ ዝርዝሮች መክፈቻ"
428msgstr "የተለዩ ዝርዝሮች መክፈቻ"
@@ -751,12 +743,18 @@ msgstr "%1 〉"
751#~ msgid "Settings"
743#~ msgid "Settings"
752#~ msgstr "ማሰናጃ"
744#~ msgstr "ማሰናጃ"
753
745
746+#~ msgid "Unlock SIM"
747+#~ msgstr "ሲም መክፈቻ"
748+
754#~ msgid ""
749#~ msgid ""
755#~ "You have now mastered the edge gestures and can start using the "
750#~ "You have now mastered the edge gestures and can start using the "
756#~ "phone<br><br>Tap on the screen to start"
751#~ "phone<br><br>Tap on the screen to start"
757#~ msgstr ""
752#~ msgstr ""
758#~ "አሁን የ ጠርዝ እንቅስቃሴን አውቀዋል እና መጀመር ይችላሉ ስልኩን መጠቀም <br><br>መመልከቻውን መታ ያድርጉ ለመጀመር"
753#~ "አሁን የ ጠርዝ እንቅስቃሴን አውቀዋል እና መጀመር ይችላሉ ስልኩን መጠቀም <br><br>መመልከቻውን መታ ያድርጉ ለመጀመር"
759
754
755+#~ msgid "Roaming"
756+#~ msgstr "ማዘዋወሪያ"
757+
760#~ msgid "Restart"
758#~ msgid "Restart"
761#~ msgstr "እንደገና ማስጀመሪያ"
759#~ msgstr "እንደገና ማስጀመሪያ"
762
760
po/ar.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-07-29 09:41+0000\n"
11"PO-Revision-Date: 2015-07-29 09:41+0000\n"
12"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
12"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
13"Language-Team: Arabic <ar@li.org>\n"
13"Language-Team: Arabic <ar@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
17"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
18"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
18"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n"
20"X-Generator: Launchpad (build 17936)\n"
20"X-Generator: Launchpad (build 17936)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -180,26 +180,26 @@ msgstr ""
180msgid "Close all"
180msgid "Close all"
181msgstr ""
181msgstr ""
182
182
183−#: qml/Dash/DashPageHeader.qml:266
183+#: qml/Dash/DashPageHeader.qml:270
184msgctxt "Button: Open the Ubuntu Store"
184msgctxt "Button: Open the Ubuntu Store"
185msgid "Store"
185msgid "Store"
186msgstr "المتجر"
186msgstr "المتجر"
187
187
188−#: qml/Dash/DashPageHeader.qml:273
188+#: qml/Dash/DashPageHeader.qml:277
189msgctxt "Button: Start a search in the current dash scope"
189msgctxt "Button: Start a search in the current dash scope"
190msgid "Search"
190msgid "Search"
191msgstr "بحث"
191msgstr "بحث"
192
192
193−#: qml/Dash/DashPageHeader.qml:283
193+#: qml/Dash/DashPageHeader.qml:287
194msgctxt "Button: Show the current dash scope settings"
194msgctxt "Button: Show the current dash scope settings"
195msgid "Settings"
195msgid "Settings"
196msgstr "الإعدادات"
196msgstr "الإعدادات"
197
197
198−#: qml/Dash/DashPageHeader.qml:290
198+#: qml/Dash/DashPageHeader.qml:294
199msgid "Remove from Favorites"
199msgid "Remove from Favorites"
200msgstr "حذف من المفضلات"
200msgstr "حذف من المفضلات"
201
201
202−#: qml/Dash/DashPageHeader.qml:290
202+#: qml/Dash/DashPageHeader.qml:294
203msgid "Add to Favorites"
203msgid "Add to Favorites"
204msgstr "إضافة إلى المفضلات"
204msgstr "إضافة إلى المفضلات"
205
205
@@ -441,14 +441,6 @@ msgctxt "Button: Call back on phone"
441msgid "Call back"
441msgid "Call back"
442msgstr ""
442msgstr ""
443
443
444−#: qml/Panel/Indicators/ModemInfoItem.qml:105
445−msgid "Unlock SIM"
446−msgstr "فتح قفل بطاقة SIM"
447−
448−#: qml/Panel/Indicators/RoamingIndication.qml:27
449−msgid "Roaming"
450−msgstr "التجوال"
451−
452#: qml/Tutorial/TutorialBottom.qml:28
444#: qml/Tutorial/TutorialBottom.qml:28
453msgid "Open special menus"
445msgid "Open special menus"
454msgstr "فتح قوائم خاصة"
446msgstr "فتح قوائم خاصة"
@@ -786,6 +778,9 @@ msgstr ""
786#~ msgid "Please re-enter"
778#~ msgid "Please re-enter"
787#~ msgstr "برجاء إعادة إدخالها"
779#~ msgstr "برجاء إعادة إدخالها"
788
780
781+#~ msgid "Roaming"
782+#~ msgstr "التجوال"
783+
789#~ msgid "Welcome to your Ubuntu phone."
784#~ msgid "Welcome to your Ubuntu phone."
790#~ msgstr "مرحبا بك في أوبونتو للهواتف."
785#~ msgstr "مرحبا بك في أوبونتو للهواتف."
791
786
@@ -794,3 +789,6 @@ msgstr ""
794
789
795#~ msgid "Your phone is now ready to use."
790#~ msgid "Your phone is now ready to use."
796#~ msgstr "هاتفك جاهز الآن للاستخدام."
791#~ msgstr "هاتفك جاهز الآن للاستخدام."
792+
793+#~ msgid "Unlock SIM"
794+#~ msgstr "فتح قفل بطاقة SIM"
po/ast.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2016-02-19 19:39+0000\n"
11"PO-Revision-Date: 2016-02-19 19:39+0000\n"
12"Last-Translator: Xuacu Saturio <xuacusk8@gmail.com>\n"
12"Last-Translator: Xuacu Saturio <xuacusk8@gmail.com>\n"
13"Language-Team: Asturian <ast@li.org>\n"
13"Language-Team: Asturian <ast@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -176,26 +176,26 @@ msgstr "Reconeutar agora."
176msgid "Close all"
176msgid "Close all"
177msgstr "Zarrar too"
177msgstr "Zarrar too"
178
178
179−#: qml/Dash/DashPageHeader.qml:266
179+#: qml/Dash/DashPageHeader.qml:270
180msgctxt "Button: Open the Ubuntu Store"
180msgctxt "Button: Open the Ubuntu Store"
181msgid "Store"
181msgid "Store"
182msgstr "Tienda"
182msgstr "Tienda"
183
183
184−#: qml/Dash/DashPageHeader.qml:273
184+#: qml/Dash/DashPageHeader.qml:277
185msgctxt "Button: Start a search in the current dash scope"
185msgctxt "Button: Start a search in the current dash scope"
186msgid "Search"
186msgid "Search"
187msgstr "Guetar"
187msgstr "Guetar"
188
188
189−#: qml/Dash/DashPageHeader.qml:283
189+#: qml/Dash/DashPageHeader.qml:287
190msgctxt "Button: Show the current dash scope settings"
190msgctxt "Button: Show the current dash scope settings"
191msgid "Settings"
191msgid "Settings"
192msgstr "Axustes"
192msgstr "Axustes"
193
193
194−#: qml/Dash/DashPageHeader.qml:290
194+#: qml/Dash/DashPageHeader.qml:294
195msgid "Remove from Favorites"
195msgid "Remove from Favorites"
196msgstr "Desaniciar de favoritos"
196msgstr "Desaniciar de favoritos"
197
197
198−#: qml/Dash/DashPageHeader.qml:290
198+#: qml/Dash/DashPageHeader.qml:294
199msgid "Add to Favorites"
199msgid "Add to Favorites"
200msgstr "Amestar a favoritos"
200msgstr "Amestar a favoritos"
201
201
@@ -425,14 +425,6 @@ msgctxt "Button: Call back on phone"
425msgid "Call back"
425msgid "Call back"
426msgstr "Devolver llamada"
426msgstr "Devolver llamada"
427
427
428−#: qml/Panel/Indicators/ModemInfoItem.qml:105
429−msgid "Unlock SIM"
430−msgstr "Desbloquiar SIM"
431−
432−#: qml/Panel/Indicators/RoamingIndication.qml:27
433−msgid "Roaming"
434−msgstr "Roaming"
435−
436#: qml/Tutorial/TutorialBottom.qml:28
428#: qml/Tutorial/TutorialBottom.qml:28
437msgid "Open special menus"
429msgid "Open special menus"
438msgstr "Abrir menús especiales"
430msgstr "Abrir menús especiales"
@@ -763,9 +755,15 @@ msgstr "%1 〉"
763#~ msgid "All"
755#~ msgid "All"
764#~ msgstr "Too"
756#~ msgstr "Too"
765
757
758+#~ msgid "Unlock SIM"
759+#~ msgstr "Desbloquiar SIM"
760+
766#~ msgid "Store"
761#~ msgid "Store"
767#~ msgstr "Tienda"
762#~ msgstr "Tienda"
768
763
764+#~ msgid "Roaming"
765+#~ msgstr "Roaming"
766+
769#~ msgid "Restart"
767#~ msgid "Restart"
770#~ msgstr "Reaniciar"
768#~ msgstr "Reaniciar"
771
769
po/az.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2014-09-03 16:39+0000\n"
11"PO-Revision-Date: 2014-09-03 16:39+0000\n"
12"Last-Translator: Nicat Məmmədov <n1c4t97@gmail.com>\n"
12"Last-Translator: Nicat Məmmədov <n1c4t97@gmail.com>\n"
13"Language-Team: Azerbaijani <az@li.org>\n"
13"Language-Team: Azerbaijani <az@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr ""
177msgstr ""
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr ""
182msgstr ""
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr ""
187msgstr ""
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr "Seçilmişlәrdәn çıxart"
191msgstr "Seçilmişlәrdәn çıxart"
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr "Seçilmişlәrә әlavә et"
195msgstr "Seçilmişlәrә әlavә et"
196
196
@@ -420,14 +420,6 @@ msgctxt "Button: Call back on phone"
420msgid "Call back"
420msgid "Call back"
421msgstr ""
421msgstr ""
422
422
423−#: qml/Panel/Indicators/ModemInfoItem.qml:105
424−msgid "Unlock SIM"
425−msgstr "SIM kilidini aç"
426−
427−#: qml/Panel/Indicators/RoamingIndication.qml:27
428−msgid "Roaming"
429−msgstr "Rominq"
430−
431#: qml/Tutorial/TutorialBottom.qml:28
423#: qml/Tutorial/TutorialBottom.qml:28
432msgid "Open special menus"
424msgid "Open special menus"
433msgstr ""
425msgstr ""
@@ -713,6 +705,12 @@ msgstr ""
713#~ msgid "Done"
705#~ msgid "Done"
714#~ msgstr "Başa çatdı"
706#~ msgstr "Başa çatdı"
715
707
708+#~ msgid "Unlock SIM"
709+#~ msgstr "SIM kilidini aç"
710+
711+#~ msgid "Roaming"
712+#~ msgstr "Rominq"
713+
716#~ msgid "Log out"
714#~ msgid "Log out"
717#~ msgstr "Çıxış"
715#~ msgstr "Çıxış"
718
716
po/be.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-12-13 13:12+0000\n"
11"PO-Revision-Date: 2015-12-13 13:12+0000\n"
12"Last-Translator: Mikhail_SaTuRn <mikhail_saturn@tut.by>\n"
12"Last-Translator: Mikhail_SaTuRn <mikhail_saturn@tut.by>\n"
13"Language-Team: Belarusian <be@li.org>\n"
13"Language-Team: Belarusian <be@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
17"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n"
20"X-Generator: Launchpad (build 17936)\n"
20"X-Generator: Launchpad (build 17936)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -178,26 +178,26 @@ msgstr "Перападлучыцца зараз!"
178msgid "Close all"
178msgid "Close all"
179msgstr "Зачыніць усё"
179msgstr "Зачыніць усё"
180
180
181−#: qml/Dash/DashPageHeader.qml:266
181+#: qml/Dash/DashPageHeader.qml:270
182msgctxt "Button: Open the Ubuntu Store"
182msgctxt "Button: Open the Ubuntu Store"
183msgid "Store"
183msgid "Store"
184msgstr "Крама"
184msgstr "Крама"
185
185
186−#: qml/Dash/DashPageHeader.qml:273
186+#: qml/Dash/DashPageHeader.qml:277
187msgctxt "Button: Start a search in the current dash scope"
187msgctxt "Button: Start a search in the current dash scope"
188msgid "Search"
188msgid "Search"
189msgstr "Пошук"
189msgstr "Пошук"
190
190
191−#: qml/Dash/DashPageHeader.qml:283
191+#: qml/Dash/DashPageHeader.qml:287
192msgctxt "Button: Show the current dash scope settings"
192msgctxt "Button: Show the current dash scope settings"
193msgid "Settings"
193msgid "Settings"
194msgstr "Налады"
194msgstr "Налады"
195
195
196−#: qml/Dash/DashPageHeader.qml:290
196+#: qml/Dash/DashPageHeader.qml:294
197msgid "Remove from Favorites"
197msgid "Remove from Favorites"
198msgstr "Выдаліць з абранага"
198msgstr "Выдаліць з абранага"
199
199
200−#: qml/Dash/DashPageHeader.qml:290
200+#: qml/Dash/DashPageHeader.qml:294
201msgid "Add to Favorites"
201msgid "Add to Favorites"
202msgstr "Дадаць да абранага"
202msgstr "Дадаць да абранага"
203
203
@@ -430,14 +430,6 @@ msgctxt "Button: Call back on phone"
430msgid "Call back"
430msgid "Call back"
431msgstr "Патэлефанаваць"
431msgstr "Патэлефанаваць"
432
432
433−#: qml/Panel/Indicators/ModemInfoItem.qml:105
434−msgid "Unlock SIM"
435−msgstr "Разблакаваць SIM"
436−
437−#: qml/Panel/Indicators/RoamingIndication.qml:27
438−msgid "Roaming"
439−msgstr "Роўмінг"
440−
441#: qml/Tutorial/TutorialBottom.qml:28
433#: qml/Tutorial/TutorialBottom.qml:28
442msgid "Open special menus"
434msgid "Open special menus"
443msgstr "Адкрыць спецыяльныя меню"
435msgstr "Адкрыць спецыяльныя меню"
@@ -705,6 +697,12 @@ msgstr "%1 〉"
705#~ msgid "Confirm"
697#~ msgid "Confirm"
706#~ msgstr "Пацвердзіць"
698#~ msgstr "Пацвердзіць"
707
699
700+#~ msgid "Unlock SIM"
701+#~ msgstr "Разблакаваць SIM"
702+
703+#~ msgid "Roaming"
704+#~ msgstr "Роўмінг"
705+
708#~ msgid "Try swiping from the right edge to unlock the phone"
706#~ msgid "Try swiping from the right edge to unlock the phone"
709#~ msgstr "Правядзіце пальцам з правага краю, каб разблакаваць тэлефон"
707#~ msgstr "Правядзіце пальцам з правага краю, каб разблакаваць тэлефон"
710
708
po/bg.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-04-12 14:43+0000\n"
11"PO-Revision-Date: 2015-04-12 14:43+0000\n"
12"Last-Translator: George Karavasilev <kokoto-java@ubuntu.com>\n"
12"Last-Translator: George Karavasilev <kokoto-java@ubuntu.com>\n"
13"Language-Team: Bulgarian <bg@li.org>\n"
13"Language-Team: Bulgarian <bg@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -173,26 +173,26 @@ msgstr ""
173msgid "Close all"
173msgid "Close all"
174msgstr ""
174msgstr ""
175
175
176−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
177msgctxt "Button: Open the Ubuntu Store"
177msgctxt "Button: Open the Ubuntu Store"
178msgid "Store"
178msgid "Store"
179msgstr ""
179msgstr ""
180
180
181−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
182msgctxt "Button: Start a search in the current dash scope"
182msgctxt "Button: Start a search in the current dash scope"
183msgid "Search"
183msgid "Search"
184msgstr ""
184msgstr ""
185
185
186−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
187msgctxt "Button: Show the current dash scope settings"
187msgctxt "Button: Show the current dash scope settings"
188msgid "Settings"
188msgid "Settings"
189msgstr ""
189msgstr ""
190
190
191−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
192msgid "Remove from Favorites"
192msgid "Remove from Favorites"
193msgstr ""
193msgstr ""
194
194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196msgid "Add to Favorites"
196msgid "Add to Favorites"
197msgstr ""
197msgstr ""
198
198
@@ -418,14 +418,6 @@ msgctxt "Button: Call back on phone"
418msgid "Call back"
418msgid "Call back"
419msgstr ""
419msgstr ""
420
420
421−#: qml/Panel/Indicators/ModemInfoItem.qml:105
422−msgid "Unlock SIM"
423−msgstr ""
424−
425−#: qml/Panel/Indicators/RoamingIndication.qml:27
426−msgid "Roaming"
427−msgstr ""
428−
429#: qml/Tutorial/TutorialBottom.qml:28
421#: qml/Tutorial/TutorialBottom.qml:28
430msgid "Open special menus"
422msgid "Open special menus"
431msgstr ""
423msgstr ""
po/bn.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-11-27 19:38+0000\n"
11"PO-Revision-Date: 2015-11-27 19:38+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Bengali <bn@li.org>\n"
13"Language-Team: Bengali <bn@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -173,26 +173,26 @@ msgstr ""
173msgid "Close all"
173msgid "Close all"
174msgstr ""
174msgstr ""
175
175
176−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
177msgctxt "Button: Open the Ubuntu Store"
177msgctxt "Button: Open the Ubuntu Store"
178msgid "Store"
178msgid "Store"
179msgstr "স্টোর"
179msgstr "স্টোর"
180
180
181−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
182msgctxt "Button: Start a search in the current dash scope"
182msgctxt "Button: Start a search in the current dash scope"
183msgid "Search"
183msgid "Search"
184msgstr "খুঁজুন"
184msgstr "খুঁজুন"
185
185
186−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
187msgctxt "Button: Show the current dash scope settings"
187msgctxt "Button: Show the current dash scope settings"
188msgid "Settings"
188msgid "Settings"
189msgstr "সেটিংস"
189msgstr "সেটিংস"
190
190
191−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
192msgid "Remove from Favorites"
192msgid "Remove from Favorites"
193msgstr "পছন্দ থেকে মুছে ফেলুন"
193msgstr "পছন্দ থেকে মুছে ফেলুন"
194
194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196msgid "Add to Favorites"
196msgid "Add to Favorites"
197msgstr "পছন্দতে যোগ করুন"
197msgstr "পছন্দতে যোগ করুন"
198
198
@@ -419,14 +419,6 @@ msgctxt "Button: Call back on phone"
419msgid "Call back"
419msgid "Call back"
420msgstr "কল ব্যাক"
420msgstr "কল ব্যাক"
421
421
422−#: qml/Panel/Indicators/ModemInfoItem.qml:105
423−msgid "Unlock SIM"
424−msgstr "সিম লক খুলুন করুন"
425−
426−#: qml/Panel/Indicators/RoamingIndication.qml:27
427−msgid "Roaming"
428−msgstr "রোমিং"
429−
430#: qml/Tutorial/TutorialBottom.qml:28
422#: qml/Tutorial/TutorialBottom.qml:28
431msgid "Open special menus"
423msgid "Open special menus"
432msgstr ""
424msgstr ""
@@ -726,6 +718,12 @@ msgstr ""
726#~ msgid "Speak Now..."
718#~ msgid "Speak Now..."
727#~ msgstr "এখন বলুন..."
719#~ msgstr "এখন বলুন..."
728
720
721+#~ msgid "Unlock SIM"
722+#~ msgstr "সিম লক খুলুন করুন"
723+
724+#~ msgid "Roaming"
725+#~ msgstr "রোমিং"
726+
729#~ msgid "Please re-enter"
727#~ msgid "Please re-enter"
730#~ msgstr "অনুগ্রহ করে আবার লিখুন"
728#~ msgstr "অনুগ্রহ করে আবার লিখুন"
731
729
po/br.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2016-02-22 12:29+0000\n"
11"PO-Revision-Date: 2016-02-22 12:29+0000\n"
12"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
12"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
13"Language-Team: Breton <br@li.org>\n"
13"Language-Team: Breton <br@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -179,26 +179,26 @@ msgstr "Adkevreañ bremañ !"
179msgid "Close all"
179msgid "Close all"
180msgstr "Serriñ pep tra"
180msgstr "Serriñ pep tra"
181
181
182−#: qml/Dash/DashPageHeader.qml:266
182+#: qml/Dash/DashPageHeader.qml:270
183msgctxt "Button: Open the Ubuntu Store"
183msgctxt "Button: Open the Ubuntu Store"
184msgid "Store"
184msgid "Store"
185msgstr "Stal"
185msgstr "Stal"
186
186
187−#: qml/Dash/DashPageHeader.qml:273
187+#: qml/Dash/DashPageHeader.qml:277
188msgctxt "Button: Start a search in the current dash scope"
188msgctxt "Button: Start a search in the current dash scope"
189msgid "Search"
189msgid "Search"
190msgstr "Klask"
190msgstr "Klask"
191
191
192−#: qml/Dash/DashPageHeader.qml:283
192+#: qml/Dash/DashPageHeader.qml:287
193msgctxt "Button: Show the current dash scope settings"
193msgctxt "Button: Show the current dash scope settings"
194msgid "Settings"
194msgid "Settings"
195msgstr "Arventennoù"
195msgstr "Arventennoù"
196
196
197−#: qml/Dash/DashPageHeader.qml:290
197+#: qml/Dash/DashPageHeader.qml:294
198msgid "Remove from Favorites"
198msgid "Remove from Favorites"
199msgstr "Lemel eus ar sinedoù"
199msgstr "Lemel eus ar sinedoù"
200
200
201−#: qml/Dash/DashPageHeader.qml:290
201+#: qml/Dash/DashPageHeader.qml:294
202msgid "Add to Favorites"
202msgid "Add to Favorites"
203msgstr "Ouzhpennañ d'ar sinedoù"
203msgstr "Ouzhpennañ d'ar sinedoù"
204
204
@@ -430,14 +430,6 @@ msgctxt "Button: Call back on phone"
430msgid "Call back"
430msgid "Call back"
431msgstr "Gervel en-dro"
431msgstr "Gervel en-dro"
432
432
433−#: qml/Panel/Indicators/ModemInfoItem.qml:105
434−msgid "Unlock SIM"
435−msgstr "Dibrennañ ar gartenn SIM"
436−
437−#: qml/Panel/Indicators/RoamingIndication.qml:27
438−msgid "Roaming"
439−msgstr "O kantren"
440−
441#: qml/Tutorial/TutorialBottom.qml:28
433#: qml/Tutorial/TutorialBottom.qml:28
442msgid "Open special menus"
434msgid "Open special menus"
443msgstr "Digeriñ al lañserioù ispisial"
435msgstr "Digeriñ al lañserioù ispisial"
@@ -756,6 +748,12 @@ msgstr "%1 〉"
756#~ msgid "All"
748#~ msgid "All"
757#~ msgstr "An holl anezho"
749#~ msgstr "An holl anezho"
758
750
751+#~ msgid "Unlock SIM"
752+#~ msgstr "Dibrennañ ar gartenn SIM"
753+
754+#~ msgid "Roaming"
755+#~ msgstr "O kantren"
756+
759#~ msgid "Favorites"
757#~ msgid "Favorites"
760#~ msgstr "Gwellañ deuet"
758#~ msgstr "Gwellañ deuet"
761
759
po/bs.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-12-01 20:06+0000\n"
11"PO-Revision-Date: 2015-12-01 20:06+0000\n"
12"Last-Translator: Kenan Gutić <Unknown>\n"
12"Last-Translator: Kenan Gutić <Unknown>\n"
13"Language-Team: Bosnian <bs@li.org>\n"
13"Language-Team: Bosnian <bs@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n"
20"X-Generator: Launchpad (build 17936)\n"
20"X-Generator: Launchpad (build 17936)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -177,26 +177,26 @@ msgstr "Ponovo poveži sada"
177msgid "Close all"
177msgid "Close all"
178msgstr "Zatvori sve"
178msgstr "Zatvori sve"
179
179
180−#: qml/Dash/DashPageHeader.qml:266
180+#: qml/Dash/DashPageHeader.qml:270
181msgctxt "Button: Open the Ubuntu Store"
181msgctxt "Button: Open the Ubuntu Store"
182msgid "Store"
182msgid "Store"
183msgstr "Trgovina"
183msgstr "Trgovina"
184
184
185−#: qml/Dash/DashPageHeader.qml:273
185+#: qml/Dash/DashPageHeader.qml:277
186msgctxt "Button: Start a search in the current dash scope"
186msgctxt "Button: Start a search in the current dash scope"
187msgid "Search"
187msgid "Search"
188msgstr "Pretraživanje"
188msgstr "Pretraživanje"
189
189
190−#: qml/Dash/DashPageHeader.qml:283
190+#: qml/Dash/DashPageHeader.qml:287
191msgctxt "Button: Show the current dash scope settings"
191msgctxt "Button: Show the current dash scope settings"
192msgid "Settings"
192msgid "Settings"
193msgstr "Podešavanja"
193msgstr "Podešavanja"
194
194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196msgid "Remove from Favorites"
196msgid "Remove from Favorites"
197msgstr "Ukloni iz Omiljenih"
197msgstr "Ukloni iz Omiljenih"
198
198
199−#: qml/Dash/DashPageHeader.qml:290
199+#: qml/Dash/DashPageHeader.qml:294
200msgid "Add to Favorites"
200msgid "Add to Favorites"
201msgstr "Dodaj u Omiljene"
201msgstr "Dodaj u Omiljene"
202
202
@@ -429,14 +429,6 @@ msgctxt "Button: Call back on phone"
429msgid "Call back"
429msgid "Call back"
430msgstr "Uzvrati poziv"
430msgstr "Uzvrati poziv"
431
431
432−#: qml/Panel/Indicators/ModemInfoItem.qml:105
433−msgid "Unlock SIM"
434−msgstr "Otključajte SIM"
435−
436−#: qml/Panel/Indicators/RoamingIndication.qml:27
437−msgid "Roaming"
438−msgstr "Roaming"
439−
440#: qml/Tutorial/TutorialBottom.qml:28
432#: qml/Tutorial/TutorialBottom.qml:28
441msgid "Open special menus"
433msgid "Open special menus"
442msgstr "Otvorite posebne menije"
434msgstr "Otvorite posebne menije"
@@ -699,6 +691,12 @@ msgstr "%1 〉"
699#~ msgid "Please re-enter"
691#~ msgid "Please re-enter"
700#~ msgstr "Molimo ponovo unesite"
692#~ msgstr "Molimo ponovo unesite"
701
693
694+#~ msgid "Unlock SIM"
695+#~ msgstr "Otključajte SIM"
696+
697+#~ msgid "Roaming"
698+#~ msgstr "Roaming"
699+
702#~ msgid "Welcome to your Ubuntu phone."
700#~ msgid "Welcome to your Ubuntu phone."
703#~ msgstr "Dobrodošli u vaš Ubuntu telefon."
701#~ msgstr "Dobrodošli u vaš Ubuntu telefon."
704
702
po/ca.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-07-04 09:48+0000\n"
11"PO-Revision-Date: 2015-07-04 09:48+0000\n"
12"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
12"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
13"Language-Team: Catalan <ca@li.org>\n"
13"Language-Team: Catalan <ca@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -179,26 +179,26 @@ msgstr "Torna a connectar"
179msgid "Close all"
179msgid "Close all"
180msgstr "Tanca-ho tot"
180msgstr "Tanca-ho tot"
181
181
182−#: qml/Dash/DashPageHeader.qml:266
182+#: qml/Dash/DashPageHeader.qml:270
183msgctxt "Button: Open the Ubuntu Store"
183msgctxt "Button: Open the Ubuntu Store"
184msgid "Store"
184msgid "Store"
185msgstr "Botiga"
185msgstr "Botiga"
186
186
187−#: qml/Dash/DashPageHeader.qml:273
187+#: qml/Dash/DashPageHeader.qml:277
188msgctxt "Button: Start a search in the current dash scope"
188msgctxt "Button: Start a search in the current dash scope"
189msgid "Search"
189msgid "Search"
190msgstr "Cerca"
190msgstr "Cerca"
191
191
192−#: qml/Dash/DashPageHeader.qml:283
192+#: qml/Dash/DashPageHeader.qml:287
193msgctxt "Button: Show the current dash scope settings"
193msgctxt "Button: Show the current dash scope settings"
194msgid "Settings"
194msgid "Settings"
195msgstr "Paràmetres"
195msgstr "Paràmetres"
196
196
197−#: qml/Dash/DashPageHeader.qml:290
197+#: qml/Dash/DashPageHeader.qml:294
198msgid "Remove from Favorites"
198msgid "Remove from Favorites"
199msgstr "Suprimeix dels preferits"
199msgstr "Suprimeix dels preferits"
200
200
201−#: qml/Dash/DashPageHeader.qml:290
201+#: qml/Dash/DashPageHeader.qml:294
202msgid "Add to Favorites"
202msgid "Add to Favorites"
203msgstr "Afegeix als preferits"
203msgstr "Afegeix als preferits"
204
204
@@ -430,14 +430,6 @@ msgctxt "Button: Call back on phone"
430msgid "Call back"
430msgid "Call back"
431msgstr "Retorna la trucada"
431msgstr "Retorna la trucada"
432
432
433−#: qml/Panel/Indicators/ModemInfoItem.qml:105
434−msgid "Unlock SIM"
435−msgstr "Desbloca la SIM"
436−
437−#: qml/Panel/Indicators/RoamingIndication.qml:27
438−msgid "Roaming"
439−msgstr "Itinerància"
440−
441#: qml/Tutorial/TutorialBottom.qml:28
433#: qml/Tutorial/TutorialBottom.qml:28
442msgid "Open special menus"
434msgid "Open special menus"
443msgstr "Obre els menús especials"
435msgstr "Obre els menús especials"
@@ -747,12 +739,18 @@ msgstr "%1 〉"
747#~ "Ja heu après com utilitzar els gestos de les vores per fer servir el "
739#~ "Ja heu après com utilitzar els gestos de les vores per fer servir el "
748#~ "telèfon<br><br>Feu un toc a la pantalla per començar"
740#~ "telèfon<br><br>Feu un toc a la pantalla per començar"
749
741
742+#~ msgid "Unlock SIM"
743+#~ msgstr "Desbloca la SIM"
744+
750#~ msgid "Store"
745#~ msgid "Store"
751#~ msgstr "Botiga"
746#~ msgstr "Botiga"
752
747
753#~ msgid "Done"
748#~ msgid "Done"
754#~ msgstr "Fet"
749#~ msgstr "Fet"
755
750
751+#~ msgid "Roaming"
752+#~ msgstr "Itinerància"
753+
756#~ msgid "Favorites"
754#~ msgid "Favorites"
757#~ msgstr "Preferides"
755#~ msgstr "Preferides"
758
756
po/ca@valencia.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-02-22 15:22+0000\n"
11"PO-Revision-Date: 2015-02-22 15:22+0000\n"
12"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
12"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
13"Language-Team: Catalan <ca@li.org>\n"
13"Language-Team: Catalan <ca@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -177,26 +177,26 @@ msgstr ""
177msgid "Close all"
177msgid "Close all"
178msgstr ""
178msgstr ""
179
179
180−#: qml/Dash/DashPageHeader.qml:266
180+#: qml/Dash/DashPageHeader.qml:270
181msgctxt "Button: Open the Ubuntu Store"
181msgctxt "Button: Open the Ubuntu Store"
182msgid "Store"
182msgid "Store"
183msgstr ""
183msgstr ""
184
184
185−#: qml/Dash/DashPageHeader.qml:273
185+#: qml/Dash/DashPageHeader.qml:277
186msgctxt "Button: Start a search in the current dash scope"
186msgctxt "Button: Start a search in the current dash scope"
187msgid "Search"
187msgid "Search"
188msgstr ""
188msgstr ""
189
189
190−#: qml/Dash/DashPageHeader.qml:283
190+#: qml/Dash/DashPageHeader.qml:287
191msgctxt "Button: Show the current dash scope settings"
191msgctxt "Button: Show the current dash scope settings"
192msgid "Settings"
192msgid "Settings"
193msgstr ""
193msgstr ""
194
194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196msgid "Remove from Favorites"
196msgid "Remove from Favorites"
197msgstr "Suprimeix dels preferits"
197msgstr "Suprimeix dels preferits"
198
198
199−#: qml/Dash/DashPageHeader.qml:290
199+#: qml/Dash/DashPageHeader.qml:294
200msgid "Add to Favorites"
200msgid "Add to Favorites"
201msgstr "Afig als preferits"
201msgstr "Afig als preferits"
202
202
@@ -428,14 +428,6 @@ msgctxt "Button: Call back on phone"
428msgid "Call back"
428msgid "Call back"
429msgstr ""
429msgstr ""
430
430
431−#: qml/Panel/Indicators/ModemInfoItem.qml:105
432−msgid "Unlock SIM"
433−msgstr "Desbloca la SIM"
434−
435−#: qml/Panel/Indicators/RoamingIndication.qml:27
436−msgid "Roaming"
437−msgstr "Itinerància"
438−
439#: qml/Tutorial/TutorialBottom.qml:28
431#: qml/Tutorial/TutorialBottom.qml:28
440msgid "Open special menus"
432msgid "Open special menus"
441msgstr ""
433msgstr ""
@@ -771,6 +763,12 @@ msgstr "%1 〉"
771#~ msgid "Speaking..."
763#~ msgid "Speaking..."
772#~ msgstr "S'està parlant..."
764#~ msgstr "S'està parlant..."
773
765
766+#~ msgid "Unlock SIM"
767+#~ msgstr "Desbloca la SIM"
768+
769+#~ msgid "Roaming"
770+#~ msgstr "Itinerància"
771+
774#~ msgid "Please re-enter"
772#~ msgid "Please re-enter"
775#~ msgstr "Torneu-ho a introduir"
773#~ msgstr "Torneu-ho a introduir"
776
774
po/ce.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-02-15 04:01+0000\n"
11"PO-Revision-Date: 2015-02-15 04:01+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Chechen <ce@li.org>\n"
13"Language-Team: Chechen <ce@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr ""
177msgstr ""
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr ""
182msgstr ""
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr ""
187msgstr ""
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr ""
195msgstr ""
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr ""
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
po/ckb.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2014-01-21 11:05+0000\n"
11"PO-Revision-Date: 2014-01-21 11:05+0000\n"
12"Last-Translator: Aras <aras.noori@gmail.com>\n"
12"Last-Translator: Aras <aras.noori@gmail.com>\n"
13"Language-Team: Kurdish (Sorani) <ckb@li.org>\n"
13"Language-Team: Kurdish (Sorani) <ckb@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr ""
177msgstr ""
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr ""
182msgstr ""
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr ""
187msgstr ""
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr ""
195msgstr ""
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr ""
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
po/cs.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-07-07 10:44+0000\n"
11"PO-Revision-Date: 2015-07-07 10:44+0000\n"
12"Last-Translator: Vojtěch Daněk <vdanek@outlook.com>\n"
12"Last-Translator: Vojtěch Daněk <vdanek@outlook.com>\n"
13"Language-Team: Czech <cs@li.org>\n"
13"Language-Team: Czech <cs@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
17"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20"Language: cs\n"
20"Language: cs\n"
21
21
@@ -177,26 +177,26 @@ msgstr ""
177msgid "Close all"
177msgid "Close all"
178msgstr ""
178msgstr ""
179
179
180−#: qml/Dash/DashPageHeader.qml:266
180+#: qml/Dash/DashPageHeader.qml:270
181msgctxt "Button: Open the Ubuntu Store"
181msgctxt "Button: Open the Ubuntu Store"
182msgid "Store"
182msgid "Store"
183msgstr "Obchod"
183msgstr "Obchod"
184
184
185−#: qml/Dash/DashPageHeader.qml:273
185+#: qml/Dash/DashPageHeader.qml:277
186msgctxt "Button: Start a search in the current dash scope"
186msgctxt "Button: Start a search in the current dash scope"
187msgid "Search"
187msgid "Search"
188msgstr "Hledat"
188msgstr "Hledat"
189
189
190−#: qml/Dash/DashPageHeader.qml:283
190+#: qml/Dash/DashPageHeader.qml:287
191msgctxt "Button: Show the current dash scope settings"
191msgctxt "Button: Show the current dash scope settings"
192msgid "Settings"
192msgid "Settings"
193msgstr "Nastavení"
193msgstr "Nastavení"
194
194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196msgid "Remove from Favorites"
196msgid "Remove from Favorites"
197msgstr "Odstranit z oblíbených"
197msgstr "Odstranit z oblíbených"
198
198
199−#: qml/Dash/DashPageHeader.qml:290
199+#: qml/Dash/DashPageHeader.qml:294
200msgid "Add to Favorites"
200msgid "Add to Favorites"
201msgstr "Přidat do oblíbených"
201msgstr "Přidat do oblíbených"
202
202
@@ -429,14 +429,6 @@ msgctxt "Button: Call back on phone"
429msgid "Call back"
429msgid "Call back"
430msgstr ""
430msgstr ""
431
431
432−#: qml/Panel/Indicators/ModemInfoItem.qml:105
433−msgid "Unlock SIM"
434−msgstr "Odemknout SIM"
435−
436−#: qml/Panel/Indicators/RoamingIndication.qml:27
437−msgid "Roaming"
438−msgstr "Roaming"
439−
440#: qml/Tutorial/TutorialBottom.qml:28
432#: qml/Tutorial/TutorialBottom.qml:28
441msgid "Open special menus"
433msgid "Open special menus"
442msgstr "Otevřít speciální menu"
434msgstr "Otevřít speciální menu"
@@ -734,6 +726,12 @@ msgstr "%1 〉"
734#~ msgid "Please re-enter"
726#~ msgid "Please re-enter"
735#~ msgstr "Vložte znovu"
727#~ msgstr "Vložte znovu"
736
728
729+#~ msgid "Unlock SIM"
730+#~ msgstr "Odemknout SIM"
731+
732+#~ msgid "Roaming"
733+#~ msgstr "Roaming"
734+
737#~ msgid "Welcome to your Ubuntu phone."
735#~ msgid "Welcome to your Ubuntu phone."
738#~ msgstr "Vítejte ve vašem Ubuntu telefonu."
736#~ msgstr "Vítejte ve vašem Ubuntu telefonu."
739
737
po/cy.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-07-31 13:21+0000\n"
11"PO-Revision-Date: 2015-07-31 13:21+0000\n"
12"Last-Translator: Owen Llywelyn <owen.llywelyn@gmail.com>\n"
12"Last-Translator: Owen Llywelyn <owen.llywelyn@gmail.com>\n"
13"Language-Team: Welsh <cy@li.org>\n"
13"Language-Team: Welsh <cy@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=4; plural=n==1 ? 0 : n==2 ? 1 : (n != 8 && n != 11) ? "
17"Plural-Forms: nplurals=4; plural=n==1 ? 0 : n==2 ? 1 : (n != 8 && n != 11) ? "
18"2 : 3;\n"
18"2 : 3;\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
20"X-Generator: Launchpad (build 17936)\n"
20"X-Generator: Launchpad (build 17936)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -178,26 +178,26 @@ msgstr ""
178msgid "Close all"
178msgid "Close all"
179msgstr ""
179msgstr ""
180
180
181−#: qml/Dash/DashPageHeader.qml:266
181+#: qml/Dash/DashPageHeader.qml:270
182msgctxt "Button: Open the Ubuntu Store"
182msgctxt "Button: Open the Ubuntu Store"
183msgid "Store"
183msgid "Store"
184msgstr "Marchnad"
184msgstr "Marchnad"
185
185
186−#: qml/Dash/DashPageHeader.qml:273
186+#: qml/Dash/DashPageHeader.qml:277
187msgctxt "Button: Start a search in the current dash scope"
187msgctxt "Button: Start a search in the current dash scope"
188msgid "Search"
188msgid "Search"
189msgstr "Chwilio"
189msgstr "Chwilio"
190
190
191−#: qml/Dash/DashPageHeader.qml:283
191+#: qml/Dash/DashPageHeader.qml:287
192msgctxt "Button: Show the current dash scope settings"
192msgctxt "Button: Show the current dash scope settings"
193msgid "Settings"
193msgid "Settings"
194msgstr "Gosodiadau"
194msgstr "Gosodiadau"
195
195
196−#: qml/Dash/DashPageHeader.qml:290
196+#: qml/Dash/DashPageHeader.qml:294
197msgid "Remove from Favorites"
197msgid "Remove from Favorites"
198msgstr "Tynnu o Ffefrynnau"
198msgstr "Tynnu o Ffefrynnau"
199
199
200−#: qml/Dash/DashPageHeader.qml:290
200+#: qml/Dash/DashPageHeader.qml:294
201msgid "Add to Favorites"
201msgid "Add to Favorites"
202msgstr "Ychwanegu at Ffefrynnau"
202msgstr "Ychwanegu at Ffefrynnau"
203
203
@@ -433,14 +433,6 @@ msgctxt "Button: Call back on phone"
433msgid "Call back"
433msgid "Call back"
434msgstr ""
434msgstr ""
435
435
436−#: qml/Panel/Indicators/ModemInfoItem.qml:105
437−msgid "Unlock SIM"
438−msgstr "Datgloi SIM"
439−
440−#: qml/Panel/Indicators/RoamingIndication.qml:27
441−msgid "Roaming"
442−msgstr "Crwydrol"
443−
444#: qml/Tutorial/TutorialBottom.qml:28
436#: qml/Tutorial/TutorialBottom.qml:28
445msgid "Open special menus"
437msgid "Open special menus"
446msgstr "Agor dewislenni arbennig"
438msgstr "Agor dewislenni arbennig"
@@ -717,6 +709,12 @@ msgstr "%1 〉"
717#~ msgid "Tomorrow %H:%M"
709#~ msgid "Tomorrow %H:%M"
718#~ msgstr "Yfory %H:%M"
710#~ msgstr "Yfory %H:%M"
719
711
712+#~ msgid "Unlock SIM"
713+#~ msgstr "Datgloi SIM"
714+
715+#~ msgid "Roaming"
716+#~ msgstr "Crwydrol"
717+
720#~ msgid "Welcome to your Ubuntu phone."
718#~ msgid "Welcome to your Ubuntu phone."
721#~ msgstr "Croeso i'ch ffôn Ubuntu."
719#~ msgstr "Croeso i'ch ffôn Ubuntu."
722
720
po/da.po+13−15
@@ -8,7 +8,7 @@ msgid ""
8msgstr ""
8msgstr ""
9"Project-Id-Version: unity8\n"
9"Project-Id-Version: unity8\n"
10"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
11−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
11+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
12"PO-Revision-Date: 2015-07-06 12:05+0000\n"
12"PO-Revision-Date: 2015-07-06 12:05+0000\n"
13"Last-Translator: Folmer Fredslund <Unknown>\n"
13"Last-Translator: Folmer Fredslund <Unknown>\n"
14"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
14"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18"Plural-Forms: nplurals=2; plural=n != 1;\n"
18"Plural-Forms: nplurals=2; plural=n != 1;\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
20"X-Generator: Launchpad (build 17936)\n"
20"X-Generator: Launchpad (build 17936)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -178,26 +178,26 @@ msgstr ""
178msgid "Close all"
178msgid "Close all"
179msgstr ""
179msgstr ""
180
180
181−#: qml/Dash/DashPageHeader.qml:266
181+#: qml/Dash/DashPageHeader.qml:270
182msgctxt "Button: Open the Ubuntu Store"
182msgctxt "Button: Open the Ubuntu Store"
183msgid "Store"
183msgid "Store"
184msgstr "Butik"
184msgstr "Butik"
185
185
186−#: qml/Dash/DashPageHeader.qml:273
186+#: qml/Dash/DashPageHeader.qml:277
187msgctxt "Button: Start a search in the current dash scope"
187msgctxt "Button: Start a search in the current dash scope"
188msgid "Search"
188msgid "Search"
189msgstr "Søg"
189msgstr "Søg"
190
190
191−#: qml/Dash/DashPageHeader.qml:283
191+#: qml/Dash/DashPageHeader.qml:287
192msgctxt "Button: Show the current dash scope settings"
192msgctxt "Button: Show the current dash scope settings"
193msgid "Settings"
193msgid "Settings"
194msgstr "Indstillinger"
194msgstr "Indstillinger"
195
195
196−#: qml/Dash/DashPageHeader.qml:290
196+#: qml/Dash/DashPageHeader.qml:294
197msgid "Remove from Favorites"
197msgid "Remove from Favorites"
198msgstr "Fjern fra Favoritter"
198msgstr "Fjern fra Favoritter"
199
199
200−#: qml/Dash/DashPageHeader.qml:290
200+#: qml/Dash/DashPageHeader.qml:294
201msgid "Add to Favorites"
201msgid "Add to Favorites"
202msgstr "Tilføj til Favoritter"
202msgstr "Tilføj til Favoritter"
203
203
@@ -427,14 +427,6 @@ msgctxt "Button: Call back on phone"
427msgid "Call back"
427msgid "Call back"
428msgstr ""
428msgstr ""
429
429
430−#: qml/Panel/Indicators/ModemInfoItem.qml:105
431−msgid "Unlock SIM"
432−msgstr "Lås SIM-kort op"
433−
434−#: qml/Panel/Indicators/RoamingIndication.qml:27
435−msgid "Roaming"
436−msgstr "Roaming"
437−
438#: qml/Tutorial/TutorialBottom.qml:28
430#: qml/Tutorial/TutorialBottom.qml:28
439msgid "Open special menus"
431msgid "Open special menus"
440msgstr "Åben specialmenuer"
432msgstr "Åben specialmenuer"
@@ -738,6 +730,9 @@ msgstr "%1 〉"
738#~ "Du mestrer nu kantbevægelserne og kan begynde at bruge telefonen<br><br>Tryk "
730#~ "Du mestrer nu kantbevægelserne og kan begynde at bruge telefonen<br><br>Tryk "
739#~ "på skærmen for at starte"
731#~ "på skærmen for at starte"
740
732
733+#~ msgid "Unlock SIM"
734+#~ msgstr "Lås SIM-kort op"
735+
741#~ msgid "Please re-enter"
736#~ msgid "Please re-enter"
742#~ msgstr "Vær venlig at genindtaste"
737#~ msgstr "Vær venlig at genindtaste"
743
738
@@ -750,6 +745,9 @@ msgstr "%1 〉"
750#~ msgid "Welcome to your Ubuntu phone."
745#~ msgid "Welcome to your Ubuntu phone."
751#~ msgstr "Velkommen til din Ubuntu-telefon."
746#~ msgstr "Velkommen til din Ubuntu-telefon."
752
747
748+#~ msgid "Roaming"
749+#~ msgstr "Roaming"
750+
753#~ msgid "%a %d %b %H:%M"
751#~ msgid "%a %d %b %H:%M"
754#~ msgstr "%a %b. %d %H:%M"
752#~ msgstr "%a %b. %d %H:%M"
755
753
po/de.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2016-02-17 19:16+0000\n"
11"PO-Revision-Date: 2016-02-17 19:16+0000\n"
12"Last-Translator: schuko24 <gerdsaenger@t-online.de>\n"
12"Last-Translator: schuko24 <gerdsaenger@t-online.de>\n"
13"Language-Team: German <de@li.org>\n"
13"Language-Team: German <de@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -179,26 +179,26 @@ msgstr "Jetzt verbinden!"
179msgid "Close all"
179msgid "Close all"
180msgstr "Alle schließen"
180msgstr "Alle schließen"
181
181
182−#: qml/Dash/DashPageHeader.qml:266
182+#: qml/Dash/DashPageHeader.qml:270
183msgctxt "Button: Open the Ubuntu Store"
183msgctxt "Button: Open the Ubuntu Store"
184msgid "Store"
184msgid "Store"
185msgstr "Speichern"
185msgstr "Speichern"
186
186
187−#: qml/Dash/DashPageHeader.qml:273
187+#: qml/Dash/DashPageHeader.qml:277
188msgctxt "Button: Start a search in the current dash scope"
188msgctxt "Button: Start a search in the current dash scope"
189msgid "Search"
189msgid "Search"
190msgstr "Suchen"
190msgstr "Suchen"
191
191
192−#: qml/Dash/DashPageHeader.qml:283
192+#: qml/Dash/DashPageHeader.qml:287
193msgctxt "Button: Show the current dash scope settings"
193msgctxt "Button: Show the current dash scope settings"
194msgid "Settings"
194msgid "Settings"
195msgstr "Einstellungen"
195msgstr "Einstellungen"
196
196
197−#: qml/Dash/DashPageHeader.qml:290
197+#: qml/Dash/DashPageHeader.qml:294
198msgid "Remove from Favorites"
198msgid "Remove from Favorites"
199msgstr "Aus den Favoriten entfernen"
199msgstr "Aus den Favoriten entfernen"
200
200
201−#: qml/Dash/DashPageHeader.qml:290
201+#: qml/Dash/DashPageHeader.qml:294
202msgid "Add to Favorites"
202msgid "Add to Favorites"
203msgstr "Zu Favoriten hinzufügen"
203msgstr "Zu Favoriten hinzufügen"
204
204
@@ -430,14 +430,6 @@ msgctxt "Button: Call back on phone"
430msgid "Call back"
430msgid "Call back"
431msgstr "Zurückrufen"
431msgstr "Zurückrufen"
432
432
433−#: qml/Panel/Indicators/ModemInfoItem.qml:105
434−msgid "Unlock SIM"
435−msgstr "SIM-Karte entsperren"
436−
437−#: qml/Panel/Indicators/RoamingIndication.qml:27
438−msgid "Roaming"
439−msgstr "Roaming"
440−
441#: qml/Tutorial/TutorialBottom.qml:28
433#: qml/Tutorial/TutorialBottom.qml:28
442msgid "Open special menus"
434msgid "Open special menus"
443msgstr "Spezielle Menüs öffnen"
435msgstr "Spezielle Menüs öffnen"
@@ -750,6 +742,9 @@ msgstr "%1 〉"
750#~ msgid "All"
742#~ msgid "All"
751#~ msgstr "Alle"
743#~ msgstr "Alle"
752
744
745+#~ msgid "Roaming"
746+#~ msgstr "Roaming"
747+
753#~ msgid "Done"
748#~ msgid "Done"
754#~ msgstr "Erledigt"
749#~ msgstr "Erledigt"
755
750
@@ -777,6 +772,9 @@ msgstr "%1 〉"
777#~ msgid "Restart"
772#~ msgid "Restart"
778#~ msgstr "Neustarten"
773#~ msgstr "Neustarten"
779
774
775+#~ msgid "Unlock SIM"
776+#~ msgstr "SIM-Karte entsperren"
777+
780#~ msgid "Manage Scopes"
778#~ msgid "Manage Scopes"
781#~ msgstr "Filter verwalten"
779#~ msgstr "Filter verwalten"
782
780
po/el.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-12-04 09:38+0000\n"
11"PO-Revision-Date: 2015-12-04 09:38+0000\n"
12"Last-Translator: Aggelos Arnaoutis <angelosarn@hotmail.com>\n"
12"Last-Translator: Aggelos Arnaoutis <angelosarn@hotmail.com>\n"
13"Language-Team: Greek <el@li.org>\n"
13"Language-Team: Greek <el@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -179,26 +179,26 @@ msgstr "Επανασύνδεση τώρα!"
179msgid "Close all"
179msgid "Close all"
180msgstr "Κλείσιμο όλων"
180msgstr "Κλείσιμο όλων"
181
181
182−#: qml/Dash/DashPageHeader.qml:266
182+#: qml/Dash/DashPageHeader.qml:270
183msgctxt "Button: Open the Ubuntu Store"
183msgctxt "Button: Open the Ubuntu Store"
184msgid "Store"
184msgid "Store"
185msgstr "Κατάστημα"
185msgstr "Κατάστημα"
186
186
187−#: qml/Dash/DashPageHeader.qml:273
187+#: qml/Dash/DashPageHeader.qml:277
188msgctxt "Button: Start a search in the current dash scope"
188msgctxt "Button: Start a search in the current dash scope"
189msgid "Search"
189msgid "Search"
190msgstr "Αναζήτηση"
190msgstr "Αναζήτηση"
191
191
192−#: qml/Dash/DashPageHeader.qml:283
192+#: qml/Dash/DashPageHeader.qml:287
193msgctxt "Button: Show the current dash scope settings"
193msgctxt "Button: Show the current dash scope settings"
194msgid "Settings"
194msgid "Settings"
195msgstr "Ρυθμίσεις"
195msgstr "Ρυθμίσεις"
196
196
197−#: qml/Dash/DashPageHeader.qml:290
197+#: qml/Dash/DashPageHeader.qml:294
198msgid "Remove from Favorites"
198msgid "Remove from Favorites"
199msgstr "Αφαίρεση από τα αγαπημένα"
199msgstr "Αφαίρεση από τα αγαπημένα"
200
200
201−#: qml/Dash/DashPageHeader.qml:290
201+#: qml/Dash/DashPageHeader.qml:294
202msgid "Add to Favorites"
202msgid "Add to Favorites"
203msgstr "Προσθήκη στα αγαπημένα"
203msgstr "Προσθήκη στα αγαπημένα"
204
204
@@ -430,14 +430,6 @@ msgctxt "Button: Call back on phone"
430msgid "Call back"
430msgid "Call back"
431msgstr "Επανάκληση"
431msgstr "Επανάκληση"
432
432
433−#: qml/Panel/Indicators/ModemInfoItem.qml:105
434−msgid "Unlock SIM"
435−msgstr "Ξεκλείδωμα SIM"
436−
437−#: qml/Panel/Indicators/RoamingIndication.qml:27
438−msgid "Roaming"
439−msgstr "Περιαγωγή"
440−
441#: qml/Tutorial/TutorialBottom.qml:28
433#: qml/Tutorial/TutorialBottom.qml:28
442msgid "Open special menus"
434msgid "Open special menus"
443msgstr "Άνοιγμα ειδικών μενού"
435msgstr "Άνοιγμα ειδικών μενού"
@@ -756,6 +748,12 @@ msgstr "%1 〉"
756#~ msgid "All"
748#~ msgid "All"
757#~ msgstr "Όλα"
749#~ msgstr "Όλα"
758
750
751+#~ msgid "Unlock SIM"
752+#~ msgstr "Ξεκλείδωμα SIM"
753+
754+#~ msgid "Roaming"
755+#~ msgstr "Περιαγωγή"
756+
759#~ msgid "Favorites"
757#~ msgid "Favorites"
760#~ msgstr "Αγαπημένα"
758#~ msgstr "Αγαπημένα"
761
759
po/en_AU.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2016-02-12 23:22+0000\n"
11"PO-Revision-Date: 2016-02-12 23:22+0000\n"
12"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
12"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
13"Language-Team: English (Australia) <en_AU@li.org>\n"
13"Language-Team: English (Australia) <en_AU@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -173,26 +173,26 @@ msgstr "Reconnect now!"
173msgid "Close all"
173msgid "Close all"
174msgstr "Close all"
174msgstr "Close all"
175
175
176−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
177msgctxt "Button: Open the Ubuntu Store"
177msgctxt "Button: Open the Ubuntu Store"
178msgid "Store"
178msgid "Store"
179msgstr "Store"
179msgstr "Store"
180
180
181−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
182msgctxt "Button: Start a search in the current dash scope"
182msgctxt "Button: Start a search in the current dash scope"
183msgid "Search"
183msgid "Search"
184msgstr "Search"
184msgstr "Search"
185
185
186−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
187msgctxt "Button: Show the current dash scope settings"
187msgctxt "Button: Show the current dash scope settings"
188msgid "Settings"
188msgid "Settings"
189msgstr "Settings"
189msgstr "Settings"
190
190
191−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
192msgid "Remove from Favorites"
192msgid "Remove from Favorites"
193msgstr "Remove from Favourites"
193msgstr "Remove from Favourites"
194
194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196msgid "Add to Favorites"
196msgid "Add to Favorites"
197msgstr "Add to Favourites"
197msgstr "Add to Favourites"
198
198
@@ -424,14 +424,6 @@ msgctxt "Button: Call back on phone"
424msgid "Call back"
424msgid "Call back"
425msgstr "Call back"
425msgstr "Call back"
426
426
427−#: qml/Panel/Indicators/ModemInfoItem.qml:105
428−msgid "Unlock SIM"
429−msgstr "Unlock SIM"
430−
431−#: qml/Panel/Indicators/RoamingIndication.qml:27
432−msgid "Roaming"
433−msgstr "Roaming"
434−
435#: qml/Tutorial/TutorialBottom.qml:28
427#: qml/Tutorial/TutorialBottom.qml:28
436msgid "Open special menus"
428msgid "Open special menus"
437msgstr "Open special menus"
429msgstr "Open special menus"
@@ -735,6 +727,9 @@ msgstr "%1 〉"
735#~ msgid "All"
727#~ msgid "All"
736#~ msgstr "All"
728#~ msgstr "All"
737
729
730+#~ msgid "Unlock SIM"
731+#~ msgstr "Unlock SIM"
732+
738#~ msgid "Favorites"
733#~ msgid "Favorites"
739#~ msgstr "Favourites"
734#~ msgstr "Favourites"
740
735
@@ -747,6 +742,9 @@ msgstr "%1 〉"
747#~ msgid "Done"
742#~ msgid "Done"
748#~ msgstr "Done"
743#~ msgstr "Done"
749
744
745+#~ msgid "Roaming"
746+#~ msgstr "Roaming"
747+
750#~ msgid "Log out"
748#~ msgid "Log out"
751#~ msgstr "Log out"
749#~ msgstr "Log out"
752
750
po/en_GB.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-04-23 12:59+0000\n"
11"PO-Revision-Date: 2015-04-23 12:59+0000\n"
12"Last-Translator: Andi Chandler <Unknown>\n"
12"Last-Translator: Andi Chandler <Unknown>\n"
13"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
13"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -173,26 +173,26 @@ msgstr "Reconnect now!"
173msgid "Close all"
173msgid "Close all"
174msgstr "Close all"
174msgstr "Close all"
175
175
176−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
177msgctxt "Button: Open the Ubuntu Store"
177msgctxt "Button: Open the Ubuntu Store"
178msgid "Store"
178msgid "Store"
179msgstr "Store"
179msgstr "Store"
180
180
181−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
182msgctxt "Button: Start a search in the current dash scope"
182msgctxt "Button: Start a search in the current dash scope"
183msgid "Search"
183msgid "Search"
184msgstr "Search"
184msgstr "Search"
185
185
186−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
187msgctxt "Button: Show the current dash scope settings"
187msgctxt "Button: Show the current dash scope settings"
188msgid "Settings"
188msgid "Settings"
189msgstr "Settings"
189msgstr "Settings"
190
190
191−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
192msgid "Remove from Favorites"
192msgid "Remove from Favorites"
193msgstr "Remove from Favourites"
193msgstr "Remove from Favourites"
194
194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196msgid "Add to Favorites"
196msgid "Add to Favorites"
197msgstr "Add to Favourites"
197msgstr "Add to Favourites"
198
198
@@ -424,14 +424,6 @@ msgctxt "Button: Call back on phone"
424msgid "Call back"
424msgid "Call back"
425msgstr "Call back"
425msgstr "Call back"
426
426
427−#: qml/Panel/Indicators/ModemInfoItem.qml:105
428−msgid "Unlock SIM"
429−msgstr "Unlock SIM"
430−
431−#: qml/Panel/Indicators/RoamingIndication.qml:27
432−msgid "Roaming"
433−msgstr "Roaming"
434−
435#: qml/Tutorial/TutorialBottom.qml:28
427#: qml/Tutorial/TutorialBottom.qml:28
436msgid "Open special menus"
428msgid "Open special menus"
437msgstr "Open special menus"
429msgstr "Open special menus"
@@ -738,6 +730,9 @@ msgstr "%1 〉"
738#~ msgid "All"
730#~ msgid "All"
739#~ msgstr "All"
731#~ msgstr "All"
740
732
733+#~ msgid "Unlock SIM"
734+#~ msgstr "Unlock SIM"
735+
741#~ msgid "Favorites"
736#~ msgid "Favorites"
742#~ msgstr "Favourites"
737#~ msgstr "Favourites"
743
738
@@ -747,6 +742,9 @@ msgstr "%1 〉"
747#~ msgid "Done"
742#~ msgid "Done"
748#~ msgstr "Done"
743#~ msgstr "Done"
749
744
745+#~ msgid "Roaming"
746+#~ msgstr "Roaming"
747+
750#~ msgid "Log out"
748#~ msgid "Log out"
751#~ msgstr "Log out"
749#~ msgstr "Log out"
752
750
po/eo.po+10−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-06-06 23:37+0000\n"
11"PO-Revision-Date: 2015-06-06 23:37+0000\n"
12"Last-Translator: Eliovir <Unknown>\n"
12"Last-Translator: Eliovir <Unknown>\n"
13"Language-Team: Esperanto <eo@li.org>\n"
13"Language-Team: Esperanto <eo@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr "Programarejo"
177msgstr "Programarejo"
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr "Serĉi"
182msgstr "Serĉi"
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr "Agordoj"
187msgstr "Agordoj"
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr "Aldoni al favoritoj"
195msgstr "Aldoni al favoritoj"
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr "Retmigrado"
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
@@ -663,6 +655,9 @@ msgstr "〈 %1"
663msgid "%1 〉"
655msgid "%1 〉"
664msgstr "%1 〉"
656msgstr "%1 〉"
665
657
658+#~ msgid "Roaming"
659+#~ msgstr "Retmigrado"
660+
666#~ msgid "Welcome to your Ubuntu phone."
661#~ msgid "Welcome to your Ubuntu phone."
667#~ msgstr "Bonvenon al via Ubuntu-telefono."
662#~ msgstr "Bonvenon al via Ubuntu-telefono."
668
663
po/es.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2016-01-15 14:48+0000\n"
11"PO-Revision-Date: 2016-01-15 14:48+0000\n"
12"Last-Translator: Víctor R. Ruiz <Unknown>\n"
12"Last-Translator: Víctor R. Ruiz <Unknown>\n"
13"Language-Team: Spanish <es@li.org>\n"
13"Language-Team: Spanish <es@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -179,26 +179,26 @@ msgstr "¡Reconectar ahora!"
179msgid "Close all"
179msgid "Close all"
180msgstr "Cerrar todo"
180msgstr "Cerrar todo"
181
181
182−#: qml/Dash/DashPageHeader.qml:266
182+#: qml/Dash/DashPageHeader.qml:270
183msgctxt "Button: Open the Ubuntu Store"
183msgctxt "Button: Open the Ubuntu Store"
184msgid "Store"
184msgid "Store"
185msgstr "Tienda"
185msgstr "Tienda"
186
186
187−#: qml/Dash/DashPageHeader.qml:273
187+#: qml/Dash/DashPageHeader.qml:277
188msgctxt "Button: Start a search in the current dash scope"
188msgctxt "Button: Start a search in the current dash scope"
189msgid "Search"
189msgid "Search"
190msgstr "Buscar"
190msgstr "Buscar"
191
191
192−#: qml/Dash/DashPageHeader.qml:283
192+#: qml/Dash/DashPageHeader.qml:287
193msgctxt "Button: Show the current dash scope settings"
193msgctxt "Button: Show the current dash scope settings"
194msgid "Settings"
194msgid "Settings"
195msgstr "Ajustes"
195msgstr "Ajustes"
196
196
197−#: qml/Dash/DashPageHeader.qml:290
197+#: qml/Dash/DashPageHeader.qml:294
198msgid "Remove from Favorites"
198msgid "Remove from Favorites"
199msgstr "Quitar de favoritos"
199msgstr "Quitar de favoritos"
200
200
201−#: qml/Dash/DashPageHeader.qml:290
201+#: qml/Dash/DashPageHeader.qml:294
202msgid "Add to Favorites"
202msgid "Add to Favorites"
203msgstr "Añadir a favoritos"
203msgstr "Añadir a favoritos"
204
204
@@ -430,14 +430,6 @@ msgctxt "Button: Call back on phone"
430msgid "Call back"
430msgid "Call back"
431msgstr "Devolver llamada"
431msgstr "Devolver llamada"
432
432
433−#: qml/Panel/Indicators/ModemInfoItem.qml:105
434−msgid "Unlock SIM"
435−msgstr "Desbloquear SIM"
436−
437−#: qml/Panel/Indicators/RoamingIndication.qml:27
438−msgid "Roaming"
439−msgstr "Itinerancia"
440−
441#: qml/Tutorial/TutorialBottom.qml:28
433#: qml/Tutorial/TutorialBottom.qml:28
442msgid "Open special menus"
434msgid "Open special menus"
443msgstr "Abrir menús especiales"
435msgstr "Abrir menús especiales"
@@ -744,9 +736,15 @@ msgstr "%1 〉"
744#~ msgid "Power off"
736#~ msgid "Power off"
745#~ msgstr "Apagar"
737#~ msgstr "Apagar"
746
738
739+#~ msgid "Roaming"
740+#~ msgstr "Itinerancia"
741+
747#~ msgid "All"
742#~ msgid "All"
748#~ msgstr "Todo"
743#~ msgstr "Todo"
749
744
745+#~ msgid "Unlock SIM"
746+#~ msgstr "Desbloquear SIM"
747+
750#~ msgid "Favorites"
748#~ msgid "Favorites"
751#~ msgstr "Favoritos"
749#~ msgstr "Favoritos"
752
750
po/eu.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-07-13 23:29+0000\n"
11"PO-Revision-Date: 2015-07-13 23:29+0000\n"
12"Last-Translator: Ibai Oihanguren Sala <Unknown>\n"
12"Last-Translator: Ibai Oihanguren Sala <Unknown>\n"
13"Language-Team: Basque <eu@li.org>\n"
13"Language-Team: Basque <eu@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -174,26 +174,26 @@ msgstr ""
174msgid "Close all"
174msgid "Close all"
175msgstr ""
175msgstr ""
176
176
177−#: qml/Dash/DashPageHeader.qml:266
177+#: qml/Dash/DashPageHeader.qml:270
178msgctxt "Button: Open the Ubuntu Store"
178msgctxt "Button: Open the Ubuntu Store"
179msgid "Store"
179msgid "Store"
180msgstr "Denda"
180msgstr "Denda"
181
181
182−#: qml/Dash/DashPageHeader.qml:273
182+#: qml/Dash/DashPageHeader.qml:277
183msgctxt "Button: Start a search in the current dash scope"
183msgctxt "Button: Start a search in the current dash scope"
184msgid "Search"
184msgid "Search"
185msgstr "Bilatu"
185msgstr "Bilatu"
186
186
187−#: qml/Dash/DashPageHeader.qml:283
187+#: qml/Dash/DashPageHeader.qml:287
188msgctxt "Button: Show the current dash scope settings"
188msgctxt "Button: Show the current dash scope settings"
189msgid "Settings"
189msgid "Settings"
190msgstr "Ezarpenak"
190msgstr "Ezarpenak"
191
191
192−#: qml/Dash/DashPageHeader.qml:290
192+#: qml/Dash/DashPageHeader.qml:294
193msgid "Remove from Favorites"
193msgid "Remove from Favorites"
194msgstr "Kendu gogokoetatik"
194msgstr "Kendu gogokoetatik"
195
195
196−#: qml/Dash/DashPageHeader.qml:290
196+#: qml/Dash/DashPageHeader.qml:294
197msgid "Add to Favorites"
197msgid "Add to Favorites"
198msgstr "Gehitu gogokoetara"
198msgstr "Gehitu gogokoetara"
199
199
@@ -423,14 +423,6 @@ msgctxt "Button: Call back on phone"
423msgid "Call back"
423msgid "Call back"
424msgstr ""
424msgstr ""
425
425
426−#: qml/Panel/Indicators/ModemInfoItem.qml:105
427−msgid "Unlock SIM"
428−msgstr "Desblokeatu SIMa"
429−
430−#: qml/Panel/Indicators/RoamingIndication.qml:27
431−msgid "Roaming"
432−msgstr "Ibiltaritza"
433−
434#: qml/Tutorial/TutorialBottom.qml:28
426#: qml/Tutorial/TutorialBottom.qml:28
435msgid "Open special menus"
427msgid "Open special menus"
436msgstr "Ireki menu bereziak"
428msgstr "Ireki menu bereziak"
@@ -749,6 +741,12 @@ msgstr "%1 〉"
749#~ msgid "All"
741#~ msgid "All"
750#~ msgstr "Guztiak"
742#~ msgstr "Guztiak"
751
743
744+#~ msgid "Unlock SIM"
745+#~ msgstr "Desblokeatu SIMa"
746+
747+#~ msgid "Roaming"
748+#~ msgstr "Ibiltaritza"
749+
752#~ msgid "Favorites"
750#~ msgid "Favorites"
753#~ msgstr "Gogokoak"
751#~ msgstr "Gogokoak"
754
752
po/fa.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-07-11 15:43+0000\n"
11"PO-Revision-Date: 2015-07-11 15:43+0000\n"
12"Last-Translator: Danial Behzadi <dani.behzi@gmail.com>\n"
12"Last-Translator: Danial Behzadi <dani.behzi@gmail.com>\n"
13"Language-Team: Persian <fa@li.org>\n"
13"Language-Team: Persian <fa@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -174,26 +174,26 @@ msgstr "هم‌اکنون دوباره وصل شود"
174msgid "Close all"
174msgid "Close all"
175msgstr "بستن همه"
175msgstr "بستن همه"
176
176
177−#: qml/Dash/DashPageHeader.qml:266
177+#: qml/Dash/DashPageHeader.qml:270
178msgctxt "Button: Open the Ubuntu Store"
178msgctxt "Button: Open the Ubuntu Store"
179msgid "Store"
179msgid "Store"
180msgstr "ذخیره"
180msgstr "ذخیره"
181
181
182−#: qml/Dash/DashPageHeader.qml:273
182+#: qml/Dash/DashPageHeader.qml:277
183msgctxt "Button: Start a search in the current dash scope"
183msgctxt "Button: Start a search in the current dash scope"
184msgid "Search"
184msgid "Search"
185msgstr "جست‌وجو"
185msgstr "جست‌وجو"
186
186
187−#: qml/Dash/DashPageHeader.qml:283
187+#: qml/Dash/DashPageHeader.qml:287
188msgctxt "Button: Show the current dash scope settings"
188msgctxt "Button: Show the current dash scope settings"
189msgid "Settings"
189msgid "Settings"
190msgstr "تنظیمات"
190msgstr "تنظیمات"
191
191
192−#: qml/Dash/DashPageHeader.qml:290
192+#: qml/Dash/DashPageHeader.qml:294
193msgid "Remove from Favorites"
193msgid "Remove from Favorites"
194msgstr "برداشتن از برگزیده‌ها"
194msgstr "برداشتن از برگزیده‌ها"
195
195
196−#: qml/Dash/DashPageHeader.qml:290
196+#: qml/Dash/DashPageHeader.qml:294
197msgid "Add to Favorites"
197msgid "Add to Favorites"
198msgstr "افزودن به برگزیده‌ها"
198msgstr "افزودن به برگزیده‌ها"
199
199
@@ -420,14 +420,6 @@ msgctxt "Button: Call back on phone"
420msgid "Call back"
420msgid "Call back"
421msgstr "پاسخ تماس"
421msgstr "پاسخ تماس"
422
422
423−#: qml/Panel/Indicators/ModemInfoItem.qml:105
424−msgid "Unlock SIM"
425−msgstr "باز کردن قفل سیم‌کارت"
426−
427−#: qml/Panel/Indicators/RoamingIndication.qml:27
428−msgid "Roaming"
429−msgstr "رومینگ"
430−
431#: qml/Tutorial/TutorialBottom.qml:28
423#: qml/Tutorial/TutorialBottom.qml:28
432msgid "Open special menus"
424msgid "Open special menus"
433msgstr "باز کردن فهرست‌های مخصوص"
425msgstr "باز کردن فهرست‌های مخصوص"
@@ -733,6 +725,9 @@ msgstr "%1 〉"
733#~ msgid "All"
725#~ msgid "All"
734#~ msgstr "همه"
726#~ msgstr "همه"
735
727
728+#~ msgid "Unlock SIM"
729+#~ msgstr "باز کردن قفل سیم‌کارت"
730+
736#~ msgid "Favorites"
731#~ msgid "Favorites"
737#~ msgstr "برگزیده‌ها"
732#~ msgstr "برگزیده‌ها"
738
733
@@ -745,6 +740,9 @@ msgstr "%1 〉"
745#~ msgid "Done"
740#~ msgid "Done"
746#~ msgstr "انجام شد"
741#~ msgstr "انجام شد"
747
742
743+#~ msgid "Roaming"
744+#~ msgstr "رومینگ"
745+
748#~ msgid "Power"
746#~ msgid "Power"
749#~ msgstr "توان"
747#~ msgstr "توان"
750
748
po/fi.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-07-04 18:32+0000\n"
11"PO-Revision-Date: 2015-07-04 18:32+0000\n"
12"Last-Translator: Jiri Grönroos <Unknown>\n"
12"Last-Translator: Jiri Grönroos <Unknown>\n"
13"Language-Team: Finnish <fi@li.org>\n"
13"Language-Team: Finnish <fi@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -177,26 +177,26 @@ msgstr "Yhdistä uudelleen nyt!"
177msgid "Close all"
177msgid "Close all"
178msgstr "Sulje kaikki"
178msgstr "Sulje kaikki"
179
179
180−#: qml/Dash/DashPageHeader.qml:266
180+#: qml/Dash/DashPageHeader.qml:270
181msgctxt "Button: Open the Ubuntu Store"
181msgctxt "Button: Open the Ubuntu Store"
182msgid "Store"
182msgid "Store"
183msgstr "Kauppa"
183msgstr "Kauppa"
184
184
185−#: qml/Dash/DashPageHeader.qml:273
185+#: qml/Dash/DashPageHeader.qml:277
186msgctxt "Button: Start a search in the current dash scope"
186msgctxt "Button: Start a search in the current dash scope"
187msgid "Search"
187msgid "Search"
188msgstr "Etsi"
188msgstr "Etsi"
189
189
190−#: qml/Dash/DashPageHeader.qml:283
190+#: qml/Dash/DashPageHeader.qml:287
191msgctxt "Button: Show the current dash scope settings"
191msgctxt "Button: Show the current dash scope settings"
192msgid "Settings"
192msgid "Settings"
193msgstr "Asetukset"
193msgstr "Asetukset"
194
194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196msgid "Remove from Favorites"
196msgid "Remove from Favorites"
197msgstr "Poista suosikeista"
197msgstr "Poista suosikeista"
198
198
199−#: qml/Dash/DashPageHeader.qml:290
199+#: qml/Dash/DashPageHeader.qml:294
200msgid "Add to Favorites"
200msgid "Add to Favorites"
201msgstr "Lisää suosikkeihin"
201msgstr "Lisää suosikkeihin"
202
202
@@ -428,14 +428,6 @@ msgctxt "Button: Call back on phone"
428msgid "Call back"
428msgid "Call back"
429msgstr "Soita takaisin"
429msgstr "Soita takaisin"
430
430
431−#: qml/Panel/Indicators/ModemInfoItem.qml:105
432−msgid "Unlock SIM"
433−msgstr "Avaa SIM-kortin lukitus"
434−
435−#: qml/Panel/Indicators/RoamingIndication.qml:27
436−msgid "Roaming"
437−msgstr "Verkkovierailu"
438−
439#: qml/Tutorial/TutorialBottom.qml:28
431#: qml/Tutorial/TutorialBottom.qml:28
440msgid "Open special menus"
432msgid "Open special menus"
441msgstr "Avaa erikoisvalikot"
433msgstr "Avaa erikoisvalikot"
@@ -737,6 +729,9 @@ msgstr "%1 〉"
737#~ "Hallitset nyt reunaeleet, joten voit aloittaa puhelimen "
729#~ "Hallitset nyt reunaeleet, joten voit aloittaa puhelimen "
738#~ "käytön<br><br>Napauta näyttöä aloittaaksesi"
730#~ "käytön<br><br>Napauta näyttöä aloittaaksesi"
739
731
732+#~ msgid "Unlock SIM"
733+#~ msgstr "Avaa SIM-kortin lukitus"
734+
740#~ msgid "All"
735#~ msgid "All"
741#~ msgstr "Kaikki"
736#~ msgstr "Kaikki"
742
737
@@ -752,6 +747,9 @@ msgstr "%1 〉"
752#~ msgid "Done"
747#~ msgid "Done"
753#~ msgstr "Valmis"
748#~ msgstr "Valmis"
754
749
750+#~ msgid "Roaming"
751+#~ msgstr "Verkkovierailu"
752+
755#~ msgid "Log out"
753#~ msgid "Log out"
756#~ msgstr "Kirjaudu ulos"
754#~ msgstr "Kirjaudu ulos"
757
755
po/fo.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2014-01-14 20:08+0000\n"
11"PO-Revision-Date: 2014-01-14 20:08+0000\n"
12"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
12"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
13"Language-Team: Faroese <fo@li.org>\n"
13"Language-Team: Faroese <fo@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr ""
177msgstr ""
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr ""
182msgstr ""
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr ""
187msgstr ""
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr ""
195msgstr ""
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr ""
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
po/fr.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2016-02-28 17:22+0000\n"
11"PO-Revision-Date: 2016-02-28 17:22+0000\n"
12"Last-Translator: Anne <anneonyme017@gmail.com>\n"
12"Last-Translator: Anne <anneonyme017@gmail.com>\n"
13"Language-Team: French <fr@li.org>\n"
13"Language-Team: French <fr@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -181,26 +181,26 @@ msgstr "Se reconnecter maintenant !"
181msgid "Close all"
181msgid "Close all"
182msgstr "Tout fermer"
182msgstr "Tout fermer"
183
183
184−#: qml/Dash/DashPageHeader.qml:266
184+#: qml/Dash/DashPageHeader.qml:270
185msgctxt "Button: Open the Ubuntu Store"
185msgctxt "Button: Open the Ubuntu Store"
186msgid "Store"
186msgid "Store"
187msgstr "Logithèque"
187msgstr "Logithèque"
188
188
189−#: qml/Dash/DashPageHeader.qml:273
189+#: qml/Dash/DashPageHeader.qml:277
190msgctxt "Button: Start a search in the current dash scope"
190msgctxt "Button: Start a search in the current dash scope"
191msgid "Search"
191msgid "Search"
192msgstr "Rechercher"
192msgstr "Rechercher"
193
193
194−#: qml/Dash/DashPageHeader.qml:283
194+#: qml/Dash/DashPageHeader.qml:287
195msgctxt "Button: Show the current dash scope settings"
195msgctxt "Button: Show the current dash scope settings"
196msgid "Settings"
196msgid "Settings"
197msgstr "Paramètres"
197msgstr "Paramètres"
198
198
199−#: qml/Dash/DashPageHeader.qml:290
199+#: qml/Dash/DashPageHeader.qml:294
200msgid "Remove from Favorites"
200msgid "Remove from Favorites"
201msgstr "Retirer des favoris"
201msgstr "Retirer des favoris"
202
202
203−#: qml/Dash/DashPageHeader.qml:290
203+#: qml/Dash/DashPageHeader.qml:294
204msgid "Add to Favorites"
204msgid "Add to Favorites"
205msgstr "Ajouter aux favoris"
205msgstr "Ajouter aux favoris"
206
206
@@ -434,14 +434,6 @@ msgctxt "Button: Call back on phone"
434msgid "Call back"
434msgid "Call back"
435msgstr "Rappeler"
435msgstr "Rappeler"
436
436
437−#: qml/Panel/Indicators/ModemInfoItem.qml:105
438−msgid "Unlock SIM"
439−msgstr "Déverrouiller la carte SIM"
440−
441−#: qml/Panel/Indicators/RoamingIndication.qml:27
442−msgid "Roaming"
443−msgstr "Roaming"
444−
445#: qml/Tutorial/TutorialBottom.qml:28
437#: qml/Tutorial/TutorialBottom.qml:28
446msgid "Open special menus"
438msgid "Open special menus"
447msgstr "Ouvrir les menus spéciaux"
439msgstr "Ouvrir les menus spéciaux"
@@ -756,6 +748,9 @@ msgstr "%1 〉"
756#~ "Faites glisser votre doigt à partir du bord gauche pour afficher le lanceur "
748#~ "Faites glisser votre doigt à partir du bord gauche pour afficher le lanceur "
757#~ "d'applications."
749#~ "d'applications."
758
750
751+#~ msgid "Unlock SIM"
752+#~ msgstr "Déverrouiller la carte SIM"
753+
759#~ msgid "Power off"
754#~ msgid "Power off"
760#~ msgstr "Éteindre"
755#~ msgstr "Éteindre"
761
756
@@ -771,6 +766,9 @@ msgstr "%1 〉"
771#~ msgid "Favorites"
766#~ msgid "Favorites"
772#~ msgstr "Favorites"
767#~ msgstr "Favorites"
773
768
769+#~ msgid "Roaming"
770+#~ msgstr "Roaming"
771+
774#~ msgid "Log out"
772#~ msgid "Log out"
775#~ msgstr "Se déconnecter"
773#~ msgstr "Se déconnecter"
776
774
po/ga.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2016-01-25 11:33+0000\n"
11"PO-Revision-Date: 2016-01-25 11:33+0000\n"
12"Last-Translator: Joshua Kiley <Unknown>\n"
12"Last-Translator: Joshua Kiley <Unknown>\n"
13"Language-Team: Irish <ga@li.org>\n"
13"Language-Team: Irish <ga@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2;\n"
17"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -174,26 +174,26 @@ msgstr "Athnasc anois!"
174msgid "Close all"
174msgid "Close all"
175msgstr "Dún Gach Rud"
175msgstr "Dún Gach Rud"
176
176
177−#: qml/Dash/DashPageHeader.qml:266
177+#: qml/Dash/DashPageHeader.qml:270
178msgctxt "Button: Open the Ubuntu Store"
178msgctxt "Button: Open the Ubuntu Store"
179msgid "Store"
179msgid "Store"
180msgstr "Siopa"
180msgstr "Siopa"
181
181
182−#: qml/Dash/DashPageHeader.qml:273
182+#: qml/Dash/DashPageHeader.qml:277
183msgctxt "Button: Start a search in the current dash scope"
183msgctxt "Button: Start a search in the current dash scope"
184msgid "Search"
184msgid "Search"
185msgstr "Cuardach"
185msgstr "Cuardach"
186
186
187−#: qml/Dash/DashPageHeader.qml:283
187+#: qml/Dash/DashPageHeader.qml:287
188msgctxt "Button: Show the current dash scope settings"
188msgctxt "Button: Show the current dash scope settings"
189msgid "Settings"
189msgid "Settings"
190msgstr "Socruithe"
190msgstr "Socruithe"
191
191
192−#: qml/Dash/DashPageHeader.qml:290
192+#: qml/Dash/DashPageHeader.qml:294
193msgid "Remove from Favorites"
193msgid "Remove from Favorites"
194msgstr "Bain ó Cheanáin"
194msgstr "Bain ó Cheanáin"
195
195
196−#: qml/Dash/DashPageHeader.qml:290
196+#: qml/Dash/DashPageHeader.qml:294
197msgid "Add to Favorites"
197msgid "Add to Favorites"
198msgstr "Cuir le Ceanáin"
198msgstr "Cuir le Ceanáin"
199
199
@@ -426,14 +426,6 @@ msgctxt "Button: Call back on phone"
426msgid "Call back"
426msgid "Call back"
427msgstr "Glaoch Ar Ais"
427msgstr "Glaoch Ar Ais"
428
428
429−#: qml/Panel/Indicators/ModemInfoItem.qml:105
430−msgid "Unlock SIM"
431−msgstr "Díghlasail an SIM"
432−
433−#: qml/Panel/Indicators/RoamingIndication.qml:27
434−msgid "Roaming"
435−msgstr "Fánaíocht"
436−
437#: qml/Tutorial/TutorialBottom.qml:28
429#: qml/Tutorial/TutorialBottom.qml:28
438msgid "Open special menus"
430msgid "Open special menus"
439msgstr "Oscail Roghchláir Speisialta"
431msgstr "Oscail Roghchláir Speisialta"
@@ -680,6 +672,12 @@ msgstr ""
680msgid "%1 〉"
672msgid "%1 〉"
681msgstr ""
673msgstr ""
682
674
675+#~ msgid "Unlock SIM"
676+#~ msgstr "Díghlasail an SIM"
677+
678+#~ msgid "Roaming"
679+#~ msgstr "Fánaíocht"
680+
683#~ msgid "Welcome to your Ubuntu phone."
681#~ msgid "Welcome to your Ubuntu phone."
684#~ msgstr "Tá fáilte romhat chuig do fhón Ubuntu."
682#~ msgstr "Tá fáilte romhat chuig do fhón Ubuntu."
685
683
po/gd.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-07-16 10:56+0000\n"
11"PO-Revision-Date: 2015-07-16 10:56+0000\n"
12"Last-Translator: GunChleoc <Unknown>\n"
12"Last-Translator: GunChleoc <Unknown>\n"
13"Language-Team: Fòram na Gàidhlig\n"
13"Language-Team: Fòram na Gàidhlig\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
17"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
18"(n > 2 && n < 20) ? 2 : 3;\n"
18"(n > 2 && n < 20) ? 2 : 3;\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
20"X-Generator: Launchpad (build 17936)\n"
20"X-Generator: Launchpad (build 17936)\n"
21"Language: gd\n"
21"Language: gd\n"
22
22
@@ -183,26 +183,26 @@ msgstr "Ath-cheangail an-dràsta!"
183msgid "Close all"
183msgid "Close all"
184msgstr "Dùin na h-uile"
184msgstr "Dùin na h-uile"
185
185
186−#: qml/Dash/DashPageHeader.qml:266
186+#: qml/Dash/DashPageHeader.qml:270
187msgctxt "Button: Open the Ubuntu Store"
187msgctxt "Button: Open the Ubuntu Store"
188msgid "Store"
188msgid "Store"
189msgstr "Am bùth"
189msgstr "Am bùth"
190
190
191−#: qml/Dash/DashPageHeader.qml:273
191+#: qml/Dash/DashPageHeader.qml:277
192msgctxt "Button: Start a search in the current dash scope"
192msgctxt "Button: Start a search in the current dash scope"
193msgid "Search"
193msgid "Search"
194msgstr "Lorg"
194msgstr "Lorg"
195
195
196−#: qml/Dash/DashPageHeader.qml:283
196+#: qml/Dash/DashPageHeader.qml:287
197msgctxt "Button: Show the current dash scope settings"
197msgctxt "Button: Show the current dash scope settings"
198msgid "Settings"
198msgid "Settings"
199msgstr "Roghainnean"
199msgstr "Roghainnean"
200
200
201−#: qml/Dash/DashPageHeader.qml:290
201+#: qml/Dash/DashPageHeader.qml:294
202msgid "Remove from Favorites"
202msgid "Remove from Favorites"
203msgstr "Thoir air falbh o na h-annsachdan"
203msgstr "Thoir air falbh o na h-annsachdan"
204
204
205−#: qml/Dash/DashPageHeader.qml:290
205+#: qml/Dash/DashPageHeader.qml:294
206msgid "Add to Favorites"
206msgid "Add to Favorites"
207msgstr "Cuir ris na h-annsachdan"
207msgstr "Cuir ris na h-annsachdan"
208
208
@@ -443,14 +443,6 @@ msgctxt "Button: Call back on phone"
443msgid "Call back"
443msgid "Call back"
444msgstr "Fònaig air ais"
444msgstr "Fònaig air ais"
445
445
446−#: qml/Panel/Indicators/ModemInfoItem.qml:105
447−msgid "Unlock SIM"
448−msgstr "Thoir a' ghlas far an SIM"
449−
450−#: qml/Panel/Indicators/RoamingIndication.qml:27
451−msgid "Roaming"
452−msgstr "Air fàrsan"
453−
454#: qml/Tutorial/TutorialBottom.qml:28
446#: qml/Tutorial/TutorialBottom.qml:28
455msgid "Open special menus"
447msgid "Open special menus"
456msgstr "Fosgail na clàran-taice sònraichte"
448msgstr "Fosgail na clàran-taice sònraichte"
@@ -766,6 +758,9 @@ msgstr "%1 〉"
766#~ msgid "All"
758#~ msgid "All"
767#~ msgstr "Na h-uile"
759#~ msgstr "Na h-uile"
768
760
761+#~ msgid "Unlock SIM"
762+#~ msgstr "Thoir a' ghlas far an SIM"
763+
769#~ msgid "Favorites"
764#~ msgid "Favorites"
770#~ msgstr "Annsachdan"
765#~ msgstr "Annsachdan"
771
766
@@ -778,6 +773,9 @@ msgstr "%1 〉"
778#~ msgid "Done"
773#~ msgid "Done"
779#~ msgstr "Deiseil"
774#~ msgstr "Deiseil"
780
775
776+#~ msgid "Roaming"
777+#~ msgstr "Air fàrsan"
778+
781#~ msgid "Log out"
779#~ msgid "Log out"
782#~ msgstr "Clàraich a-mach"
780#~ msgstr "Clàraich a-mach"
783
781
po/gl.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2016-01-15 14:56+0000\n"
11"PO-Revision-Date: 2016-01-15 14:56+0000\n"
12"Last-Translator: Marcos Lans <Unknown>\n"
12"Last-Translator: Marcos Lans <Unknown>\n"
13"Language-Team: Galician <gl@li.org>\n"
13"Language-Team: Galician <gl@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -173,26 +173,26 @@ msgstr "Reconectar agora."
173msgid "Close all"
173msgid "Close all"
174msgstr "Pechar todo"
174msgstr "Pechar todo"
175
175
176−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
177msgctxt "Button: Open the Ubuntu Store"
177msgctxt "Button: Open the Ubuntu Store"
178msgid "Store"
178msgid "Store"
179msgstr "Tenda"
179msgstr "Tenda"
180
180
181−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
182msgctxt "Button: Start a search in the current dash scope"
182msgctxt "Button: Start a search in the current dash scope"
183msgid "Search"
183msgid "Search"
184msgstr "Buscar"
184msgstr "Buscar"
185
185
186−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
187msgctxt "Button: Show the current dash scope settings"
187msgctxt "Button: Show the current dash scope settings"
188msgid "Settings"
188msgid "Settings"
189msgstr "Axustes"
189msgstr "Axustes"
190
190
191−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
192msgid "Remove from Favorites"
192msgid "Remove from Favorites"
193msgstr "Eliminar dos favoritos"
193msgstr "Eliminar dos favoritos"
194
194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196msgid "Add to Favorites"
196msgid "Add to Favorites"
197msgstr "Engadir aos favoritos"
197msgstr "Engadir aos favoritos"
198
198
@@ -424,14 +424,6 @@ msgctxt "Button: Call back on phone"
424msgid "Call back"
424msgid "Call back"
425msgstr "Chamar de volta"
425msgstr "Chamar de volta"
426
426
427−#: qml/Panel/Indicators/ModemInfoItem.qml:105
428−msgid "Unlock SIM"
429−msgstr "Desbloquear a SIM"
430−
431−#: qml/Panel/Indicators/RoamingIndication.qml:27
432−msgid "Roaming"
433−msgstr "Itinerancia"
434−
435#: qml/Tutorial/TutorialBottom.qml:28
427#: qml/Tutorial/TutorialBottom.qml:28
436msgid "Open special menus"
428msgid "Open special menus"
437msgstr "Abrir menús especiais"
429msgstr "Abrir menús especiais"
@@ -738,6 +730,9 @@ msgstr "%1 〉"
738#~ msgid "All"
730#~ msgid "All"
739#~ msgstr "Todos"
731#~ msgstr "Todos"
740
732
733+#~ msgid "Unlock SIM"
734+#~ msgstr "Desbloquear a SIM"
735+
741#~ msgid "Favorites"
736#~ msgid "Favorites"
742#~ msgstr "Favoritos"
737#~ msgstr "Favoritos"
743
738
@@ -750,6 +745,9 @@ msgstr "%1 〉"
750#~ msgid "Done"
745#~ msgid "Done"
751#~ msgstr "Feito"
746#~ msgstr "Feito"
752
747
748+#~ msgid "Roaming"
749+#~ msgstr "Itinerancia"
750+
753#~ msgid "Log out"
751#~ msgid "Log out"
754#~ msgstr "Saír da sesión"
752#~ msgstr "Saír da sesión"
755
753
po/gv.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-04-02 14:24+0000\n"
11"PO-Revision-Date: 2015-04-02 14:24+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Manx <gv@li.org>\n"
13"Language-Team: Manx <gv@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : (n == 2 ? 1 : 2);\n"
17"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : (n == 2 ? 1 : 2);\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -178,26 +178,26 @@ msgstr ""
178msgid "Close all"
178msgid "Close all"
179msgstr ""
179msgstr ""
180
180
181−#: qml/Dash/DashPageHeader.qml:266
181+#: qml/Dash/DashPageHeader.qml:270
182msgctxt "Button: Open the Ubuntu Store"
182msgctxt "Button: Open the Ubuntu Store"
183msgid "Store"
183msgid "Store"
184msgstr ""
184msgstr ""
185
185
186−#: qml/Dash/DashPageHeader.qml:273
186+#: qml/Dash/DashPageHeader.qml:277
187msgctxt "Button: Start a search in the current dash scope"
187msgctxt "Button: Start a search in the current dash scope"
188msgid "Search"
188msgid "Search"
189msgstr ""
189msgstr ""
190
190
191−#: qml/Dash/DashPageHeader.qml:283
191+#: qml/Dash/DashPageHeader.qml:287
192msgctxt "Button: Show the current dash scope settings"
192msgctxt "Button: Show the current dash scope settings"
193msgid "Settings"
193msgid "Settings"
194msgstr ""
194msgstr ""
195
195
196−#: qml/Dash/DashPageHeader.qml:290
196+#: qml/Dash/DashPageHeader.qml:294
197msgid "Remove from Favorites"
197msgid "Remove from Favorites"
198msgstr "Jean scughey woish Reihyn"
198msgstr "Jean scughey woish Reihyn"
199
199
200−#: qml/Dash/DashPageHeader.qml:290
200+#: qml/Dash/DashPageHeader.qml:294
201msgid "Add to Favorites"
201msgid "Add to Favorites"
202msgstr "Cur ayns Reihyn"
202msgstr "Cur ayns Reihyn"
203
203
@@ -423,14 +423,6 @@ msgctxt "Button: Call back on phone"
423msgid "Call back"
423msgid "Call back"
424msgstr ""
424msgstr ""
425
425
426−#: qml/Panel/Indicators/ModemInfoItem.qml:105
427−msgid "Unlock SIM"
428−msgstr ""
429−
430−#: qml/Panel/Indicators/RoamingIndication.qml:27
431−msgid "Roaming"
432−msgstr ""
433−
434#: qml/Tutorial/TutorialBottom.qml:28
426#: qml/Tutorial/TutorialBottom.qml:28
435msgid "Open special menus"
427msgid "Open special menus"
436msgstr ""
428msgstr ""
po/he.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-07-12 08:47+0000\n"
11"PO-Revision-Date: 2015-07-12 08:47+0000\n"
12"Last-Translator: Yaron <sh.yaron@gmail.com>\n"
12"Last-Translator: Yaron <sh.yaron@gmail.com>\n"
13"Language-Team: Hebrew <he@li.org>\n"
13"Language-Team: Hebrew <he@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr "חנות"
177msgstr "חנות"
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr "חיפוש"
182msgstr "חיפוש"
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr "הגדרות"
187msgstr "הגדרות"
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr "הסרה מהמועדפים"
191msgstr "הסרה מהמועדפים"
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr "הוספה למועדפים"
195msgstr "הוספה למועדפים"
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr "שחרור נעילת ה־SIM"
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr "נדידה"
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr "פתיחת תפריטים מיוחדים"
421msgstr "פתיחת תפריטים מיוחדים"
@@ -730,9 +722,15 @@ msgstr ""
730#~ msgid "All"
722#~ msgid "All"
731#~ msgstr "הכול"
723#~ msgstr "הכול"
732
724
725+#~ msgid "Roaming"
726+#~ msgstr "נדידה"
727+
733#~ msgid "Favorites"
728#~ msgid "Favorites"
734#~ msgstr "מועדפים"
729#~ msgstr "מועדפים"
735
730
731+#~ msgid "Unlock SIM"
732+#~ msgstr "שחרור נעילת ה־SIM"
733+
736#~ msgid "Welcome to your Ubuntu phone."
734#~ msgid "Welcome to your Ubuntu phone."
737#~ msgstr "ברוך בואך לטלפון האובונטו שלך."
735#~ msgstr "ברוך בואך לטלפון האובונטו שלך."
738
736
po/hi.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2014-01-15 01:49+0000\n"
11"PO-Revision-Date: 2014-01-15 01:49+0000\n"
12"Last-Translator: Siddhanathan Shanmugam <Unknown>\n"
12"Last-Translator: Siddhanathan Shanmugam <Unknown>\n"
13"Language-Team: Hindi <hi@li.org>\n"
13"Language-Team: Hindi <hi@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr ""
177msgstr ""
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr ""
182msgstr ""
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr ""
187msgstr ""
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr ""
195msgstr ""
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr ""
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
po/hr.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2013-06-27 04:14+0000\n"
11"PO-Revision-Date: 2013-06-27 04:14+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Croatian <hr@li.org>\n"
13"Language-Team: Croatian <hr@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
20"X-Generator: Launchpad (build 17936)\n"
20"X-Generator: Launchpad (build 17936)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -176,26 +176,26 @@ msgstr "Ponovno poveži odmah!"
176msgid "Close all"
176msgid "Close all"
177msgstr "Zatvori sve"
177msgstr "Zatvori sve"
178
178
179−#: qml/Dash/DashPageHeader.qml:266
179+#: qml/Dash/DashPageHeader.qml:270
180msgctxt "Button: Open the Ubuntu Store"
180msgctxt "Button: Open the Ubuntu Store"
181msgid "Store"
181msgid "Store"
182msgstr "Trgovina"
182msgstr "Trgovina"
183
183
184−#: qml/Dash/DashPageHeader.qml:273
184+#: qml/Dash/DashPageHeader.qml:277
185msgctxt "Button: Start a search in the current dash scope"
185msgctxt "Button: Start a search in the current dash scope"
186msgid "Search"
186msgid "Search"
187msgstr "Pretraži"
187msgstr "Pretraži"
188
188
189−#: qml/Dash/DashPageHeader.qml:283
189+#: qml/Dash/DashPageHeader.qml:287
190msgctxt "Button: Show the current dash scope settings"
190msgctxt "Button: Show the current dash scope settings"
191msgid "Settings"
191msgid "Settings"
192msgstr "Postavke"
192msgstr "Postavke"
193
193
194−#: qml/Dash/DashPageHeader.qml:290
194+#: qml/Dash/DashPageHeader.qml:294
195msgid "Remove from Favorites"
195msgid "Remove from Favorites"
196msgstr "Ukloni iz omiljenih"
196msgstr "Ukloni iz omiljenih"
197
197
198−#: qml/Dash/DashPageHeader.qml:290
198+#: qml/Dash/DashPageHeader.qml:294
199msgid "Add to Favorites"
199msgid "Add to Favorites"
200msgstr "Dodaj u omiljene"
200msgstr "Dodaj u omiljene"
201
201
@@ -430,14 +430,6 @@ msgctxt "Button: Call back on phone"
430msgid "Call back"
430msgid "Call back"
431msgstr "Uzvrati poziv"
431msgstr "Uzvrati poziv"
432
432
433−#: qml/Panel/Indicators/ModemInfoItem.qml:105
434−msgid "Unlock SIM"
435−msgstr "Otključaj SIM"
436−
437−#: qml/Panel/Indicators/RoamingIndication.qml:27
438−msgid "Roaming"
439−msgstr "Roaming"
440−
441#: qml/Tutorial/TutorialBottom.qml:28
433#: qml/Tutorial/TutorialBottom.qml:28
442msgid "Open special menus"
434msgid "Open special menus"
443msgstr "Otvori posebne izbornike"
435msgstr "Otvori posebne izbornike"
@@ -702,6 +694,12 @@ msgstr "%1 〉"
702#~ msgid "Search"
694#~ msgid "Search"
703#~ msgstr "Pretraživanje"
695#~ msgstr "Pretraživanje"
704
696
697+#~ msgid "Unlock SIM"
698+#~ msgstr "Otključaj SIM"
699+
700+#~ msgid "Roaming"
701+#~ msgstr "Roaming"
702+
705#~ msgid "%a %l:%M %p"
703#~ msgid "%a %l:%M %p"
706#~ msgstr "%a %l:%M %p"
704#~ msgstr "%a %l:%M %p"
707
705
po/hu.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2016-02-16 07:23+0000\n"
11"PO-Revision-Date: 2016-02-16 07:23+0000\n"
12"Last-Translator: Richard Somlói <ricsipontaz@gmail.com>\n"
12"Last-Translator: Richard Somlói <ricsipontaz@gmail.com>\n"
13"Language-Team: Hungarian <hu@li.org>\n"
13"Language-Team: Hungarian <hu@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -175,26 +175,26 @@ msgstr "Újracsatlakozás most!"
175msgid "Close all"
175msgid "Close all"
176msgstr "Minden bezárása"
176msgstr "Minden bezárása"
177
177
178−#: qml/Dash/DashPageHeader.qml:266
178+#: qml/Dash/DashPageHeader.qml:270
179msgctxt "Button: Open the Ubuntu Store"
179msgctxt "Button: Open the Ubuntu Store"
180msgid "Store"
180msgid "Store"
181msgstr "Áruház"
181msgstr "Áruház"
182
182
183−#: qml/Dash/DashPageHeader.qml:273
183+#: qml/Dash/DashPageHeader.qml:277
184msgctxt "Button: Start a search in the current dash scope"
184msgctxt "Button: Start a search in the current dash scope"
185msgid "Search"
185msgid "Search"
186msgstr "Keresés"
186msgstr "Keresés"
187
187
188−#: qml/Dash/DashPageHeader.qml:283
188+#: qml/Dash/DashPageHeader.qml:287
189msgctxt "Button: Show the current dash scope settings"
189msgctxt "Button: Show the current dash scope settings"
190msgid "Settings"
190msgid "Settings"
191msgstr "Beállítások"
191msgstr "Beállítások"
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Remove from Favorites"
194msgid "Remove from Favorites"
195msgstr "Eltávolítás a kedvencek közül"
195msgstr "Eltávolítás a kedvencek közül"
196
196
197−#: qml/Dash/DashPageHeader.qml:290
197+#: qml/Dash/DashPageHeader.qml:294
198msgid "Add to Favorites"
198msgid "Add to Favorites"
199msgstr "Hozzáadás a kedvencekhez"
199msgstr "Hozzáadás a kedvencekhez"
200
200
@@ -426,14 +426,6 @@ msgctxt "Button: Call back on phone"
426msgid "Call back"
426msgid "Call back"
427msgstr "Visszahívás"
427msgstr "Visszahívás"
428
428
429−#: qml/Panel/Indicators/ModemInfoItem.qml:105
430−msgid "Unlock SIM"
431−msgstr "SIM feloldása"
432−
433−#: qml/Panel/Indicators/RoamingIndication.qml:27
434−msgid "Roaming"
435−msgstr "Barangolás"
436−
437#: qml/Tutorial/TutorialBottom.qml:28
429#: qml/Tutorial/TutorialBottom.qml:28
438msgid "Open special menus"
430msgid "Open special menus"
439msgstr "Speciális menük elérése"
431msgstr "Speciális menük elérése"
@@ -744,6 +736,12 @@ msgstr "%1 〉"
744#~ msgid "All"
736#~ msgid "All"
745#~ msgstr "Összes"
737#~ msgstr "Összes"
746
738
739+#~ msgid "Unlock SIM"
740+#~ msgstr "SIM feloldása"
741+
742+#~ msgid "Roaming"
743+#~ msgstr "Barangolás"
744+
747#~ msgid "Favorites"
745#~ msgid "Favorites"
748#~ msgstr "Kedvencek"
746#~ msgstr "Kedvencek"
749
747
po/hy.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2014-10-28 06:34+0000\n"
11"PO-Revision-Date: 2014-10-28 06:34+0000\n"
12"Last-Translator: Vahan Harutyunyan <Unknown>\n"
12"Last-Translator: Vahan Harutyunyan <Unknown>\n"
13"Language-Team: Armenian <hy@li.org>\n"
13"Language-Team: Armenian <hy@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -175,26 +175,26 @@ msgstr ""
175msgid "Close all"
175msgid "Close all"
176msgstr ""
176msgstr ""
177
177
178−#: qml/Dash/DashPageHeader.qml:266
178+#: qml/Dash/DashPageHeader.qml:270
179msgctxt "Button: Open the Ubuntu Store"
179msgctxt "Button: Open the Ubuntu Store"
180msgid "Store"
180msgid "Store"
181msgstr ""
181msgstr ""
182
182
183−#: qml/Dash/DashPageHeader.qml:273
183+#: qml/Dash/DashPageHeader.qml:277
184msgctxt "Button: Start a search in the current dash scope"
184msgctxt "Button: Start a search in the current dash scope"
185msgid "Search"
185msgid "Search"
186msgstr ""
186msgstr ""
187
187
188−#: qml/Dash/DashPageHeader.qml:283
188+#: qml/Dash/DashPageHeader.qml:287
189msgctxt "Button: Show the current dash scope settings"
189msgctxt "Button: Show the current dash scope settings"
190msgid "Settings"
190msgid "Settings"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Remove from Favorites"
194msgid "Remove from Favorites"
195msgstr "Հեռացնել ընտրյալների ցուցակից"
195msgstr "Հեռացնել ընտրյալների ցուցակից"
196
196
197−#: qml/Dash/DashPageHeader.qml:290
197+#: qml/Dash/DashPageHeader.qml:294
198msgid "Add to Favorites"
198msgid "Add to Favorites"
199msgstr "Ավելացնել ընտրյալների ցուցակում"
199msgstr "Ավելացնել ընտրյալների ցուցակում"
200
200
@@ -420,14 +420,6 @@ msgctxt "Button: Call back on phone"
420msgid "Call back"
420msgid "Call back"
421msgstr ""
421msgstr ""
422
422
423−#: qml/Panel/Indicators/ModemInfoItem.qml:105
424−msgid "Unlock SIM"
425−msgstr "Ապաբլոկավորել SIM-ը"
426−
427−#: qml/Panel/Indicators/RoamingIndication.qml:27
428−msgid "Roaming"
429−msgstr "Ռոումինգ"
430−
431#: qml/Tutorial/TutorialBottom.qml:28
423#: qml/Tutorial/TutorialBottom.qml:28
432msgid "Open special menus"
424msgid "Open special menus"
433msgstr ""
425msgstr ""
@@ -733,6 +725,12 @@ msgstr ""
733#~ msgid "All"
725#~ msgid "All"
734#~ msgstr "Բոլորը"
726#~ msgstr "Բոլորը"
735
727
728+#~ msgid "Unlock SIM"
729+#~ msgstr "Ապաբլոկավորել SIM-ը"
730+
731+#~ msgid "Roaming"
732+#~ msgstr "Ռոումինգ"
733+
736#~ msgid "Please re-enter"
734#~ msgid "Please re-enter"
737#~ msgstr "Խնդրում ենք նորից մուտքագրել"
735#~ msgstr "Խնդրում ենք նորից մուտքագրել"
738
736
po/ia.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-08-25 19:31+0000\n"
11"PO-Revision-Date: 2015-08-25 19:31+0000\n"
12"Last-Translator: karm <melo@carmu.com>\n"
12"Last-Translator: karm <melo@carmu.com>\n"
13"Language-Team: Interlingua <ia@li.org>\n"
13"Language-Team: Interlingua <ia@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -176,26 +176,26 @@ msgstr "Reconnecter nunc!"
176msgid "Close all"
176msgid "Close all"
177msgstr "Clauder toto"
177msgstr "Clauder toto"
178
178
179−#: qml/Dash/DashPageHeader.qml:266
179+#: qml/Dash/DashPageHeader.qml:270
180msgctxt "Button: Open the Ubuntu Store"
180msgctxt "Button: Open the Ubuntu Store"
181msgid "Store"
181msgid "Store"
182msgstr "Salva"
182msgstr "Salva"
183
183
184−#: qml/Dash/DashPageHeader.qml:273
184+#: qml/Dash/DashPageHeader.qml:277
185msgctxt "Button: Start a search in the current dash scope"
185msgctxt "Button: Start a search in the current dash scope"
186msgid "Search"
186msgid "Search"
187msgstr "Cerca"
187msgstr "Cerca"
188
188
189−#: qml/Dash/DashPageHeader.qml:283
189+#: qml/Dash/DashPageHeader.qml:287
190msgctxt "Button: Show the current dash scope settings"
190msgctxt "Button: Show the current dash scope settings"
191msgid "Settings"
191msgid "Settings"
192msgstr "Configurationes"
192msgstr "Configurationes"
193
193
194−#: qml/Dash/DashPageHeader.qml:290
194+#: qml/Dash/DashPageHeader.qml:294
195msgid "Remove from Favorites"
195msgid "Remove from Favorites"
196msgstr "Remover ex le Favoritos"
196msgstr "Remover ex le Favoritos"
197
197
198−#: qml/Dash/DashPageHeader.qml:290
198+#: qml/Dash/DashPageHeader.qml:294
199msgid "Add to Favorites"
199msgid "Add to Favorites"
200msgstr "Adder al Favoritos"
200msgstr "Adder al Favoritos"
201
201
@@ -425,14 +425,6 @@ msgctxt "Button: Call back on phone"
425msgid "Call back"
425msgid "Call back"
426msgstr "Appellar retro"
426msgstr "Appellar retro"
427
427
428−#: qml/Panel/Indicators/ModemInfoItem.qml:105
429−msgid "Unlock SIM"
430−msgstr "Liberar le SIM"
431−
432−#: qml/Panel/Indicators/RoamingIndication.qml:27
433−msgid "Roaming"
434−msgstr "Roaming"
435−
436#: qml/Tutorial/TutorialBottom.qml:28
428#: qml/Tutorial/TutorialBottom.qml:28
437msgid "Open special menus"
429msgid "Open special menus"
438msgstr "Aperi le menus special"
430msgstr "Aperi le menus special"
@@ -757,6 +749,12 @@ msgstr "%1 〉"
757#~ msgid "Speaking..."
749#~ msgid "Speaking..."
758#~ msgstr "Parlante..."
750#~ msgstr "Parlante..."
759
751
752+#~ msgid "Unlock SIM"
753+#~ msgstr "Liberar le SIM"
754+
755+#~ msgid "Roaming"
756+#~ msgstr "Roaming"
757+
760#~ msgid "Please re-enter"
758#~ msgid "Please re-enter"
761#~ msgstr "Per favor re-inserer"
759#~ msgstr "Per favor re-inserer"
762
760
po/id.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2013-06-26 22:35+0000\n"
11"PO-Revision-Date: 2013-06-26 22:35+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Indonesian <id@li.org>\n"
13"Language-Team: Indonesian <id@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -174,26 +174,26 @@ msgstr ""
174msgid "Close all"
174msgid "Close all"
175msgstr ""
175msgstr ""
176
176
177−#: qml/Dash/DashPageHeader.qml:266
177+#: qml/Dash/DashPageHeader.qml:270
178msgctxt "Button: Open the Ubuntu Store"
178msgctxt "Button: Open the Ubuntu Store"
179msgid "Store"
179msgid "Store"
180msgstr ""
180msgstr ""
181
181
182−#: qml/Dash/DashPageHeader.qml:273
182+#: qml/Dash/DashPageHeader.qml:277
183msgctxt "Button: Start a search in the current dash scope"
183msgctxt "Button: Start a search in the current dash scope"
184msgid "Search"
184msgid "Search"
185msgstr ""
185msgstr ""
186
186
187−#: qml/Dash/DashPageHeader.qml:283
187+#: qml/Dash/DashPageHeader.qml:287
188msgctxt "Button: Show the current dash scope settings"
188msgctxt "Button: Show the current dash scope settings"
189msgid "Settings"
189msgid "Settings"
190msgstr ""
190msgstr ""
191
191
192−#: qml/Dash/DashPageHeader.qml:290
192+#: qml/Dash/DashPageHeader.qml:294
193msgid "Remove from Favorites"
193msgid "Remove from Favorites"
194msgstr "Hapus dari Favorit"
194msgstr "Hapus dari Favorit"
195
195
196−#: qml/Dash/DashPageHeader.qml:290
196+#: qml/Dash/DashPageHeader.qml:294
197msgid "Add to Favorites"
197msgid "Add to Favorites"
198msgstr "Tambah ke Favorit"
198msgstr "Tambah ke Favorit"
199
199
@@ -423,14 +423,6 @@ msgctxt "Button: Call back on phone"
423msgid "Call back"
423msgid "Call back"
424msgstr ""
424msgstr ""
425
425
426−#: qml/Panel/Indicators/ModemInfoItem.qml:105
427−msgid "Unlock SIM"
428−msgstr "Buka Kunci SIM"
429−
430−#: qml/Panel/Indicators/RoamingIndication.qml:27
431−msgid "Roaming"
432−msgstr "Roaming"
433−
434#: qml/Tutorial/TutorialBottom.qml:28
426#: qml/Tutorial/TutorialBottom.qml:28
435msgid "Open special menus"
427msgid "Open special menus"
436msgstr ""
428msgstr ""
@@ -745,6 +737,12 @@ msgstr ""
745#~ msgid "Favorites"
737#~ msgid "Favorites"
746#~ msgstr "Favorit"
738#~ msgstr "Favorit"
747
739
740+#~ msgid "Roaming"
741+#~ msgstr "Roaming"
742+
743+#~ msgid "Unlock SIM"
744+#~ msgstr "Buka Kunci SIM"
745+
748#~ msgid "Manage Scopes"
746#~ msgid "Manage Scopes"
749#~ msgstr "Kelola Skup"
747#~ msgstr "Kelola Skup"
750
748
po/is.po+13−15
@@ -9,7 +9,7 @@ msgid ""
9msgstr ""
9msgstr ""
10"Project-Id-Version: po_unity8-is\n"
10"Project-Id-Version: po_unity8-is\n"
11"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
11"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
12−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
12+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
13"PO-Revision-Date: 2014-11-13 09:32+0000\n"
13"PO-Revision-Date: 2014-11-13 09:32+0000\n"
14"Last-Translator: Sveinn í Felli <sv1@fellsnet.is>\n"
14"Last-Translator: Sveinn í Felli <sv1@fellsnet.is>\n"
15"Language-Team: Icelandic <translation-team-is@lists.sourceforge.net>\n"
15"Language-Team: Icelandic <translation-team-is@lists.sourceforge.net>\n"
@@ -17,7 +17,7 @@ msgstr ""
17"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Type: text/plain; charset=UTF-8\n"
18"Content-Transfer-Encoding: 8bit\n"
18"Content-Transfer-Encoding: 8bit\n"
19"Plural-Forms: nplurals=2; plural=n != 1;\n"
19"Plural-Forms: nplurals=2; plural=n != 1;\n"
20−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
20+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
21"X-Generator: Launchpad (build 17936)\n"
21"X-Generator: Launchpad (build 17936)\n"
22"Language: is\n"
22"Language: is\n"
23
23
@@ -180,26 +180,26 @@ msgstr ""
180msgid "Close all"
180msgid "Close all"
181msgstr ""
181msgstr ""
182
182
183−#: qml/Dash/DashPageHeader.qml:266
183+#: qml/Dash/DashPageHeader.qml:270
184msgctxt "Button: Open the Ubuntu Store"
184msgctxt "Button: Open the Ubuntu Store"
185msgid "Store"
185msgid "Store"
186msgstr ""
186msgstr ""
187
187
188−#: qml/Dash/DashPageHeader.qml:273
188+#: qml/Dash/DashPageHeader.qml:277
189msgctxt "Button: Start a search in the current dash scope"
189msgctxt "Button: Start a search in the current dash scope"
190msgid "Search"
190msgid "Search"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Dash/DashPageHeader.qml:283
193+#: qml/Dash/DashPageHeader.qml:287
194msgctxt "Button: Show the current dash scope settings"
194msgctxt "Button: Show the current dash scope settings"
195msgid "Settings"
195msgid "Settings"
196msgstr ""
196msgstr ""
197
197
198−#: qml/Dash/DashPageHeader.qml:290
198+#: qml/Dash/DashPageHeader.qml:294
199msgid "Remove from Favorites"
199msgid "Remove from Favorites"
200msgstr "Fjarlægja úr Eftirlæti"
200msgstr "Fjarlægja úr Eftirlæti"
201
201
202−#: qml/Dash/DashPageHeader.qml:290
202+#: qml/Dash/DashPageHeader.qml:294
203msgid "Add to Favorites"
203msgid "Add to Favorites"
204msgstr "Bæta við Eftirlæti"
204msgstr "Bæta við Eftirlæti"
205
205
@@ -429,14 +429,6 @@ msgctxt "Button: Call back on phone"
429msgid "Call back"
429msgid "Call back"
430msgstr ""
430msgstr ""
431
431
432−#: qml/Panel/Indicators/ModemInfoItem.qml:105
433−msgid "Unlock SIM"
434−msgstr "Aflæsa SIM-korti"
435−
436−#: qml/Panel/Indicators/RoamingIndication.qml:27
437−msgid "Roaming"
438−msgstr "Ráphamur"
439−
440#: qml/Tutorial/TutorialBottom.qml:28
432#: qml/Tutorial/TutorialBottom.qml:28
441msgid "Open special menus"
433msgid "Open special menus"
442msgstr ""
434msgstr ""
@@ -756,6 +748,9 @@ msgstr ""
756#~ msgid "All"
748#~ msgid "All"
757#~ msgstr "Allt"
749#~ msgstr "Allt"
758
750
751+#~ msgid "Unlock SIM"
752+#~ msgstr "Aflæsa SIM-korti"
753+
759#~ msgid "Favorites"
754#~ msgid "Favorites"
760#~ msgstr "Eftirlæti"
755#~ msgstr "Eftirlæti"
761
756
@@ -765,6 +760,9 @@ msgstr ""
765#~ msgid "Done"
760#~ msgid "Done"
766#~ msgstr "Lokið"
761#~ msgstr "Lokið"
767
762
763+#~ msgid "Roaming"
764+#~ msgstr "Ráphamur"
765+
768#~ msgid "Please re-enter"
766#~ msgid "Please re-enter"
769#~ msgstr "Settu aftur inn"
767#~ msgstr "Settu aftur inn"
770
768
po/it.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-09-18 08:24+0000\n"
11"PO-Revision-Date: 2015-09-18 08:24+0000\n"
12"Last-Translator: Claudio Arseni <claudio.arseni@gmail.com>\n"
12"Last-Translator: Claudio Arseni <claudio.arseni@gmail.com>\n"
13"Language-Team: Italian <it@li.org>\n"
13"Language-Team: Italian <it@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -179,26 +179,26 @@ msgstr "Collegare ora."
179msgid "Close all"
179msgid "Close all"
180msgstr "Chiudi tutto"
180msgstr "Chiudi tutto"
181
181
182−#: qml/Dash/DashPageHeader.qml:266
182+#: qml/Dash/DashPageHeader.qml:270
183msgctxt "Button: Open the Ubuntu Store"
183msgctxt "Button: Open the Ubuntu Store"
184msgid "Store"
184msgid "Store"
185msgstr "Store"
185msgstr "Store"
186
186
187−#: qml/Dash/DashPageHeader.qml:273
187+#: qml/Dash/DashPageHeader.qml:277
188msgctxt "Button: Start a search in the current dash scope"
188msgctxt "Button: Start a search in the current dash scope"
189msgid "Search"
189msgid "Search"
190msgstr "Cerca"
190msgstr "Cerca"
191
191
192−#: qml/Dash/DashPageHeader.qml:283
192+#: qml/Dash/DashPageHeader.qml:287
193msgctxt "Button: Show the current dash scope settings"
193msgctxt "Button: Show the current dash scope settings"
194msgid "Settings"
194msgid "Settings"
195msgstr "Impostazioni"
195msgstr "Impostazioni"
196
196
197−#: qml/Dash/DashPageHeader.qml:290
197+#: qml/Dash/DashPageHeader.qml:294
198msgid "Remove from Favorites"
198msgid "Remove from Favorites"
199msgstr "Rimuovi dai preferiti"
199msgstr "Rimuovi dai preferiti"
200
200
201−#: qml/Dash/DashPageHeader.qml:290
201+#: qml/Dash/DashPageHeader.qml:294
202msgid "Add to Favorites"
202msgid "Add to Favorites"
203msgstr "Aggiungi ai preferiti"
203msgstr "Aggiungi ai preferiti"
204
204
@@ -428,14 +428,6 @@ msgctxt "Button: Call back on phone"
428msgid "Call back"
428msgid "Call back"
429msgstr "Richiama"
429msgstr "Richiama"
430
430
431−#: qml/Panel/Indicators/ModemInfoItem.qml:105
432−msgid "Unlock SIM"
433−msgstr "Sblocca SIM"
434−
435−#: qml/Panel/Indicators/RoamingIndication.qml:27
436−msgid "Roaming"
437−msgstr "Roaming"
438−
439#: qml/Tutorial/TutorialBottom.qml:28
431#: qml/Tutorial/TutorialBottom.qml:28
440msgid "Open special menus"
432msgid "Open special menus"
441msgstr "Apri menù speciali"
433msgstr "Apri menù speciali"
@@ -743,6 +735,9 @@ msgstr "%1 〉"
743#~ msgid "All"
735#~ msgid "All"
744#~ msgstr "Tutto"
736#~ msgstr "Tutto"
745
737
738+#~ msgid "Unlock SIM"
739+#~ msgstr "Sblocca SIM"
740+
746#~ msgid "Favorites"
741#~ msgid "Favorites"
747#~ msgstr "Preferiti"
742#~ msgstr "Preferiti"
748
743
@@ -755,6 +750,9 @@ msgstr "%1 〉"
755#~ msgid "Done"
750#~ msgid "Done"
756#~ msgstr "Fatto"
751#~ msgstr "Fatto"
757
752
753+#~ msgid "Roaming"
754+#~ msgstr "Roaming"
755+
758#~ msgid "Log out"
756#~ msgid "Log out"
759#~ msgstr "Termina sessione"
757#~ msgstr "Termina sessione"
760
758
po/ja.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-10-05 10:05+0000\n"
11"PO-Revision-Date: 2015-10-05 10:05+0000\n"
12"Last-Translator: Kentaro Kazuhama <Unknown>\n"
12"Last-Translator: Kentaro Kazuhama <Unknown>\n"
13"Language-Team: Japanese <ja@li.org>\n"
13"Language-Team: Japanese <ja@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -170,26 +170,26 @@ msgstr ""
170msgid "Close all"
170msgid "Close all"
171msgstr ""
171msgstr ""
172
172
173−#: qml/Dash/DashPageHeader.qml:266
173+#: qml/Dash/DashPageHeader.qml:270
174msgctxt "Button: Open the Ubuntu Store"
174msgctxt "Button: Open the Ubuntu Store"
175msgid "Store"
175msgid "Store"
176msgstr ""
176msgstr ""
177
177
178−#: qml/Dash/DashPageHeader.qml:273
178+#: qml/Dash/DashPageHeader.qml:277
179msgctxt "Button: Start a search in the current dash scope"
179msgctxt "Button: Start a search in the current dash scope"
180msgid "Search"
180msgid "Search"
181msgstr ""
181msgstr ""
182
182
183−#: qml/Dash/DashPageHeader.qml:283
183+#: qml/Dash/DashPageHeader.qml:287
184msgctxt "Button: Show the current dash scope settings"
184msgctxt "Button: Show the current dash scope settings"
185msgid "Settings"
185msgid "Settings"
186msgstr ""
186msgstr ""
187
187
188−#: qml/Dash/DashPageHeader.qml:290
188+#: qml/Dash/DashPageHeader.qml:294
189msgid "Remove from Favorites"
189msgid "Remove from Favorites"
190msgstr "お気に入りから削除する"
190msgstr "お気に入りから削除する"
191
191
192−#: qml/Dash/DashPageHeader.qml:290
192+#: qml/Dash/DashPageHeader.qml:294
193msgid "Add to Favorites"
193msgid "Add to Favorites"
194msgstr "お気に入りに追加する"
194msgstr "お気に入りに追加する"
195
195
@@ -415,14 +415,6 @@ msgctxt "Button: Call back on phone"
415msgid "Call back"
415msgid "Call back"
416msgstr ""
416msgstr ""
417
417
418−#: qml/Panel/Indicators/ModemInfoItem.qml:105
419−msgid "Unlock SIM"
420−msgstr "SIMのアンロック"
421−
422−#: qml/Panel/Indicators/RoamingIndication.qml:27
423−msgid "Roaming"
424−msgstr "ローミング"
425−
426#: qml/Tutorial/TutorialBottom.qml:28
418#: qml/Tutorial/TutorialBottom.qml:28
427msgid "Open special menus"
419msgid "Open special menus"
428msgstr ""
420msgstr ""
@@ -722,6 +714,12 @@ msgstr ""
722#~ msgid "Favorites"
714#~ msgid "Favorites"
723#~ msgstr "お気に入り"
715#~ msgstr "お気に入り"
724
716
717+#~ msgid "Unlock SIM"
718+#~ msgstr "SIMのアンロック"
719+
720+#~ msgid "Roaming"
721+#~ msgstr "ローミング"
722+
725#~ msgid "Done"
723#~ msgid "Done"
726#~ msgstr "完了"
724#~ msgstr "完了"
727
725
po/km.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2014-08-20 02:48+0000\n"
11"PO-Revision-Date: 2014-08-20 02:48+0000\n"
12"Last-Translator: Sophea Sok <sksophea@gmail.com>\n"
12"Last-Translator: Sophea Sok <sksophea@gmail.com>\n"
13"Language-Team: Khmer <km@li.org>\n"
13"Language-Team: Khmer <km@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -173,26 +173,26 @@ msgstr ""
173msgid "Close all"
173msgid "Close all"
174msgstr ""
174msgstr ""
175
175
176−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
177msgctxt "Button: Open the Ubuntu Store"
177msgctxt "Button: Open the Ubuntu Store"
178msgid "Store"
178msgid "Store"
179msgstr "រក្សាទុក"
179msgstr "រក្សាទុក"
180
180
181−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
182msgctxt "Button: Start a search in the current dash scope"
182msgctxt "Button: Start a search in the current dash scope"
183msgid "Search"
183msgid "Search"
184msgstr "ស្វែងរក"
184msgstr "ស្វែងរក"
185
185
186−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
187msgctxt "Button: Show the current dash scope settings"
187msgctxt "Button: Show the current dash scope settings"
188msgid "Settings"
188msgid "Settings"
189msgstr "ការ​កំណត់"
189msgstr "ការ​កំណត់"
190
190
191−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
192msgid "Remove from Favorites"
192msgid "Remove from Favorites"
193msgstr "យក​ចេញពី​សំណព្វ"
193msgstr "យក​ចេញពី​សំណព្វ"
194
194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196msgid "Add to Favorites"
196msgid "Add to Favorites"
197msgstr "បន្ថែម​ទៅ​សណព្វ"
197msgstr "បន្ថែម​ទៅ​សណព្វ"
198
198
@@ -424,14 +424,6 @@ msgctxt "Button: Call back on phone"
424msgid "Call back"
424msgid "Call back"
425msgstr ""
425msgstr ""
426
426
427−#: qml/Panel/Indicators/ModemInfoItem.qml:105
428−msgid "Unlock SIM"
429−msgstr "ដោះ​សោ​ស៊ីម"
430−
431−#: qml/Panel/Indicators/RoamingIndication.qml:27
432−msgid "Roaming"
433−msgstr "រ៉ូមីង"
434−
435#: qml/Tutorial/TutorialBottom.qml:28
427#: qml/Tutorial/TutorialBottom.qml:28
436msgid "Open special menus"
428msgid "Open special menus"
437msgstr ""
429msgstr ""
@@ -731,6 +723,9 @@ msgstr "%1 〉"
731#~ msgid "All"
723#~ msgid "All"
732#~ msgstr "ទាំងអស់"
724#~ msgstr "ទាំងអស់"
733
725
726+#~ msgid "Unlock SIM"
727+#~ msgstr "ដោះ​សោ​ស៊ីម"
728+
734#~ msgid "Favorites"
729#~ msgid "Favorites"
735#~ msgstr "និយម"
730#~ msgstr "និយម"
736
731
@@ -743,6 +738,9 @@ msgstr "%1 〉"
743#~ msgid "Done"
738#~ msgid "Done"
744#~ msgstr "ធ្វើរួច"
739#~ msgstr "ធ្វើរួច"
745
740
741+#~ msgid "Roaming"
742+#~ msgstr "រ៉ូមីង"
743+
746#~ msgid "Power"
744#~ msgid "Power"
747#~ msgstr "បីទ/បើក"
745#~ msgstr "បីទ/បើក"
748
746
po/kn.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2013-06-27 05:43+0000\n"
11"PO-Revision-Date: 2013-06-27 05:43+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Kannada <kn@li.org>\n"
13"Language-Team: Kannada <kn@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr ""
177msgstr ""
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr ""
182msgstr ""
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr ""
187msgstr ""
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr ""
195msgstr ""
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr ""
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
po/ko.po+16−18
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2014-08-19 13:02+0000\n"
11"PO-Revision-Date: 2014-08-19 13:02+0000\n"
12"Last-Translator: MinSik CHO <Unknown>\n"
12"Last-Translator: MinSik CHO <Unknown>\n"
13"Language-Team: Korean <ko@li.org>\n"
13"Language-Team: Korean <ko@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -170,26 +170,26 @@ msgstr "지급 다시 접속!"
170msgid "Close all"
170msgid "Close all"
171msgstr "모두 닫기"
171msgstr "모두 닫기"
172
172
173−#: qml/Dash/DashPageHeader.qml:266
173+#: qml/Dash/DashPageHeader.qml:270
174msgctxt "Button: Open the Ubuntu Store"
174msgctxt "Button: Open the Ubuntu Store"
175msgid "Store"
175msgid "Store"
176msgstr "상점"
176msgstr "상점"
177
177
178−#: qml/Dash/DashPageHeader.qml:273
178+#: qml/Dash/DashPageHeader.qml:277
179msgctxt "Button: Start a search in the current dash scope"
179msgctxt "Button: Start a search in the current dash scope"
180msgid "Search"
180msgid "Search"
181msgstr "검색"
181msgstr "검색"
182
182
183−#: qml/Dash/DashPageHeader.qml:283
183+#: qml/Dash/DashPageHeader.qml:287
184msgctxt "Button: Show the current dash scope settings"
184msgctxt "Button: Show the current dash scope settings"
185msgid "Settings"
185msgid "Settings"
186msgstr "설정"
186msgstr "설정"
187
187
188−#: qml/Dash/DashPageHeader.qml:290
188+#: qml/Dash/DashPageHeader.qml:294
189msgid "Remove from Favorites"
189msgid "Remove from Favorites"
190msgstr "즐겨찾기에서 제거"
190msgstr "즐겨찾기에서 제거"
191
191
192−#: qml/Dash/DashPageHeader.qml:290
192+#: qml/Dash/DashPageHeader.qml:294
193msgid "Add to Favorites"
193msgid "Add to Favorites"
194msgstr "즐겨찾기에 추가"
194msgstr "즐겨찾기에 추가"
195
195
@@ -412,14 +412,6 @@ msgctxt "Button: Call back on phone"
412msgid "Call back"
412msgid "Call back"
413msgstr "부재중 번호로 전화"
413msgstr "부재중 번호로 전화"
414
414
415−#: qml/Panel/Indicators/ModemInfoItem.qml:105
416−msgid "Unlock SIM"
417−msgstr "심 카드 잠금 해제"
418−
419−#: qml/Panel/Indicators/RoamingIndication.qml:27
420−msgid "Roaming"
421−msgstr "로밍"
422−
423#: qml/Tutorial/TutorialBottom.qml:28
415#: qml/Tutorial/TutorialBottom.qml:28
424msgid "Open special menus"
416msgid "Open special menus"
425msgstr "특별 메뉴 열기"
417msgstr "특별 메뉴 열기"
@@ -484,7 +476,7 @@ msgstr "안녕!"
484
476
485#: qml/Wizard/Pages/10-welcome.qml:44
477#: qml/Wizard/Pages/10-welcome.qml:44
486msgid "Welcome to your Ubuntu device."
478msgid "Welcome to your Ubuntu device."
487−msgstr ""
479+msgstr "우분투를 사용해주셔서 감사합니다."
488
480
489#: qml/Wizard/Pages/10-welcome.qml:52
481#: qml/Wizard/Pages/10-welcome.qml:52
490msgid "Let’s get started."
482msgid "Let’s get started."
@@ -515,7 +507,7 @@ msgstr "보안 잠금"
515
507
516#: qml/Wizard/Pages/30-passwd-type.qml:79
508#: qml/Wizard/Pages/30-passwd-type.qml:79
517msgid "Please select how you’d like to unlock your device."
509msgid "Please select how you’d like to unlock your device."
518−msgstr ""
510+msgstr "장치의 잠금 해제 방법을 선택해주십시오."
519
511
520#: qml/Wizard/Pages/30-passwd-type.qml:102
512#: qml/Wizard/Pages/30-passwd-type.qml:102
521msgctxt "Label: Type of security method"
513msgctxt "Label: Type of security method"
@@ -616,7 +608,7 @@ msgstr "잘 하셨습니다!"
616
608
617#: qml/Wizard/Pages/80-finished.qml:46
609#: qml/Wizard/Pages/80-finished.qml:46
618msgid "Your device is now ready to use."
610msgid "Your device is now ready to use."
619−msgstr ""
611+msgstr "이제 장치를 사용할 수 있습니다."
620
612
621#: qml/Wizard/Pages/80-finished.qml:53
613#: qml/Wizard/Pages/80-finished.qml:53
622msgid "Finish"
614msgid "Finish"
@@ -695,6 +687,9 @@ msgstr "%1 〉"
695#~ msgid "All"
687#~ msgid "All"
696#~ msgstr "모두"
688#~ msgstr "모두"
697
689
690+#~ msgid "Roaming"
691+#~ msgstr "로밍"
692+
698#~ msgid "Favorites"
693#~ msgid "Favorites"
699#~ msgstr "즐겨찾기"
694#~ msgstr "즐겨찾기"
700
695
@@ -731,6 +726,9 @@ msgstr "%1 〉"
731#~ msgid "Loading. Please Wait..."
726#~ msgid "Loading. Please Wait..."
732#~ msgstr "불러오는 중 입니다. 짐시 기다려주십시오..."
727#~ msgstr "불러오는 중 입니다. 짐시 기다려주십시오..."
733
728
729+#~ msgid "Unlock SIM"
730+#~ msgstr "심 카드 잠금 해제"
731+
734#~ msgid "Try swiping from the top edge to access the indicators"
732#~ msgid "Try swiping from the top edge to access the indicators"
735#~ msgstr "위쪽 가장자리에서 쓸면 알림에 접근할 수 있습니다."
733#~ msgstr "위쪽 가장자리에서 쓸면 알림에 접근할 수 있습니다."
736
734
po/ku.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2014-09-10 13:14+0000\n"
11"PO-Revision-Date: 2014-09-10 13:14+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Kurdish <ku@li.org>\n"
13"Language-Team: Kurdish <ku@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -173,26 +173,26 @@ msgstr ""
173msgid "Close all"
173msgid "Close all"
174msgstr ""
174msgstr ""
175
175
176−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
177msgctxt "Button: Open the Ubuntu Store"
177msgctxt "Button: Open the Ubuntu Store"
178msgid "Store"
178msgid "Store"
179msgstr ""
179msgstr ""
180
180
181−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
182msgctxt "Button: Start a search in the current dash scope"
182msgctxt "Button: Start a search in the current dash scope"
183msgid "Search"
183msgid "Search"
184msgstr ""
184msgstr ""
185
185
186−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
187msgctxt "Button: Show the current dash scope settings"
187msgctxt "Button: Show the current dash scope settings"
188msgid "Settings"
188msgid "Settings"
189msgstr ""
189msgstr ""
190
190
191−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
192msgid "Remove from Favorites"
192msgid "Remove from Favorites"
193msgstr "Ji nav Bijareyan rake"
193msgstr "Ji nav Bijareyan rake"
194
194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196msgid "Add to Favorites"
196msgid "Add to Favorites"
197msgstr "Li Bijareyan zêde bike"
197msgstr "Li Bijareyan zêde bike"
198
198
@@ -422,14 +422,6 @@ msgctxt "Button: Call back on phone"
422msgid "Call back"
422msgid "Call back"
423msgstr ""
423msgstr ""
424
424
425−#: qml/Panel/Indicators/ModemInfoItem.qml:105
426−msgid "Unlock SIM"
427−msgstr "Kilîda SIMê veke"
428−
429−#: qml/Panel/Indicators/RoamingIndication.qml:27
430−msgid "Roaming"
431−msgstr "Geriyan"
432−
433#: qml/Tutorial/TutorialBottom.qml:28
425#: qml/Tutorial/TutorialBottom.qml:28
434msgid "Open special menus"
426msgid "Open special menus"
435msgstr ""
427msgstr ""
@@ -752,3 +744,9 @@ msgstr ""
752
744
753#~ msgid "Speaking..."
745#~ msgid "Speaking..."
754#~ msgstr "Diaxive..."
746#~ msgstr "Diaxive..."
747+
748+#~ msgid "Unlock SIM"
749+#~ msgstr "Kilîda SIMê veke"
750+
751+#~ msgid "Roaming"
752+#~ msgstr "Geriyan"
po/ky.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2013-06-27 06:17+0000\n"
11"PO-Revision-Date: 2013-06-27 06:17+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Kirghiz <ky@li.org>\n"
13"Language-Team: Kirghiz <ky@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr ""
177msgstr ""
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr ""
182msgstr ""
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr ""
187msgstr ""
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr ""
195msgstr ""
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr ""
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
po/lo.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2013-10-02 10:00+0000\n"
11"PO-Revision-Date: 2013-10-02 10:00+0000\n"
12"Last-Translator: Anousak <anousak@gmail.com>\n"
12"Last-Translator: Anousak <anousak@gmail.com>\n"
13"Language-Team: Lao <lo@li.org>\n"
13"Language-Team: Lao <lo@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr ""
177msgstr ""
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr ""
182msgstr ""
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr ""
187msgstr ""
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr ""
195msgstr ""
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr ""
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
po/lt.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2014-05-19 17:15+0000\n"
11"PO-Revision-Date: 2014-05-19 17:15+0000\n"
12"Last-Translator: Mantas Kriaučiūnas <mantas@akl.lt>\n"
12"Last-Translator: Mantas Kriaučiūnas <mantas@akl.lt>\n"
13"Language-Team: Lithuanian <lt@li.org>\n"
13"Language-Team: Lithuanian <lt@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"(n%100<10 || n%100>=20) ? 1 : 2;\n"
18"(n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
20"X-Generator: Launchpad (build 17936)\n"
20"X-Generator: Launchpad (build 17936)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -172,26 +172,26 @@ msgstr ""
172msgid "Close all"
172msgid "Close all"
173msgstr ""
173msgstr ""
174
174
175−#: qml/Dash/DashPageHeader.qml:266
175+#: qml/Dash/DashPageHeader.qml:270
176msgctxt "Button: Open the Ubuntu Store"
176msgctxt "Button: Open the Ubuntu Store"
177msgid "Store"
177msgid "Store"
178msgstr ""
178msgstr ""
179
179
180−#: qml/Dash/DashPageHeader.qml:273
180+#: qml/Dash/DashPageHeader.qml:277
181msgctxt "Button: Start a search in the current dash scope"
181msgctxt "Button: Start a search in the current dash scope"
182msgid "Search"
182msgid "Search"
183msgstr ""
183msgstr ""
184
184
185−#: qml/Dash/DashPageHeader.qml:283
185+#: qml/Dash/DashPageHeader.qml:287
186msgctxt "Button: Show the current dash scope settings"
186msgctxt "Button: Show the current dash scope settings"
187msgid "Settings"
187msgid "Settings"
188msgstr ""
188msgstr ""
189
189
190−#: qml/Dash/DashPageHeader.qml:290
190+#: qml/Dash/DashPageHeader.qml:294
191msgid "Remove from Favorites"
191msgid "Remove from Favorites"
192msgstr ""
192msgstr ""
193
193
194−#: qml/Dash/DashPageHeader.qml:290
194+#: qml/Dash/DashPageHeader.qml:294
195msgid "Add to Favorites"
195msgid "Add to Favorites"
196msgstr ""
196msgstr ""
197
197
@@ -417,14 +417,6 @@ msgctxt "Button: Call back on phone"
417msgid "Call back"
417msgid "Call back"
418msgstr ""
418msgstr ""
419
419
420−#: qml/Panel/Indicators/ModemInfoItem.qml:105
421−msgid "Unlock SIM"
422−msgstr ""
423−
424−#: qml/Panel/Indicators/RoamingIndication.qml:27
425−msgid "Roaming"
426−msgstr ""
427−
428#: qml/Tutorial/TutorialBottom.qml:28
420#: qml/Tutorial/TutorialBottom.qml:28
429msgid "Open special menus"
421msgid "Open special menus"
430msgstr ""
422msgstr ""
po/lv.po+13−15
@@ -8,7 +8,7 @@ msgid ""
8msgstr ""
8msgstr ""
9"Project-Id-Version: unity\n"
9"Project-Id-Version: unity\n"
10"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
11−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
11+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
12"PO-Revision-Date: 2015-11-22 19:13+0000\n"
12"PO-Revision-Date: 2015-11-22 19:13+0000\n"
13"Last-Translator: Klavs Anson <anson.klavs@gmail.com>\n"
13"Last-Translator: Klavs Anson <anson.klavs@gmail.com>\n"
14"Language-Team: Latvian <lata-l10n@googlegroups.com>\n"
14"Language-Team: Latvian <lata-l10n@googlegroups.com>\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
18"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
20"X-Generator: Launchpad (build 17936)\n"
20"X-Generator: Launchpad (build 17936)\n"
21"Language: lv\n"
21"Language: lv\n"
22
22
@@ -176,26 +176,26 @@ msgstr ""
176msgid "Close all"
176msgid "Close all"
177msgstr ""
177msgstr ""
178
178
179−#: qml/Dash/DashPageHeader.qml:266
179+#: qml/Dash/DashPageHeader.qml:270
180msgctxt "Button: Open the Ubuntu Store"
180msgctxt "Button: Open the Ubuntu Store"
181msgid "Store"
181msgid "Store"
182msgstr "Veikals"
182msgstr "Veikals"
183
183
184−#: qml/Dash/DashPageHeader.qml:273
184+#: qml/Dash/DashPageHeader.qml:277
185msgctxt "Button: Start a search in the current dash scope"
185msgctxt "Button: Start a search in the current dash scope"
186msgid "Search"
186msgid "Search"
187msgstr "Meklēt"
187msgstr "Meklēt"
188
188
189−#: qml/Dash/DashPageHeader.qml:283
189+#: qml/Dash/DashPageHeader.qml:287
190msgctxt "Button: Show the current dash scope settings"
190msgctxt "Button: Show the current dash scope settings"
191msgid "Settings"
191msgid "Settings"
192msgstr "Iestatījumi"
192msgstr "Iestatījumi"
193
193
194−#: qml/Dash/DashPageHeader.qml:290
194+#: qml/Dash/DashPageHeader.qml:294
195msgid "Remove from Favorites"
195msgid "Remove from Favorites"
196msgstr "Izņemt no izlases"
196msgstr "Izņemt no izlases"
197
197
198−#: qml/Dash/DashPageHeader.qml:290
198+#: qml/Dash/DashPageHeader.qml:294
199msgid "Add to Favorites"
199msgid "Add to Favorites"
200msgstr "Pievienot izlasei"
200msgstr "Pievienot izlasei"
201
201
@@ -428,14 +428,6 @@ msgctxt "Button: Call back on phone"
428msgid "Call back"
428msgid "Call back"
429msgstr "Atzvanīt"
429msgstr "Atzvanīt"
430
430
431−#: qml/Panel/Indicators/ModemInfoItem.qml:105
432−msgid "Unlock SIM"
433−msgstr "Atbloķēt SIM"
434−
435−#: qml/Panel/Indicators/RoamingIndication.qml:27
436−msgid "Roaming"
437−msgstr "Viesabonēšana"
438−
439#: qml/Tutorial/TutorialBottom.qml:28
431#: qml/Tutorial/TutorialBottom.qml:28
440msgid "Open special menus"
432msgid "Open special menus"
441msgstr "Atvērt īpašas izvēlnes"
433msgstr "Atvērt īpašas izvēlnes"
@@ -729,12 +721,18 @@ msgstr "%1 〉"
729#~ msgid "All"
721#~ msgid "All"
730#~ msgstr "Visi"
722#~ msgstr "Visi"
731
723
724+#~ msgid "Unlock SIM"
725+#~ msgstr "Atbloķēt SIM"
726+
732#~ msgid "Favorites"
727#~ msgid "Favorites"
733#~ msgstr "Iecienītās"
728#~ msgstr "Iecienītās"
734
729
735#~ msgid "Done"
730#~ msgid "Done"
736#~ msgstr "Pabeigts"
731#~ msgstr "Pabeigts"
737
732
733+#~ msgid "Roaming"
734+#~ msgstr "Viesabonēšana"
735+
738#~ msgid "Store"
736#~ msgid "Store"
739#~ msgstr "Veikals"
737#~ msgstr "Veikals"
740
738
po/ml.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2013-11-23 11:44+0000\n"
11"PO-Revision-Date: 2013-11-23 11:44+0000\n"
12"Last-Translator: ST Alfas <Unknown>\n"
12"Last-Translator: ST Alfas <Unknown>\n"
13"Language-Team: Malayalam <ml@li.org>\n"
13"Language-Team: Malayalam <ml@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr ""
177msgstr ""
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr ""
182msgstr ""
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr ""
187msgstr ""
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr ""
195msgstr ""
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr ""
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
po/mr.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2014-01-14 19:54+0000\n"
11"PO-Revision-Date: 2014-01-14 19:54+0000\n"
12"Last-Translator: Rohan Deshmukh <Unknown>\n"
12"Last-Translator: Rohan Deshmukh <Unknown>\n"
13"Language-Team: Marathi <mr@li.org>\n"
13"Language-Team: Marathi <mr@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr ""
177msgstr ""
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr "शोध"
182msgstr "शोध"
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr ""
187msgstr ""
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr "आवड पासून काढूण टाका"
191msgstr "आवड पासून काढूण टाका"
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr "आवड मध्ये जोडा"
195msgstr "आवड मध्ये जोडा"
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr ""
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
po/ms.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2014-01-17 09:05+0000\n"
11"PO-Revision-Date: 2014-01-17 09:05+0000\n"
12"Last-Translator: abuyop <Unknown>\n"
12"Last-Translator: abuyop <Unknown>\n"
13"Language-Team: Malay <ms@li.org>\n"
13"Language-Team: Malay <ms@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -173,26 +173,26 @@ msgstr "Sambung semula sekarang!"
173msgid "Close all"
173msgid "Close all"
174msgstr "Tutup semua"
174msgstr "Tutup semua"
175
175
176−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
177msgctxt "Button: Open the Ubuntu Store"
177msgctxt "Button: Open the Ubuntu Store"
178msgid "Store"
178msgid "Store"
179msgstr "Kedai"
179msgstr "Kedai"
180
180
181−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
182msgctxt "Button: Start a search in the current dash scope"
182msgctxt "Button: Start a search in the current dash scope"
183msgid "Search"
183msgid "Search"
184msgstr "Gelintar"
184msgstr "Gelintar"
185
185
186−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
187msgctxt "Button: Show the current dash scope settings"
187msgctxt "Button: Show the current dash scope settings"
188msgid "Settings"
188msgid "Settings"
189msgstr "Tetapan"
189msgstr "Tetapan"
190
190
191−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
192msgid "Remove from Favorites"
192msgid "Remove from Favorites"
193msgstr "Buang dari Kegemaran"
193msgstr "Buang dari Kegemaran"
194
194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196msgid "Add to Favorites"
196msgid "Add to Favorites"
197msgstr "Tambah ke Kegemaran"
197msgstr "Tambah ke Kegemaran"
198
198
@@ -422,14 +422,6 @@ msgctxt "Button: Call back on phone"
422msgid "Call back"
422msgid "Call back"
423msgstr "Panggilan semula"
423msgstr "Panggilan semula"
424
424
425−#: qml/Panel/Indicators/ModemInfoItem.qml:105
426−msgid "Unlock SIM"
427−msgstr "Buka SIM"
428−
429−#: qml/Panel/Indicators/RoamingIndication.qml:27
430−msgid "Roaming"
431−msgstr "Perayauan"
432−
433#: qml/Tutorial/TutorialBottom.qml:28
425#: qml/Tutorial/TutorialBottom.qml:28
434msgid "Open special menus"
426msgid "Open special menus"
435msgstr "Buka menu khas"
427msgstr "Buka menu khas"
@@ -758,12 +750,18 @@ msgstr "%1 〉"
758#~ msgid "Done"
750#~ msgid "Done"
759#~ msgstr "Selesai"
751#~ msgstr "Selesai"
760
752
753+#~ msgid "Roaming"
754+#~ msgstr "Perayauan"
755+
761#~ msgid "Please re-enter"
756#~ msgid "Please re-enter"
762#~ msgstr "Sila masuk-semula"
757#~ msgstr "Sila masuk-semula"
763
758
764#~ msgid "Manage Scopes"
759#~ msgid "Manage Scopes"
765#~ msgstr "Urus Skop"
760#~ msgstr "Urus Skop"
766
761
762+#~ msgid "Unlock SIM"
763+#~ msgstr "Buka SIM"
764+
767#~ msgid ""
765#~ msgid ""
768#~ "You have now mastered the edge gestures and can start using the "
766#~ "You have now mastered the edge gestures and can start using the "
769#~ "phone<br><br>Tap on the screen to start"
767#~ "phone<br><br>Tap on the screen to start"
po/my.po+10−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2013-12-12 11:12+0000\n"
11"PO-Revision-Date: 2013-12-12 11:12+0000\n"
12"Last-Translator: Pyae Sone <Unknown>\n"
12"Last-Translator: Pyae Sone <Unknown>\n"
13"Language-Team: Burmese <my@li.org>\n"
13"Language-Team: Burmese <my@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr "မှတ်သားပါ"
177msgstr "မှတ်သားပါ"
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr "ရှာဖွေရန်"
182msgstr "ရှာဖွေရန်"
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr "ချိန်ညှိစရာများ"
187msgstr "ချိန်ညှိစရာများ"
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr "နှစ်သက်မှုအဖြစ်မှပယ်ဖျက်ပါ"
191msgstr "နှစ်သက်မှုအဖြစ်မှပယ်ဖျက်ပါ"
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr "နှစ်သက်မှုအဖြစ်ထည့်ပါ"
195msgstr "နှစ်သက်မှုအဖြစ်ထည့်ပါ"
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr "Roaming"
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
@@ -698,3 +690,6 @@ msgstr ""
698
690
699#~ msgid "Well done"
691#~ msgid "Well done"
700#~ msgstr "ကောင်းအောင်ပြုလုပ်ခဲ့သည်"
692#~ msgstr "ကောင်းအောင်ပြုလုပ်ခဲ့သည်"
693+
694+#~ msgid "Roaming"
695+#~ msgstr "Roaming"
po/nb.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-07-05 19:44+0000\n"
11"PO-Revision-Date: 2015-07-05 19:44+0000\n"
12"Last-Translator: Mathias Bynke <Unknown>\n"
12"Last-Translator: Mathias Bynke <Unknown>\n"
13"Language-Team: Norwegian Bokmal <nb@li.org>\n"
13"Language-Team: Norwegian Bokmal <nb@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -177,26 +177,26 @@ msgstr "Koble til nå!"
177msgid "Close all"
177msgid "Close all"
178msgstr "Lukk alle"
178msgstr "Lukk alle"
179
179
180−#: qml/Dash/DashPageHeader.qml:266
180+#: qml/Dash/DashPageHeader.qml:270
181msgctxt "Button: Open the Ubuntu Store"
181msgctxt "Button: Open the Ubuntu Store"
182msgid "Store"
182msgid "Store"
183msgstr "Butikk"
183msgstr "Butikk"
184
184
185−#: qml/Dash/DashPageHeader.qml:273
185+#: qml/Dash/DashPageHeader.qml:277
186msgctxt "Button: Start a search in the current dash scope"
186msgctxt "Button: Start a search in the current dash scope"
187msgid "Search"
187msgid "Search"
188msgstr "Søk"
188msgstr "Søk"
189
189
190−#: qml/Dash/DashPageHeader.qml:283
190+#: qml/Dash/DashPageHeader.qml:287
191msgctxt "Button: Show the current dash scope settings"
191msgctxt "Button: Show the current dash scope settings"
192msgid "Settings"
192msgid "Settings"
193msgstr "Innstillinger"
193msgstr "Innstillinger"
194
194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196msgid "Remove from Favorites"
196msgid "Remove from Favorites"
197msgstr "Fjern fra favoritter"
197msgstr "Fjern fra favoritter"
198
198
199−#: qml/Dash/DashPageHeader.qml:290
199+#: qml/Dash/DashPageHeader.qml:294
200msgid "Add to Favorites"
200msgid "Add to Favorites"
201msgstr "Legg til i favoritter"
201msgstr "Legg til i favoritter"
202
202
@@ -428,14 +428,6 @@ msgctxt "Button: Call back on phone"
428msgid "Call back"
428msgid "Call back"
429msgstr "Ring tilbake"
429msgstr "Ring tilbake"
430
430
431−#: qml/Panel/Indicators/ModemInfoItem.qml:105
432−msgid "Unlock SIM"
433−msgstr "Lås opp SIM"
434−
435−#: qml/Panel/Indicators/RoamingIndication.qml:27
436−msgid "Roaming"
437−msgstr "Fremmednett"
438−
439#: qml/Tutorial/TutorialBottom.qml:28
431#: qml/Tutorial/TutorialBottom.qml:28
440msgid "Open special menus"
432msgid "Open special menus"
441msgstr "Åpne spesialmenyer"
433msgstr "Åpne spesialmenyer"
@@ -733,6 +725,9 @@ msgstr "%1 〉"
733#~ msgid "All"
725#~ msgid "All"
734#~ msgstr "Alt"
726#~ msgstr "Alt"
735
727
728+#~ msgid "Unlock SIM"
729+#~ msgstr "Lås opp SIM"
730+
736#~ msgid "Favorites"
731#~ msgid "Favorites"
737#~ msgstr "Favoritter"
732#~ msgstr "Favoritter"
738
733
@@ -745,6 +740,9 @@ msgstr "%1 〉"
745#~ msgid "Done"
740#~ msgid "Done"
746#~ msgstr "Ferdig"
741#~ msgstr "Ferdig"
747
742
743+#~ msgid "Roaming"
744+#~ msgstr "Fremmednett"
745+
748#~ msgid "Swipe from the left to reveal the launcher for quick access to apps"
746#~ msgid "Swipe from the left to reveal the launcher for quick access to apps"
749#~ msgstr "Skyv fra venstre for å få tilgang til programoppstarteren"
747#~ msgstr "Skyv fra venstre for å få tilgang til programoppstarteren"
750
748
po/ne.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-12-06 15:11+0000\n"
11"PO-Revision-Date: 2015-12-06 15:11+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Nepali <ne@li.org>\n"
13"Language-Team: Nepali <ne@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr ""
177msgstr ""
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr ""
182msgstr ""
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr ""
187msgstr ""
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr ""
195msgstr ""
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr ""
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
po/nl.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-07-07 07:14+0000\n"
11"PO-Revision-Date: 2015-07-07 07:14+0000\n"
12"Last-Translator: Hannie Dumoleyn <Unknown>\n"
12"Last-Translator: Hannie Dumoleyn <Unknown>\n"
13"Language-Team: Dutch <nl@li.org>\n"
13"Language-Team: Dutch <nl@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -177,26 +177,26 @@ msgstr ""
177msgid "Close all"
177msgid "Close all"
178msgstr ""
178msgstr ""
179
179
180−#: qml/Dash/DashPageHeader.qml:266
180+#: qml/Dash/DashPageHeader.qml:270
181msgctxt "Button: Open the Ubuntu Store"
181msgctxt "Button: Open the Ubuntu Store"
182msgid "Store"
182msgid "Store"
183msgstr "Winkel"
183msgstr "Winkel"
184
184
185−#: qml/Dash/DashPageHeader.qml:273
185+#: qml/Dash/DashPageHeader.qml:277
186msgctxt "Button: Start a search in the current dash scope"
186msgctxt "Button: Start a search in the current dash scope"
187msgid "Search"
187msgid "Search"
188msgstr "Zoeken"
188msgstr "Zoeken"
189
189
190−#: qml/Dash/DashPageHeader.qml:283
190+#: qml/Dash/DashPageHeader.qml:287
191msgctxt "Button: Show the current dash scope settings"
191msgctxt "Button: Show the current dash scope settings"
192msgid "Settings"
192msgid "Settings"
193msgstr "Instellingen"
193msgstr "Instellingen"
194
194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196msgid "Remove from Favorites"
196msgid "Remove from Favorites"
197msgstr "Verwijderen uit favorieten"
197msgstr "Verwijderen uit favorieten"
198
198
199−#: qml/Dash/DashPageHeader.qml:290
199+#: qml/Dash/DashPageHeader.qml:294
200msgid "Add to Favorites"
200msgid "Add to Favorites"
201msgstr "Toevoegen aan favorieten"
201msgstr "Toevoegen aan favorieten"
202
202
@@ -426,14 +426,6 @@ msgctxt "Button: Call back on phone"
426msgid "Call back"
426msgid "Call back"
427msgstr ""
427msgstr ""
428
428
429−#: qml/Panel/Indicators/ModemInfoItem.qml:105
430−msgid "Unlock SIM"
431−msgstr "Simkaart deblokkeren"
432−
433−#: qml/Panel/Indicators/RoamingIndication.qml:27
434−msgid "Roaming"
435−msgstr "Roaming"
436−
437#: qml/Tutorial/TutorialBottom.qml:28
429#: qml/Tutorial/TutorialBottom.qml:28
438msgid "Open special menus"
430msgid "Open special menus"
439msgstr "Speciale menu's openen"
431msgstr "Speciale menu's openen"
@@ -746,6 +738,9 @@ msgstr "%1 〉"
746#~ msgid "Store"
738#~ msgid "Store"
747#~ msgstr "Winkel"
739#~ msgstr "Winkel"
748
740
741+#~ msgid "Roaming"
742+#~ msgstr "Roaming"
743+
749#~ msgid "Done"
744#~ msgid "Done"
750#~ msgstr "Klaar"
745#~ msgstr "Klaar"
751
746
@@ -767,6 +762,9 @@ msgstr "%1 〉"
767#~ msgid "Power"
762#~ msgid "Power"
768#~ msgstr "Energie"
763#~ msgstr "Energie"
769
764
765+#~ msgid "Unlock SIM"
766+#~ msgstr "Simkaart deblokkeren"
767+
770#~ msgid "Restart"
768#~ msgid "Restart"
771#~ msgstr "Herstarten"
769#~ msgstr "Herstarten"
772
770
po/nn.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-05-12 11:32+0000\n"
11"PO-Revision-Date: 2015-05-12 11:32+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Norwegian Nynorsk <nn@li.org>\n"
13"Language-Team: Norwegian Nynorsk <nn@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr ""
177msgstr ""
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr ""
182msgstr ""
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr ""
187msgstr ""
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr ""
195msgstr ""
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr ""
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
po/oc.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-02-05 20:35+0000\n"
11"PO-Revision-Date: 2015-02-05 20:35+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Occitan (post 1500) <oc@li.org>\n"
13"Language-Team: Occitan (post 1500) <oc@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr ""
177msgstr ""
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr ""
182msgstr ""
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr ""
187msgstr ""
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr ""
195msgstr ""
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr ""
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
po/or.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-03-21 05:28+0000\n"
11"PO-Revision-Date: 2015-03-21 05:28+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Oriya <or@li.org>\n"
13"Language-Team: Oriya <or@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n!=1;\n"
17"Plural-Forms: nplurals=2; plural=n!=1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr ""
177msgstr ""
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr ""
182msgstr ""
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr ""
187msgstr ""
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr ""
195msgstr ""
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr ""
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
po/pa.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-04-24 04:29+0000\n"
11"PO-Revision-Date: 2015-04-24 04:29+0000\n"
12"Last-Translator: Gursharnjit_Singh <ubuntuser13@gmail.com>\n"
12"Last-Translator: Gursharnjit_Singh <ubuntuser13@gmail.com>\n"
13"Language-Team: Punjabi <pa@li.org>\n"
13"Language-Team: Punjabi <pa@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -173,26 +173,26 @@ msgstr ""
173msgid "Close all"
173msgid "Close all"
174msgstr ""
174msgstr ""
175
175
176−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
177msgctxt "Button: Open the Ubuntu Store"
177msgctxt "Button: Open the Ubuntu Store"
178msgid "Store"
178msgid "Store"
179msgstr "ਸਟੋਰ"
179msgstr "ਸਟੋਰ"
180
180
181−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
182msgctxt "Button: Start a search in the current dash scope"
182msgctxt "Button: Start a search in the current dash scope"
183msgid "Search"
183msgid "Search"
184msgstr "ਖੋਜ"
184msgstr "ਖੋਜ"
185
185
186−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
187msgctxt "Button: Show the current dash scope settings"
187msgctxt "Button: Show the current dash scope settings"
188msgid "Settings"
188msgid "Settings"
189msgstr "ਸੈਟਿੰਗ"
189msgstr "ਸੈਟਿੰਗ"
190
190
191−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
192msgid "Remove from Favorites"
192msgid "Remove from Favorites"
193msgstr "ਪਸੰਦ ਵਿੱਚੋਂ ਹਟਾਓ"
193msgstr "ਪਸੰਦ ਵਿੱਚੋਂ ਹਟਾਓ"
194
194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196msgid "Add to Favorites"
196msgid "Add to Favorites"
197msgstr "ਪਸੰਦ ਵਿੱਚ ਜੋੜੋ"
197msgstr "ਪਸੰਦ ਵਿੱਚ ਜੋੜੋ"
198
198
@@ -422,14 +422,6 @@ msgctxt "Button: Call back on phone"
422msgid "Call back"
422msgid "Call back"
423msgstr ""
423msgstr ""
424
424
425−#: qml/Panel/Indicators/ModemInfoItem.qml:105
426−msgid "Unlock SIM"
427−msgstr "ਅਣਲਾਕ SIM"
428−
429−#: qml/Panel/Indicators/RoamingIndication.qml:27
430−msgid "Roaming"
431−msgstr "ਰੋਮਿੰਗ"
432−
433#: qml/Tutorial/TutorialBottom.qml:28
425#: qml/Tutorial/TutorialBottom.qml:28
434msgid "Open special menus"
426msgid "Open special menus"
435msgstr "ਖਾਸ਼ ਮੀਨੂੰ ਖੋਲ੍ਹੋ"
427msgstr "ਖਾਸ਼ ਮੀਨੂੰ ਖੋਲ੍ਹੋ"
@@ -714,6 +706,12 @@ msgstr "%1 〉"
714#~ msgid "Please re-enter"
706#~ msgid "Please re-enter"
715#~ msgstr "ਕਿਰਪਾ ਕਰਕੇ ਮੁੜ-ਦਰਜ ਕਰੋ"
707#~ msgstr "ਕਿਰਪਾ ਕਰਕੇ ਮੁੜ-ਦਰਜ ਕਰੋ"
716
708
709+#~ msgid "Unlock SIM"
710+#~ msgstr "ਅਣਲਾਕ SIM"
711+
712+#~ msgid "Roaming"
713+#~ msgstr "ਰੋਮਿੰਗ"
714+
717#~ msgid "Please select how you’d like to unlock your phone."
715#~ msgid "Please select how you’d like to unlock your phone."
718#~ msgstr ""
716#~ msgstr ""
719#~ "ਕਿਰਪਾ ਕਰਕੇ ਚੁਣੋ ਤੁਸੀਂ ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਕਿਸ ਤਰ੍ਹਾਂ ਅਣ-ਲਾਕ ਕਰਨਾ ਪਸੰਦ ਕਰੋਗੇ।"
717#~ "ਕਿਰਪਾ ਕਰਕੇ ਚੁਣੋ ਤੁਸੀਂ ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਕਿਸ ਤਰ੍ਹਾਂ ਅਣ-ਲਾਕ ਕਰਨਾ ਪਸੰਦ ਕਰੋਗੇ।"
po/pl.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-07-12 09:46+0000\n"
11"PO-Revision-Date: 2015-07-12 09:46+0000\n"
12"Last-Translator: Seweryn Opyd <Unknown>\n"
12"Last-Translator: Seweryn Opyd <Unknown>\n"
13"Language-Team: Polish <pl@li.org>\n"
13"Language-Team: Polish <pl@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
17"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
18"|| n%100>=20) ? 1 : 2;\n"
18"|| n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
20"X-Generator: Launchpad (build 17936)\n"
20"X-Generator: Launchpad (build 17936)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -175,26 +175,26 @@ msgstr "Ponownie połącz teraz!"
175msgid "Close all"
175msgid "Close all"
176msgstr "Zamknij wszystko"
176msgstr "Zamknij wszystko"
177
177
178−#: qml/Dash/DashPageHeader.qml:266
178+#: qml/Dash/DashPageHeader.qml:270
179msgctxt "Button: Open the Ubuntu Store"
179msgctxt "Button: Open the Ubuntu Store"
180msgid "Store"
180msgid "Store"
181msgstr "Sklep"
181msgstr "Sklep"
182
182
183−#: qml/Dash/DashPageHeader.qml:273
183+#: qml/Dash/DashPageHeader.qml:277
184msgctxt "Button: Start a search in the current dash scope"
184msgctxt "Button: Start a search in the current dash scope"
185msgid "Search"
185msgid "Search"
186msgstr "Wyszukaj"
186msgstr "Wyszukaj"
187
187
188−#: qml/Dash/DashPageHeader.qml:283
188+#: qml/Dash/DashPageHeader.qml:287
189msgctxt "Button: Show the current dash scope settings"
189msgctxt "Button: Show the current dash scope settings"
190msgid "Settings"
190msgid "Settings"
191msgstr "Ustawienia"
191msgstr "Ustawienia"
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Remove from Favorites"
194msgid "Remove from Favorites"
195msgstr "Usuń z ulubionych"
195msgstr "Usuń z ulubionych"
196
196
197−#: qml/Dash/DashPageHeader.qml:290
197+#: qml/Dash/DashPageHeader.qml:294
198msgid "Add to Favorites"
198msgid "Add to Favorites"
199msgstr "Dodaj do ulubionych"
199msgstr "Dodaj do ulubionych"
200
200
@@ -429,14 +429,6 @@ msgctxt "Button: Call back on phone"
429msgid "Call back"
429msgid "Call back"
430msgstr "Oddzwoń"
430msgstr "Oddzwoń"
431
431
432−#: qml/Panel/Indicators/ModemInfoItem.qml:105
433−msgid "Unlock SIM"
434−msgstr "Odblokuj kartę SIM"
435−
436−#: qml/Panel/Indicators/RoamingIndication.qml:27
437−msgid "Roaming"
438−msgstr "Roaming"
439−
440#: qml/Tutorial/TutorialBottom.qml:28
432#: qml/Tutorial/TutorialBottom.qml:28
441msgid "Open special menus"
433msgid "Open special menus"
442msgstr "Otwórz menu specjalne"
434msgstr "Otwórz menu specjalne"
@@ -740,6 +732,9 @@ msgstr "%1 〉"
740#~ "Wydawanie poleceń krawędzi zostało opanowane. Urządzenie gotowe do "
732#~ "Wydawanie poleceń krawędzi zostało opanowane. Urządzenie gotowe do "
741#~ "pracy.<br><br>Dotknij ekranu by rozpocząć"
733#~ "pracy.<br><br>Dotknij ekranu by rozpocząć"
742
734
735+#~ msgid "Unlock SIM"
736+#~ msgstr "Odblokuj kartę SIM"
737+
743#~ msgid "Log out"
738#~ msgid "Log out"
744#~ msgstr "Wyloguj"
739#~ msgstr "Wyloguj"
745
740
@@ -764,6 +759,9 @@ msgstr "%1 〉"
764#~ msgid "Settings"
759#~ msgid "Settings"
765#~ msgstr "Ustawienia"
760#~ msgstr "Ustawienia"
766
761
762+#~ msgid "Roaming"
763+#~ msgstr "Roaming"
764+
767#~ msgid "Please re-enter"
765#~ msgid "Please re-enter"
768#~ msgstr "Proszę wprowadź ponownie"
766#~ msgstr "Proszę wprowadź ponownie"
769
767
po/pt.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2016-02-18 01:11+0000\n"
11"PO-Revision-Date: 2016-02-18 01:11+0000\n"
12"Last-Translator: Ivo Xavier <ivofernandes12@gmail.com>\n"
12"Last-Translator: Ivo Xavier <ivofernandes12@gmail.com>\n"
13"Language-Team: Portuguese <pt@li.org>\n"
13"Language-Team: Portuguese <pt@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -177,26 +177,26 @@ msgstr "Volte a ligar agora!"
177msgid "Close all"
177msgid "Close all"
178msgstr "Fechar tudo"
178msgstr "Fechar tudo"
179
179
180−#: qml/Dash/DashPageHeader.qml:266
180+#: qml/Dash/DashPageHeader.qml:270
181msgctxt "Button: Open the Ubuntu Store"
181msgctxt "Button: Open the Ubuntu Store"
182msgid "Store"
182msgid "Store"
183msgstr "Store"
183msgstr "Store"
184
184
185−#: qml/Dash/DashPageHeader.qml:273
185+#: qml/Dash/DashPageHeader.qml:277
186msgctxt "Button: Start a search in the current dash scope"
186msgctxt "Button: Start a search in the current dash scope"
187msgid "Search"
187msgid "Search"
188msgstr "Procurar"
188msgstr "Procurar"
189
189
190−#: qml/Dash/DashPageHeader.qml:283
190+#: qml/Dash/DashPageHeader.qml:287
191msgctxt "Button: Show the current dash scope settings"
191msgctxt "Button: Show the current dash scope settings"
192msgid "Settings"
192msgid "Settings"
193msgstr "Definições"
193msgstr "Definições"
194
194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196msgid "Remove from Favorites"
196msgid "Remove from Favorites"
197msgstr "Remover dos favoritos"
197msgstr "Remover dos favoritos"
198
198
199−#: qml/Dash/DashPageHeader.qml:290
199+#: qml/Dash/DashPageHeader.qml:294
200msgid "Add to Favorites"
200msgid "Add to Favorites"
201msgstr "Adicionar aos favoritos"
201msgstr "Adicionar aos favoritos"
202
202
@@ -428,14 +428,6 @@ msgctxt "Button: Call back on phone"
428msgid "Call back"
428msgid "Call back"
429msgstr "Ligar de volta"
429msgstr "Ligar de volta"
430
430
431−#: qml/Panel/Indicators/ModemInfoItem.qml:105
432−msgid "Unlock SIM"
433−msgstr "Desbloquear SIM"
434−
435−#: qml/Panel/Indicators/RoamingIndication.qml:27
436−msgid "Roaming"
437−msgstr "Roaming"
438−
439#: qml/Tutorial/TutorialBottom.qml:28
431#: qml/Tutorial/TutorialBottom.qml:28
440msgid "Open special menus"
432msgid "Open special menus"
441msgstr "Abrir menus especiais"
433msgstr "Abrir menus especiais"
@@ -721,6 +713,9 @@ msgstr "%1 〉"
721#~ msgid "All"
713#~ msgid "All"
722#~ msgstr "Todos"
714#~ msgstr "Todos"
723
715
716+#~ msgid "Unlock SIM"
717+#~ msgstr "Desbloquear SIM"
718+
724#~ msgid "Favorites"
719#~ msgid "Favorites"
725#~ msgstr "Favoritos"
720#~ msgstr "Favoritos"
726
721
@@ -730,6 +725,9 @@ msgstr "%1 〉"
730#~ msgid "Done"
725#~ msgid "Done"
731#~ msgstr "Concluído"
726#~ msgstr "Concluído"
732
727
728+#~ msgid "Roaming"
729+#~ msgstr "Roaming"
730+
733#~ msgid "Log out"
731#~ msgid "Log out"
734#~ msgstr "Terminar sessão"
732#~ msgstr "Terminar sessão"
735
733
po/pt_BR.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-08-05 04:40+0000\n"
11"PO-Revision-Date: 2015-08-05 04:40+0000\n"
12"Last-Translator: Julio Alexander Sieg <julio.sieg@gmail.com>\n"
12"Last-Translator: Julio Alexander Sieg <julio.sieg@gmail.com>\n"
13"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
13"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -175,26 +175,26 @@ msgstr ""
175msgid "Close all"
175msgid "Close all"
176msgstr ""
176msgstr ""
177
177
178−#: qml/Dash/DashPageHeader.qml:266
178+#: qml/Dash/DashPageHeader.qml:270
179msgctxt "Button: Open the Ubuntu Store"
179msgctxt "Button: Open the Ubuntu Store"
180msgid "Store"
180msgid "Store"
181msgstr "Loja"
181msgstr "Loja"
182
182
183−#: qml/Dash/DashPageHeader.qml:273
183+#: qml/Dash/DashPageHeader.qml:277
184msgctxt "Button: Start a search in the current dash scope"
184msgctxt "Button: Start a search in the current dash scope"
185msgid "Search"
185msgid "Search"
186msgstr "Pesquisar"
186msgstr "Pesquisar"
187
187
188−#: qml/Dash/DashPageHeader.qml:283
188+#: qml/Dash/DashPageHeader.qml:287
189msgctxt "Button: Show the current dash scope settings"
189msgctxt "Button: Show the current dash scope settings"
190msgid "Settings"
190msgid "Settings"
191msgstr "Configurações"
191msgstr "Configurações"
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Remove from Favorites"
194msgid "Remove from Favorites"
195msgstr "Remover dos favoritos"
195msgstr "Remover dos favoritos"
196
196
197−#: qml/Dash/DashPageHeader.qml:290
197+#: qml/Dash/DashPageHeader.qml:294
198msgid "Add to Favorites"
198msgid "Add to Favorites"
199msgstr "Adicionar aos favoritos"
199msgstr "Adicionar aos favoritos"
200
200
@@ -424,14 +424,6 @@ msgctxt "Button: Call back on phone"
424msgid "Call back"
424msgid "Call back"
425msgstr ""
425msgstr ""
426
426
427−#: qml/Panel/Indicators/ModemInfoItem.qml:105
428−msgid "Unlock SIM"
429−msgstr "Desbloquear SIM"
430−
431−#: qml/Panel/Indicators/RoamingIndication.qml:27
432−msgid "Roaming"
433−msgstr "Roaming"
434−
435#: qml/Tutorial/TutorialBottom.qml:28
427#: qml/Tutorial/TutorialBottom.qml:28
436msgid "Open special menus"
428msgid "Open special menus"
437msgstr "Abrir menus especiais"
429msgstr "Abrir menus especiais"
@@ -737,6 +729,9 @@ msgstr "%1 〉"
737#~ "Agora você já domina os gestos das bordas e pode começar a usar o "
729#~ "Agora você já domina os gestos das bordas e pode começar a usar o "
738#~ "telefone<br><br>Toque na tela para iniciar"
730#~ "telefone<br><br>Toque na tela para iniciar"
739
731
732+#~ msgid "Unlock SIM"
733+#~ msgstr "Desbloquear SIM"
734+
740#~ msgid "Store"
735#~ msgid "Store"
741#~ msgstr "Loja"
736#~ msgstr "Loja"
742
737
@@ -749,6 +744,9 @@ msgstr "%1 〉"
749#~ msgid "Favorites"
744#~ msgid "Favorites"
750#~ msgstr "Favoritos"
745#~ msgstr "Favoritos"
751
746
747+#~ msgid "Roaming"
748+#~ msgstr "Roaming"
749+
752#~ msgid "All"
750#~ msgid "All"
753#~ msgstr "Tudo"
751#~ msgstr "Tudo"
754
752
po/ro.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-07-06 17:47+0000\n"
11"PO-Revision-Date: 2015-07-06 17:47+0000\n"
12"Last-Translator: Meriuță Cornel <meriutacornel@neacornel.eu>\n"
12"Last-Translator: Meriuță Cornel <meriutacornel@neacornel.eu>\n"
13"Language-Team: Romanian <ro@li.org>\n"
13"Language-Team: Romanian <ro@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
17"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
18"== 0) && (n != 0))) ? 2: 1));\n"
18"== 0) && (n != 0))) ? 2: 1));\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
20"X-Generator: Launchpad (build 17936)\n"
20"X-Generator: Launchpad (build 17936)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -178,26 +178,26 @@ msgstr ""
178msgid "Close all"
178msgid "Close all"
179msgstr ""
179msgstr ""
180
180
181−#: qml/Dash/DashPageHeader.qml:266
181+#: qml/Dash/DashPageHeader.qml:270
182msgctxt "Button: Open the Ubuntu Store"
182msgctxt "Button: Open the Ubuntu Store"
183msgid "Store"
183msgid "Store"
184msgstr "Magazin"
184msgstr "Magazin"
185
185
186−#: qml/Dash/DashPageHeader.qml:273
186+#: qml/Dash/DashPageHeader.qml:277
187msgctxt "Button: Start a search in the current dash scope"
187msgctxt "Button: Start a search in the current dash scope"
188msgid "Search"
188msgid "Search"
189msgstr "Căutare"
189msgstr "Căutare"
190
190
191−#: qml/Dash/DashPageHeader.qml:283
191+#: qml/Dash/DashPageHeader.qml:287
192msgctxt "Button: Show the current dash scope settings"
192msgctxt "Button: Show the current dash scope settings"
193msgid "Settings"
193msgid "Settings"
194msgstr "Configurări"
194msgstr "Configurări"
195
195
196−#: qml/Dash/DashPageHeader.qml:290
196+#: qml/Dash/DashPageHeader.qml:294
197msgid "Remove from Favorites"
197msgid "Remove from Favorites"
198msgstr "Șterge din favorite"
198msgstr "Șterge din favorite"
199
199
200−#: qml/Dash/DashPageHeader.qml:290
200+#: qml/Dash/DashPageHeader.qml:294
201msgid "Add to Favorites"
201msgid "Add to Favorites"
202msgstr "Adaugă la favorite"
202msgstr "Adaugă la favorite"
203
203
@@ -432,14 +432,6 @@ msgctxt "Button: Call back on phone"
432msgid "Call back"
432msgid "Call back"
433msgstr ""
433msgstr ""
434
434
435−#: qml/Panel/Indicators/ModemInfoItem.qml:105
436−msgid "Unlock SIM"
437−msgstr "Deblocare SIM"
438−
439−#: qml/Panel/Indicators/RoamingIndication.qml:27
440−msgid "Roaming"
441−msgstr "Roaming"
442−
443#: qml/Tutorial/TutorialBottom.qml:28
435#: qml/Tutorial/TutorialBottom.qml:28
444msgid "Open special menus"
436msgid "Open special menus"
445msgstr "Deschide meniurile speciale"
437msgstr "Deschide meniurile speciale"
@@ -751,6 +743,9 @@ msgstr "%1 〉"
751#~ msgid "All"
743#~ msgid "All"
752#~ msgstr "Tot"
744#~ msgstr "Tot"
753
745
746+#~ msgid "Unlock SIM"
747+#~ msgstr "Deblocare SIM"
748+
754#~ msgid "Favorites"
749#~ msgid "Favorites"
755#~ msgstr "Favorite"
750#~ msgstr "Favorite"
756
751
@@ -763,6 +758,9 @@ msgstr "%1 〉"
763#~ msgid "Done"
758#~ msgid "Done"
764#~ msgstr "Finalizat"
759#~ msgstr "Finalizat"
765
760
761+#~ msgid "Roaming"
762+#~ msgstr "Roaming"
763+
766#~ msgid "Log out"
764#~ msgid "Log out"
767#~ msgstr "Închide sesiunea"
765#~ msgstr "Închide sesiunea"
768
766
po/ru.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-07-06 05:33+0000\n"
11"PO-Revision-Date: 2015-07-06 05:33+0000\n"
12"Last-Translator: ☠Jay ZDLin☠ <Unknown>\n"
12"Last-Translator: ☠Jay ZDLin☠ <Unknown>\n"
13"Language-Team: Russian <ru@li.org>\n"
13"Language-Team: Russian <ru@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
20"X-Generator: Launchpad (build 17936)\n"
20"X-Generator: Launchpad (build 17936)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -179,26 +179,26 @@ msgstr "Переподключиться сейчас!"
179msgid "Close all"
179msgid "Close all"
180msgstr "Закрыть все"
180msgstr "Закрыть все"
181
181
182−#: qml/Dash/DashPageHeader.qml:266
182+#: qml/Dash/DashPageHeader.qml:270
183msgctxt "Button: Open the Ubuntu Store"
183msgctxt "Button: Open the Ubuntu Store"
184msgid "Store"
184msgid "Store"
185msgstr "Магазин"
185msgstr "Магазин"
186
186
187−#: qml/Dash/DashPageHeader.qml:273
187+#: qml/Dash/DashPageHeader.qml:277
188msgctxt "Button: Start a search in the current dash scope"
188msgctxt "Button: Start a search in the current dash scope"
189msgid "Search"
189msgid "Search"
190msgstr "Найти"
190msgstr "Найти"
191
191
192−#: qml/Dash/DashPageHeader.qml:283
192+#: qml/Dash/DashPageHeader.qml:287
193msgctxt "Button: Show the current dash scope settings"
193msgctxt "Button: Show the current dash scope settings"
194msgid "Settings"
194msgid "Settings"
195msgstr "Настройки"
195msgstr "Настройки"
196
196
197−#: qml/Dash/DashPageHeader.qml:290
197+#: qml/Dash/DashPageHeader.qml:294
198msgid "Remove from Favorites"
198msgid "Remove from Favorites"
199msgstr "Удалить из избранного"
199msgstr "Удалить из избранного"
200
200
201−#: qml/Dash/DashPageHeader.qml:290
201+#: qml/Dash/DashPageHeader.qml:294
202msgid "Add to Favorites"
202msgid "Add to Favorites"
203msgstr "Добавить в избранное"
203msgstr "Добавить в избранное"
204
204
@@ -431,14 +431,6 @@ msgctxt "Button: Call back on phone"
431msgid "Call back"
431msgid "Call back"
432msgstr "Позвонить"
432msgstr "Позвонить"
433
433
434−#: qml/Panel/Indicators/ModemInfoItem.qml:105
435−msgid "Unlock SIM"
436−msgstr "Разблокировать SIM-карту"
437−
438−#: qml/Panel/Indicators/RoamingIndication.qml:27
439−msgid "Roaming"
440−msgstr "Роуминг"
441−
442#: qml/Tutorial/TutorialBottom.qml:28
434#: qml/Tutorial/TutorialBottom.qml:28
443msgid "Open special menus"
435msgid "Open special menus"
444msgstr "Открытие специальных меню"
436msgstr "Открытие специальных меню"
@@ -747,12 +739,18 @@ msgstr "%1 〉"
747#~ "Вы научились пользоваться Ubuntu и можете начать использовать свой "
739#~ "Вы научились пользоваться Ubuntu и можете начать использовать свой "
748#~ "телефон<br><br>Нажмите на экран"
740#~ "телефон<br><br>Нажмите на экран"
749
741
742+#~ msgid "Unlock SIM"
743+#~ msgstr "Разблокировать SIM-карту"
744+
750#~ msgid "Power off"
745#~ msgid "Power off"
751#~ msgstr "Отключить"
746#~ msgstr "Отключить"
752
747
753#~ msgid "All"
748#~ msgid "All"
754#~ msgstr "Все"
749#~ msgstr "Все"
755
750
751+#~ msgid "Roaming"
752+#~ msgstr "Роуминг"
753+
756#~ msgid "Favorites"
754#~ msgid "Favorites"
757#~ msgstr "Избранное"
755#~ msgstr "Избранное"
758
756
po/shn.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-11-10 12:09+0000\n"
11"PO-Revision-Date: 2015-11-10 12:09+0000\n"
12"Last-Translator: Rockworld <sumoisrock@gmail.com>\n"
12"Last-Translator: Rockworld <sumoisrock@gmail.com>\n"
13"Language-Team: Shan <shn@li.org>\n"
13"Language-Team: Shan <shn@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=(n == 1) ? 0 : 1;\n"
17"Plural-Forms: nplurals=2; plural=(n == 1) ? 0 : 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr ""
177msgstr ""
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr ""
182msgstr ""
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr ""
187msgstr ""
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr ""
195msgstr ""
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr ""
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
po/si.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2013-06-26 22:36+0000\n"
11"PO-Revision-Date: 2013-06-26 22:36+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Sinhalese <si@li.org>\n"
13"Language-Team: Sinhalese <si@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -173,26 +173,26 @@ msgstr ""
173msgid "Close all"
173msgid "Close all"
174msgstr ""
174msgstr ""
175
175
176−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
177msgctxt "Button: Open the Ubuntu Store"
177msgctxt "Button: Open the Ubuntu Store"
178msgid "Store"
178msgid "Store"
179msgstr ""
179msgstr ""
180
180
181−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
182msgctxt "Button: Start a search in the current dash scope"
182msgctxt "Button: Start a search in the current dash scope"
183msgid "Search"
183msgid "Search"
184msgstr ""
184msgstr ""
185
185
186−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
187msgctxt "Button: Show the current dash scope settings"
187msgctxt "Button: Show the current dash scope settings"
188msgid "Settings"
188msgid "Settings"
189msgstr ""
189msgstr ""
190
190
191−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
192msgid "Remove from Favorites"
192msgid "Remove from Favorites"
193msgstr ""
193msgstr ""
194
194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196msgid "Add to Favorites"
196msgid "Add to Favorites"
197msgstr ""
197msgstr ""
198
198
@@ -418,14 +418,6 @@ msgctxt "Button: Call back on phone"
418msgid "Call back"
418msgid "Call back"
419msgstr ""
419msgstr ""
420
420
421−#: qml/Panel/Indicators/ModemInfoItem.qml:105
422−msgid "Unlock SIM"
423−msgstr ""
424−
425−#: qml/Panel/Indicators/RoamingIndication.qml:27
426−msgid "Roaming"
427−msgstr ""
428−
429#: qml/Tutorial/TutorialBottom.qml:28
421#: qml/Tutorial/TutorialBottom.qml:28
430msgid "Open special menus"
422msgid "Open special menus"
431msgstr ""
423msgstr ""
po/sk.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2016-03-02 01:54+0000\n"
11"PO-Revision-Date: 2016-03-02 01:54+0000\n"
12"Last-Translator: P_E_T_O <Unknown>\n"
12"Last-Translator: P_E_T_O <Unknown>\n"
13"Language-Team: Slovak <sk@li.org>\n"
13"Language-Team: Slovak <sk@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n"
17"Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20"Language: sk\n"
20"Language: sk\n"
21
21
@@ -180,26 +180,26 @@ msgstr "Znova pripojiť!"
180msgid "Close all"
180msgid "Close all"
181msgstr "Zavrieť všetko"
181msgstr "Zavrieť všetko"
182
182
183−#: qml/Dash/DashPageHeader.qml:266
183+#: qml/Dash/DashPageHeader.qml:270
184msgctxt "Button: Open the Ubuntu Store"
184msgctxt "Button: Open the Ubuntu Store"
185msgid "Store"
185msgid "Store"
186msgstr "Obchod"
186msgstr "Obchod"
187
187
188−#: qml/Dash/DashPageHeader.qml:273
188+#: qml/Dash/DashPageHeader.qml:277
189msgctxt "Button: Start a search in the current dash scope"
189msgctxt "Button: Start a search in the current dash scope"
190msgid "Search"
190msgid "Search"
191msgstr "Hľadať"
191msgstr "Hľadať"
192
192
193−#: qml/Dash/DashPageHeader.qml:283
193+#: qml/Dash/DashPageHeader.qml:287
194msgctxt "Button: Show the current dash scope settings"
194msgctxt "Button: Show the current dash scope settings"
195msgid "Settings"
195msgid "Settings"
196msgstr "Nastavenia"
196msgstr "Nastavenia"
197
197
198−#: qml/Dash/DashPageHeader.qml:290
198+#: qml/Dash/DashPageHeader.qml:294
199msgid "Remove from Favorites"
199msgid "Remove from Favorites"
200msgstr "Odstrániť z obľúbených"
200msgstr "Odstrániť z obľúbených"
201
201
202−#: qml/Dash/DashPageHeader.qml:290
202+#: qml/Dash/DashPageHeader.qml:294
203msgid "Add to Favorites"
203msgid "Add to Favorites"
204msgstr "Pridať k obľúbeným"
204msgstr "Pridať k obľúbeným"
205
205
@@ -434,14 +434,6 @@ msgctxt "Button: Call back on phone"
434msgid "Call back"
434msgid "Call back"
435msgstr "Zavolať naspäť"
435msgstr "Zavolať naspäť"
436
436
437−#: qml/Panel/Indicators/ModemInfoItem.qml:105
438−msgid "Unlock SIM"
439−msgstr "Odomknúť SIM"
440−
441−#: qml/Panel/Indicators/RoamingIndication.qml:27
442−msgid "Roaming"
443−msgstr "Roaming"
444−
445#: qml/Tutorial/TutorialBottom.qml:28
437#: qml/Tutorial/TutorialBottom.qml:28
446msgid "Open special menus"
438msgid "Open special menus"
447msgstr "Otvoriť špeciálne menu"
439msgstr "Otvoriť špeciálne menu"
@@ -686,3 +678,9 @@ msgstr "〈 %1"
686#, qt-format
678#, qt-format
687msgid "%1 〉"
679msgid "%1 〉"
688msgstr "%1 〉"
680msgstr "%1 〉"
681+
682+#~ msgid "Unlock SIM"
683+#~ msgstr "Odomknúť SIM"
684+
685+#~ msgid "Roaming"
686+#~ msgstr "Roaming"
po/sl.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2016-01-31 18:34+0000\n"
11"PO-Revision-Date: 2016-01-31 18:34+0000\n"
12"Last-Translator: Bernard Banko <Unknown>\n"
12"Last-Translator: Bernard Banko <Unknown>\n"
13"Language-Team: Slovenian <sl@li.org>\n"
13"Language-Team: Slovenian <sl@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
17"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
18"n%100==4 ? 3 : 0);\n"
18"n%100==4 ? 3 : 0);\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
20"X-Generator: Launchpad (build 17936)\n"
20"X-Generator: Launchpad (build 17936)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -178,26 +178,26 @@ msgstr "Ponovno priključi sedaj!"
178msgid "Close all"
178msgid "Close all"
179msgstr "Zapri vse"
179msgstr "Zapri vse"
180
180
181−#: qml/Dash/DashPageHeader.qml:266
181+#: qml/Dash/DashPageHeader.qml:270
182msgctxt "Button: Open the Ubuntu Store"
182msgctxt "Button: Open the Ubuntu Store"
183msgid "Store"
183msgid "Store"
184msgstr "Trgovina"
184msgstr "Trgovina"
185
185
186−#: qml/Dash/DashPageHeader.qml:273
186+#: qml/Dash/DashPageHeader.qml:277
187msgctxt "Button: Start a search in the current dash scope"
187msgctxt "Button: Start a search in the current dash scope"
188msgid "Search"
188msgid "Search"
189msgstr "Iskanje"
189msgstr "Iskanje"
190
190
191−#: qml/Dash/DashPageHeader.qml:283
191+#: qml/Dash/DashPageHeader.qml:287
192msgctxt "Button: Show the current dash scope settings"
192msgctxt "Button: Show the current dash scope settings"
193msgid "Settings"
193msgid "Settings"
194msgstr "Nastavitve"
194msgstr "Nastavitve"
195
195
196−#: qml/Dash/DashPageHeader.qml:290
196+#: qml/Dash/DashPageHeader.qml:294
197msgid "Remove from Favorites"
197msgid "Remove from Favorites"
198msgstr "Odstrani iz priljubljenih"
198msgstr "Odstrani iz priljubljenih"
199
199
200−#: qml/Dash/DashPageHeader.qml:290
200+#: qml/Dash/DashPageHeader.qml:294
201msgid "Add to Favorites"
201msgid "Add to Favorites"
202msgstr "Dodaj med priljubljene"
202msgstr "Dodaj med priljubljene"
203
203
@@ -435,14 +435,6 @@ msgctxt "Button: Call back on phone"
435msgid "Call back"
435msgid "Call back"
436msgstr "Pokliči nazaj"
436msgstr "Pokliči nazaj"
437
437
438−#: qml/Panel/Indicators/ModemInfoItem.qml:105
439−msgid "Unlock SIM"
440−msgstr "Odkleni SIM"
441−
442−#: qml/Panel/Indicators/RoamingIndication.qml:27
443−msgid "Roaming"
444−msgstr "Gostovanje"
445−
446#: qml/Tutorial/TutorialBottom.qml:28
438#: qml/Tutorial/TutorialBottom.qml:28
447msgid "Open special menus"
439msgid "Open special menus"
448msgstr "Odpri posebne menije"
440msgstr "Odpri posebne menije"
@@ -759,6 +751,12 @@ msgstr "%1 〉"
759#~ msgid "All"
751#~ msgid "All"
760#~ msgstr "Vse"
752#~ msgstr "Vse"
761
753
754+#~ msgid "Unlock SIM"
755+#~ msgstr "Odkleni SIM"
756+
757+#~ msgid "Roaming"
758+#~ msgstr "Gostovanje"
759+
762#~ msgid "Favorites"
760#~ msgid "Favorites"
763#~ msgstr "Priljubljeni"
761#~ msgstr "Priljubljeni"
764
762
po/sq.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-11-30 21:05+0000\n"
11"PO-Revision-Date: 2015-11-30 21:05+0000\n"
12"Last-Translator: Indrit Bashkimi <indrit.bashkimi@gmail.com>\n"
12"Last-Translator: Indrit Bashkimi <indrit.bashkimi@gmail.com>\n"
13"Language-Team: Albanian <sq@li.org>\n"
13"Language-Team: Albanian <sq@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr "Rilidhu tani!"
171msgid "Close all"
171msgid "Close all"
172msgstr "Mbylli të gjitha"
172msgstr "Mbylli të gjitha"
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr "Ruaje"
177msgstr "Ruaje"
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr "Kërko"
182msgstr "Kërko"
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr "Parametrat"
187msgstr "Parametrat"
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr "Hiq nga të preferuarit"
191msgstr "Hiq nga të preferuarit"
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr "Shto në të preferuarit"
195msgstr "Shto në të preferuarit"
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr "Zhblloko SIM"
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr "Roaming"
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
@@ -682,11 +674,17 @@ msgstr "%1 〉"
682#~ msgid "Right edge"
674#~ msgid "Right edge"
683#~ msgstr "Cepi djathtas"
675#~ msgstr "Cepi djathtas"
684
676
677+#~ msgid "Unlock SIM"
678+#~ msgstr "Zhblloko SIM"
679+
685#~ msgid "Welcome to your Ubuntu phone."
680#~ msgid "Welcome to your Ubuntu phone."
686#~ msgstr "Mirëseerdhët në telefonin tuaj Ubuntu."
681#~ msgstr "Mirëseerdhët në telefonin tuaj Ubuntu."
687
682
688#~ msgid "Your phone is now ready to use."
683#~ msgid "Your phone is now ready to use."
689#~ msgstr "Telefoni juaj tani është gati për përdorim."
684#~ msgstr "Telefoni juaj tani është gati për përdorim."
690
685
686+#~ msgid "Roaming"
687+#~ msgstr "Roaming"
688+
691#~ msgid "Please select how you’d like to unlock your phone."
689#~ msgid "Please select how you’d like to unlock your phone."
692#~ msgstr "Zgjidhni mënyrën e zhbllokimit të telefonit."
690#~ msgstr "Zgjidhni mënyrën e zhbllokimit të telefonit."
po/sr.po+15−17
@@ -8,8 +8,8 @@ msgid ""
8msgstr ""
8msgstr ""
9"Project-Id-Version: unity\n"
9"Project-Id-Version: unity\n"
10"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
11−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
11+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
12−"PO-Revision-Date: 2016-02-10 21:21+0000\n"
12+"PO-Revision-Date: 2016-03-09 21:47+0000\n"
13"Last-Translator: Bojan Bogdanović <Unknown>\n"
13"Last-Translator: Bojan Bogdanović <Unknown>\n"
14"Language-Team: српски <xfce4@xfce4.org>\n"
14"Language-Team: српски <xfce4@xfce4.org>\n"
15"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
@@ -17,7 +17,7 @@ msgstr ""
17"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
19"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
20−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
20+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
21"X-Generator: Launchpad (build 17936)\n"
21"X-Generator: Launchpad (build 17936)\n"
22"Language: sr\n"
22"Language: sr\n"
23
23
@@ -178,26 +178,26 @@ msgstr "Поново се повежи!"
178msgid "Close all"
178msgid "Close all"
179msgstr "Затворите све"
179msgstr "Затворите све"
180
180
181−#: qml/Dash/DashPageHeader.qml:266
181+#: qml/Dash/DashPageHeader.qml:270
182msgctxt "Button: Open the Ubuntu Store"
182msgctxt "Button: Open the Ubuntu Store"
183msgid "Store"
183msgid "Store"
184msgstr "Продавница"
184msgstr "Продавница"
185
185
186−#: qml/Dash/DashPageHeader.qml:273
186+#: qml/Dash/DashPageHeader.qml:277
187msgctxt "Button: Start a search in the current dash scope"
187msgctxt "Button: Start a search in the current dash scope"
188msgid "Search"
188msgid "Search"
189msgstr "Тражи"
189msgstr "Тражи"
190
190
191−#: qml/Dash/DashPageHeader.qml:283
191+#: qml/Dash/DashPageHeader.qml:287
192msgctxt "Button: Show the current dash scope settings"
192msgctxt "Button: Show the current dash scope settings"
193msgid "Settings"
193msgid "Settings"
194msgstr "Подешавања"
194msgstr "Подешавања"
195
195
196−#: qml/Dash/DashPageHeader.qml:290
196+#: qml/Dash/DashPageHeader.qml:294
197msgid "Remove from Favorites"
197msgid "Remove from Favorites"
198msgstr "Уклони из омиљених"
198msgstr "Уклони из омиљених"
199
199
200−#: qml/Dash/DashPageHeader.qml:290
200+#: qml/Dash/DashPageHeader.qml:294
201msgid "Add to Favorites"
201msgid "Add to Favorites"
202msgstr "Додај у омиљене"
202msgstr "Додај у омиљене"
203
203
@@ -398,7 +398,7 @@ msgstr "Заказано…"
398
398
399#: qml/Panel/Indicators/MenuItemFactory.qml:906
399#: qml/Panel/Indicators/MenuItemFactory.qml:906
400msgid "Downloading"
400msgid "Downloading"
401−msgstr "Преузимам"
401+msgstr "Преузимање"
402
402
403#: qml/Panel/Indicators/MenuItemFactory.qml:908
403#: qml/Panel/Indicators/MenuItemFactory.qml:908
404msgid "Paused, tap to resume"
404msgid "Paused, tap to resume"
@@ -432,14 +432,6 @@ msgctxt "Button: Call back on phone"
432msgid "Call back"
432msgid "Call back"
433msgstr "Позови назад"
433msgstr "Позови назад"
434
434
435−#: qml/Panel/Indicators/ModemInfoItem.qml:105
436−msgid "Unlock SIM"
437−msgstr "Откључај СИМ картицу"
438−
439−#: qml/Panel/Indicators/RoamingIndication.qml:27
440−msgid "Roaming"
441−msgstr "Роминг"
442−
443#: qml/Tutorial/TutorialBottom.qml:28
435#: qml/Tutorial/TutorialBottom.qml:28
444msgid "Open special menus"
436msgid "Open special menus"
445msgstr "Отвори нарочите изборнике"
437msgstr "Отвори нарочите изборнике"
@@ -771,6 +763,12 @@ msgstr "%1 〉"
771#~ msgid "Done"
763#~ msgid "Done"
772#~ msgstr "Готово"
764#~ msgstr "Готово"
773
765
766+#~ msgid "Unlock SIM"
767+#~ msgstr "Откључај СИМ картицу"
768+
769+#~ msgid "Roaming"
770+#~ msgstr "Роминг"
771+
774#~ msgid "Restart"
772#~ msgid "Restart"
775#~ msgstr "Поново покрени"
773#~ msgstr "Поново покрени"
776
774
po/sv.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-07-12 22:17+0000\n"
11"PO-Revision-Date: 2015-07-12 22:17+0000\n"
12"Last-Translator: Josef Andersson <Unknown>\n"
12"Last-Translator: Josef Andersson <Unknown>\n"
13"Language-Team: Swedish\n"
13"Language-Team: Swedish\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20"Language: sv\n"
20"Language: sv\n"
21
21
@@ -175,26 +175,26 @@ msgstr "Återanslut nu!"
175msgid "Close all"
175msgid "Close all"
176msgstr "Stäng alla"
176msgstr "Stäng alla"
177
177
178−#: qml/Dash/DashPageHeader.qml:266
178+#: qml/Dash/DashPageHeader.qml:270
179msgctxt "Button: Open the Ubuntu Store"
179msgctxt "Button: Open the Ubuntu Store"
180msgid "Store"
180msgid "Store"
181msgstr "Förråd"
181msgstr "Förråd"
182
182
183−#: qml/Dash/DashPageHeader.qml:273
183+#: qml/Dash/DashPageHeader.qml:277
184msgctxt "Button: Start a search in the current dash scope"
184msgctxt "Button: Start a search in the current dash scope"
185msgid "Search"
185msgid "Search"
186msgstr "Sök"
186msgstr "Sök"
187
187
188−#: qml/Dash/DashPageHeader.qml:283
188+#: qml/Dash/DashPageHeader.qml:287
189msgctxt "Button: Show the current dash scope settings"
189msgctxt "Button: Show the current dash scope settings"
190msgid "Settings"
190msgid "Settings"
191msgstr "Inställningar"
191msgstr "Inställningar"
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Remove from Favorites"
194msgid "Remove from Favorites"
195msgstr "Ta bort från Favoriter"
195msgstr "Ta bort från Favoriter"
196
196
197−#: qml/Dash/DashPageHeader.qml:290
197+#: qml/Dash/DashPageHeader.qml:294
198msgid "Add to Favorites"
198msgid "Add to Favorites"
199msgstr "Lägg till Favoriter"
199msgstr "Lägg till Favoriter"
200
200
@@ -426,14 +426,6 @@ msgctxt "Button: Call back on phone"
426msgid "Call back"
426msgid "Call back"
427msgstr "Ring upp"
427msgstr "Ring upp"
428
428
429−#: qml/Panel/Indicators/ModemInfoItem.qml:105
430−msgid "Unlock SIM"
431−msgstr "Lås upp SIM-kort"
432−
433−#: qml/Panel/Indicators/RoamingIndication.qml:27
434−msgid "Roaming"
435−msgstr "Roaming"
436−
437#: qml/Tutorial/TutorialBottom.qml:28
429#: qml/Tutorial/TutorialBottom.qml:28
438msgid "Open special menus"
430msgid "Open special menus"
439msgstr "Öppna specialmenyer"
431msgstr "Öppna specialmenyer"
@@ -736,6 +728,12 @@ msgstr "%1 〉"
736#~ msgid "Speaking..."
728#~ msgid "Speaking..."
737#~ msgstr "Talar…"
729#~ msgstr "Talar…"
738
730
731+#~ msgid "Unlock SIM"
732+#~ msgstr "Lås upp SIM-kort"
733+
734+#~ msgid "Roaming"
735+#~ msgstr "Roaming"
736+
739#~ msgid "Favorites"
737#~ msgid "Favorites"
740#~ msgstr "Favoriter"
738#~ msgstr "Favoriter"
741
739
po/sw.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-07-17 20:02+0000\n"
11"PO-Revision-Date: 2015-07-17 20:02+0000\n"
12"Last-Translator: Valentine <mwangi_valentino@yahoo.com>\n"
12"Last-Translator: Valentine <mwangi_valentino@yahoo.com>\n"
13"Language-Team: Swahili <sw@li.org>\n"
13"Language-Team: Swahili <sw@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -173,26 +173,26 @@ msgstr ""
173msgid "Close all"
173msgid "Close all"
174msgstr ""
174msgstr ""
175
175
176−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
177msgctxt "Button: Open the Ubuntu Store"
177msgctxt "Button: Open the Ubuntu Store"
178msgid "Store"
178msgid "Store"
179msgstr "Duka"
179msgstr "Duka"
180
180
181−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
182msgctxt "Button: Start a search in the current dash scope"
182msgctxt "Button: Start a search in the current dash scope"
183msgid "Search"
183msgid "Search"
184msgstr "Tafuta"
184msgstr "Tafuta"
185
185
186−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
187msgctxt "Button: Show the current dash scope settings"
187msgctxt "Button: Show the current dash scope settings"
188msgid "Settings"
188msgid "Settings"
189msgstr "Mipangilio"
189msgstr "Mipangilio"
190
190
191−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
192msgid "Remove from Favorites"
192msgid "Remove from Favorites"
193msgstr "Toa kutoka nilizopenda"
193msgstr "Toa kutoka nilizopenda"
194
194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196msgid "Add to Favorites"
196msgid "Add to Favorites"
197msgstr "Ongeza kwenye nilizopenda"
197msgstr "Ongeza kwenye nilizopenda"
198
198
@@ -422,14 +422,6 @@ msgctxt "Button: Call back on phone"
422msgid "Call back"
422msgid "Call back"
423msgstr ""
423msgstr ""
424
424
425−#: qml/Panel/Indicators/ModemInfoItem.qml:105
426−msgid "Unlock SIM"
427−msgstr "Fungua SIM"
428−
429−#: qml/Panel/Indicators/RoamingIndication.qml:27
430−msgid "Roaming"
431−msgstr "Uzururaji"
432−
433#: qml/Tutorial/TutorialBottom.qml:28
425#: qml/Tutorial/TutorialBottom.qml:28
434msgid "Open special menus"
426msgid "Open special menus"
435msgstr "Fungua orodha maalum"
427msgstr "Fungua orodha maalum"
@@ -711,6 +703,12 @@ msgstr ""
711#~ msgid "Please re-enter"
703#~ msgid "Please re-enter"
712#~ msgstr "Tafadhali bonyeza tena"
704#~ msgstr "Tafadhali bonyeza tena"
713
705
706+#~ msgid "Unlock SIM"
707+#~ msgstr "Fungua SIM"
708+
709+#~ msgid "Roaming"
710+#~ msgstr "Uzururaji"
711+
714#~ msgid "Please select how you’d like to unlock your phone."
712#~ msgid "Please select how you’d like to unlock your phone."
715#~ msgstr "Tafadhali chagua vile ungependa kufunga simu."
713#~ msgstr "Tafadhali chagua vile ungependa kufunga simu."
716
714
po/ta.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2013-10-24 11:36+0000\n"
11"PO-Revision-Date: 2013-10-24 11:36+0000\n"
12"Last-Translator: Arun Kumar - அருண் குமார் <thangam.arunx@gmail.com>\n"
12"Last-Translator: Arun Kumar - அருண் குமார் <thangam.arunx@gmail.com>\n"
13"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\n"
13"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20"Language: ta\n"
20"Language: ta\n"
21
21
@@ -172,26 +172,26 @@ msgstr ""
172msgid "Close all"
172msgid "Close all"
173msgstr ""
173msgstr ""
174
174
175−#: qml/Dash/DashPageHeader.qml:266
175+#: qml/Dash/DashPageHeader.qml:270
176msgctxt "Button: Open the Ubuntu Store"
176msgctxt "Button: Open the Ubuntu Store"
177msgid "Store"
177msgid "Store"
178msgstr ""
178msgstr ""
179
179
180−#: qml/Dash/DashPageHeader.qml:273
180+#: qml/Dash/DashPageHeader.qml:277
181msgctxt "Button: Start a search in the current dash scope"
181msgctxt "Button: Start a search in the current dash scope"
182msgid "Search"
182msgid "Search"
183msgstr ""
183msgstr ""
184
184
185−#: qml/Dash/DashPageHeader.qml:283
185+#: qml/Dash/DashPageHeader.qml:287
186msgctxt "Button: Show the current dash scope settings"
186msgctxt "Button: Show the current dash scope settings"
187msgid "Settings"
187msgid "Settings"
188msgstr ""
188msgstr ""
189
189
190−#: qml/Dash/DashPageHeader.qml:290
190+#: qml/Dash/DashPageHeader.qml:294
191msgid "Remove from Favorites"
191msgid "Remove from Favorites"
192msgstr ""
192msgstr ""
193
193
194−#: qml/Dash/DashPageHeader.qml:290
194+#: qml/Dash/DashPageHeader.qml:294
195msgid "Add to Favorites"
195msgid "Add to Favorites"
196msgstr ""
196msgstr ""
197
197
@@ -417,14 +417,6 @@ msgctxt "Button: Call back on phone"
417msgid "Call back"
417msgid "Call back"
418msgstr ""
418msgstr ""
419
419
420−#: qml/Panel/Indicators/ModemInfoItem.qml:105
421−msgid "Unlock SIM"
422−msgstr ""
423−
424−#: qml/Panel/Indicators/RoamingIndication.qml:27
425−msgid "Roaming"
426−msgstr ""
427−
428#: qml/Tutorial/TutorialBottom.qml:28
420#: qml/Tutorial/TutorialBottom.qml:28
429msgid "Open special menus"
421msgid "Open special menus"
430msgstr ""
422msgstr ""
po/te.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2014-07-19 10:04+0000\n"
11"PO-Revision-Date: 2014-07-19 10:04+0000\n"
12"Last-Translator: Praveen Illa <mail2ipn@gmail.com>\n"
12"Last-Translator: Praveen Illa <mail2ipn@gmail.com>\n"
13"Language-Team: Telugu <te@li.org>\n"
13"Language-Team: Telugu <te@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr ""
177msgstr ""
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr ""
182msgstr ""
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr ""
187msgstr ""
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr ""
195msgstr ""
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr ""
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
po/th.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2014-10-02 04:55+0000\n"
11"PO-Revision-Date: 2014-10-02 04:55+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Thai <th@li.org>\n"
13"Language-Team: Thai <th@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr ""
177msgstr ""
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr ""
182msgstr ""
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr ""
187msgstr ""
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr ""
195msgstr ""
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr ""
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
po/tr.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-03-22 15:56+0000\n"
11"PO-Revision-Date: 2015-03-22 15:56+0000\n"
12"Last-Translator: Arda Ünlü <aarda.uunlu@gmail.com>\n"
12"Last-Translator: Arda Ünlü <aarda.uunlu@gmail.com>\n"
13"Language-Team: Turkish <tr@li.org>\n"
13"Language-Team: Turkish <tr@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr "Mağaza"
177msgstr "Mağaza"
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr "Ara"
182msgstr "Ara"
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr "Ayarlar"
187msgstr "Ayarlar"
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr "Sık kullanılanlardan kaldır"
191msgstr "Sık kullanılanlardan kaldır"
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr "Yer İmlerine Ekle"
195msgstr "Yer İmlerine Ekle"
196
196
@@ -420,14 +420,6 @@ msgctxt "Button: Call back on phone"
420msgid "Call back"
420msgid "Call back"
421msgstr ""
421msgstr ""
422
422
423−#: qml/Panel/Indicators/ModemInfoItem.qml:105
424−msgid "Unlock SIM"
425−msgstr "SIM kilidini aç"
426−
427−#: qml/Panel/Indicators/RoamingIndication.qml:27
428−msgid "Roaming"
429−msgstr "Dolaşım"
430−
431#: qml/Tutorial/TutorialBottom.qml:28
423#: qml/Tutorial/TutorialBottom.qml:28
432msgid "Open special menus"
424msgid "Open special menus"
433msgstr "Özel menüleri aç"
425msgstr "Özel menüleri aç"
@@ -739,6 +731,9 @@ msgstr "%1 〉"
739#~ msgid "Store"
731#~ msgid "Store"
740#~ msgstr "Mağaza"
732#~ msgstr "Mağaza"
741
733
734+#~ msgid "Unlock SIM"
735+#~ msgstr "SIM kilidini aç"
736+
742#~ msgid "Reboot"
737#~ msgid "Reboot"
743#~ msgstr "Yeniden başlat"
738#~ msgstr "Yeniden başlat"
744
739
@@ -760,6 +755,9 @@ msgstr "%1 〉"
760#~ msgid "Restart"
755#~ msgid "Restart"
761#~ msgstr "Yeniden başlat"
756#~ msgstr "Yeniden başlat"
762
757
758+#~ msgid "Roaming"
759+#~ msgstr "Dolaşım"
760+
763#~ msgid "Please re-enter"
761#~ msgid "Please re-enter"
764#~ msgstr "Lütfen yeniden girin"
762#~ msgstr "Lütfen yeniden girin"
765
763
po/ug.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-12-01 07:37+0000\n"
11"PO-Revision-Date: 2015-12-01 07:37+0000\n"
12"Last-Translator: Eltikin <eltikinuyghur@hotmail.com>\n"
12"Last-Translator: Eltikin <eltikinuyghur@hotmail.com>\n"
13"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
13"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -172,26 +172,26 @@ msgstr ""
172msgid "Close all"
172msgid "Close all"
173msgstr ""
173msgstr ""
174
174
175−#: qml/Dash/DashPageHeader.qml:266
175+#: qml/Dash/DashPageHeader.qml:270
176msgctxt "Button: Open the Ubuntu Store"
176msgctxt "Button: Open the Ubuntu Store"
177msgid "Store"
177msgid "Store"
178msgstr "ساقلا"
178msgstr "ساقلا"
179
179
180−#: qml/Dash/DashPageHeader.qml:273
180+#: qml/Dash/DashPageHeader.qml:277
181msgctxt "Button: Start a search in the current dash scope"
181msgctxt "Button: Start a search in the current dash scope"
182msgid "Search"
182msgid "Search"
183msgstr "ئىزدە"
183msgstr "ئىزدە"
184
184
185−#: qml/Dash/DashPageHeader.qml:283
185+#: qml/Dash/DashPageHeader.qml:287
186msgctxt "Button: Show the current dash scope settings"
186msgctxt "Button: Show the current dash scope settings"
187msgid "Settings"
187msgid "Settings"
188msgstr "تەڭشەك"
188msgstr "تەڭشەك"
189
189
190−#: qml/Dash/DashPageHeader.qml:290
190+#: qml/Dash/DashPageHeader.qml:294
191msgid "Remove from Favorites"
191msgid "Remove from Favorites"
192msgstr "يىغقۇچتىن چىقىرىۋەت"
192msgstr "يىغقۇچتىن چىقىرىۋەت"
193
193
194−#: qml/Dash/DashPageHeader.qml:290
194+#: qml/Dash/DashPageHeader.qml:294
195msgid "Add to Favorites"
195msgid "Add to Favorites"
196msgstr "يىغقۇچقا قوش"
196msgstr "يىغقۇچقا قوش"
197
197
@@ -418,14 +418,6 @@ msgctxt "Button: Call back on phone"
418msgid "Call back"
418msgid "Call back"
419msgstr "تىلفۇن ئۇرلىۋاتىدۇ"
419msgstr "تىلفۇن ئۇرلىۋاتىدۇ"
420
420
421−#: qml/Panel/Indicators/ModemInfoItem.qml:105
422−msgid "Unlock SIM"
423−msgstr "SIM نى قۇلۇپسىزلاش"
424−
425−#: qml/Panel/Indicators/RoamingIndication.qml:27
426−msgid "Roaming"
427−msgstr "كەزمە"
428−
429#: qml/Tutorial/TutorialBottom.qml:28
421#: qml/Tutorial/TutorialBottom.qml:28
430msgid "Open special menus"
422msgid "Open special menus"
431msgstr "تىزملىكنى ئاچ"
423msgstr "تىزملىكنى ئاچ"
@@ -756,6 +748,12 @@ msgstr "%1 〉"
756#~ msgid "All"
748#~ msgid "All"
757#~ msgstr "ھەممىسى"
749#~ msgstr "ھەممىسى"
758
750
751+#~ msgid "Unlock SIM"
752+#~ msgstr "SIM نى قۇلۇپسىزلاش"
753+
754+#~ msgid "Roaming"
755+#~ msgstr "كەزمە"
756+
759#~ msgid "Restart"
757#~ msgid "Restart"
760#~ msgstr "قايتا قوزغات"
758#~ msgstr "قايتا قوزغات"
761
759
po/uk.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-07-04 05:53+0000\n"
11"PO-Revision-Date: 2015-07-04 05:53+0000\n"
12"Last-Translator: Yuri Chornoivan <yurchor@gmail.com>\n"
12"Last-Translator: Yuri Chornoivan <yurchor@gmail.com>\n"
13"Language-Team: Ukrainian <uk@li.org>\n"
13"Language-Team: Ukrainian <uk@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
20"X-Generator: Launchpad (build 17936)\n"
20"X-Generator: Launchpad (build 17936)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -180,26 +180,26 @@ msgstr "Перепід’єднатися зараз!"
180msgid "Close all"
180msgid "Close all"
181msgstr "Закрити усе"
181msgstr "Закрити усе"
182
182
183−#: qml/Dash/DashPageHeader.qml:266
183+#: qml/Dash/DashPageHeader.qml:270
184msgctxt "Button: Open the Ubuntu Store"
184msgctxt "Button: Open the Ubuntu Store"
185msgid "Store"
185msgid "Store"
186msgstr "Крамниця"
186msgstr "Крамниця"
187
187
188−#: qml/Dash/DashPageHeader.qml:273
188+#: qml/Dash/DashPageHeader.qml:277
189msgctxt "Button: Start a search in the current dash scope"
189msgctxt "Button: Start a search in the current dash scope"
190msgid "Search"
190msgid "Search"
191msgstr "Пошук"
191msgstr "Пошук"
192
192
193−#: qml/Dash/DashPageHeader.qml:283
193+#: qml/Dash/DashPageHeader.qml:287
194msgctxt "Button: Show the current dash scope settings"
194msgctxt "Button: Show the current dash scope settings"
195msgid "Settings"
195msgid "Settings"
196msgstr "Параметри"
196msgstr "Параметри"
197
197
198−#: qml/Dash/DashPageHeader.qml:290
198+#: qml/Dash/DashPageHeader.qml:294
199msgid "Remove from Favorites"
199msgid "Remove from Favorites"
200msgstr "Вилучити з вибраного"
200msgstr "Вилучити з вибраного"
201
201
202−#: qml/Dash/DashPageHeader.qml:290
202+#: qml/Dash/DashPageHeader.qml:294
203msgid "Add to Favorites"
203msgid "Add to Favorites"
204msgstr "Додати до вибраного"
204msgstr "Додати до вибраного"
205
205
@@ -434,14 +434,6 @@ msgctxt "Button: Call back on phone"
434msgid "Call back"
434msgid "Call back"
435msgstr "Зворотний виклик"
435msgstr "Зворотний виклик"
436
436
437−#: qml/Panel/Indicators/ModemInfoItem.qml:105
438−msgid "Unlock SIM"
439−msgstr "Розблокувати SIM"
440−
441−#: qml/Panel/Indicators/RoamingIndication.qml:27
442−msgid "Roaming"
443−msgstr "Роумінг"
444−
445#: qml/Tutorial/TutorialBottom.qml:28
437#: qml/Tutorial/TutorialBottom.qml:28
446msgid "Open special menus"
438msgid "Open special menus"
447msgstr "Відкрити спеціальні меню"
439msgstr "Відкрити спеціальні меню"
@@ -751,6 +743,9 @@ msgstr "%1 〉"
751#~ msgid "All"
743#~ msgid "All"
752#~ msgstr "Все"
744#~ msgstr "Все"
753
745
746+#~ msgid "Unlock SIM"
747+#~ msgstr "Розблокувати SIM"
748+
754#~ msgid "Favorites"
749#~ msgid "Favorites"
755#~ msgstr "Улюблене"
750#~ msgstr "Улюблене"
756
751
@@ -763,6 +758,9 @@ msgstr "%1 〉"
763#~ msgid "Done"
758#~ msgid "Done"
764#~ msgstr "Виконано"
759#~ msgstr "Виконано"
765
760
761+#~ msgid "Roaming"
762+#~ msgstr "Роумінг"
763+
766#~ msgid "Log out"
764#~ msgid "Log out"
767#~ msgstr "Вийти"
765#~ msgstr "Вийти"
768
766
po/unity8.pot+34−40
@@ -8,7 +8,7 @@ msgid ""
8msgstr ""
8msgstr ""
9"Project-Id-Version: unity8\n"
9"Project-Id-Version: unity8\n"
10"Report-Msgid-Bugs-To: \n"
10"Report-Msgid-Bugs-To: \n"
11−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
11+"POT-Creation-Date: 2016-03-10 22:48+0000\n"
12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14"Language-Team: LANGUAGE <LL@li.org>\n"
14"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -22,16 +22,16 @@ msgstr ""
22msgid "Password: "
22msgid "Password: "
23msgstr ""
23msgstr ""
24
24
25−#: plugins/Unity/Launcher/launcheritem.cpp:47
25+#: plugins/Unity/Launcher/launcheritem.cpp:48
26−#: plugins/Unity/Launcher/launcheritem.cpp:106
26+#: plugins/Unity/Launcher/launcheritem.cpp:107
27msgid "Pin shortcut"
27msgid "Pin shortcut"
28msgstr ""
28msgstr ""
29
29
30−#: plugins/Unity/Launcher/launcheritem.cpp:52
30+#: plugins/Unity/Launcher/launcheritem.cpp:53
31msgid "Quit"
31msgid "Quit"
32msgstr ""
32msgstr ""
33
33
34−#: plugins/Unity/Launcher/launcheritem.cpp:106
34+#: plugins/Unity/Launcher/launcheritem.cpp:107
35msgid "Unpin shortcut"
35msgid "Unpin shortcut"
36msgstr ""
36msgstr ""
37
37
@@ -135,15 +135,15 @@ msgctxt "Button: Restart the system"
135msgid "Restart"
135msgid "Restart"
136msgstr ""
136msgstr ""
137
137
138−#: qml/Components/Lockscreen.qml:245
138+#: qml/Components/Lockscreen.qml:231
139msgid "Return to Call"
139msgid "Return to Call"
140msgstr ""
140msgstr ""
141
141
142−#: qml/Components/Lockscreen.qml:245
142+#: qml/Components/Lockscreen.qml:231
143msgid "Emergency Call"
143msgid "Emergency Call"
144msgstr ""
144msgstr ""
145
145
146−#: qml/Components/Lockscreen.qml:277
146+#: qml/Components/Lockscreen.qml:263
147msgid "OK"
147msgid "OK"
148msgstr ""
148msgstr ""
149
149
@@ -152,6 +152,8 @@ msgid "Apps may have unsaved data:"
152msgstr ""
152msgstr ""
153
153
154#: qml/Components/ModeSwitchWarningDialog.qml:57
154#: qml/Components/ModeSwitchWarningDialog.qml:57
155+msgctxt ""
156+"Re-dock means connect the device again to an external screen/mouse/keyboard"
155msgid "Re-dock, save your work and close these apps to continue."
157msgid "Re-dock, save your work and close these apps to continue."
156msgstr ""
158msgstr ""
157
159
@@ -171,38 +173,38 @@ msgstr ""
171msgid "Close all"
173msgid "Close all"
172msgstr ""
174msgstr ""
173
175
174−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
177msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
178msgid "Store"
177msgstr ""
179msgstr ""
178
180
179−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
182msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
183msgid "Search"
182msgstr ""
184msgstr ""
183
185
184−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
187msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
188msgid "Settings"
187msgstr ""
189msgstr ""
188
190
189−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
192msgid "Remove from Favorites"
191msgstr ""
193msgstr ""
192
194
193−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
196msgid "Add to Favorites"
195msgstr ""
197msgstr ""
196
198
197−#: qml/Dash/GenericScopeView.qml:565 qml/Dash/GenericScopeView.qml:723
199+#: qml/Dash/GenericScopeView.qml:567 qml/Dash/GenericScopeView.qml:725
198msgid "See less"
200msgid "See less"
199msgstr ""
201msgstr ""
200
202
201−#: qml/Dash/GenericScopeView.qml:565
203+#: qml/Dash/GenericScopeView.qml:567
202msgid "See all"
204msgid "See all"
203msgstr ""
205msgstr ""
204
206
205−#: qml/Dash/GenericScopeView.qml:627
207+#: qml/Dash/GenericScopeView.qml:629
206msgctxt "Label: Hint for dash search line edit"
208msgctxt "Label: Hint for dash search line edit"
207msgid "Search"
209msgid "Search"
208msgstr ""
210msgstr ""
@@ -228,7 +230,7 @@ msgstr ""
228msgid "Add a review"
230msgid "Add a review"
229msgstr ""
231msgstr ""
230
232
231−#: qml/Dash/Previews/PreviewSharing.qml:50
233+#: qml/Dash/Previews/PreviewSharing.qml:66
232msgid "Preview Share Item"
234msgid "Preview Share Item"
233msgstr ""
235msgstr ""
234
236
@@ -256,13 +258,13 @@ msgstr ""
256msgid "Also installed"
258msgid "Also installed"
257msgstr ""
259msgstr ""
258
260
259−#: qml/DisabledScreenNotice.qml:87
261+#: qml/DisabledScreenNotice.qml:104
260msgid ""
262msgid ""
261"Your device is now connected to an external display. Use this screen as a "
263"Your device is now connected to an external display. Use this screen as a "
262−"touch pad to interact with the mouse."
264+"touch pad to interact with the pointer."
263msgstr ""
265msgstr ""
264
266
265−#: qml/Greeter/CoverPage.qml:107
267+#: qml/Greeter/CoverPage.qml:118
266msgid "Unlock"
268msgid "Unlock"
267msgstr ""
269msgstr ""
268
270
@@ -341,62 +343,62 @@ msgstr ""
341msgid "Conference"
343msgid "Conference"
342msgstr ""
344msgstr ""
343
345
344−#: qml/Panel/Indicators/MenuItemFactory.qml:753
346+#: qml/Panel/Indicators/MenuItemFactory.qml:752
345msgid "Nothing is playing"
347msgid "Nothing is playing"
346msgstr ""
348msgstr ""
347
349
348−#: qml/Panel/Indicators/MenuItemFactory.qml:882
350+#: qml/Panel/Indicators/MenuItemFactory.qml:881
349#, qt-format
351#, qt-format
350msgid "%1 hour"
352msgid "%1 hour"
351msgid_plural "%1 hours"
353msgid_plural "%1 hours"
352msgstr[0] ""
354msgstr[0] ""
353msgstr[1] ""
355msgstr[1] ""
354
356
355−#: qml/Panel/Indicators/MenuItemFactory.qml:886
357+#: qml/Panel/Indicators/MenuItemFactory.qml:885
356#, qt-format
358#, qt-format
357msgid "%1 minute"
359msgid "%1 minute"
358msgid_plural "%1 minutes"
360msgid_plural "%1 minutes"
359msgstr[0] ""
361msgstr[0] ""
360msgstr[1] ""
362msgstr[1] ""
361
363
362−#: qml/Panel/Indicators/MenuItemFactory.qml:891
364+#: qml/Panel/Indicators/MenuItemFactory.qml:890
363#, qt-format
365#, qt-format
364msgid "%1 second"
366msgid "%1 second"
365msgid_plural "%1 seconds"
367msgid_plural "%1 seconds"
366msgstr[0] ""
368msgstr[0] ""
367msgstr[1] ""
369msgstr[1] ""
368
370
369−#: qml/Panel/Indicators/MenuItemFactory.qml:894
371+#: qml/Panel/Indicators/MenuItemFactory.qml:893
370msgid "0 seconds"
372msgid "0 seconds"
371msgstr ""
373msgstr ""
372
374
373#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
375#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
374−#: qml/Panel/Indicators/MenuItemFactory.qml:896
376+#: qml/Panel/Indicators/MenuItemFactory.qml:895
375#, qt-format
377#, qt-format
376msgid "%1 remaining"
378msgid "%1 remaining"
377msgstr ""
379msgstr ""
378
380
379−#: qml/Panel/Indicators/MenuItemFactory.qml:902
381+#: qml/Panel/Indicators/MenuItemFactory.qml:901
380msgid "In queue…"
382msgid "In queue…"
381msgstr ""
383msgstr ""
382
384
383−#: qml/Panel/Indicators/MenuItemFactory.qml:906
385+#: qml/Panel/Indicators/MenuItemFactory.qml:905
384msgid "Downloading"
386msgid "Downloading"
385msgstr ""
387msgstr ""
386
388
387−#: qml/Panel/Indicators/MenuItemFactory.qml:908
389+#: qml/Panel/Indicators/MenuItemFactory.qml:907
388msgid "Paused, tap to resume"
390msgid "Paused, tap to resume"
389msgstr ""
391msgstr ""
390
392
391−#: qml/Panel/Indicators/MenuItemFactory.qml:910
393+#: qml/Panel/Indicators/MenuItemFactory.qml:909
392msgid "Canceled"
394msgid "Canceled"
393msgstr ""
395msgstr ""
394
396
395−#: qml/Panel/Indicators/MenuItemFactory.qml:912
397+#: qml/Panel/Indicators/MenuItemFactory.qml:911
396msgid "Finished"
398msgid "Finished"
397msgstr ""
399msgstr ""
398
400
399−#: qml/Panel/Indicators/MenuItemFactory.qml:914
401+#: qml/Panel/Indicators/MenuItemFactory.qml:913
400msgid "Failed, tap to retry"
402msgid "Failed, tap to retry"
401msgstr ""
403msgstr ""
402
404
@@ -416,14 +418,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
418msgid "Call back"
417msgstr ""
419msgstr ""
418
420
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr ""
426−
427#: qml/Tutorial/TutorialBottom.qml:28
421#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
422msgid "Open special menus"
429msgstr ""
423msgstr ""
po/ur.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-05-05 03:12+0000\n"
11"PO-Revision-Date: 2015-05-05 03:12+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Urdu <ur@li.org>\n"
13"Language-Team: Urdu <ur@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr ""
177msgstr ""
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr ""
182msgstr ""
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr ""
187msgstr ""
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr ""
195msgstr ""
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr ""
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
po/uz.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-07-04 16:03+0000\n"
11"PO-Revision-Date: 2015-07-04 16:03+0000\n"
12"Last-Translator: Learner <muzaffar.habibullayev@yandex.ru>\n"
12"Last-Translator: Learner <muzaffar.habibullayev@yandex.ru>\n"
13"Language-Team: Uzbek <uz@li.org>\n"
13"Language-Team: Uzbek <uz@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr ""
177msgstr ""
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr ""
182msgstr ""
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr ""
187msgstr ""
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr ""
195msgstr ""
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr ""
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
po/vi.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2014-01-15 01:19+0000\n"
11"PO-Revision-Date: 2014-01-15 01:19+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Vietnamese <vi@li.org>\n"
13"Language-Team: Vietnamese <vi@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr ""
177msgstr ""
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr ""
182msgstr ""
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr ""
187msgstr ""
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr ""
195msgstr ""
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr ""
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
po/wo.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-10-29 11:16+0000\n"
11"PO-Revision-Date: 2015-10-29 11:16+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Wolof <wo@li.org>\n"
13"Language-Team: Wolof <wo@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr "Ja"
177msgstr "Ja"
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr "Seet"
182msgstr "Seet"
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr "Jekkal"
187msgstr "Jekkal"
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr "Dindee ci Tànneef yi"
191msgstr "Dindee ci Tànneef yi"
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr "Yokk ci Tànneef yi"
195msgstr "Yokk ci Tànneef yi"
196
196
@@ -420,14 +420,6 @@ msgctxt "Button: Call back on phone"
420msgid "Call back"
420msgid "Call back"
421msgstr ""
421msgstr ""
422
422
423−#: qml/Panel/Indicators/ModemInfoItem.qml:105
424−msgid "Unlock SIM"
425−msgstr "Tijji SIM"
426−
427−#: qml/Panel/Indicators/RoamingIndication.qml:27
428−msgid "Roaming"
429−msgstr "Roaming"
430−
431#: qml/Tutorial/TutorialBottom.qml:28
423#: qml/Tutorial/TutorialBottom.qml:28
432msgid "Open special menus"
424msgid "Open special menus"
433msgstr "Open njëli jagleel"
425msgstr "Open njëli jagleel"
@@ -755,6 +747,12 @@ msgstr "%1 〉"
755#~ msgid "Confirm"
747#~ msgid "Confirm"
756#~ msgstr "Dëggal"
748#~ msgstr "Dëggal"
757
749
750+#~ msgid "Unlock SIM"
751+#~ msgstr "Tijji SIM"
752+
753+#~ msgid "Roaming"
754+#~ msgstr "Roaming"
755+
758#~ msgid "Please re-enter"
756#~ msgid "Please re-enter"
759#~ msgstr "Di la ñaan nga duggalaat"
757#~ msgstr "Di la ñaan nga duggalaat"
760
758
po/xh.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2013-09-28 13:20+0000\n"
11"PO-Revision-Date: 2013-09-28 13:20+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Xhosa <xh@li.org>\n"
13"Language-Team: Xhosa <xh@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr ""
177msgstr ""
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr ""
182msgstr ""
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr ""
187msgstr ""
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr ""
195msgstr ""
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr ""
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
po/zh_CN.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2015-07-27 10:26+0000\n"
11"PO-Revision-Date: 2015-07-27 10:26+0000\n"
12"Last-Translator: Ian Li <Unknown>\n"
12"Last-Translator: Ian Li <Unknown>\n"
13"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
13"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -172,26 +172,26 @@ msgstr "即刻重新连接!"
172msgid "Close all"
172msgid "Close all"
173msgstr "关闭所有"
173msgstr "关闭所有"
174
174
175−#: qml/Dash/DashPageHeader.qml:266
175+#: qml/Dash/DashPageHeader.qml:270
176msgctxt "Button: Open the Ubuntu Store"
176msgctxt "Button: Open the Ubuntu Store"
177msgid "Store"
177msgid "Store"
178msgstr "商店"
178msgstr "商店"
179
179
180−#: qml/Dash/DashPageHeader.qml:273
180+#: qml/Dash/DashPageHeader.qml:277
181msgctxt "Button: Start a search in the current dash scope"
181msgctxt "Button: Start a search in the current dash scope"
182msgid "Search"
182msgid "Search"
183msgstr "搜索"
183msgstr "搜索"
184
184
185−#: qml/Dash/DashPageHeader.qml:283
185+#: qml/Dash/DashPageHeader.qml:287
186msgctxt "Button: Show the current dash scope settings"
186msgctxt "Button: Show the current dash scope settings"
187msgid "Settings"
187msgid "Settings"
188msgstr "设置"
188msgstr "设置"
189
189
190−#: qml/Dash/DashPageHeader.qml:290
190+#: qml/Dash/DashPageHeader.qml:294
191msgid "Remove from Favorites"
191msgid "Remove from Favorites"
192msgstr "从收藏夹中移除"
192msgstr "从收藏夹中移除"
193
193
194−#: qml/Dash/DashPageHeader.qml:290
194+#: qml/Dash/DashPageHeader.qml:294
195msgid "Add to Favorites"
195msgid "Add to Favorites"
196msgstr "添加到收藏夹"
196msgstr "添加到收藏夹"
197
197
@@ -414,14 +414,6 @@ msgctxt "Button: Call back on phone"
414msgid "Call back"
414msgid "Call back"
415msgstr "回电"
415msgstr "回电"
416
416
417−#: qml/Panel/Indicators/ModemInfoItem.qml:105
418−msgid "Unlock SIM"
419−msgstr "解开 SIM"
420−
421−#: qml/Panel/Indicators/RoamingIndication.qml:27
422−msgid "Roaming"
423−msgstr "漫游"
424−
425#: qml/Tutorial/TutorialBottom.qml:28
417#: qml/Tutorial/TutorialBottom.qml:28
426msgid "Open special menus"
418msgid "Open special menus"
427msgstr "打开专题菜单"
419msgstr "打开专题菜单"
@@ -717,6 +709,9 @@ msgstr "%1 〉"
717#~ msgid "All"
709#~ msgid "All"
718#~ msgstr "所有"
710#~ msgstr "所有"
719
711
712+#~ msgid "Unlock SIM"
713+#~ msgstr "解开 SIM"
714+
720#~ msgid "Favorites"
715#~ msgid "Favorites"
721#~ msgstr "收藏夹"
716#~ msgstr "收藏夹"
722
717
@@ -729,6 +724,9 @@ msgstr "%1 〉"
729#~ msgid "Done"
724#~ msgid "Done"
730#~ msgstr "完成"
725#~ msgstr "完成"
731
726
727+#~ msgid "Roaming"
728+#~ msgstr "漫游"
729+
732#~ msgid "Please re-enter"
730#~ msgid "Please re-enter"
733#~ msgstr "请重新输入"
731#~ msgstr "请重新输入"
734
732
po/zh_HK.po+7−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2014-08-10 11:45+0000\n"
11"PO-Revision-Date: 2014-08-10 11:45+0000\n"
12"Last-Translator: Daniel Cheung <daniel.2345@hotmail.com>\n"
12"Last-Translator: Daniel Cheung <daniel.2345@hotmail.com>\n"
13"Language-Team: Chinese (Hong Kong) <zh_HK@li.org>\n"
13"Language-Team: Chinese (Hong Kong) <zh_HK@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171msgid "Close all"
171msgid "Close all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr ""
177msgstr ""
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr ""
182msgstr ""
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr ""
187msgstr ""
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr ""
195msgstr ""
196
196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416msgid "Call back"
416msgid "Call back"
417msgstr ""
417msgstr ""
418
418
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421−msgstr ""
422−
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425−msgstr ""
426−
427#: qml/Tutorial/TutorialBottom.qml:28
419#: qml/Tutorial/TutorialBottom.qml:28
428msgid "Open special menus"
420msgid "Open special menus"
429msgstr ""
421msgstr ""
po/zh_TW.po+13−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
10+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
11"PO-Revision-Date: 2016-02-24 04:40+0000\n"
11"PO-Revision-Date: 2016-02-24 04:40+0000\n"
12"Last-Translator: Po-Hsu Lin <po-hsu.lin@canonical.com>\n"
12"Last-Translator: Po-Hsu Lin <po-hsu.lin@canonical.com>\n"
13"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
13"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
19"X-Generator: Launchpad (build 17936)\n"
19"X-Generator: Launchpad (build 17936)\n"
20"Language: zh_TW\n"
20"Language: zh_TW\n"
21
21
@@ -171,26 +171,26 @@ msgstr "即刻重新連線!"
171msgid "Close all"
171msgid "Close all"
172msgstr "全部關閉"
172msgstr "全部關閉"
173
173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175msgctxt "Button: Open the Ubuntu Store"
175msgctxt "Button: Open the Ubuntu Store"
176msgid "Store"
176msgid "Store"
177msgstr "商城"
177msgstr "商城"
178
178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180msgctxt "Button: Start a search in the current dash scope"
180msgctxt "Button: Start a search in the current dash scope"
181msgid "Search"
181msgid "Search"
182msgstr "搜尋"
182msgstr "搜尋"
183
183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185msgctxt "Button: Show the current dash scope settings"
185msgctxt "Button: Show the current dash scope settings"
186msgid "Settings"
186msgid "Settings"
187msgstr "設定"
187msgstr "設定"
188
188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190msgid "Remove from Favorites"
190msgid "Remove from Favorites"
191msgstr "自「最愛」移除"
191msgstr "自「最愛」移除"
192
192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194msgid "Add to Favorites"
194msgid "Add to Favorites"
195msgstr "加入到「最愛」"
195msgstr "加入到「最愛」"
196
196
@@ -413,14 +413,6 @@ msgctxt "Button: Call back on phone"
413msgid "Call back"
413msgid "Call back"
414msgstr "回撥"
414msgstr "回撥"
415
415
416−#: qml/Panel/Indicators/ModemInfoItem.qml:105
417−msgid "Unlock SIM"
418−msgstr "解鎖 SIM 卡"
419−
420−#: qml/Panel/Indicators/RoamingIndication.qml:27
421−msgid "Roaming"
422−msgstr "漫遊"
423−
424#: qml/Tutorial/TutorialBottom.qml:28
416#: qml/Tutorial/TutorialBottom.qml:28
425msgid "Open special menus"
417msgid "Open special menus"
426msgstr "開啟特殊選單"
418msgstr "開啟特殊選單"
@@ -743,12 +735,18 @@ msgstr "%1 〉"
743#~ msgid "Done"
735#~ msgid "Done"
744#~ msgstr "完成"
736#~ msgstr "完成"
745
737
738+#~ msgid "Roaming"
739+#~ msgstr "漫遊"
740+
746#~ msgid "Restart"
741#~ msgid "Restart"
747#~ msgstr "重新啟動"
742#~ msgstr "重新啟動"
748
743
749#~ msgid "Please re-enter"
744#~ msgid "Please re-enter"
750#~ msgstr "請再輸入"
745#~ msgstr "請再輸入"
751
746
747+#~ msgid "Unlock SIM"
748+#~ msgstr "解鎖 SIM 卡"
749+
752#~ msgid "Welcome to your Ubuntu phone."
750#~ msgid "Welcome to your Ubuntu phone."
753#~ msgstr "歡迎使用您的 Ubuntu 手機。"
751#~ msgstr "歡迎使用您的 Ubuntu 手機。"
754
752
qml/Components/EdgeBarrier.qml+1−1
@@ -105,7 +105,7 @@ Item {
105 },
105 },
106 Transition {
106 Transition {
107 from: "resisting"; to: "passed"
107 from: "resisting"; to: "passed"
108− UbuntuNumberAnimation { target: materialContainer; property: "opacity" }
108+ UbuntuNumberAnimation { duration: UbuntuAnimation.BriskDuration; target: materialContainer; property: "opacity" }
109 }
109 }
110 ]
110 ]
111}
111}
qml/Components/Header.qml+1
@@ -18,6 +18,7 @@ import Ubuntu.Components 1.3
18import Ubuntu.Components.Themes.Ambiance 1.3
18import Ubuntu.Components.Themes.Ambiance 1.3
19
19
20PageHeadStyle {
20PageHeadStyle {
21+ // FIXME: Don't use this but PageHeader from Ubuntu.Components 1.3.
21 id: root
22 id: root
22
23
23 property var styledItem: root
24 property var styledItem: root
qml/Components/InputMethod.qml+1−9
@@ -22,15 +22,6 @@ import Ubuntu.Gestures 0.1
22Item {
22Item {
23 id: root
23 id: root
24
24
25− Connections {
26− target: SurfaceManager
27− onSurfaceCreated: {
28− if (surface.type == Mir.InputMethodType) {
29− surfaceItem.surface = surface;
30− }
31− }
32− }
33−
34 property int transitionDuration: UbuntuAnimation.FastDuration
25 property int transitionDuration: UbuntuAnimation.FastDuration
35
26
36 MirSurfaceItem {
27 MirSurfaceItem {
@@ -41,6 +32,7 @@ Item {
41
32
42 surfaceWidth: width
33 surfaceWidth: width
43 surfaceHeight: height
34 surfaceHeight: height
35+ surface: SurfaceManager.inputMethodSurface
44
36
45 onLiveChanged: {
37 onLiveChanged: {
46 if (surface !== null && !live) {
38 if (surface !== null && !live) {
qml/Components/Lockscreen.qml+80−94
@@ -121,108 +121,94 @@ Showable {
121 opacity: root.darkenBackground
121 opacity: root.darkenBackground
122 }
122 }
123
123
124− MouseArea {
124+ Loader {
125− anchors.fill: root
125+ id: pinPadLoader
126− onClicked: {
126+ objectName: "pinPadLoader"
127− if (pinPadLoader.item)
128− pinPadLoader.item.forceActiveFocus()
129− }
130− }
131−
132− FocusScope {
133− id: loaderScope
134 anchors.fill: parent
127 anchors.fill: parent
135−
136− Loader {
137− id: pinPadLoader
138− objectName: "pinPadLoader"
139− anchors.fill: parent
140− property bool resetting: false
128+ property bool resetting: false
141− property bool waiting: false
129+ property bool waiting: false
142− property bool showWrongText: false
130+ property bool showWrongText: false
143−
131+ focus: true
132+
144− source: {
133+ source: {
145− if (resetting || !root.required) {
134+ if (resetting || !root.required) {
146− return ""
135+ return ""
147− } else if (root.delayMinutes > 0) {
136+ } else if (root.delayMinutes > 0) {
148− return "DelayedLockscreen.qml"
137+ return "DelayedLockscreen.qml"
149− } else if (root.alphaNumeric) {
138+ } else if (root.alphaNumeric) {
150− return "PassphraseLockscreen.qml"
139+ return "PassphraseLockscreen.qml"
151− } else {
140+ } else {
152− return "PinLockscreen.qml"
141+ return "PinLockscreen.qml"
153− }
154− }
155− onSourceChanged: {
156− waiting = false
157− showWrongText = false
158− if (loaderScope.activeFocus && pinPadLoader.item)
159− pinPadLoader.item.forceActiveFocus()
160 }
142 }
143+ }
144+ onSourceChanged: {
145+ waiting = false
146+ showWrongText = false
147+ }
161
148
162− Connections {
149+ Connections {
163− target: pinPadLoader.item
150+ target: pinPadLoader.item
164−
165− onEntered: {
166− pinPadLoader.waiting = true
167− root.entered(passphrase);
168− }
169
151
170− onCancel: {
152+ onEntered: {
171− root.cancel()
153+ pinPadLoader.waiting = true
172− }
154+ root.entered(passphrase);
173 }
155 }
174
156
175− Binding {
157+ onCancel: {
176− target: pinPadLoader.item
158+ root.cancel()
177− property: "minPinLength"
178− value: root.minPinLength
179− }
180− Binding {
181− target: pinPadLoader.item
182− property: "maxPinLength"
183− value: root.maxPinLength
184− }
185− Binding {
186− target: pinPadLoader.item
187− property: "infoText"
188− value: root.infoText
189− }
190− Binding {
191− target: pinPadLoader.item
192− property: "retryText"
193− value: root.retryText
194− }
195− Binding {
196− target: pinPadLoader.item
197− property: "errorText"
198− value: pinPadLoader.showWrongText ? root.errorText : ""
199− }
200− Binding {
201− target: pinPadLoader.item
202− property: "entryEnabled"
203− value: !pinPadLoader.waiting
204− }
205− Binding {
206− target: pinPadLoader.item
207− property: "alphaNumeric"
208− value: root.alphaNumeric
209− }
210− Binding {
211− target: pinPadLoader.item
212− property: "delayMinutes"
213− value: root.delayMinutes
214− }
215− Binding {
216− target: pinPadLoader.item
217− property: "showCancelButton"
218− value: root.showCancelButton
219− }
220− Binding {
221− target: pinPadLoader.item
222− property: "foregroundColor"
223− value: root.foregroundColor
224 }
159 }
225 }
160 }
161+
162+ Binding {
163+ target: pinPadLoader.item
164+ property: "minPinLength"
165+ value: root.minPinLength
166+ }
167+ Binding {
168+ target: pinPadLoader.item
169+ property: "maxPinLength"
170+ value: root.maxPinLength
171+ }
172+ Binding {
173+ target: pinPadLoader.item
174+ property: "infoText"
175+ value: root.infoText
176+ }
177+ Binding {
178+ target: pinPadLoader.item
179+ property: "retryText"
180+ value: root.retryText
181+ }
182+ Binding {
183+ target: pinPadLoader.item
184+ property: "errorText"
185+ value: pinPadLoader.showWrongText ? root.errorText : ""
186+ }
187+ Binding {
188+ target: pinPadLoader.item
189+ property: "entryEnabled"
190+ value: !pinPadLoader.waiting
191+ }
192+ Binding {
193+ target: pinPadLoader.item
194+ property: "alphaNumeric"
195+ value: root.alphaNumeric
196+ }
197+ Binding {
198+ target: pinPadLoader.item
199+ property: "delayMinutes"
200+ value: root.delayMinutes
201+ }
202+ Binding {
203+ target: pinPadLoader.item
204+ property: "showCancelButton"
205+ value: root.showCancelButton
206+ }
207+ Binding {
208+ target: pinPadLoader.item
209+ property: "foregroundColor"
210+ value: root.foregroundColor
211+ }
226 }
212 }
227
213
228 Item {
214 Item {
qml/Components/ModeSwitchWarningDialog.qml+1−1
@@ -54,7 +54,7 @@ ShellDialog {
54 }
54 }
55
55
56 Label {
56 Label {
57− text: i18n.tr("Re-dock, save your work and close these apps to continue.")
57+ text: i18n.ctr("Re-dock means connect the device again to an external screen/mouse/keyboard", "Re-dock, save your work and close these apps to continue.")
58 wrapMode: Text.WordWrap
58 wrapMode: Text.WordWrap
59 color: "#888888"
59 color: "#888888"
60 }
60 }
qml/Components/PassphraseLockscreen.qml+5−4
@@ -18,10 +18,11 @@ import QtQuick 2.4
18import Ubuntu.Components 1.3
18import Ubuntu.Components 1.3
19import "../Components"
19import "../Components"
20
20
21−Item {
21+FocusScope {
22 id: root
22 id: root
23 y: units.gu(4)
23 y: units.gu(4)
24 height: shakeContainer.height
24 height: shakeContainer.height
25+ focus: true
25
26
26 property string infoText
27 property string infoText
27 property string errorText
28 property string errorText
@@ -42,8 +43,6 @@ Item {
42 }
43 }
43 }
44 }
44
45
45− onActiveFocusChanged: if (activeFocus) pinentryField.forceActiveFocus()
46−
47 Column {
46 Column {
48 id: shakeContainer
47 id: shakeContainer
49 anchors.horizontalCenter: parent.horizontalCenter
48 anchors.horizontalCenter: parent.horizontalCenter
@@ -59,14 +58,16 @@ Item {
59 text: root.infoText
58 text: root.infoText
60 }
59 }
61
60
62− Item {
61+ FocusScope {
63 id: entryContainer
62 id: entryContainer
64 anchors { left: parent.left; right: parent.right; margins: units.gu(2) }
63 anchors { left: parent.left; right: parent.right; margins: units.gu(2) }
65 height: units.gu(4)
64 height: units.gu(4)
65+ focus: true
66
66
67 TextInput {
67 TextInput {
68 id: pinentryField
68 id: pinentryField
69 objectName: "pinentryField"
69 objectName: "pinentryField"
70+ focus: true
70
71
71 property bool incorrectOverride: false
72 property bool incorrectOverride: false
72
73
qml/Components/PhysicalKeysMapper.qml+24
@@ -42,12 +42,15 @@ Item {
42 signal screenshotTriggered;
42 signal screenshotTriggered;
43
43
44 readonly property bool altTabPressed: d.altTabPressed
44 readonly property bool altTabPressed: d.altTabPressed
45+ readonly property bool superPressed: d.superPressed
46+ readonly property bool superTabPressed: d.superTabPressed
45
47
46 property int powerKeyLongPressTime: 2000
48 property int powerKeyLongPressTime: 2000
47
49
48 // For testing. If running windowed (e.g. tryShell), Alt+Tab is taken by the
50 // For testing. If running windowed (e.g. tryShell), Alt+Tab is taken by the
49 // running desktop, set this to true to use Ctrl+Tab instead.
51 // running desktop, set this to true to use Ctrl+Tab instead.
50 property bool controlInsteadOfAlt: false
52 property bool controlInsteadOfAlt: false
53+ property bool controlInsteadOfSuper: false
51
54
52 QtObject {
55 QtObject {
53 id: d
56 id: d
@@ -59,6 +62,9 @@ Item {
59 property bool altPressed: false
62 property bool altPressed: false
60 property bool altTabPressed: false
63 property bool altTabPressed: false
61
64
65+ property bool superPressed: false
66+ property bool superTabPressed: false
67+
62 property var powerButtonPressStart: 0
68 property var powerButtonPressStart: 0
63
69
64 // We need to eat ALT presses until we know what they're for (Alt+Tab or going to the app?)
70 // We need to eat ALT presses until we know what they're for (Alt+Tab or going to the app?)
@@ -119,11 +125,23 @@ Item {
119 event.accepted = true;
125 event.accepted = true;
120 d.altPressInjected = false;
126 d.altPressInjected = false;
121 }
127 }
128+
129+ // Adding MetaModifier here because that's what keyboards do. Pressing Super_L actually gives
130+ // Super_L + MetaModifier. This helps to make sure we only invoke superPressed if no other
131+ // Modifier is pressed too.
132+ } else if (((event.key == Qt.Key_Super_L || event.key == Qt.Key_Super_R) && event.modifiers === Qt.MetaModifier)
133+ || (root.controlInsteadOfSuper && event.key == Qt.Key_Control)
134+ ) {
135+ d.superPressed = true;
122 } else if (event.key == Qt.Key_Tab) {
136 } else if (event.key == Qt.Key_Tab) {
123 if (d.altPressed && !d.altTabPressed) {
137 if (d.altPressed && !d.altTabPressed) {
124 d.altTabPressed = true;
138 d.altTabPressed = true;
125 event.accepted = true;
139 event.accepted = true;
126 }
140 }
141+ if (d.superPressed && !d.superTabPressed) {
142+ d.superTabPressed = true;
143+ event.accepted = true;
144+ }
127 }
145 }
128 }
146 }
129
147
@@ -154,6 +172,12 @@ Item {
154 if (d.altTabPressed) {
172 if (d.altTabPressed) {
155 event.accepted = true;
173 event.accepted = true;
156 }
174 }
175+ } else if (event.key == Qt.Key_Super_L || event.key == Qt.Key_Super_R || (root.controlInsteadOfSuper && event.key == Qt.Key_Control)) {
176+ d.superPressed = false;
177+ if (d.superTabPressed) {
178+ d.superTabPressed = false;
179+ event.accepted = true;
180+ }
157 }
181 }
158 }
182 }
159}
183}
qml/Components/PinLockscreen.qml+22−1
@@ -19,8 +19,9 @@ import Ubuntu.Components 1.3
19import Ubuntu.Components.ListItems 1.3
19import Ubuntu.Components.ListItems 1.3
20import "../Components"
20import "../Components"
21
21
22−Item {
22+FocusScope {
23 id: root
23 id: root
24+ focus: true
24
25
25 property string infoText
26 property string infoText
26 property string retryText
27 property string retryText
@@ -45,6 +46,24 @@ Item {
45 }
46 }
46 }
47 }
47
48
49+ Keys.onPressed: {
50+ if (pinentryField.text.length == root.maxPinLength)
51+ return;
52+
53+ if (event.key === Qt.Key_Backspace) {
54+ pinentryField.backspace();
55+ } else if (event.key === Qt.Key_Delete || event.key === Qt.Key_Escape) {
56+ closeButton.clicked()
57+ } else if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return) {
58+ confirmButton.clicked()
59+ } else {
60+ var digit = parseInt(event.text);
61+ if (!isNaN(digit) && typeof digit == "number") {
62+ pinentryField.appendNumber(digit);
63+ }
64+ }
65+ }
66+
48 Column {
67 Column {
49 anchors {
68 anchors {
50 left: parent.left;
69 left: parent.left;
@@ -204,6 +223,7 @@ Item {
204 width: numbersGrid.buttonWidth
223 width: numbersGrid.buttonWidth
205 }
224 }
206 PinPadButton {
225 PinPadButton {
226+ id: closeButton
207 iconName: "close"
227 iconName: "close"
208 height: units.gu(5) // visual spec has this row a little closer in
228 height: units.gu(5) // visual spec has this row a little closer in
209 width: numbersGrid.buttonWidth
229 width: numbersGrid.buttonWidth
@@ -216,6 +236,7 @@ Item {
216 width: numbersGrid.buttonWidth
236 width: numbersGrid.buttonWidth
217 }
237 }
218 PinPadButton {
238 PinPadButton {
239+ id: confirmButton
219 iconName: "tick"
240 iconName: "tick"
220 objectName: "confirmButton"
241 objectName: "confirmButton"
221 height: units.gu(5)
242 height: units.gu(5)
qml/Components/ShellDialog.qml+8
@@ -37,7 +37,15 @@ Dialog {
37
37
38 focus: true
38 focus: true
39
39
40+ // FIXME: this is a hack because Dialog subtheming seems broken atm
41+ // https://bugs.launchpad.net/ubuntu/+source/ubuntu-ui-toolkit/+bug/1555548
42+ ThemeSettings {
43+ id: themeHack
44+ name: "Ubuntu.Components.Themes.Ambiance"
45+ }
46+
40 Component.onCompleted: {
47 Component.onCompleted: {
48+ __foreground.theme = themeHack
41 show();
49 show();
42 }
50 }
43}
51}
qml/Dash/CardCarousel.qml−1
@@ -66,7 +66,6 @@ DashRenderer {
66 item.cardData = Qt.binding(function() { return model; });
66 item.cardData = Qt.binding(function() { return model; });
67 item.fontScale = Qt.binding(function() { return carousel.fontScale; });
67 item.fontScale = Qt.binding(function() { return carousel.fontScale; });
68 item.showHeader = Qt.binding(function() { return loader.explicitlyScaled; });
68 item.showHeader = Qt.binding(function() { return loader.explicitlyScaled; });
69− item.titleAlignment = Qt.binding(function() { return cardTool.titleAlignment; });
70 item.artShapeStyle = "shadow";
69 item.artShapeStyle = "shadow";
71 item.scopeStyle = cardCarousel.scopeStyle;
70 item.scopeStyle = cardCarousel.scopeStyle;
72 }
71 }
qml/Dash/CardGrid.qml−1
@@ -70,7 +70,6 @@ DashRenderer {
70 item.fixedHeaderHeight = Qt.binding(function() { return cardTool.headerHeight; });
70 item.fixedHeaderHeight = Qt.binding(function() { return cardTool.headerHeight; });
71 item.fixedArtShapeSize = Qt.binding(function() { return cardTool.artShapeSize; });
71 item.fixedArtShapeSize = Qt.binding(function() { return cardTool.artShapeSize; });
72 item.cardData = Qt.binding(function() { return model; });
72 item.cardData = Qt.binding(function() { return model; });
73− item.titleAlignment = Qt.binding(function() { return cardTool.titleAlignment; });
74 item.scopeStyle = root.scopeStyle;
73 item.scopeStyle = root.scopeStyle;
75 item.artShapeStyle = root.artShapeStyle;
74 item.artShapeStyle = root.artShapeStyle;
76 item.backgroundShapeStyle = root.backgroundShapeStyle;
75 item.backgroundShapeStyle = root.backgroundShapeStyle;
qml/Dash/CardHorizontalList.qml−1
@@ -53,7 +53,6 @@ DashRenderer {
53 item.fixedArtShapeSize = Qt.binding(function() { return cardTool.artShapeSize; });
53 item.fixedArtShapeSize = Qt.binding(function() { return cardTool.artShapeSize; });
54 item.fixedHeaderHeight = Qt.binding(function() { return cardTool.headerHeight; });
54 item.fixedHeaderHeight = Qt.binding(function() { return cardTool.headerHeight; });
55 item.cardData = Qt.binding(function() { return model; });
55 item.cardData = Qt.binding(function() { return model; });
56− item.titleAlignment = Qt.binding(function() { return cardTool.titleAlignment; });
57 item.scopeStyle = root.scopeStyle;
56 item.scopeStyle = root.scopeStyle;
58 }
57 }
59 Connections {
58 Connections {
qml/Dash/CardTool.qml+2−26
@@ -66,7 +66,7 @@ Item {
66 return layout;
66 return layout;
67 }
67 }
68
68
69− property var cardComponent: CardCreatorCache.getCardComponent(cardTool.template, cardTool.components);
69+ property var cardComponent: CardCreatorCache.getCardComponent(cardTool.template, cardTool.components, false);
70
70
71 // FIXME: Saviq
71 // FIXME: Saviq
72 // Only way for the card below to actually be laid out completely.
72 // Only way for the card below to actually be laid out completely.
@@ -139,29 +139,6 @@ Item {
139 readonly property int headerHeight: cardLoader.item ? cardLoader.item.headerHeight : 0
139 readonly property int headerHeight: cardLoader.item ? cardLoader.item.headerHeight : 0
140 property size artShapeSize: cardLoader.item ? cardLoader.item.artShapeSize : 0
140 property size artShapeSize: cardLoader.item ? cardLoader.item.artShapeSize : 0
141
141
142− /*!
143− \brief Desired alignment of title
144− */
145− readonly property int titleAlignment: {
146− if (template["card-layout"] === "horizontal"
147− || typeof components["title"] !== "object"
148− || components["title"]["align"] === "left") return Text.AlignLeft;
149−
150− var keys = ["mascot", "emblem", "subtitle", "attributes", "summary"];
151−
152− for (var key in keys) {
153− key = keys[key];
154− try {
155− if (typeof components[key] === "string"
156− || typeof components[key]["field"] === "string") return Text.AlignLeft;
157− } catch (e) {
158− continue;
159− }
160− }
161−
162− return Text.AlignHCenter;
163− }
164−
165 QtObject {
142 QtObject {
166 id: carouselTool
143 id: carouselTool
167
144
@@ -216,10 +193,9 @@ Item {
216 "summary": "—\n—\n—\n—\n—",
193 "summary": "—\n—\n—\n—\n—",
217 "attributes": attributesModel.model
194 "attributes": attributesModel.model
218 }
195 }
219− sourceComponent: cardTool.cardComponent
196+ sourceComponent: CardCreatorCache.getCardComponent(cardTool.template, cardTool.components, true);
220 onLoaded: {
197 onLoaded: {
221 item.objectName = "cardToolCard";
198 item.objectName = "cardToolCard";
222− item.asynchronous = false;
223 item.width = Qt.binding(function() { return cardTool.cardWidth !== -1 ? cardTool.cardWidth : item.implicitWidth; });
199 item.width = Qt.binding(function() { return cardTool.cardWidth !== -1 ? cardTool.cardWidth : item.implicitWidth; });
224 item.height = Qt.binding(function() { return cardTool.cardHeight !== -1 ? cardTool.cardHeight : item.implicitHeight; });
200 item.height = Qt.binding(function() { return cardTool.cardHeight !== -1 ? cardTool.cardHeight : item.implicitHeight; });
225 }
201 }
qml/Dash/CardVerticalJournal.qml−1
@@ -72,7 +72,6 @@ DashRenderer {
72 item.fixedArtShapeSize = Qt.binding(function() { return cardTool.artShapeSize; });
72 item.fixedArtShapeSize = Qt.binding(function() { return cardTool.artShapeSize; });
73 item.fixedHeaderHeight = Qt.binding(function() { return cardTool.headerHeight; });
73 item.fixedHeaderHeight = Qt.binding(function() { return cardTool.headerHeight; });
74 item.cardData = Qt.binding(function() { return model; });
74 item.cardData = Qt.binding(function() { return model; });
75− item.titleAlignment = Qt.binding(function() { return cardTool.titleAlignment; });
76 item.scopeStyle = root.scopeStyle;
75 item.scopeStyle = root.scopeStyle;
77 }
76 }
78 Connections {
77 Connections {
qml/Dash/Dash.qml+11−11
@@ -37,6 +37,7 @@ Showable {
37 }
37 }
38
38
39 property bool windowActive: window.active
39 property bool windowActive: window.active
40+ property bool showOverlayScope: false
40
41
41 DashCommunicatorService {
42 DashCommunicatorService {
42 objectName: "dashCommunicatorService"
43 objectName: "dashCommunicatorService"
@@ -80,7 +81,7 @@ Showable {
80 return
81 return
81 }
82 }
82
83
83− closeOverlayScope();
84+ dash.showOverlayScope = false;
84
85
85 dashContent.closePreview();
86 dashContent.closePreview();
86
87
@@ -93,12 +94,6 @@ Showable {
93 dashContent.setCurrentScopeAtIndex(scopeIndex, animate, reset)
94 dashContent.setCurrentScopeAtIndex(scopeIndex, animate, reset)
94 }
95 }
95
96
96− function closeOverlayScope() {
97− if (dashContent.x != 0) {
98− dashContent.x = 0;
99− }
100− }
101−
102 Scopes {
97 Scopes {
103 id: scopes
98 id: scopes
104 }
99 }
@@ -133,12 +128,13 @@ Showable {
133 height: dash.height
128 height: dash.height
134 scopes: scopes
129 scopes: scopes
135 visible: x != -width
130 visible: x != -width
131+ x: dash.showOverlayScope ? -width : 0
136 onGotoScope: {
132 onGotoScope: {
137 dash.setCurrentScope(scopeId, true, false);
133 dash.setCurrentScope(scopeId, true, false);
138 }
134 }
139 onOpenScope: {
135 onOpenScope: {
140 scopeItem.scope = scope;
136 scopeItem.scope = scope;
141− x = -width;
137+ dash.showOverlayScope = true;
142 }
138 }
143 Behavior on x {
139 Behavior on x {
144 UbuntuNumberAnimation {
140 UbuntuNumberAnimation {
@@ -207,7 +203,7 @@ Showable {
207 bottomEdgeController.enableAnimation = true;
203 bottomEdgeController.enableAnimation = true;
208 bottomEdgeController.progress = 0;
204 bottomEdgeController.progress = 0;
209 scopeItem.scope = scope;
205 scopeItem.scope = scope;
210− dashContent.x = -dashContent.width;
206+ dash.showOverlayScope = true;
211 }
207 }
212 onGotoScope: {
208 onGotoScope: {
213 bottomEdgeController.enableAnimation = true;
209 bottomEdgeController.enableAnimation = true;
@@ -226,7 +222,7 @@ Showable {
226 id: scopeItem
222 id: scopeItem
227 objectName: "dashTempScopeItem"
223 objectName: "dashTempScopeItem"
228
224
229− x: dashContent.x + width
225+ x: dash.showOverlayScope ? 0 : width
230 y: dashContent.y
226 y: dashContent.y
231 width: parent.width
227 width: parent.width
232 height: parent.height
228 height: parent.height
@@ -234,7 +230,7 @@ Showable {
234 hasBackAction: true
230 hasBackAction: true
235 isCurrent: visible
231 isCurrent: visible
236 onBackClicked: {
232 onBackClicked: {
237− closeOverlayScope();
233+ dash.showOverlayScope = false;
238 closePreview();
234 closePreview();
239 }
235 }
240
236
@@ -250,6 +246,10 @@ Showable {
250 scopes.closeScope(oldScope);
246 scopes.closeScope(oldScope);
251 }
247 }
252 }
248 }
249+
250+ Behavior on x {
251+ UbuntuNumberAnimation { }
252+ }
253 }
253 }
254
254
255 Rectangle {
255 Rectangle {
qml/Dash/DashPageHeader.qml+4
@@ -170,6 +170,7 @@ Item {
170 anchors { left: parent.left; right: parent.right }
170 anchors { left: parent.left; right: parent.right }
171
171
172 PageHeadStyle {
172 PageHeadStyle {
173+ // FIXME: Replace PageHeadStyle from the Ambiance theme by the new PageHeader from Ubuntu.Components 1.3.
173 id: searchHeader
174 id: searchHeader
174 anchors { left: parent.left; right: parent.right }
175 anchors { left: parent.left; right: parent.right }
175 opacity: headerContainer.clip || headerContainer.showSearch ? 1 : 0 // setting visible false cause column to relayout
176 opacity: headerContainer.clip || headerContainer.showSearch ? 1 : 0 // setting visible false cause column to relayout
@@ -179,6 +180,7 @@ Item {
179 property color dividerColor: "transparent" // Doesn't matter as we don't have PageHeadSections
180 property color dividerColor: "transparent" // Doesn't matter as we don't have PageHeadSections
180 property color panelColor: background.topColor
181 property color panelColor: background.topColor
181 panelForegroundColor: config.foregroundColor
182 panelForegroundColor: config.foregroundColor
183+ backgroundColor: "transparent"
182 config: PageHeadConfiguration {
184 config: PageHeadConfiguration {
183 foregroundColor: root.scopeStyle ? root.scopeStyle.headerForeground : theme.palette.normal.baseText
185 foregroundColor: root.scopeStyle ? root.scopeStyle.headerForeground : theme.palette.normal.baseText
184 backAction: Action {
186 backAction: Action {
@@ -241,6 +243,7 @@ Item {
241 }
243 }
242
244
243 PageHeadStyle {
245 PageHeadStyle {
246+ // FIXME: Replace PageHeadStyle from the Ambiance theme by the new PageHeader from Ubuntu.Components 1.3.
244 id: header
247 id: header
245 objectName: "innerPageHeader"
248 objectName: "innerPageHeader"
246 anchors { left: parent.left; right: parent.right }
249 anchors { left: parent.left; right: parent.right }
@@ -251,6 +254,7 @@ Item {
251 property color dividerColor: "transparent" // Doesn't matter as we don't have PageHeadSections
254 property color dividerColor: "transparent" // Doesn't matter as we don't have PageHeadSections
252 property color panelColor: background.topColor
255 property color panelColor: background.topColor
253 panelForegroundColor: config.foregroundColor
256 panelForegroundColor: config.foregroundColor
257+ backgroundColor: "transparent"
254 config: PageHeadConfiguration {
258 config: PageHeadConfiguration {
255 title: root.title
259 title: root.title
256 foregroundColor: root.scopeStyle ? root.scopeStyle.headerForeground : theme.palette.normal.baseText
260 foregroundColor: root.scopeStyle ? root.scopeStyle.headerForeground : theme.palette.normal.baseText
qml/Dash/GenericScopeView.qml+2
@@ -370,6 +370,8 @@ FocusScope {
370 } else {
370 } else {
371 cardTool.cardWidth = units.gu(10);
371 cardTool.cardWidth = units.gu(10);
372 }
372 }
373+ } else {
374+ cardTool.cardWidth = units.gu(12);
373 }
375 }
374 item.minimumHorizontalSpacing = item.defaultMinimumHorizontalSpacing;
376 item.minimumHorizontalSpacing = item.defaultMinimumHorizontalSpacing;
375 }
377 }
qml/Dash/Previews/PreviewHeader.qml+37−9
@@ -25,6 +25,7 @@ import "../"
25 * The mascot fall back image comes in widgetData["fallback"]
25 * The mascot fall back image comes in widgetData["fallback"]
26 * The subtitle comes in widgetData["subtitle"]
26 * The subtitle comes in widgetData["subtitle"]
27 * The attributes comes in widgetData["attributes"]
27 * The attributes comes in widgetData["attributes"]
28+ * The emblem comes in widgetData["emblem"]
28 */
29 */
29
30
30PreviewWidget {
31PreviewWidget {
@@ -40,6 +41,7 @@ PreviewWidget {
40 readonly property string title: root.widgetData["title"] || ""
41 readonly property string title: root.widgetData["title"] || ""
41 readonly property string subtitle: root.widgetData["subtitle"] || ""
42 readonly property string subtitle: root.widgetData["subtitle"] || ""
42 readonly property var attributes: root.widgetData["attributes"] || null
43 readonly property var attributes: root.widgetData["attributes"] || null
44+ readonly property url emblem: root.widgetData["emblem"] || ""
43 readonly property color fontColor: root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText
45 readonly property color fontColor: root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText
44
46
45 // Rewire the source since we may have unwired it on onStatusChanged
47 // Rewire the source since we may have unwired it on onStatusChanged
@@ -98,16 +100,42 @@ PreviewWidget {
98 spacing: units.dp(2)
100 spacing: units.dp(2)
99 anchors.verticalCenter: parent.verticalCenter
101 anchors.verticalCenter: parent.verticalCenter
100
102
101− Label {
103+ Item {
102− id: titleLabel
103− objectName: "titleLabel"
104 anchors { left: parent.left; right: parent.right }
104 anchors { left: parent.left; right: parent.right }
105+ height: titleLabel.height
106+
107+ Label {
108+ id: titleLabel
109+ objectName: "titleLabel"
110+ anchors {
111+ left: parent.left;
112+ right: iconLoader.right
113+ rightMargin: iconLoader.width > 0 ? units.gu(0.5) : 0
114+ }
105− elide: Text.ElideRight
115+ elide: Text.ElideRight
106− font.weight: Font.Normal
116+ font.weight: Font.Normal
107− fontSize: "large"
117+ fontSize: "large"
108− wrapMode: Text.Wrap
118+ wrapMode: Text.Wrap
109− color: headerRoot.fontColor
119+ color: headerRoot.fontColor
110− text: headerRoot.title
120+ text: headerRoot.title
121+ }
122+
123+ Loader {
124+ id: iconLoader
125+ active: headerRoot.emblem != ""
126+ anchors {
127+ bottom: titleLabel.baseline
128+ right: parent.right
129+ }
130+ sourceComponent: Icon {
131+ objectName: "emblemIcon"
132+ source: headerRoot.emblem
133+ color: headerRoot.fontColor
134+ height: source != "" ? titleLabel.font.pixelSize : 0
135+ // FIXME Workaround for bug https://bugs.launchpad.net/ubuntu/+source/ubuntu-ui-toolkit/+bug/1421293
136+ width: implicitWidth > 0 && implicitHeight > 0 ? (implicitWidth / implicitHeight * height) : implicitWidth
137+ }
138+ }
111 }
139 }
112
140
113 Loader {
141 Loader {
qml/Dash/Previews/PreviewOverlay.qml+1−1
@@ -158,7 +158,7 @@ Rectangle {
158 anchors.centerIn: parent
158 anchors.centerIn: parent
159 width: units.gu(2.5)
159 width: units.gu(2.5)
160 height: width
160 height: width
161− color: theme.palette.normal.foregroundText
161+ color: "white"
162 name: "close"
162 name: "close"
163 }
163 }
164 }
164 }
qml/Dash/Previews/PreviewPayments.qml+1−3
@@ -65,9 +65,7 @@ PreviewWidget {
65 }
65 }
66 onPurchaseCancelled: {
66 onPurchaseCancelled: {
67 paymentButton.opacity = 1;
67 paymentButton.opacity = 1;
68− // DO NOT emit the signal right now, as it causes a new
69− // preview to be requested, when that is not what we want.
70− //root.triggered(widgetId, "purchaseCancelled", source);
68+ root.triggered(widgetId, "purchaseCancelled", source);
71 }
69 }
72 }
70 }
73 }
71 }
qml/Dash/Previews/PreviewSharing.qml+17−7
@@ -44,6 +44,22 @@ Item {
44 }
44 }
45 }
45 }
46
46
47+ function createExportedItems(url) {
48+ var items = new Array();
49+ if (typeof url === "string") {
50+ var exportItem = exportItemComponent.createObject();
51+ exportItem.url = url;
52+ items.push(exportItem);
53+ } else {
54+ for (var i = 0; i < url.length; i++) {
55+ var exportItem = exportItemComponent.createObject();
56+ exportItem.url = url[i];
57+ items.push(exportItem);
58+ }
59+ }
60+ return items;
61+ }
62+
47 Component {
63 Component {
48 id: exportItemComponent
64 id: exportItemComponent
49 ContentItem {
65 ContentItem {
@@ -76,13 +92,7 @@ Item {
76 onPeerSelected: {
92 onPeerSelected: {
77 var transfer = peer.request();
93 var transfer = peer.request();
78 if (transfer.state === ContentTransfer.InProgress) {
94 if (transfer.state === ContentTransfer.InProgress) {
79− var items = new Array();
80− for (var i = 0; i < url.length; i++) {
81− var exportItem = exportItemComponent.createObject();
82− exportItem.url = url[i];
83− items.push(exportItem);
84− }
85− transfer.items = items;
95+ transfer.items = createExportedItems(url);
86 transfer.state = ContentTransfer.Charged;
96 transfer.state = ContentTransfer.Charged;
87 }
97 }
88 peerPicker.visible = false;
98 peerPicker.visible = false;
qml/Dash/ScopesListCategoryItem.qml+8−4
@@ -18,7 +18,7 @@ import QtQuick 2.4
18import QtQuick.Layouts 1.1
18import QtQuick.Layouts 1.1
19import Ubuntu.Components 1.3
19import Ubuntu.Components 1.3
20
20
21−MouseArea {
21+AbstractButton {
22 id: root
22 id: root
23
23
24 signal requestFavorite(string scopeId, bool favorite)
24 signal requestFavorite(string scopeId, bool favorite)
@@ -84,15 +84,19 @@ MouseArea {
84 visible: text != ""
84 visible: text != ""
85 }
85 }
86 }
86 }
87− MouseArea {
87+ AbstractButton {
88 id: starArea
88 id: starArea
89 objectName: "starArea"
89 objectName: "starArea"
90 height: parent.height
90 height: parent.height
91 width: height
91 width: height
92 anchors.right: parent.right
92 anchors.right: parent.right
93 onClicked: if (!editMode) root.requestFavorite(model.scopeId, !isFavorite);
93 onClicked: if (!editMode) root.requestFavorite(model.scopeId, !isFavorite);
94+ onPressedChanged: {
95+ if (editMode) {
94− onPressed: if (editMode) root.handlePressed(starArea);
96+ if (pressed) root.handlePressed(starArea.__mouseArea);
95− onReleased: if (editMode) root.handleReleased(starArea);
97+ else root.handleReleased(starArea.__mouseArea);
98+ }
99+ }
96 visible: editMode || showStar
100 visible: editMode || showStar
97 Icon {
101 Icon {
98 id: star
102 id: star
qml/DeviceConfiguration.qml+54−16
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -15,6 +15,7 @@
15 */
15 */
16
16
17import QtQuick 2.4
17import QtQuick 2.4
18+import Utils 0.1
18
19
19QtObject {
20QtObject {
20 id: root
21 id: root
@@ -34,57 +35,83 @@ QtObject {
34
35
35 readonly property alias category: priv.category
36 readonly property alias category: priv.category
36
37
38+ readonly property var deviceConfigParser: DeviceConfigParser {
39+ name: root.name
40+ }
41+
37 readonly property var priv: StateGroup {
42 readonly property var priv: StateGroup {
38 id: priv
43 id: priv
39
44
40− property int primaryOrientation: root.useNativeOrientation
45+ property int primaryOrientation: deviceConfigParser.primaryOrientation == Qt.PrimaryOrientation ?
46+ root.useNativeOrientation : deviceConfigParser.primaryOrientation
41
47
42− property int supportedOrientations: Qt.PortraitOrientation
48+ property int supportedOrientations: deviceConfigParser.supportedOrientations
43− | Qt.InvertedPortraitOrientation
44− | Qt.LandscapeOrientation
45− | Qt.InvertedLandscapeOrientation
46
49
47− property int landscapeOrientation: Qt.LandscapeOrientation
50+ property int landscapeOrientation: deviceConfigParser.landscapeOrientation
48− property int invertedLandscapeOrientation: Qt.InvertedLandscapeOrientation
51+ property int invertedLandscapeOrientation: deviceConfigParser.invertedLandscapeOrientation
49− property int portraitOrientation: Qt.PortraitOrientation
52+ property int portraitOrientation: deviceConfigParser.portraitOrientation
50− property int invertedPortraitOrientation: Qt.InvertedPortraitOrientation
53+ property int invertedPortraitOrientation: deviceConfigParser.invertedPortraitOrientation
51−
52− // Supported values so far:
53− // "phone", "tablet" or "desktop"
54− property string category: "phone"
54+ property string category: deviceConfigParser.category
55
55
56 states: [
56 states: [
57 State {
57 State {
58 name: "mako"
58 name: "mako"
59 PropertyChanges {
59 PropertyChanges {
60 target: priv
60 target: priv
61+ primaryOrientation: root.useNativeOrientation
61 supportedOrientations: Qt.PortraitOrientation
62 supportedOrientations: Qt.PortraitOrientation
62 | Qt.LandscapeOrientation
63 | Qt.LandscapeOrientation
63 | Qt.InvertedLandscapeOrientation
64 | Qt.InvertedLandscapeOrientation
65+ landscapeOrientation: Qt.LandscapeOrientation
66+ invertedLandscapeOrientation: Qt.InvertedLandscapeOrientation
67+ portraitOrientation: Qt.PortraitOrientation
68+ invertedPortraitOrientation: Qt.InvertedPortraitOrientation
69+ category: "phone"
64 }
70 }
65 },
71 },
66 State {
72 State {
67 name: "krillin"
73 name: "krillin"
68 PropertyChanges {
74 PropertyChanges {
69 target: priv
75 target: priv
76+ primaryOrientation: root.useNativeOrientation
70 supportedOrientations: Qt.PortraitOrientation
77 supportedOrientations: Qt.PortraitOrientation
71 | Qt.LandscapeOrientation
78 | Qt.LandscapeOrientation
72 | Qt.InvertedLandscapeOrientation
79 | Qt.InvertedLandscapeOrientation
80+ landscapeOrientation: Qt.LandscapeOrientation
81+ invertedLandscapeOrientation: Qt.InvertedLandscapeOrientation
82+ portraitOrientation: Qt.PortraitOrientation
83+ invertedPortraitOrientation: Qt.InvertedPortraitOrientation
84+ category: "phone"
73 }
85 }
74 },
86 },
75 State {
87 State {
76 name: "arale"
88 name: "arale"
77 PropertyChanges {
89 PropertyChanges {
78 target: priv
90 target: priv
91+ primaryOrientation: root.useNativeOrientation
79 supportedOrientations: Qt.PortraitOrientation
92 supportedOrientations: Qt.PortraitOrientation
80 | Qt.LandscapeOrientation
93 | Qt.LandscapeOrientation
81 | Qt.InvertedLandscapeOrientation
94 | Qt.InvertedLandscapeOrientation
95+ landscapeOrientation: Qt.LandscapeOrientation
96+ invertedLandscapeOrientation: Qt.InvertedLandscapeOrientation
97+ portraitOrientation: Qt.PortraitOrientation
98+ invertedPortraitOrientation: Qt.InvertedPortraitOrientation
99+ category: "phone"
82 }
100 }
83 },
101 },
84 State {
102 State {
85 name: "manta"
103 name: "manta"
86 PropertyChanges {
104 PropertyChanges {
87 target: priv
105 target: priv
106+ primaryOrientation: root.useNativeOrientation
107+ supportedOrientations: Qt.PortraitOrientation
108+ | Qt.InvertedPortraitOrientation
109+ | Qt.LandscapeOrientation
110+ | Qt.InvertedLandscapeOrientation
111+ landscapeOrientation: Qt.LandscapeOrientation
112+ invertedLandscapeOrientation: Qt.InvertedLandscapeOrientation
113+ portraitOrientation: Qt.PortraitOrientation
114+ invertedPortraitOrientation: Qt.InvertedPortraitOrientation
88 category: "tablet"
115 category: "tablet"
89 }
116 }
90 },
117 },
@@ -92,9 +119,15 @@ QtObject {
92 name: "flo"
119 name: "flo"
93 PropertyChanges {
120 PropertyChanges {
94 target: priv
121 target: priv
122+ primaryOrientation: Qt.InvertedLandscapeOrientation
123+ supportedOrientations: Qt.PortraitOrientation
124+ | Qt.InvertedPortraitOrientation
125+ | Qt.LandscapeOrientation
126+ | Qt.InvertedLandscapeOrientation
95 landscapeOrientation: Qt.InvertedLandscapeOrientation
127 landscapeOrientation: Qt.InvertedLandscapeOrientation
96 invertedLandscapeOrientation: Qt.LandscapeOrientation
128 invertedLandscapeOrientation: Qt.LandscapeOrientation
97− primaryOrientation: Qt.InvertedLandscapeOrientation
129+ portraitOrientation: Qt.PortraitOrientation
130+ invertedPortraitOrientation: Qt.InvertedPortraitOrientation
98 category: "tablet"
131 category: "tablet"
99 }
132 }
100 },
133 },
@@ -102,8 +135,13 @@ QtObject {
102 name: "desktop"
135 name: "desktop"
103 PropertyChanges {
136 PropertyChanges {
104 target: priv
137 target: priv
105− category: "desktop"
138+ primaryOrientation: root.useNativeOrientation
106 supportedOrientations: root.useNativeOrientation
139 supportedOrientations: root.useNativeOrientation
140+ landscapeOrientation: Qt.LandscapeOrientation
141+ invertedLandscapeOrientation: Qt.InvertedLandscapeOrientation
142+ portraitOrientation: Qt.PortraitOrientation
143+ invertedPortraitOrientation: Qt.InvertedPortraitOrientation
144+ category: "desktop"
107 }
145 }
108 }
146 }
109 ]
147 ]
qml/DisabledScreenNotice.qml+44−20
@@ -17,6 +17,7 @@
17import QtQuick 2.4
17import QtQuick 2.4
18import QtQuick.Layouts 1.1
18import QtQuick.Layouts 1.1
19import Ubuntu.Components 1.3
19import Ubuntu.Components 1.3
20+import Unity.Session 0.1
20import QtQuick.Window 2.2
21import QtQuick.Window 2.2
21import "Components"
22import "Components"
22
23
@@ -25,19 +26,36 @@ Item {
25
26
26 property bool infoNoteDisplayed: true
27 property bool infoNoteDisplayed: true
27
28
28− WallpaperResolver {
29+ // For testing
29− width: root.width
30+ property var screen: Screen
30− id: wallpaperResolver
31+ property var orientationLock: OrientationLock
32+
33+ DeviceConfiguration {
34+ id: deviceConfiguration
35+ name: applicationArguments.deviceName
31 }
36 }
32
37
33 Item {
38 Item {
34 id: contentContainer
39 id: contentContainer
40+ objectName: "contentContainer"
35 anchors.centerIn: parent
41 anchors.centerIn: parent
36 height: rotation == 90 || rotation == 270 ? parent.width : parent.height
42 height: rotation == 90 || rotation == 270 ? parent.width : parent.height
37 width: rotation == 90 || rotation == 270 ? parent.height : parent.width
43 width: rotation == 90 || rotation == 270 ? parent.height : parent.width
38
44
45+ property int savedOrientation: deviceConfiguration.primaryOrientation == deviceConfiguration.useNativeOrientation
46+ ? (root.width > root.height ? Qt.LandscapeOrientation : Qt.PortraitOrientation)
47+ : deviceConfiguration.primaryOrientation
48+
39 rotation: {
49 rotation: {
40− switch (Screen.orientation) {
50+ var usedOrientation = root.screen.orientation;
51+
52+ if (root.orientationLock.enabled) {
53+ usedOrientation = savedOrientation;
54+ }
55+
56+ savedOrientation = usedOrientation;
57+
58+ switch (usedOrientation) {
41 case Qt.PortraitOrientation:
59 case Qt.PortraitOrientation:
42 return 0;
60 return 0;
43 case Qt.LandscapeOrientation:
61 case Qt.LandscapeOrientation:
@@ -47,6 +65,8 @@ Item {
47 case Qt.InvertedLandscapeOrientation:
65 case Qt.InvertedLandscapeOrientation:
48 return 90;
66 return 90;
49 }
67 }
68+
69+ return 0;
50 }
70 }
51 transformOrigin: Item.Center
71 transformOrigin: Item.Center
52
72
@@ -60,9 +80,9 @@ Item {
60 }
80 }
61 }
81 }
62
82
63− Image {
83+ Rectangle {
64 anchors.fill: parent
84 anchors.fill: parent
65− source: wallpaperResolver.background
85+ color: "#3b3b3b"
66 }
86 }
67
87
68 Item {
88 Item {
@@ -74,22 +94,26 @@ Item {
74 UbuntuNumberAnimation { }
94 UbuntuNumberAnimation { }
75 }
95 }
76
96
77− Rectangle {
97+ Column {
78− anchors.fill: parent
79− color: "black"
80− opacity: 0.4
81− }
82−
83− Label {
84− id: text
85 anchors.centerIn: parent
98 anchors.centerIn: parent
86 width: parent.width - units.gu(8)
99 width: parent.width - units.gu(8)
100+ spacing: units.gu(4)
101+
102+ Label {
103+ id: text
87− text: i18n.tr("Your device is now connected to an external display. Use this screen as a touch pad to interact with the mouse.")
104+ text: i18n.tr("Your device is now connected to an external display. Use this screen as a touch pad to interact with the pointer.")
88− color: "white"
105+ color: "white"
89− horizontalAlignment: Text.AlignHCenter
106+ width: parent.width
90− verticalAlignment: Text.AlignVCenter
91− fontSize: "x-large"
107+ fontSize: "large"
92− wrapMode: Text.Wrap
108+ wrapMode: Text.Wrap
109+ }
110+ Icon {
111+ height: units.gu(8)
112+ width: height
113+ name: "input-touchpad-symbolic"
114+ color: "white"
115+ anchors.horizontalCenter: parent.horizontalCenter
116+ }
93 }
117 }
94 }
118 }
95
119
qml/Greeter/CoverPage.qml+13−2
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013,2014,2015 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -34,6 +34,7 @@ Showable {
34 readonly property real showProgress: MathUtils.clamp((width - Math.abs(x)) / width, 0, 1)
34 readonly property real showProgress: MathUtils.clamp((width - Math.abs(x)) / width, 0, 1)
35
35
36 signal tease()
36 signal tease()
37+ signal clicked()
37
38
38 function hideRight() {
39 function hideRight() {
39 d.forceRightOnNextHideAnimation = true;
40 d.forceRightOnNextHideAnimation = true;
@@ -55,7 +56,17 @@ Showable {
55 // instead, we can get a little extra horizontal push by using transforms.
56 // instead, we can get a little extra horizontal push by using transforms.
56 transform: Translate { id: translation; x: root.draggable ? launcherOffset : 0 }
57 transform: Translate { id: translation; x: root.draggable ? launcherOffset : 0 }
57
58
59+ // Eat events elsewhere on the coverpage, except mouse clicks which we pass
60+ // up (they are used in the NarrowView to hide the cover page)
61+ MouseArea {
62+ anchors.fill: parent
63+ onClicked: root.clicked()
64+
65+ MultiPointTouchArea {
58− MouseArea { anchors.fill: parent; }
66+ anchors.fill: parent
67+ mouseEnabled: false
68+ }
69+ }
59
70
60 Rectangle {
71 Rectangle {
61 // In case background fails to load
72 // In case background fails to load
qml/Greeter/Infographics.qml+2−1
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -402,6 +402,7 @@ Item {
402
402
403 MouseArea {
403 MouseArea {
404 anchors.fill: dataCircle
404 anchors.fill: dataCircle
405+ enabled: notification.text != ""
405
406
406 onDoubleClicked: {
407 onDoubleClicked: {
407 if (!d.animating) {
408 if (!d.animating) {
qml/Greeter/NarrowView.qml+14−1
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -125,6 +125,18 @@ FocusScope {
125 onCancel: coverPage.show()
125 onCancel: coverPage.show()
126 onEmergencyCall: root.emergencyCall()
126 onEmergencyCall: root.emergencyCall()
127
127
128+ onEnabledChanged: {
129+ if (enabled) {
130+ lockscreen.forceActiveFocus();
131+ }
132+ }
133+
134+ onVisibleChanged: {
135+ if (visible) {
136+ lockscreen.forceActiveFocus();
137+ }
138+ }
139+
128 function maybeShow() {
140 function maybeShow() {
129 if (root.locked && !shown) {
141 if (root.locked && !shown) {
130 showNow();
142 showNow();
@@ -145,6 +157,7 @@ FocusScope {
145 width: parent.width
157 width: parent.width
146 background: root.background
158 background: root.background
147 onTease: root.tease()
159 onTease: root.tease()
160+ onClicked: hide()
148
161
149 onShowProgressChanged: {
162 onShowProgressChanged: {
150 if (showProgress === 1) {
163 if (showProgress === 1) {
qml/Launcher/Launcher.qml+144−11
@@ -19,21 +19,26 @@ import "../Components"
19import Ubuntu.Components 1.3
19import Ubuntu.Components 1.3
20import Ubuntu.Gestures 0.1
20import Ubuntu.Gestures 0.1
21import Unity.Launcher 0.1
21import Unity.Launcher 0.1
22+import GlobalShortcut 1.0
22
23
23−Item {
24+FocusScope {
24 id: root
25 id: root
25
26
26 property bool autohideEnabled: false
27 property bool autohideEnabled: false
28+ property bool lockedVisible: false
27 property bool available: true // can be used to disable all interactions
29 property bool available: true // can be used to disable all interactions
28 property alias inverted: panel.inverted
30 property alias inverted: panel.inverted
29 property bool shadeBackground: true // can be used to disable background shade when launcher is visible
31 property bool shadeBackground: true // can be used to disable background shade when launcher is visible
30
32
31− property int panelWidth: units.gu(8)
33+ property int panelWidth: units.gu(10)
32 property int dragAreaWidth: units.gu(1)
34 property int dragAreaWidth: units.gu(1)
33 property int minimizeDistance: units.gu(26)
35 property int minimizeDistance: units.gu(26)
34 property real progress: dragArea.dragging && dragArea.touchX > panelWidth ?
36 property real progress: dragArea.dragging && dragArea.touchX > panelWidth ?
35 (width * (dragArea.touchX-panelWidth) / (width - panelWidth)) : 0
37 (width * (dragArea.touchX-panelWidth) / (width - panelWidth)) : 0
36
38
39+ property bool superPressed: false
40+ property bool superTabPressed: false
41+
37 readonly property bool dragging: dragArea.dragging
42 readonly property bool dragging: dragArea.dragging
38 readonly property real dragDistance: dragArea.dragging ? dragArea.touchX : 0
43 readonly property real dragDistance: dragArea.dragging ? dragArea.touchX : 0
39 readonly property real visibleWidth: panel.width + panel.x
44 readonly property real visibleWidth: panel.width + panel.x
@@ -57,12 +62,55 @@ Item {
57 }
62 }
58 }
63 }
59
64
65+ onSuperPressedChanged: {
66+ if (superPressed) {
67+ superPressTimer.start();
68+ superLongPressTimer.start();
69+ } else {
70+ superPressTimer.stop();
71+ superLongPressTimer.stop();
72+ launcher.switchToNextState("");
73+ panel.shortcutHintsShown = false;
74+ }
75+ }
76+
77+ onSuperTabPressedChanged: {
78+ if (superTabPressed) {
79+ switchToNextState("visible")
80+ panel.highlightIndex = -1;
81+ root.focus = true;
82+ superPressTimer.stop();
83+ superLongPressTimer.stop();
84+ } else {
85+ if (panel.highlightIndex == -1) {
86+ showDashHome();
87+ } else if (panel.highlightIndex >= 0){
88+ launcherApplicationSelected(LauncherModel.get(panel.highlightIndex).appId);
89+ }
90+ panel.highlightIndex = -2;
91+ switchToNextState("");
92+ root.focus = false;
93+ }
94+ }
95+
96+ onLockedVisibleChanged: {
97+ if (lockedVisible && state == "") {
98+ panel.dismissTimer.stop();
99+ fadeOutAnimation.stop();
100+ switchToNextState("visible")
101+ } else if (!lockedVisible && state == "visible") {
102+ hide();
103+ }
104+ }
105+
60 function hide() {
106 function hide() {
61 switchToNextState("")
107 switchToNextState("")
62 }
108 }
63
109
64 function fadeOut() {
110 function fadeOut() {
111+ if (!root.lockedVisible) {
65− fadeOutAnimation.start();
112+ fadeOutAnimation.start();
113+ }
66 }
114 }
67
115
68 function switchToNextState(state) {
116 function switchToNextState(state) {
@@ -90,6 +138,77 @@ Item {
90 }
138 }
91 }
139 }
92
140
141+ function openForKeyboardNavigation() {
142+ panel.highlightIndex = -1; // The BFB
143+ root.focus = true;
144+ switchToNextState("visible")
145+ }
146+
147+ Keys.onPressed: {
148+ switch (event.key) {
149+ case Qt.Key_Backtab:
150+ panel.highlightPrevious();
151+ event.accepted = true;
152+ break;
153+ case Qt.Key_Up:
154+ if (root.inverted) {
155+ panel.highlightNext()
156+ } else {
157+ panel.highlightPrevious();
158+ }
159+ event.accepted = true;
160+ break;
161+ case Qt.Key_Tab:
162+ panel.highlightNext();
163+ event.accepted = true;
164+ break;
165+ case Qt.Key_Down:
166+ if (root.inverted) {
167+ panel.highlightPrevious();
168+ } else {
169+ panel.highlightNext();
170+ }
171+ event.accepted = true;
172+ break;
173+ case Qt.Key_Right:
174+ panel.openQuicklist(panel.highlightIndex)
175+ event.accepted = true;
176+ break;
177+ case Qt.Key_Escape:
178+ panel.highlightIndex = -2;
179+ // Falling through intentionally
180+ case Qt.Key_Enter:
181+ case Qt.Key_Return:
182+ case Qt.Key_Space:
183+ if (panel.highlightIndex == -1) {
184+ showDashHome();
185+ } else if (panel.highlightIndex >= 0) {
186+ launcherApplicationSelected(LauncherModel.get(panel.highlightIndex).appId);
187+ }
188+ root.hide();
189+ panel.highlightIndex = -2
190+ event.accepted = true;
191+ root.focus = false;
192+ }
193+ }
194+
195+ Timer {
196+ id: superPressTimer
197+ interval: 200
198+ onTriggered: {
199+ switchToNextState("visible")
200+ }
201+ }
202+
203+ Timer {
204+ id: superLongPressTimer
205+ interval: 1000
206+ onTriggered: {
207+ switchToNextState("visible")
208+ panel.shortcutHintsShown = true;
209+ }
210+ }
211+
93 Timer {
212 Timer {
94 id: teaseTimer
213 id: teaseTimer
95 interval: mode == "teasing" ? 200 : 300
214 interval: mode == "teasing" ? 200 : 300
@@ -106,6 +225,13 @@ Item {
106 interval: 1
225 interval: 1
107 property string nextState: ""
226 property string nextState: ""
108 onTriggered: {
227 onTriggered: {
228+ if (root.lockedVisible && nextState == "") {
229+ // Due to binding updates when switching between modes
230+ // it could happen that our request to show will be overwritten
231+ // with a hide request. Rewrite it when we know hiding is not allowed.
232+ nextState = "visible"
233+ }
234+
109 // switching to an intermediate state here to make sure all the
235 // switching to an intermediate state here to make sure all the
110 // values are restored, even if we were already in the target state
236 // values are restored, even if we were already in the target state
111 root.state = "tmp"
237 root.state = "tmp"
@@ -151,7 +277,7 @@ Item {
151
277
152 MouseArea {
278 MouseArea {
153 id: launcherDragArea
279 id: launcherDragArea
154− enabled: root.available && (root.state == "visible" || root.state == "visibleTemporary")
280+ enabled: root.available && (root.state == "visible" || root.state == "visibleTemporary") && !root.lockedVisible
155 anchors.fill: panel
281 anchors.fill: panel
156 anchors.rightMargin: -units.gu(2)
282 anchors.rightMargin: -units.gu(2)
157 drag {
283 drag {
@@ -172,9 +298,10 @@ Item {
172 InverseMouseArea {
298 InverseMouseArea {
173 id: closeMouseArea
299 id: closeMouseArea
174 anchors.fill: panel
300 anchors.fill: panel
175− enabled: root.shadeBackground && root.state == "visible"
301+ enabled: root.shadeBackground && root.state == "visible" && (!root.lockedVisible || panel.highlightIndex >= -1)
176 visible: enabled
302 visible: enabled
177 onPressed: {
303 onPressed: {
304+ panel.highlightIndex = -2
178 root.hide();
305 root.hide();
179 }
306 }
180 }
307 }
@@ -183,7 +310,7 @@ Item {
183 id: backgroundShade
310 id: backgroundShade
184 anchors.fill: parent
311 anchors.fill: parent
185 color: "black"
312 color: "black"
186− opacity: root.shadeBackground && root.state == "visible" ? 0.6 : 0
313+ opacity: root.shadeBackground && root.state == "visible" && !root.lockedVisible ? 0.6 : 0
187
314
188 Behavior on opacity { NumberAnimation { duration: UbuntuAnimation.BriskDuration } }
315 Behavior on opacity { NumberAnimation { duration: UbuntuAnimation.BriskDuration } }
189 }
316 }
@@ -202,8 +329,8 @@ Item {
202 rotation: -90
329 rotation: -90
203 anchors.centerIn: parent
330 anchors.centerIn: parent
204 gradient: Gradient {
331 gradient: Gradient {
205− GradientStop { position: 0.0; color: panel.color}
332+ GradientStop { position: 0.0; color: Qt.rgba(panel.color.r, panel.color.g, panel.color.b, .5)}
206− GradientStop { position: 1.0; color: Qt.rgba(panel.r,panel.g,panel.b,0)}
333+ GradientStop { position: 1.0; color: Qt.rgba(panel.color.r,panel.color.g,panel.color.b,0)}
207 }
334 }
208 }
335 }
209 }
336 }
@@ -227,7 +354,7 @@ Item {
227 Connections {
354 Connections {
228 target: panel.dismissTimer
355 target: panel.dismissTimer
229 onTriggered: {
356 onTriggered: {
230− if (root.autohideEnabled) {
357+ if (root.autohideEnabled && !root.lockedVisible) {
231 if (!panel.preventHiding) {
358 if (!panel.preventHiding) {
232 root.state = ""
359 root.state = ""
233 } else {
360 } else {
@@ -240,11 +367,11 @@ Item {
240 property bool animate: true
367 property bool animate: true
241
368
242 onApplicationSelected: {
369 onApplicationSelected: {
243− root.state = ""
370+ root.hide();
244 launcherApplicationSelected(appId)
371 launcherApplicationSelected(appId)
245 }
372 }
246 onShowDashHome: {
373 onShowDashHome: {
247− root.state = ""
374+ root.hide();
248 root.showDashHome();
375 root.showDashHome();
249 }
376 }
250
377
@@ -254,6 +381,12 @@ Item {
254 }
381 }
255 }
382 }
256
383
384+ onKbdNavigationCancelled: {
385+ panel.highlightIndex = -2;
386+ root.hide();
387+ root.focus = false;
388+ }
389+
257 Behavior on x {
390 Behavior on x {
258 enabled: !dragArea.dragging && !launcherDragArea.drag.active && panel.animate;
391 enabled: !dragArea.dragging && !launcherDragArea.drag.active && panel.animate;
259 NumberAnimation {
392 NumberAnimation {
qml/Launcher/LauncherDelegate.qml+55−20
@@ -20,6 +20,7 @@ import Ubuntu.Components 1.3
20Item {
20Item {
21 id: root
21 id: root
22
22
23+ property int itemIndex: 0
23 property string iconName
24 property string iconName
24 property int count: 0
25 property int count: 0
25 property bool countVisible: false
26 property bool countVisible: false
@@ -29,10 +30,12 @@ Item {
29 property real maxAngle: 0
30 property real maxAngle: 0
30 property bool inverted: false
31 property bool inverted: false
31 property bool alerting: false
32 property bool alerting: false
32− readonly property alias wiggling: wiggleAnim.running
33+ property bool highlighted: false
34+ property bool shortcutHintShown: false
33
35
34 readonly property int effectiveHeight: Math.cos(angle * Math.PI / 180) * itemHeight
36 readonly property int effectiveHeight: Math.cos(angle * Math.PI / 180) * itemHeight
35 readonly property real foldedHeight: Math.cos(maxAngle * Math.PI / 180) * itemHeight
37 readonly property real foldedHeight: Math.cos(maxAngle * Math.PI / 180) * itemHeight
38+ readonly property alias wiggling: wiggleAnim.running
36
39
37 property int itemWidth
40 property int itemWidth
38 property int itemHeight
41 property int itemHeight
@@ -121,20 +124,32 @@ Item {
121
124
122 Item {
125 Item {
123 id: iconItem
126 id: iconItem
124− width: parent.itemWidth + units.gu(1)
127+ width: root.width
125 height: parent.itemHeight + units.gu(1)
128 height: parent.itemHeight + units.gu(1)
126 anchors.centerIn: parent
129 anchors.centerIn: parent
127
130
131+ Image {
132+ objectName: "focusRing"
133+ anchors.centerIn: iconShape
134+ height: width * 15 / 16
135+ width: iconShape.width + units.gu(1)
136+ source: "graphics/launcher-app-focus-ring.svg"
137+ sourceSize.width: width
138+ sourceSize.height: height
139+ visible: root.highlighted
140+ }
141+
128 ProportionalShape {
142 ProportionalShape {
129 id: iconShape
143 id: iconShape
130 anchors.centerIn: parent
144 anchors.centerIn: parent
131− width: parent.width - units.gu(2)
145+ width: root.itemWidth
132 aspect: UbuntuShape.DropShadow
146 aspect: UbuntuShape.DropShadow
133 source: Image {
147 source: Image {
134 id: iconImage
148 id: iconImage
135 sourceSize.width: iconShape.width
149 sourceSize.width: iconShape.width
136 sourceSize.height: iconShape.height
150 sourceSize.height: iconShape.height
137 source: root.iconName
151 source: root.iconName
152+ cache: false // see lpbug#1543290 why no cache
138 }
153 }
139 }
154 }
140
155
@@ -144,7 +159,8 @@ Item {
144 anchors {
159 anchors {
145 right: parent.right
160 right: parent.right
146 bottom: parent.bottom
161 bottom: parent.bottom
162+ rightMargin: (iconItem.width - root.itemWidth) / 2 - units.dp(2)
147− margins: units.dp(3)
163+ margins: units.dp(5)
148 }
164 }
149 width: Math.min(root.itemWidth, Math.max(units.gu(2), countLabel.implicitWidth + units.gu(1)))
165 width: Math.min(root.itemWidth, Math.max(units.gu(2), countLabel.implicitWidth + units.gu(1)))
150 height: units.gu(2)
166 height: units.gu(2)
@@ -172,16 +188,11 @@ Item {
172 id: progressOverlay
188 id: progressOverlay
173 objectName: "progressOverlay"
189 objectName: "progressOverlay"
174
190
175− anchors {
191+ anchors.centerIn: parent
176− left: iconItem.left
192+ width: root.itemWidth * .8
177− right: iconItem.right
178− verticalCenter: parent.verticalCenter
179− leftMargin: units.gu(1.5)
180− rightMargin: units.gu(1.5)
181− }
182 height: units.gu(1)
193 height: units.gu(1)
183 visible: root.progress > -1
194 visible: root.progress > -1
184− color: UbuntuColors.darkGrey
195+ backgroundColor: UbuntuColors.darkGrey
185 borderSource: "none"
196 borderSource: "none"
186
197
187 Item {
198 Item {
@@ -199,32 +210,56 @@ Item {
199 top: parent.top
210 top: parent.top
200 bottom: parent.bottom
211 bottom: parent.bottom
201 }
212 }
202− color: "white"
213+ backgroundColor: "white"
203 borderSource: "none"
214 borderSource: "none"
204 width: progressOverlay.width
215 width: progressOverlay.width
205 }
216 }
206 }
217 }
207 }
218 }
208
219
209− Image {
220+ Column {
210− objectName: "runningHighlight"
211 anchors {
221 anchors {
212 left: parent.left
222 left: parent.left
213 verticalCenter: parent.verticalCenter
223 verticalCenter: parent.verticalCenter
214 }
224 }
225+ spacing: units.gu(.5)
226+ Repeater {
227+ model: 1 // TODO: This should be "Math.min(3, app.surfaceCount)" once we have multiple surfaces
228+ Rectangle {
229+ objectName: "runningHighlight" + index
230+ width: units.gu(0.25)
231+ height: units.gu(.5)
232+ color: "white"
215− visible: root.itemRunning
233+ visible: root.itemRunning
216− rotation: 180
234+ }
217− source: "graphics/focused_app_arrow.png"
235+ }
218 }
236 }
219
237
220− Image {
238+ Rectangle {
221 objectName: "focusedHighlight"
239 objectName: "focusedHighlight"
222 anchors {
240 anchors {
223 right: parent.right
241 right: parent.right
224 verticalCenter: parent.verticalCenter
242 verticalCenter: parent.verticalCenter
225 }
243 }
244+ width: units.gu(0.25)
245+ height: units.gu(.5)
246+ color: "white"
226 visible: root.itemFocused
247 visible: root.itemFocused
227− source: "graphics/focused_app_arrow.png"
248+ }
249+
250+ Rectangle {
251+ objectName: "shortcutHint"
252+ anchors.centerIn: parent
253+ width: units.gu(3)
254+ height: width
255+ color: "#E0292929"
256+ visible: root.shortcutHintShown
257+ Label {
258+ anchors.centerIn: parent
259+ text: (itemIndex + 1) % 10
260+ color: "white"
261+ font.weight: Font.DemiBold
262+ }
228 }
263 }
229 }
264 }
230
265
qml/Launcher/LauncherPanel.qml+122−51
@@ -19,12 +19,13 @@ import Ubuntu.Components 1.3
19import Ubuntu.Components.ListItems 1.3 as ListItems
19import Ubuntu.Components.ListItems 1.3 as ListItems
20import Unity.Launcher 0.1
20import Unity.Launcher 0.1
21import Ubuntu.Components.Popups 1.3
21import Ubuntu.Components.Popups 1.3
22+import GlobalShortcut 1.0
22import "../Components/ListItems"
23import "../Components/ListItems"
23import "../Components/"
24import "../Components/"
24
25
25Rectangle {
26Rectangle {
26 id: root
27 id: root
27− color: "#B2000000"
28+ color: "#E0292929"
28
29
29 rotation: inverted ? 180 : 0
30 rotation: inverted ? 180 : 0
30
31
@@ -33,11 +34,13 @@ Rectangle {
33 property bool dragging: false
34 property bool dragging: false
34 property bool moving: launcherListView.moving || launcherListView.flicking
35 property bool moving: launcherListView.moving || launcherListView.flicking
35 property bool preventHiding: moving || dndArea.draggedIndex >= 0 || quickList.state === "open" || dndArea.pressed
36 property bool preventHiding: moving || dndArea.draggedIndex >= 0 || quickList.state === "open" || dndArea.pressed
36− || mouseEventEater.containsMouse || dashItem.hovered
37+ || mouseEventEater.containsMouse || dashItem.hovered
37− property int highlightIndex: -1
38+ property int highlightIndex: -2
39+ property bool shortcutHintsShown: false
38
40
39 signal applicationSelected(string appId)
41 signal applicationSelected(string appId)
40 signal showDashHome()
42 signal showDashHome()
43+ signal kbdNavigationCancelled()
41
44
42 onXChanged: {
45 onXChanged: {
43 if (quickList.state == "open") {
46 if (quickList.state == "open") {
@@ -45,6 +48,26 @@ Rectangle {
45 }
48 }
46 }
49 }
47
50
51+ function highlightNext() {
52+ highlightIndex++;
53+ if (highlightIndex >= launcherListView.count) {
54+ highlightIndex = -1;
55+ }
56+ launcherListView.moveToIndex(Math.max(highlightIndex, 0));
57+ }
58+ function highlightPrevious() {
59+ highlightIndex--;
60+ if (highlightIndex <= -2) {
61+ highlightIndex = launcherListView.count - 1;
62+ }
63+ launcherListView.moveToIndex(Math.max(highlightIndex, 0));
64+ }
65+ function openQuicklist(index) {
66+ quickList.open(index);
67+ quickList.selectedIndex = 0;
68+ quickList.focus = true;
69+ }
70+
48 MouseArea {
71 MouseArea {
49 id: mouseEventEater
72 id: mouseEventEater
50 anchors.fill: parent
73 anchors.fill: parent
@@ -57,24 +80,16 @@ Rectangle {
57 fill: parent
80 fill: parent
58 }
81 }
59
82
60− Item {
83+ Rectangle {
61 objectName: "buttonShowDashHome"
84 objectName: "buttonShowDashHome"
62 width: parent.width
85 width: parent.width
63− height: units.gu(7)
86+ height: width * .9
64− clip: true
65−
66− UbuntuShape {
67− anchors {
68− fill: parent
69− topMargin: -units.gu(2)
70− }
71− aspect: UbuntuShape.Flat
72− backgroundColor: UbuntuColors.orange
87+ color: UbuntuColors.orange
73− }
88+ readonly property bool highlighted: root.highlightIndex == -1;
74
89
75 Image {
90 Image {
76 objectName: "dashItem"
91 objectName: "dashItem"
77− width: units.gu(5)
92+ width: parent.width * .6
78 height: width
93 height: width
79 anchors.centerIn: parent
94 anchors.centerIn: parent
80 source: "graphics/home.png"
95 source: "graphics/home.png"
@@ -85,6 +100,14 @@ Rectangle {
85 anchors.fill: parent
100 anchors.fill: parent
86 onClicked: root.showDashHome()
101 onClicked: root.showDashHome()
87 }
102 }
103+ Rectangle {
104+ objectName: "bfbFocusHighlight"
105+ anchors.fill: parent
106+ border.color: "white"
107+ border.width: units.dp(1)
108+ color: "transparent"
109+ visible: parent.highlighted
110+ }
88 }
111 }
89
112
90 Item {
113 Item {
@@ -102,10 +125,8 @@ Rectangle {
102 objectName: "launcherListView"
125 objectName: "launcherListView"
103 anchors {
126 anchors {
104 fill: parent
127 fill: parent
105− topMargin: -extensionSize + units.gu(0.5)
128+ topMargin: -extensionSize + width * .15
106− bottomMargin: -extensionSize + units.gu(1)
129+ bottomMargin: -extensionSize + width * .15
107− leftMargin: units.gu(0.5)
108− rightMargin: units.gu(0.5)
109 }
130 }
110 topMargin: extensionSize
131 topMargin: extensionSize
111 bottomMargin: extensionSize
132 bottomMargin: extensionSize
@@ -140,11 +161,11 @@ Rectangle {
140 }
161 }
141
162
142 // The height of the area where icons start getting folded
163 // The height of the area where icons start getting folded
143− property int foldingStartHeight: units.gu(6.5)
164+ property int foldingStartHeight: itemHeight
144 // The height of the area where the items reach the final folding angle
165 // The height of the area where the items reach the final folding angle
145 property int foldingStopHeight: foldingStartHeight - itemHeight - spacing
166 property int foldingStopHeight: foldingStartHeight - itemHeight - spacing
146− property int itemWidth: units.gu(7)
167+ property int itemWidth: width * .75
147− property int itemHeight: units.gu(6.5)
168+ property int itemHeight: itemWidth * 15 / 16 + units.gu(1)
148 property int clickFlickSpeed: units.gu(60)
169 property int clickFlickSpeed: units.gu(60)
149 property int draggedIndex: dndArea.draggedIndex
170 property int draggedIndex: dndArea.draggedIndex
150 property real realContentY: contentY - originY + topMargin
171 property real realContentY: contentY - originY + topMargin
@@ -172,12 +193,24 @@ Rectangle {
172
193
173 UbuntuNumberAnimation {
194 UbuntuNumberAnimation {
174 id: moveAnimation
195 id: moveAnimation
196+ objectName: "moveAnimation"
175 target: launcherListView
197 target: launcherListView
176 property: "contentY"
198 property: "contentY"
177 function moveTo(contentY) {
199 function moveTo(contentY) {
178 from = launcherListView.contentY;
200 from = launcherListView.contentY;
179 to = contentY;
201 to = contentY;
180− start();
202+ restart();
203+ }
204+ }
205+ function moveToIndex(index) {
206+ var totalItemHeight = launcherListView.itemHeight + launcherListView.spacing
207+ var itemPosition = index * totalItemHeight;
208+ var height = launcherListView.height - launcherListView.topMargin - launcherListView.bottomMargin
209+ var distanceToEnd = index == 0 || index == launcherListView.count - 1 ? 0 : totalItemHeight
210+ if (itemPosition + totalItemHeight + distanceToEnd > launcherListView.contentY + launcherListView.originY + launcherListView.topMargin + height) {
211+ moveAnimation.moveTo(itemPosition + launcherListView.itemHeight - launcherListView.topMargin - height + distanceToEnd - launcherListView.originY);
212+ } else if (itemPosition - distanceToEnd < launcherListView.contentY - launcherListView.originY + launcherListView.topMargin) {
213+ moveAnimation.moveTo(itemPosition - distanceToEnd - launcherListView.topMargin + launcherListView.originY);
181 }
214 }
182 }
215 }
183
216
@@ -192,9 +225,10 @@ Rectangle {
192 // the right app when running autopilot tests for
225 // the right app when running autopilot tests for
193 // multiple apps.
226 // multiple apps.
194 readonly property string appId: model.appId
227 readonly property string appId: model.appId
228+ itemIndex: index
195 itemHeight: launcherListView.itemHeight
229 itemHeight: launcherListView.itemHeight
196 itemWidth: launcherListView.itemWidth
230 itemWidth: launcherListView.itemWidth
197− width: itemWidth
231+ width: parent.width
198 height: itemHeight
232 height: itemHeight
199 iconName: model.icon
233 iconName: model.icon
200 count: model.count
234 count: model.count
@@ -204,6 +238,8 @@ Rectangle {
204 itemFocused: model.focused
238 itemFocused: model.focused
205 inverted: root.inverted
239 inverted: root.inverted
206 alerting: model.alerting
240 alerting: model.alerting
241+ highlighted: root.highlightIndex == index
242+ shortcutHintShown: root.shortcutHintsShown && index <= 9
207 z: -Math.abs(offset)
243 z: -Math.abs(offset)
208 maxAngle: 55
244 maxAngle: 55
209 property bool dragging: false
245 property bool dragging: false
@@ -241,14 +277,7 @@ Rectangle {
241 onAlertingChanged: {
277 onAlertingChanged: {
242 if(alerting) {
278 if(alerting) {
243 if (!dragging && (launcherListView.peekingIndex === -1 || launcher.visibleWidth > 0)) {
279 if (!dragging && (launcherListView.peekingIndex === -1 || launcher.visibleWidth > 0)) {
244− var itemPosition = index * launcherListView.itemHeight;
280+ launcherListView.moveToIndex(index)
245− var height = launcherListView.height - launcherListView.topMargin - launcherListView.bottomMargin
246− var distanceToEnd = index == 0 || index == launcherListView.count - 1 ? 0 : launcherListView.itemHeight
247− if (itemPosition + launcherListView.itemHeight + distanceToEnd > launcherListView.contentY + launcherListView.topMargin + height) {
248− moveAnimation.moveTo(itemPosition + launcherListView.itemHeight - launcherListView.topMargin - height + distanceToEnd);
249− } else if (itemPosition - distanceToEnd < launcherListView.contentY + launcherListView.topMargin) {
250− moveAnimation.moveTo(itemPosition - distanceToEnd - launcherListView.topMargin);
251− }
252 if (!dragging && launcher.state !== "visible") {
281 if (!dragging && launcher.state !== "visible") {
253 peekingAnimation.start()
282 peekingAnimation.start()
254 }
283 }
@@ -402,10 +431,7 @@ Rectangle {
402
431
403 if (mouse.button & Qt.RightButton) { // context menu
432 if (mouse.button & Qt.RightButton) { // context menu
404 // Opening QuickList
433 // Opening QuickList
405− quickList.item = clickedItem;
434+ quickList.open(index);
406− quickList.model = launcherListView.model.get(index).quickList;
407− quickList.appId = launcherListView.model.get(index).appId;
408− quickList.state = "open";
409 return;
435 return;
410 }
436 }
411
437
@@ -413,10 +439,8 @@ Rectangle {
413
439
414 // First/last item do the scrolling at more than 12 degrees
440 // First/last item do the scrolling at more than 12 degrees
415 if (index == 0 || index == launcherListView.count - 1) {
441 if (index == 0 || index == launcherListView.count - 1) {
416− if (clickedItem.angle > 12) {
442+ if (clickedItem.angle > 12 || clickedItem.angle < -12) {
417− launcherListView.flick(0, -launcherListView.clickFlickSpeed);
443+ launcherListView.moveToIndex(index);
418− } else if (clickedItem.angle < -12) {
419− launcherListView.flick(0, launcherListView.clickFlickSpeed);
420 } else {
444 } else {
421 root.applicationSelected(LauncherModel.get(index).appId);
445 root.applicationSelected(LauncherModel.get(index).appId);
422 }
446 }
@@ -424,10 +448,8 @@ Rectangle {
424 }
448 }
425
449
426 // the rest launches apps up to an angle of 30 degrees
450 // the rest launches apps up to an angle of 30 degrees
427− if (clickedItem.angle > 30) {
451+ if (clickedItem.angle > 30 || clickedItem.angle < -30) {
428− launcherListView.flick(0, -launcherListView.clickFlickSpeed);
452+ launcherListView.moveToIndex(index);
429− } else if (clickedItem.angle < -30) {
430− launcherListView.flick(0, launcherListView.clickFlickSpeed);
431 } else {
453 } else {
432 root.applicationSelected(LauncherModel.get(index).appId);
454 root.applicationSelected(LauncherModel.get(index).appId);
433 }
455 }
@@ -481,11 +503,7 @@ Rectangle {
481
503
482 draggedIndex = Math.floor((mouse.y + launcherListView.realContentY) / launcherListView.realItemHeight);
504 draggedIndex = Math.floor((mouse.y + launcherListView.realContentY) / launcherListView.realItemHeight);
483
505
484− // Opening QuickList
485− quickList.item = selectedItem;
486− quickList.model = launcherListView.model.get(draggedIndex).quickList;
487− quickList.appId = launcherListView.model.get(draggedIndex).appId;
488− quickList.state = "open";
506+ quickList.open(draggedIndex)
489
507
490 launcherListView.interactive = false
508 launcherListView.interactive = false
491
509
@@ -644,7 +662,9 @@ Rectangle {
644 enabled: quickList.state == "open" || pressed
662 enabled: quickList.state == "open" || pressed
645
663
646 onClicked: {
664 onClicked: {
647− quickList.state = ""
665+ quickList.state = "";
666+ quickList.focus = false;
667+ root.kbdNavigationCancelled();
648 }
668 }
649
669
650 // Forward for dragging to work when quickList is open
670 // Forward for dragging to work when quickList is open
@@ -693,12 +713,60 @@ Rectangle {
693 property var model
713 property var model
694 property string appId
714 property string appId
695 property var item
715 property var item
716+ property int selectedIndex: -1
717+
718+ Keys.onPressed: {
719+ switch (event.key) {
720+ case Qt.Key_Down:
721+ selectedIndex++;
722+ if (selectedIndex >= popoverRepeater.count) {
723+ selectedIndex = 0;
724+ }
725+ event.accepted = true;
726+ break;
727+ case Qt.Key_Up:
728+ selectedIndex--;
729+ if (selectedIndex < 0) {
730+ selectedIndex = popoverRepeater.count - 1;
731+ }
732+ event.accepted = true;
733+ break;
734+ case Qt.Key_Left:
735+ case Qt.Key_Escape:
736+ quickList.selectedIndex = -1;
737+ quickList.focus = false;
738+ quickList.state = ""
739+ event.accepted = true;
740+ break;
741+ case Qt.Key_Enter:
742+ case Qt.Key_Return:
743+ case Qt.Key_Space:
744+ if (quickList.selectedIndex >= 0) {
745+ LauncherModel.quickListActionInvoked(quickList.appId, quickList.selectedIndex)
746+ }
747+ quickList.selectedIndex = -1;
748+ quickList.focus = false;
749+ quickList.state = ""
750+ root.kbdNavigationCancelled();
751+ event.accepted = true;
752+ break;
753+ }
754+ }
696
755
697 // internal
756 // internal
698 property int itemCenter: item ? root.mapFromItem(quickList.item).y + (item.height / 2) + quickList.item.offset : units.gu(1)
757 property int itemCenter: item ? root.mapFromItem(quickList.item).y + (item.height / 2) + quickList.item.offset : units.gu(1)
699 property int offset: itemCenter + (height/2) + units.gu(1) > parent.height ? -itemCenter - (height/2) - units.gu(1) + parent.height :
758 property int offset: itemCenter + (height/2) + units.gu(1) > parent.height ? -itemCenter - (height/2) - units.gu(1) + parent.height :
700 itemCenter - (height/2) < units.gu(1) ? (height/2) - itemCenter + units.gu(1) : 0
759 itemCenter - (height/2) < units.gu(1) ? (height/2) - itemCenter + units.gu(1) : 0
701
760
761+ function open(index) {
762+ var itemPosition = index * launcherListView.itemHeight;
763+ var height = launcherListView.height - launcherListView.topMargin - launcherListView.bottomMargin
764+ item = launcherListView.itemAt(launcherListView.width / 2, itemPosition + launcherListView.itemHeight / 2);
765+ quickList.model = launcherListView.model.get(index).quickList;
766+ quickList.appId = launcherListView.model.get(index).appId;
767+ quickList.state = "open";
768+ }
769+
702 Column {
770 Column {
703 id: quickListColumn
771 id: quickListColumn
704 width: parent.width
772 width: parent.width
@@ -712,6 +780,7 @@ Rectangle {
712 objectName: "quickListEntry" + index
780 objectName: "quickListEntry" + index
713 text: (model.clickable ? "" : "<b>") + model.label + (model.clickable ? "" : "</b>")
781 text: (model.clickable ? "" : "<b>") + model.label + (model.clickable ? "" : "</b>")
714 highlightWhenPressed: model.clickable
782 highlightWhenPressed: model.clickable
783+ selected: index === quickList.selectedIndex
715
784
716 // FIXME: This is a workaround for the theme not being context sensitive. I.e. the
785 // FIXME: This is a workaround for the theme not being context sensitive. I.e. the
717 // ListItems don't know that they are sitting in a themed Popover where the color
786 // ListItems don't know that they are sitting in a themed Popover where the color
@@ -727,6 +796,8 @@ Rectangle {
727 // Unsetting model to prevent showing changing entries during fading out
796 // Unsetting model to prevent showing changing entries during fading out
728 // that may happen because of triggering an action.
797 // that may happen because of triggering an action.
729 LauncherModel.quickListActionInvoked(quickList.appId, index);
798 LauncherModel.quickListActionInvoked(quickList.appId, index);
799+ quickList.focus = false;
800+ root.kbdNavigationCancelled();
730 quickList.model = undefined;
801 quickList.model = undefined;
731 }
802 }
732 }
803 }
qml/Launcher/graphics/launcher-app-focus-ring.svgnew file+12
@@ -0,0 +1,12 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<svg width="172px" height="163px" viewBox="0 0 172 163" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
3+ <!-- Generator: Sketch 3.4.4 (17249) - http://www.bohemiancoding.com/sketch -->
4+ <title>Shape</title>
5+ <desc>Created with Sketch.</desc>
6+ <defs></defs>
7+ <g id="•-Launcher" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
8+ <g id="Artboard-9" sketch:type="MSArtboardGroup" transform="translate(-163.000000, -1436.000000)" fill="#E95420">
9+ <path d="M221.983432,1440 L221.983432,1440 C195.6127,1440 184.708233,1442.4723 177.107949,1450.10734 C169.476819,1457.77336 167,1468.79245 167,1495.3481 L167,1538.9019 C167,1565.45755 169.476819,1576.47664 177.107949,1584.14266 C184.708233,1591.7777 195.6127,1594.25 221.983432,1594.25 L276.016868,1594.25 C302.387595,1594.25 313.291998,1591.77771 320.892221,1584.14264 C328.523252,1576.47663 331,1565.45769 331,1538.9019 L331,1495.3481 C331,1468.79231 328.523252,1457.77337 320.892221,1450.10736 C313.291998,1442.47229 302.387595,1440 276.016868,1440 L221.983432,1440 Z M221.983432,1436 L276.016868,1436 C302.345315,1436 314.848953,1438.36655 323.727108,1447.2854 C332.633306,1456.23243 335,1468.85167 335,1495.3481 L335,1538.9019 C335,1565.39833 332.633306,1578.01757 323.727108,1586.9646 C314.848953,1595.88345 302.345315,1598.25 276.016868,1598.25 L221.983432,1598.25 C195.654985,1598.25 183.151291,1595.88345 174.273077,1586.96463 C165.366772,1578.0176 163,1565.39822 163,1538.9019 L163,1495.3481 C163,1468.85178 165.366772,1456.2324 174.273077,1447.28537 C183.151291,1438.36655 195.654985,1436 221.983432,1436 L221.983432,1436 Z" id="Shape" sketch:type="MSShapeGroup"></path>
10+ </g>
11+ </g>
12+</svg>
qml/Notifications/Notification.qml+9−5
@@ -23,7 +23,7 @@ import QMenuModel 0.1
23import Utils 0.1
23import Utils 0.1
24import "../Components"
24import "../Components"
25
25
26−Item {
26+StyledItem {
27 id: notification
27 id: notification
28
28
29 property alias iconSource: icon.fileSource
29 property alias iconSource: icon.fileSource
@@ -58,6 +58,10 @@ Item {
58 color: (type === Notification.Confirmation && notificationList.useModal && !greeter.shown) || darkOnBright ? sdLightGrey : Qt.rgba(0.132, 0.117, 0.109, 0.97)
58 color: (type === Notification.Confirmation && notificationList.useModal && !greeter.shown) || darkOnBright ? sdLightGrey : Qt.rgba(0.132, 0.117, 0.109, 0.97)
59 opacity: 1 - (x / notification.width) // FIXME: non-zero initially because of LP: #1354406 workaround, we want this to start at 0 upon creation eventually
59 opacity: 1 - (x / notification.width) // FIXME: non-zero initially because of LP: #1354406 workaround, we want this to start at 0 upon creation eventually
60
60
61+ theme: ThemeSettings {
62+ name: "Ubuntu.Components.Themes.Ambiance"
63+ }
64+
61 state: {
65 state: {
62 var result = "";
66 var result = "";
63
67
@@ -281,7 +285,7 @@ Item {
281 }
285 }
282 visible: type !== Notification.Confirmation
286 visible: type !== Notification.Confirmation
283 fontSize: "medium"
287 fontSize: "medium"
284− color: darkOnBright ? sdFontColor : theme.palette.selected.backgroundText
288+ color: darkOnBright ? sdFontColor : theme.palette.normal.backgroundText
285 elide: Text.ElideRight
289 elide: Text.ElideRight
286 textFormat: Text.PlainText
290 textFormat: Text.PlainText
287 }
291 }
@@ -296,8 +300,8 @@ Item {
296 }
300 }
297 visible: body != "" && type !== Notification.Confirmation
301 visible: body != "" && type !== Notification.Confirmation
298 fontSize: "small"
302 fontSize: "small"
299− color: darkOnBright ? sdFontColor : theme.palette.selected.backgroundText
303+ color: darkOnBright ? sdFontColor : theme.palette.normal.backgroundText
300− wrapMode: Text.WordWrap
304+ wrapMode: Text.Wrap
301 maximumLineCount: type == Notification.SnapDecision ? 12 : 2
305 maximumLineCount: type == Notification.SnapDecision ? 12 : 2
302 elide: Text.ElideRight
306 elide: Text.ElideRight
303 textFormat: Text.PlainText
307 textFormat: Text.PlainText
@@ -337,7 +341,7 @@ Item {
337 anchors.horizontalCenter: parent.horizontalCenter
341 anchors.horizontalCenter: parent.horizontalCenter
338 visible: type === Notification.Confirmation && body !== ""
342 visible: type === Notification.Confirmation && body !== ""
339 fontSize: "medium"
343 fontSize: "medium"
340− color: darkOnBright ? sdFontColor : theme.palette.selected.backgroundText
344+ color: darkOnBright ? sdFontColor : theme.palette.normal.backgroundText
341 wrapMode: Text.WordWrap
345 wrapMode: Text.WordWrap
342 maximumLineCount: 1
346 maximumLineCount: 1
343 elide: Text.ElideRight
347 elide: Text.ElideRight
qml/OrientedShell.qml+26−1
@@ -19,6 +19,7 @@ import QtQuick.Window 2.2
19import Unity.InputInfo 0.1
19import Unity.InputInfo 0.1
20import Unity.Session 0.1
20import Unity.Session 0.1
21import Unity.Screens 0.1
21import Unity.Screens 0.1
22+import Utils 0.1
22import GSettings 1.0
23import GSettings 1.0
23import "Components"
24import "Components"
24import "Rotation"
25import "Rotation"
@@ -79,6 +80,8 @@ Rectangle {
79 InputDeviceModel {
80 InputDeviceModel {
80 id: keyboardsModel
81 id: keyboardsModel
81 deviceFilter: InputInfo.Keyboard
82 deviceFilter: InputInfo.Keyboard
83+ onDeviceAdded: forceOSKEnabled = autopilotDevicePresent();
84+ onDeviceRemoved: forceOSKEnabled = autopilotDevicePresent();
82 }
85 }
83
86
84 InputDeviceModel {
87 InputDeviceModel {
@@ -109,6 +112,27 @@ Rectangle {
109 touchPadModel.oldCount = touchPadModel.count;
112 touchPadModel.oldCount = touchPadModel.count;
110 }
113 }
111
114
115+ /* FIXME: This exposes the NameRole as a work arround for lp:1542224.
116+ * When QInputInfo exposes NameRole to QML, this should be removed.
117+ */
118+ property bool forceOSKEnabled: false
119+ property var autopilotEmulatedDeviceNames: ["py-evdev-uinput"]
120+ UnitySortFilterProxyModel {
121+ id: autopilotDevices
122+ model: keyboardsModel
123+ }
124+
125+ function autopilotDevicePresent() {
126+ for(var i = 0; i < autopilotDevices.count; i++) {
127+ var device = autopilotDevices.get(i);
128+ if (autopilotEmulatedDeviceNames.indexOf(device.name) != -1) {
129+ console.warn("Forcing the OSK to be enabled as there is an autopilot eumlated device present.")
130+ return true;
131+ }
132+ }
133+ return false;
134+ }
135+
112 Screens {
136 Screens {
113 id: screens
137 id: screens
114 }
138 }
@@ -220,7 +244,8 @@ Rectangle {
220 // have multiple keyboards around. For now we only enable one keyboard at a time
244 // have multiple keyboards around. For now we only enable one keyboard at a time
221 // thus hiding it here if there is a physical one around or if we have a second
245 // thus hiding it here if there is a physical one around or if we have a second
222 // screen (the virtual touchpad & osk on the phone) attached.
246 // screen (the virtual touchpad & osk on the phone) attached.
223− oskEnabled: keyboardsModel.count === 0 && screens.count === 1
247+ oskEnabled: (keyboardsModel.count === 0 && screens.count === 1) ||
248+ forceOSKEnabled
224
249
225 usageScenario: {
250 usageScenario: {
226 if (root.unity8Settings.usageMode === "Windowed") {
251 if (root.unity8Settings.usageMode === "Windowed") {
qml/Panel/Handle.qml+2−2
@@ -19,7 +19,7 @@ import Ubuntu.Components 1.3
19
19
20Rectangle {
20Rectangle {
21 id: handle
21 id: handle
22− color: "#5d5d5d"
22+ color: theme.palette.normal.foreground
23 height: units.gu(2)
23 height: units.gu(2)
24 property bool active: false
24 property bool active: false
25
25
@@ -35,7 +35,7 @@ Rectangle {
35 id: dot
35 id: dot
36 width: units.dp(3)
36 width: units.dp(3)
37 height: width
37 height: width
38− color: handle.active ? UbuntuColors.orange : "#888888"
38+ color: handle.active ? theme.palette.highlighted.foreground : theme.palette.normal.raised
39 radius: units.dp(1)
39 radius: units.dp(1)
40 }
40 }
41 }
41 }
qml/Panel/IndicatorItem.qml+3−3
@@ -32,9 +32,9 @@ IndicatorDelegate {
32 property bool selected: false
32 property bool selected: false
33 property real iconHeight: units.gu(2)
33 property real iconHeight: units.gu(2)
34 readonly property color color: {
34 readonly property color color: {
35− if (!expanded) return "#ffffff";
35+ if (!expanded) return theme.palette.normal.backgroundText;
36− if (!selected) return "#888888";
36+ if (!selected) return theme.palette.disabled.backgroundText;
37− return "#ffffff";
37+ return theme.palette.normal.backgroundText;
38 }
38 }
39
39
40 implicitWidth: mainItems.width
40 implicitWidth: mainItems.width
qml/Panel/Indicators/MenuItemFactory.qml+3−4
@@ -232,7 +232,6 @@ Item {
232 text: menuData && menuData.label || ""
232 text: menuData && menuData.label || ""
233 iconSource: menuData && menuData.icon || ""
233 iconSource: menuData && menuData.icon || ""
234 value : menuData && menuData.actionState || 0.0
234 value : menuData && menuData.actionState || 0.0
235− enabled: menuData && menuData.sensitive || false
236 highlightWhenPressed: false
235 highlightWhenPressed: false
237 }
236 }
238 }
237 }
@@ -265,7 +264,7 @@ Item {
265 name: "settings"
264 name: "settings"
266 height: units.gu(3)
265 height: units.gu(3)
267 width: height
266 width: height
268− color: theme.palette.selected.backgroundText
267+ color: theme.palette.normal.backgroundText
269 }
268 }
270 }
269 }
271 }
270 }
@@ -297,7 +296,7 @@ Item {
297 source: menuData.icon
296 source: menuData.icon
298 height: units.gu(3)
297 height: units.gu(3)
299 width: height
298 width: height
300− color: theme.palette.selected.backgroundText
299+ color: theme.palette.normal.backgroundText
301 }
300 }
302 }
301 }
303 }
302 }
@@ -624,7 +623,7 @@ Item {
624
623
625 Component {
624 Component {
626 id: modeminfoitem;
625 id: modeminfoitem;
627− ModemInfoItem {
626+ Menus.ModemInfoItem {
628 objectName: "modemInfoItem"
627 objectName: "modemInfoItem"
629 property QtObject menuData: null
628 property QtObject menuData: null
630 property var menuModel: menuFactory.menuModel
629 property var menuModel: menuFactory.menuModel
qml/Panel/Indicators/ModemInfoItem.qmldeleted−111
@@ -1,111 +0,0 @@
1−/*
2− * Copyright 2014,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 Lesser 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 Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.4
18−import QtQuick.Layouts 1.1
19−import Ubuntu.Components 1.3
20−import Ubuntu.Components.ListItems 1.3 as ListItem
21−
22−ListItem.Empty {
23− id: menu
24− implicitHeight: mainColumn.implicitHeight
25− + mainColumn.anchors.topMargin
26− + mainColumn.anchors.bottomMargin
27−
28− property alias statusIcon: statusIcon.name
29− property alias statusText: labelStatus.text
30− property alias connectivityIcon: iconConnectivity.name
31− property alias simIdentifierText: labelSimIdentifier.text
32− property bool locked : false
33− property bool roaming: false
34− signal unlock
35−
36− ColumnLayout {
37− id: mainColumn
38− anchors.fill: parent
39− anchors.margins: menu.__contentsMargins
40− spacing: units.gu(0.5)
41−
42− Label {
43− id: labelSimIdentifier
44− elide: Text.ElideRight
45− visible: text !== ""
46− font.bold: true
47− opacity: menu.locked ? 0.6 : 1.0
48− }
49−
50− RowLayout {
51− id: statusRow
52− spacing: units.gu(1)
53−
54− height: labelStatus.height
55− width: parent.width
56−
57− Label {
58− id: labelStatus
59− elide: Text.ElideRight
60− opacity: 0.6
61− }
62−
63− RowLayout {
64− spacing: 0.5
65− height: parent.height
66− Icon {
67− id: statusIcon
68− color: theme.palette.selected.backgroundText
69−
70− Layout.preferredHeight: parent.height
71− Layout.preferredWidth: Layout.preferredHeight
72−
73− visible: name !== ""
74− }
75−
76− Icon {
77− id: iconConnectivity
78− color: theme.palette.selected.backgroundText
79−
80− Layout.preferredHeight: parent.height
81− Layout.preferredWidth: Layout.preferredHeight
82−
83− visible: name !== ""
84− }
85− }
86−
87− Item {
88− // eat up all the excess space so that RoamingIndication
89− // ends up to the far right
90− Layout.fillWidth: true
91− }
92−
93− RoamingIndication {
94− id: roamingIndication
95− visible: menu.roaming
96− Layout.fillHeight: true
97− }
98− }
99−
100− Button {
101− id: buttonUnlock
102− objectName: "buttonUnlockSim"
103− visible: menu.locked
104−
105− text: i18n.tr("Unlock SIM")
106− Layout.preferredWidth: implicitWidth + units.gu(5)
107−
108− onTriggered: menu.unlock()
109− }
110− }
111−}
qml/Panel/Indicators/RoamingIndication.qmldeleted−40
@@ -1,40 +0,0 @@
1−/*
2− * Copyright 2014,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 Lesser 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 Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.4
18−import QtQuick.Layouts 1.1
19−import Ubuntu.Components 1.3
20−
21−RowLayout {
22− spacing: units.gu(0.5)
23− Label {
24− id: labelRoaming
25− elide: Text.ElideRight
26− fontSize: "x-small"
27− text: i18n.tr("Roaming")
28− opacity: 0.6
29− }
30−
31− Icon {
32− id: iconRoaming
33− color: theme.palette.selected.backgroundText
34−
35− Layout.preferredHeight: parent.height
36− Layout.preferredWidth: Layout.preferredHeight
37−
38− name: "network-cellular-roaming"
39− }
40−}
qml/Panel/Indicators/client/IndicatorsClient.qml+1−1
@@ -26,7 +26,7 @@ Rectangle {
26 id: root
26 id: root
27
27
28 Component.onCompleted: {
28 Component.onCompleted: {
29− theme.name = "Ubuntu.Components.Themes.SuruGradient"
29+ theme.name = "Ubuntu.Components.Themes.SuruDark"
30 }
30 }
31
31
32 PageStack {
32 PageStack {
qml/Panel/IndicatorsMenu.qml+3−2
@@ -38,7 +38,7 @@ Showable {
38 property bool enableHint: true
38 property bool enableHint: true
39 property bool contentEnabled: true
39 property bool contentEnabled: true
40 property bool showOnClick: true
40 property bool showOnClick: true
41− property color panelColor: "#292929"
41+ property color panelColor: UbuntuColors.jet
42
42
43 signal showTapped(point position)
43 signal showTapped(point position)
44
44
@@ -76,6 +76,7 @@ Showable {
76 MenuContent {
76 MenuContent {
77 id: content
77 id: content
78 objectName: "menuContent"
78 objectName: "menuContent"
79+ color: root.panelColor
79
80
80 anchors {
81 anchors {
81 left: parent.left
82 left: parent.left
@@ -110,7 +111,7 @@ Showable {
110 height: units.gu(0.5)
111 height: units.gu(0.5)
111 gradient: Gradient {
112 gradient: Gradient {
112 GradientStop { position: 0.0; color: "transparent" }
113 GradientStop { position: 0.0; color: "transparent" }
113− GradientStop { position: 1.0; color: "#292929" }
114+ GradientStop { position: 1.0; color: root.panelColor }
114 }
115 }
115 opacity: 0.3
116 opacity: 0.3
116 }
117 }
qml/Panel/MenuContent.qml+1−1
@@ -27,7 +27,7 @@ Rectangle {
27
27
28 property QtObject indicatorsModel: null
28 property QtObject indicatorsModel: null
29 property int currentMenuIndex: -1
29 property int currentMenuIndex: -1
30− color: "#292929" // FIXME not in palette yet
30+ color: theme.palette.normal.background
31
31
32 width: units.gu(40)
32 width: units.gu(40)
33 height: units.gu(42)
33 height: units.gu(42)
qml/Panel/Panel.qml+5−1
@@ -89,7 +89,7 @@ Item {
89
89
90 Rectangle {
90 Rectangle {
91 id: indicatorAreaBackground
91 id: indicatorAreaBackground
92− color: callHint.visible ? "green" : "#292929"
92+ color: callHint.visible ? UbuntuColors.green : indicators.panelColor
93 anchors {
93 anchors {
94 top: parent.top
94 top: parent.top
95 left: parent.left
95 left: parent.left
@@ -169,8 +169,10 @@ Item {
169 objectName: "windowDecorationTitle"
169 objectName: "windowDecorationTitle"
170 anchors {
170 anchors {
171 left: parent.left
171 left: parent.left
172+ right: __indicators.left
172 top: parent.top
173 top: parent.top
173 leftMargin: units.gu(1)
174 leftMargin: units.gu(1)
175+ rightMargin: units.gu(1)
174 topMargin: units.gu(0.5)
176 topMargin: units.gu(0.5)
175 bottomMargin: units.gu(0.5)
177 bottomMargin: units.gu(0.5)
176 }
178 }
@@ -181,6 +183,8 @@ Item {
181 fontSize: "medium"
183 fontSize: "medium"
182 font.weight: Font.Normal
184 font.weight: Font.Normal
183 text: PanelState.title
185 text: PanelState.title
186+ elide: Text.ElideRight
187+ maximumLineCount: 1
184 }
188 }
185
189
186 // TODO here would the Locally integrated menus come
190 // TODO here would the Locally integrated menus come
qml/ScopeTool.qml−8
@@ -52,14 +52,6 @@ Rectangle {
52 color: "#FCFCFC"
52 color: "#FCFCFC"
53 }
53 }
54
54
55− Image {
56− anchors.fill: dashContent
57− source: root.width > root.height ? "Dash/graphics/paper_landscape.png" : "Dash/graphics/paper_portrait.png"
58− fillMode: Image.PreserveAspectCrop
59− horizontalAlignment: Image.AlignRight
60− verticalAlignment: Image.AlignTop
61− }
62−
63 DashContent {
55 DashContent {
64 id: dashContent
56 id: dashContent
65
57
qml/Shell.qml+52−2
@@ -25,6 +25,7 @@ import Ubuntu.Telephony 0.1 as Telephony
25import Unity.Connectivity 0.1
25import Unity.Connectivity 0.1
26import Unity.Launcher 0.1
26import Unity.Launcher 0.1
27import GlobalShortcut 1.0 // has to be before Utils, because of WindowKeysFilter
27import GlobalShortcut 1.0 // has to be before Utils, because of WindowKeysFilter
28+import GSettings 1.0
28import Utils 0.1
29import Utils 0.1
29import Powerd 0.1
30import Powerd 0.1
30import SessionBroadcast 0.1
31import SessionBroadcast 0.1
@@ -139,7 +140,7 @@ Item {
139 }
140 }
140
141
141 Component.onCompleted: {
142 Component.onCompleted: {
142− theme.name = "Ubuntu.Components.Themes.SuruGradient"
143+ theme.name = "Ubuntu.Components.Themes.SuruDark"
143 if (ApplicationManager.count > 0) {
144 if (ApplicationManager.count > 0) {
144 ApplicationManager.focusApplication(ApplicationManager.get(0).appId);
145 ApplicationManager.focusApplication(ApplicationManager.get(0).appId);
145 }
146 }
@@ -187,6 +188,11 @@ Item {
187 }
188 }
188 }
189 }
189
190
191+ GSettings {
192+ id: settings
193+ schema.id: "com.canonical.Unity8"
194+ }
195+
190 Item {
196 Item {
191 id: stages
197 id: stages
192 objectName: "stages"
198 objectName: "stages"
@@ -343,6 +349,11 @@ Item {
343 property: "altTabPressed"
349 property: "altTabPressed"
344 value: physicalKeysMapper.altTabPressed
350 value: physicalKeysMapper.altTabPressed
345 }
351 }
352+ Binding {
353+ target: applicationsDisplayLoader.item
354+ property: "leftMargin"
355+ value: shell.usageScenario == "desktop" && !settings.autohideLauncher ? launcher.panelWidth: 0
356+ }
346 }
357 }
347
358
348 Tutorial {
359 Tutorial {
@@ -373,7 +384,11 @@ Item {
373 InputMethod {
384 InputMethod {
374 id: inputMethod
385 id: inputMethod
375 objectName: "inputMethod"
386 objectName: "inputMethod"
387+ anchors {
388+ fill: parent
376− anchors { fill: parent; topMargin: panel.panelHeight }
389+ topMargin: panel.panelHeight
390+ leftMargin: launcher.lockedVisible ? launcher.panelWidth : 0
391+ }
377 z: notifications.useModal || panel.indicators.shown || wizard.active ? overlay.z + 1 : overlay.z - 1
392 z: notifications.useModal || panel.indicators.shown || wizard.active ? overlay.z + 1 : overlay.z - 1
378 }
393 }
379
394
@@ -562,6 +577,10 @@ Item {
562 && !greeter.hasLockedApp
577 && !greeter.hasLockedApp
563 inverted: shell.usageScenario !== "desktop"
578 inverted: shell.usageScenario !== "desktop"
564 shadeBackground: !tutorial.running
579 shadeBackground: !tutorial.running
580+ superPressed: physicalKeysMapper.superPressed
581+ superTabPressed: physicalKeysMapper.superTabPressed
582+ panelWidth: units.gu(settings.launcherWidth)
583+ lockedVisible: shell.usageScenario == "desktop" && !settings.autohideLauncher && !panel.fullscreenMode
565
584
566 onShowDashHome: showHome()
585 onShowDashHome: showHome()
567 onDash: showDash()
586 onDash: showDash()
@@ -581,6 +600,37 @@ Item {
581 panel.indicators.hide()
600 panel.indicators.hide()
582 }
601 }
583 }
602 }
603+ onFocusChanged: {
604+ if (!focus) {
605+ applicationsDisplayLoader.focus = true;
606+ }
607+ }
608+
609+ GlobalShortcut {
610+ shortcut: Qt.AltModifier | Qt.Key_F1
611+ onTriggered: {
612+ launcher.openForKeyboardNavigation();
613+ }
614+ }
615+ GlobalShortcut {
616+ shortcut: Qt.MetaModifier | Qt.Key_0
617+ onTriggered: {
618+ if (LauncherModel.get(9)) {
619+ activateApplication(LauncherModel.get(9).appId);
620+ }
621+ }
622+ }
623+ Repeater {
624+ model: 9
625+ GlobalShortcut {
626+ shortcut: Qt.MetaModifier | (Qt.Key_1 + index)
627+ onTriggered: {
628+ if (LauncherModel.get(index)) {
629+ activateApplication(LauncherModel.get(index).appId);
630+ }
631+ }
632+ }
633+ }
584 }
634 }
585
635
586 Wizard {
636 Wizard {
qml/Stages/AbstractStage.qml+3−1
@@ -21,7 +21,7 @@ import GSettings 1.0
21Rectangle {
21Rectangle {
22 id: root
22 id: root
23
23
24− color: "#111111"
24+ color: "#060606"
25
25
26 // Controls to be set from outside
26 // Controls to be set from outside
27 property bool altTabPressed
27 property bool altTabPressed
@@ -39,6 +39,8 @@ Rectangle {
39 property int shellOrientationAngle
39 property int shellOrientationAngle
40 property bool spreadEnabled: true // If false, animations and right edge will be disabled
40 property bool spreadEnabled: true // If false, animations and right edge will be disabled
41 property bool suspended
41 property bool suspended
42+ // A Stage should paint a wallpaper etc over its full size but not use the margins for window placement
43+ property int leftMargin: 0
42
44
43 // To be read from outside
45 // To be read from outside
44 property var mainApp: null
46 property var mainApp: null
qml/Stages/DesktopSpread.qml+64−17
@@ -19,6 +19,7 @@ import QtQuick.Layouts 1.1
19import Ubuntu.Components 1.3
19import Ubuntu.Components 1.3
20import Ubuntu.Gestures 0.1
20import Ubuntu.Gestures 0.1
21import Unity.Application 0.1
21import Unity.Application 0.1
22+import "../Components"
22
23
23FocusScope {
24FocusScope {
24 id: root
25 id: root
@@ -26,8 +27,11 @@ FocusScope {
26 property bool altTabPressed: false
27 property bool altTabPressed: false
27 property Item workspace: null
28 property Item workspace: null
28
29
30+ readonly property alias ready: blurLayer.ready
29 readonly property alias highlightedIndex: spreadRepeater.highlightedIndex
31 readonly property alias highlightedIndex: spreadRepeater.highlightedIndex
30
32
33+ signal playFocusAnimation(int index)
34+
31 function show() {
35 function show() {
32 spreadContainer.animateIn = true;
36 spreadContainer.animateIn = true;
33 root.state = "altTab";
37 root.state = "altTab";
@@ -91,6 +95,9 @@ FocusScope {
91
95
92 function focusSelected() {
96 function focusSelected() {
93 if (spreadRepeater.highlightedIndex != -1) {
97 if (spreadRepeater.highlightedIndex != -1) {
98+ if (spreadContainer.visible) {
99+ root.playFocusAnimation(spreadRepeater.highlightedIndex)
100+ }
94 var application = ApplicationManager.get(spreadRepeater.highlightedIndex);
101 var application = ApplicationManager.get(spreadRepeater.highlightedIndex);
95 ApplicationManager.requestFocusApplication(application.appId);
102 ApplicationManager.requestFocusApplication(application.appId);
96 }
103 }
@@ -101,6 +108,31 @@ FocusScope {
101 state = ""
108 state = ""
102 }
109 }
103
110
111+ BlurLayer {
112+ id: blurLayer
113+ anchors.fill: parent
114+ source: root.workspace
115+ visible: false
116+ }
117+
118+ Rectangle {
119+ id: spreadBackground
120+ anchors.fill: parent
121+ color: "#B2000000"
122+ visible: false
123+ opacity: visible ? 1 : 0
124+ Behavior on opacity {
125+ UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration }
126+ }
127+ }
128+
129+ MouseArea {
130+ id: eventEater
131+ anchors.fill: parent
132+ visible: spreadBackground.visible
133+ enabled: visible
134+ }
135+
104 Item {
136 Item {
105 id: spreadContainer
137 id: spreadContainer
106 objectName: "spreadContainer"
138 objectName: "spreadContainer"
@@ -226,13 +258,20 @@ FocusScope {
226 Transition {
258 Transition {
227 from: ""
259 from: ""
228 to: "altTab"
260 to: "altTab"
261+ SequentialAnimation {
262+ ParallelAnimation {
229− PropertyAction { target: spreadDelegate; properties: "y,height,width,angle,z,itemScale,itemScaleOriginY,visible" }
263+ PropertyAction { target: spreadDelegate; properties: "y,height,width,angle,z,itemScale,itemScaleOriginY,visible" }
230− PropertyAction { target: clippedSpreadDelegate; properties: "anchors.topMargin" }
264+ PropertyAction { target: clippedSpreadDelegate; properties: "anchors.topMargin" }
231− PropertyAnimation {
265+ PropertyAnimation {
232− target: spreadDelegate; properties: "x"
266+ target: spreadDelegate; properties: "x"
233− from: root.width
267+ from: root.width
234− duration: spreadContainer.animateIn ? UbuntuAnimation.FastDuration :0
268+ duration: spreadContainer.animateIn ? UbuntuAnimation.FastDuration :0
235− easing: UbuntuAnimation.StandardEasing
269+ easing: UbuntuAnimation.StandardEasing
270+ }
271+ UbuntuNumberAnimation { target: clippedSpreadDelegate; property: "shadowOpacity"; from: 0; to: spreadMaths.shadowOpacity; duration: spreadContainer.animateIn ? UbuntuAnimation.FastDuration : 0 }
272+ UbuntuNumberAnimation { target: tileInfo; property: "opacity"; from: 0; to: spreadMaths.tileInfoOpacity; duration: spreadContainer.animateIn ? UbuntuAnimation.FastDuration : 0 }
273+ }
274+ PropertyAction { target: spreadSelectArea; property: "enabled" }
236 }
275 }
237 }
276 }
238 ]
277 ]
@@ -240,7 +279,11 @@ FocusScope {
240 MouseArea {
279 MouseArea {
241 id: tileInfo
280 id: tileInfo
242 objectName: "tileInfo"
281 objectName: "tileInfo"
282+ anchors {
283+ left: parent.left
243− anchors { left: parent.left; top: clippedSpreadDelegate.bottom; topMargin: units.gu(5) }
284+ top: clippedSpreadDelegate.bottom
285+ topMargin: ((spreadMaths.sceneHeight - spreadDelegate.y) - clippedSpreadDelegate.height) * 0.2
286+ }
244 property int nextItemX: spreadRepeater.count > index + 1 ? spreadRepeater.itemAt(index + 1).x : spreadDelegate.x + units.gu(30)
287 property int nextItemX: spreadRepeater.count > index + 1 ? spreadRepeater.itemAt(index + 1).x : spreadDelegate.x + units.gu(30)
245 width: Math.min(units.gu(30), nextItemX - spreadDelegate.x)
288 width: Math.min(units.gu(30), nextItemX - spreadDelegate.x)
246 height: titleInfoColumn.height
289 height: titleInfoColumn.height
@@ -262,12 +305,20 @@ FocusScope {
262 anchors { left: parent.left; top: parent.top; right: parent.right }
305 anchors { left: parent.left; top: parent.top; right: parent.right }
263 spacing: units.gu(1)
306 spacing: units.gu(1)
264
307
265− UbuntuShape {
308+ UbuntuShapeForItem {
266 Layout.preferredHeight: Math.min(units.gu(6), root.height * .05)
309 Layout.preferredHeight: Math.min(units.gu(6), root.height * .05)
267 Layout.preferredWidth: height * 8 / 7.6
310 Layout.preferredWidth: height * 8 / 7.6
268 image: Image {
311 image: Image {
269 anchors.fill: parent
312 anchors.fill: parent
270 source: model.icon
313 source: model.icon
314+ Rectangle {
315+ anchors.fill: parent
316+ color: "black"
317+ opacity: clippedSpreadDelegate.highlightShown ? 0 : .1
318+ Behavior on opacity {
319+ UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration }
320+ }
321+ }
271 }
322 }
272 }
323 }
273 Label {
324 Label {
@@ -420,7 +471,7 @@ FocusScope {
420
471
421 property var source: ShaderEffectSource {
472 property var source: ShaderEffectSource {
422 id: shaderEffectSource
473 id: shaderEffectSource
423− sourceItem: appContainer
474+ sourceItem: root.workspace
424 }
475 }
425
476
426 fragmentShader: "
477 fragmentShader: "
@@ -494,20 +545,17 @@ FocusScope {
494 from: "*"
545 from: "*"
495 to: "altTab"
546 to: "altTab"
496 SequentialAnimation {
547 SequentialAnimation {
497− PropertyAction { target: hoverMouseArea; property: "progressiveScrollingEnabled"; value: false }
498 PropertyAction { target: spreadRepeater; property: "highlightedIndex"; value: Math.min(ApplicationManager.count - 1, 1) }
548 PropertyAction { target: spreadRepeater; property: "highlightedIndex"; value: Math.min(ApplicationManager.count - 1, 1) }
499− PauseAnimation { duration: 140 }
549+ PauseAnimation { duration: spreadContainer.animateIn ? 0 : 140 }
500 PropertyAction { target: workspaceSelector; property: "visible" }
550 PropertyAction { target: workspaceSelector; property: "visible" }
501 PropertyAction { target: spreadContainer; property: "visible" }
551 PropertyAction { target: spreadContainer; property: "visible" }
502 ParallelAnimation {
552 ParallelAnimation {
503− UbuntuNumberAnimation {
504− target: blurLayer; properties: "saturation,blurRadius";
553+ UbuntuNumberAnimation { target: blurLayer; properties: "saturation,blurRadius"; duration: UbuntuAnimation.SnapDuration }
505− duration: spreadContainer.animateIn ? UbuntuAnimation.FastDuration : 0
506− }
507 PropertyAction { target: spreadFlickable; property: "visible" }
554 PropertyAction { target: spreadFlickable; property: "visible" }
508 PropertyAction { targets: [currentSelectedLabel,spreadBackground]; property: "visible" }
555 PropertyAction { targets: [currentSelectedLabel,spreadBackground]; property: "visible" }
509 PropertyAction { target: spreadFlickable; property: "contentX"; value: 0 }
556 PropertyAction { target: spreadFlickable; property: "contentX"; value: 0 }
510 }
557 }
558+ PropertyAction { target: hoverMouseArea; properties: "enabled,progressiveScrollingEnabled"; value: false }
511 }
559 }
512 },
560 },
513 Transition {
561 Transition {
@@ -518,6 +566,5 @@ FocusScope {
518 PropertyAction { target: spreadRepeater; property: "highlightedIndex"; value: -1 }
566 PropertyAction { target: spreadRepeater; property: "highlightedIndex"; value: -1 }
519 PropertyAction { target: spreadContainer; property: "animateIn"; value: false }
567 PropertyAction { target: spreadContainer; property: "animateIn"; value: false }
520 }
568 }
521−
522 ]
569 ]
523}
570}
qml/Stages/DesktopSpreadDelegate.qml+15−1
@@ -56,6 +56,11 @@ Item {
56 }
56 }
57 ]
57 ]
58
58
59+ scale: highlightShown ? 1.025 : 1
60+ Behavior on scale {
61+ UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration }
62+ }
63+
59 BorderImage {
64 BorderImage {
60 anchors {
65 anchors {
61 fill: root
66 fill: root
@@ -70,7 +75,7 @@ Item {
70 anchors.fill: parent
75 anchors.fill: parent
71 anchors.margins: -units.gu(1)
76 anchors.margins: -units.gu(1)
72 color: "white"
77 color: "white"
73− opacity: highlightShown ? 0.15 : 0
78+ opacity: highlightShown ? 0.55 : 0
74 antialiasing: true
79 antialiasing: true
75 }
80 }
76
81
@@ -108,4 +113,13 @@ Item {
108 ]
113 ]
109 }
114 }
110 }
115 }
116+
117+ Rectangle {
118+ anchors.fill: parent
119+ color: "black"
120+ opacity: root.highlightShown ? 0 : .1
121+ Behavior on opacity {
122+ UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration }
123+ }
124+ }
111}
125}
qml/Stages/DesktopStage.qml+34−34
@@ -224,6 +224,7 @@ AbstractStage {
224 PanelState.dropShadow = false;
224 PanelState.dropShadow = false;
225 }
225 }
226
226
227+
227 FocusScope {
228 FocusScope {
228 id: appContainer
229 id: appContainer
229 objectName: "appContainer"
230 objectName: "appContainer"
@@ -274,6 +275,7 @@ AbstractStage {
274 readonly property alias maximizedLeft: appDelegatePrivate.maximizedLeft
275 readonly property alias maximizedLeft: appDelegatePrivate.maximizedLeft
275 readonly property alias maximizedRight: appDelegatePrivate.maximizedRight
276 readonly property alias maximizedRight: appDelegatePrivate.maximizedRight
276 readonly property alias minimized: appDelegatePrivate.minimized
277 readonly property alias minimized: appDelegatePrivate.minimized
278+ readonly property alias fullscreen: decoratedWindow.fullscreen
277
279
278 readonly property string appId: model.appId
280 readonly property string appId: model.appId
279 property bool animationsEnabled: true
281 property bool animationsEnabled: true
@@ -293,6 +295,7 @@ AbstractStage {
293 visible: !visuallyMinimized &&
295 visible: !visuallyMinimized &&
294 !greeter.fullyShown &&
296 !greeter.fullyShown &&
295 (priv.foregroundMaximizedAppZ === -1 || priv.foregroundMaximizedAppZ <= z) ||
297 (priv.foregroundMaximizedAppZ === -1 || priv.foregroundMaximizedAppZ <= z) ||
298+ decoratedWindow.fullscreen ||
296 (spread.state == "altTab" && index === spread.highlightedIndex)
299 (spread.state == "altTab" && index === spread.highlightedIndex)
297
300
298 Binding {
301 Binding {
@@ -348,13 +351,26 @@ AbstractStage {
348 ApplicationManager.focusApplication(appId);
351 ApplicationManager.focusApplication(appId);
349 }
352 }
350
353
354+ function playFocusAnimation() {
355+ focusAnimation.start()
356+ }
357+
358+ UbuntuNumberAnimation {
359+ id: focusAnimation
360+ target: appDelegate
361+ property: "scale"
362+ from: 0.98
363+ to: 1
364+ duration: UbuntuAnimation.SnapDuration
365+ }
366+
351 states: [
367 states: [
352 State {
368 State {
353 name: "fullscreen"; when: decoratedWindow.fullscreen
369 name: "fullscreen"; when: decoratedWindow.fullscreen
354− extend: "maximized"
355 PropertyChanges {
370 PropertyChanges {
356 target: appDelegate;
371 target: appDelegate;
357− y: -PanelState.panelHeight
372+ x: 0; y: -PanelState.panelHeight
373+ requestedWidth: appContainer.width; requestedHeight: appContainer.height;
358 }
374 }
359 },
375 },
360 State {
376 State {
@@ -371,21 +387,21 @@ AbstractStage {
371 name: "maximized"; when: appDelegate.maximized && !appDelegate.minimized
387 name: "maximized"; when: appDelegate.maximized && !appDelegate.minimized
372 PropertyChanges {
388 PropertyChanges {
373 target: appDelegate;
389 target: appDelegate;
374− x: 0; y: 0;
390+ x: root.leftMargin; y: 0;
375− requestedWidth: root.width; requestedHeight: root.height;
391+ requestedWidth: appContainer.width - root.leftMargin; requestedHeight: appContainer.height;
376 visuallyMinimized: false;
392 visuallyMinimized: false;
377 visuallyMaximized: true
393 visuallyMaximized: true
378 }
394 }
379 },
395 },
380 State {
396 State {
381 name: "maximizedLeft"; when: appDelegate.maximizedLeft && !appDelegate.minimized
397 name: "maximizedLeft"; when: appDelegate.maximizedLeft && !appDelegate.minimized
382− PropertyChanges { target: appDelegate; x: 0; y: PanelState.panelHeight;
398+ PropertyChanges { target: appDelegate; x: root.leftMargin; y: PanelState.panelHeight;
383− requestedWidth: root.width/2; requestedHeight: root.height - PanelState.panelHeight }
399+ requestedWidth: (appContainer.width - root.leftMargin)/2; requestedHeight: appContainer.height - PanelState.panelHeight }
384 },
400 },
385 State {
401 State {
386 name: "maximizedRight"; when: appDelegate.maximizedRight && !appDelegate.minimized
402 name: "maximizedRight"; when: appDelegate.maximizedRight && !appDelegate.minimized
387− PropertyChanges { target: appDelegate; x: root.width/2; y: PanelState.panelHeight;
403+ PropertyChanges { target: appDelegate; x: (appContainer.width + root.leftMargin)/2; y: PanelState.panelHeight;
388− requestedWidth: root.width/2; requestedHeight: root.height - PanelState.panelHeight }
404+ requestedWidth: (appContainer.width - root.leftMargin)/2; requestedHeight: appContainer.height - PanelState.panelHeight }
389 },
405 },
390 State {
406 State {
391 name: "minimized"; when: appDelegate.minimized
407 name: "minimized"; when: appDelegate.minimized
@@ -438,7 +454,7 @@ AbstractStage {
438 target: appDelegate
454 target: appDelegate
439 property: "z"
455 property: "z"
440 value: ApplicationManager.count + 1
456 value: ApplicationManager.count + 1
441− when: index == spread.highlightedIndex && blurLayer.ready
457+ when: index == spread.highlightedIndex && spread.ready
442 }
458 }
443
459
444 WindowResizeArea {
460 WindowResizeArea {
@@ -448,8 +464,9 @@ AbstractStage {
448 minHeight: units.gu(10)
464 minHeight: units.gu(10)
449 borderThickness: units.gu(2)
465 borderThickness: units.gu(2)
450 windowId: model.appId // FIXME: Change this to point to windowId once we have such a thing
466 windowId: model.appId // FIXME: Change this to point to windowId once we have such a thing
451− screenWidth: root.width
467+ screenWidth: appContainer.width
452− screenHeight: root.height
468+ screenHeight: appContainer.height
469+ leftMargin: root.leftMargin
453
470
454 onPressed: { ApplicationManager.focusApplication(model.appId) }
471 onPressed: { ApplicationManager.focusApplication(model.appId) }
455 }
472 }
@@ -473,27 +490,6 @@ AbstractStage {
473 }
490 }
474 }
491 }
475
492
476− BlurLayer {
477− id: blurLayer
478− anchors.fill: parent
479− source: appContainer
480− visible: false
481− }
482−
483− Rectangle {
484− id: spreadBackground
485− anchors.fill: parent
486− color: "#55000000"
487− visible: false
488− }
489−
490− MouseArea {
491− id: eventEater
492− anchors.fill: parent
493− visible: spreadBackground.visible
494− enabled: visible
495− }
496−
497 EdgeBarrier {
493 EdgeBarrier {
498 id: edgeBarrier
494 id: edgeBarrier
499
495
@@ -509,7 +505,7 @@ AbstractStage {
509 rotation: 90
505 rotation: 90
510 anchors.centerIn: parent
506 anchors.centerIn: parent
511 gradient: Gradient {
507 gradient: Gradient {
512− GradientStop { position: 0.0; color: Qt.rgba(0.16,0.16,0.16,0.7)}
508+ GradientStop { position: 0.0; color: Qt.rgba(0.16,0.16,0.16,0.5)}
513 GradientStop { position: 1.0; color: Qt.rgba(0.16,0.16,0.16,0)}
509 GradientStop { position: 1.0; color: Qt.rgba(0.16,0.16,0.16,0)}
514 }
510 }
515 }
511 }
@@ -527,9 +523,13 @@ AbstractStage {
527 DesktopSpread {
523 DesktopSpread {
528 id: spread
524 id: spread
529 objectName: "spread"
525 objectName: "spread"
530− anchors.fill: parent
526+ anchors.fill: appContainer
531 workspace: appContainer
527 workspace: appContainer
532 focus: state == "altTab"
528 focus: state == "altTab"
533 altTabPressed: root.altTabPressed
529 altTabPressed: root.altTabPressed
530+
531+ onPlayFocusAnimation: {
532+ appRepeater.itemAt(index).playFocusAnimation();
533+ }
534 }
534 }
535}
535}
qml/Stages/PhoneStage.qml+77−3
@@ -44,6 +44,33 @@ AbstractStage {
44 }
44 }
45 }
45 }
46
46
47+ onAltTabPressedChanged: {
48+ if (!spreadEnabled || !altTabEnabled) {
49+ return;
50+ }
51+ if (altTabPressed) {
52+ spreadView.snapToSpread();
53+ priv.highlightIndex = Math.min(spreadRepeater.count - 1, 1);
54+ } else {
55+ spreadView.snapTo(priv.highlightIndex)
56+ }
57+ }
58+
59+ FocusScope {
60+ focus: root.altTabPressed
61+
62+ Keys.onPressed: {
63+ switch (event.key) {
64+ case Qt.Key_Tab:
65+ priv.highlightIndex = (priv.highlightIndex + 1) % spreadRepeater.count
66+ break;
67+ case Qt.Key_Backtab:
68+ priv.highlightIndex = (priv.highlightIndex + spreadRepeater.count - 1) % spreadRepeater.count
69+ break;
70+ }
71+ }
72+ }
73+
47 // Functions to be called from outside
74 // Functions to be called from outside
48 function updateFocusedAppOrientation() {
75 function updateFocusedAppOrientation() {
49 if (spreadRepeater.count > 0) {
76 if (spreadRepeater.count > 0) {
@@ -74,6 +101,12 @@ AbstractStage {
74 }
101 }
75 }
102 }
76
103
104+ function pushRightEdge(amount) {
105+ if (spreadView.contentX == -spreadView.shift) {
106+ edgeBarrier.push(amount);
107+ }
108+ }
109+
77 mainApp: applicationManager.focusedApplicationId
110 mainApp: applicationManager.focusedApplicationId
78 ? applicationManager.findApplication(applicationManager.focusedApplicationId)
111 ? applicationManager.findApplication(applicationManager.focusedApplicationId)
79 : null
112 : null
@@ -180,6 +213,7 @@ AbstractStage {
180
213
181 property real oldInverseProgress: 0
214 property real oldInverseProgress: 0
182 property bool animateX: false
215 property bool animateX: false
216+ property int highlightIndex: 0
183
217
184 onFocusedAppDelegateChanged: {
218 onFocusedAppDelegateChanged: {
185 if (focusedAppDelegate) {
219 if (focusedAppDelegate) {
@@ -214,6 +248,10 @@ AbstractStage {
214 spreadView.phase = 0;
248 spreadView.phase = 0;
215 spreadView.contentX = -spreadView.shift;
249 spreadView.contentX = -spreadView.shift;
216 }
250 }
251+
252+ onHighlightIndexChanged: {
253+ spreadView.contentX = highlightIndex * spreadView.contentWidth / (spreadRepeater.count + 2)
254+ }
217 }
255 }
218 Timer {
256 Timer {
219 id: fullyShowingFocusedAppUpdateTimer
257 id: fullyShowingFocusedAppUpdateTimer
@@ -281,6 +319,11 @@ AbstractStage {
281 }
319 }
282 }
320 }
283
321
322+ Behavior on contentX {
323+ enabled: root.altTabPressed
324+ UbuntuNumberAnimation {}
325+ }
326+
284 onShiftedContentXChanged: {
327 onShiftedContentXChanged: {
285 if (root.beingResized) {
328 if (root.beingResized) {
286 // Flickabe.contentX wiggles during resizes. Don't react to it.
329 // Flickabe.contentX wiggles during resizes. Don't react to it.
@@ -319,12 +362,17 @@ AbstractStage {
319 } else if (shiftedContentX < positionMarker3 * width) {
362 } else if (shiftedContentX < positionMarker3 * width) {
320 snapTo(1);
363 snapTo(1);
321 } else if (phase < 2){
364 } else if (phase < 2){
322− // Add 1 pixel to make sure we definitely hit positionMarker4 even with rounding errors of the animation.
365+ snapToSpread();
323− snapAnimation.targetContentX = width * positionMarker4 + 1 - shift;
324− snapAnimation.start();
325 root.opened();
366 root.opened();
326 }
367 }
327 }
368 }
369+
370+ function snapToSpread() {
371+ // Add 1 pixel to make sure we definitely hit positionMarker4 even with rounding errors of the animation.
372+ snapAnimation.targetContentX = (root.width * spreadView.positionMarker4) + 1 - spreadView.shift;
373+ snapAnimation.start();
374+ }
375+
328 function snapTo(index) {
376 function snapTo(index) {
329 if (!root.altTabEnabled) {
377 if (!root.altTabEnabled) {
330 // Reset to start instead
378 // Reset to start instead
@@ -427,6 +475,7 @@ AbstractStage {
427 maximizedAppTopMargin: root.maximizedAppTopMargin
475 maximizedAppTopMargin: root.maximizedAppTopMargin
428 dropShadow: spreadView.active || priv.focusedAppDelegateIsDislocated
476 dropShadow: spreadView.active || priv.focusedAppDelegateIsDislocated
429 focusFirstApp: root.focusFirstApp
477 focusFirstApp: root.focusFirstApp
478+ highlightShown: root.altTabPressed && index === priv.highlightIndex
430
479
431 readonly property bool isDash: model.appId == "unity8-dash"
480 readonly property bool isDash: model.appId == "unity8-dash"
432
481
@@ -651,4 +700,29 @@ AbstractStage {
651 }
700 }
652 }
701 }
653 }
702 }
703+
704+ EdgeBarrier {
705+ id: edgeBarrier
706+
707+ // NB: it does its own positioning according to the specified edge
708+ edge: Qt.RightEdge
709+
710+ onPassed: {
711+ spreadView.snapToSpread();
712+ }
713+ material: Component {
714+ Item {
715+ Rectangle {
716+ width: parent.height
717+ height: parent.width
718+ rotation: 90
719+ anchors.centerIn: parent
720+ gradient: Gradient {
721+ GradientStop { position: 0.0; color: Qt.rgba(0.16,0.16,0.16,0.7)}
722+ GradientStop { position: 1.0; color: Qt.rgba(0.16,0.16,0.16,0)}
723+ }
724+ }
725+ }
726+ }
727+ }
654}
728}
qml/Stages/Splash.qml+4−2
@@ -76,6 +76,7 @@ Item {
76 }
76 }
77
77
78 Ambiance.PageHeadStyle {
78 Ambiance.PageHeadStyle {
79+ // FIXME: Replace PageHeadStyle by PageHeader from Ubuntu.Components 1.3.
79 id: header
80 id: header
80 anchors {
81 anchors {
81 left: parent.left;
82 left: parent.left;
@@ -86,9 +87,10 @@ Item {
86 property color dividerColor: Qt.darker(styledItem.backgroundColor, 1.1)
87 property color dividerColor: Qt.darker(styledItem.backgroundColor, 1.1)
87 property color panelColor: Qt.lighter(styledItem.backgroundColor, 1.1)
88 property color panelColor: Qt.lighter(styledItem.backgroundColor, 1.1)
88 panelForegroundColor: config.foregroundColor
89 panelForegroundColor: config.foregroundColor
90+ backgroundColor: "transparent"
89 config: PageHeadConfiguration {
91 config: PageHeadConfiguration {
90 id: headerConfig
92 id: headerConfig
91− foregroundColor: styledItem.fakeTheme.palette.selected.backgroundText
93+ foregroundColor: styledItem.fakeTheme.palette.normal.backgroundText
92 }
94 }
93
95
94 property var contents: null
96 property var contents: null
@@ -134,7 +136,7 @@ Item {
134 anchors.topMargin: units.gu(2)
136 anchors.topMargin: units.gu(2)
135 fontSize: "large"
137 fontSize: "large"
136
138
137− color: styledItem.fakeTheme.palette.selected.backgroundText
139+ color: styledItem.fakeTheme.palette.normal.backgroundText
138 visible: d.showIcon
140 visible: d.showIcon
139 }
141 }
140
142
qml/Stages/SpreadDelegate.qml+20
@@ -43,6 +43,7 @@ FocusScope {
43 property int shellOrientationAngle
43 property int shellOrientationAngle
44 property int shellOrientation
44 property int shellOrientation
45 property QtObject orientations
45 property QtObject orientations
46+ property bool highlightShown: false
46
47
47 function matchShellOrientation() {
48 function matchShellOrientation() {
48 if (!root.application)
49 if (!root.application)
@@ -261,6 +262,25 @@ FocusScope {
261 Behavior on opacity { UbuntuNumberAnimation {} }
262 Behavior on opacity { UbuntuNumberAnimation {} }
262 }
263 }
263
264
265+ Rectangle {
266+ id: selectionHighlight
267+ objectName: "selectionHighlight"
268+ anchors.fill: appWindow
269+ anchors.margins: -units.gu(1)
270+ color: "white"
271+ opacity: root.highlightShown ? 0.15 : 0
272+ antialiasing: true
273+ visible: opacity > 0
274+ }
275+
276+ Rectangle {
277+ anchors { left: selectionHighlight.left; right: selectionHighlight.right; bottom: selectionHighlight.bottom; }
278+ height: units.dp(2)
279+ color: UbuntuColors.orange
280+ visible: root.highlightShown
281+ antialiasing: true
282+ }
283+
264 ApplicationWindow {
284 ApplicationWindow {
265 id: appWindow
285 id: appWindow
266 objectName: application ? "appWindow_" + application.appId : "appWindow_null"
286 objectName: application ? "appWindow_" + application.appId : "appWindow_null"
qml/Stages/TabletStage.qml+83−3
@@ -70,6 +70,12 @@ AbstractStage {
70 }
70 }
71 }
71 }
72
72
73+ function pushRightEdge(amount) {
74+ if (spreadView.contentX == -spreadView.shift) {
75+ edgeBarrier.push(amount);
76+ }
77+ }
78+
73 orientationChangesEnabled: priv.mainAppOrientationChangesEnabled
79 orientationChangesEnabled: priv.mainAppOrientationChangesEnabled
74
80
75 supportedOrientations: mainApp ? mainApp.supportedOrientations
81 supportedOrientations: mainApp ? mainApp.supportedOrientations
@@ -102,6 +108,38 @@ AbstractStage {
102 priv.oldInverseProgress = inverseProgress;
108 priv.oldInverseProgress = inverseProgress;
103 }
109 }
104
110
111+ onAltTabPressedChanged: {
112+ if (!spreadEnabled) {
113+ return;
114+ }
115+ if (altTabPressed) {
116+ priv.highlightIndex = Math.min(spreadRepeater.count - 1, 1);
117+ spreadView.snapToSpread();
118+ } else {
119+ for (var i = 0; i < spreadRepeater.count; i++) {
120+ if (spreadRepeater.itemAt(i).zIndex === priv.highlightIndex) {
121+ spreadView.snapTo(i);
122+ return;
123+ }
124+ }
125+ }
126+ }
127+
128+ FocusScope {
129+ focus: root.altTabPressed
130+
131+ Keys.onPressed: {
132+ switch (event.key) {
133+ case Qt.Key_Tab:
134+ priv.highlightIndex = (priv.highlightIndex + 1) % spreadRepeater.count
135+ break;
136+ case Qt.Key_Backtab:
137+ priv.highlightIndex = (priv.highlightIndex + spreadRepeater.count - 1) % spreadRepeater.count
138+ break;
139+ }
140+ }
141+ }
142+
105 QtObject {
143 QtObject {
106 id: priv
144 id: priv
107 objectName: "stagesPriv"
145 objectName: "stagesPriv"
@@ -130,6 +168,8 @@ AbstractStage {
130
168
131 property int oldInverseProgress: 0
169 property int oldInverseProgress: 0
132
170
171+ property int highlightIndex: 0
172+
133 onFocusedAppIdChanged: {
173 onFocusedAppIdChanged: {
134 if (priv.focusedAppId.length > 0) {
174 if (priv.focusedAppId.length > 0) {
135 var focusedApp = ApplicationManager.findApplication(focusedAppId);
175 var focusedApp = ApplicationManager.findApplication(focusedAppId);
@@ -185,6 +225,10 @@ AbstractStage {
185 }
225 }
186 return oneWayFlick;
226 return oneWayFlick;
187 }
227 }
228+
229+ onHighlightIndexChanged: {
230+ spreadView.contentX = highlightIndex * spreadView.contentWidth / (spreadRepeater.count + 2)
231+ }
188 }
232 }
189
233
190 Connections {
234 Connections {
@@ -391,11 +435,16 @@ AbstractStage {
391 } else if (shiftedContentX < phase1Width) {
435 } else if (shiftedContentX < phase1Width) {
392 snapTo(1);
436 snapTo(1);
393 } else {
437 } else {
394− // Add 1 pixel to make sure we definitely hit positionMarker4 even with rounding errors of the animation.
438+ snapToSpread();
395− snapAnimation.targetContentX = spreadView.width * spreadView.positionMarker4 + 1 - shift;
396− snapAnimation.start();
397 }
439 }
398 }
440 }
441+
442+ function snapToSpread() {
443+ // Add 1 pixel to make sure we definitely hit positionMarker4 even with rounding errors of the animation.
444+ snapAnimation.targetContentX = (spreadView.width * spreadView.positionMarker4) + 1 - shift;
445+ snapAnimation.start();
446+ }
447+
399 function snapTo(index) {
448 function snapTo(index) {
400 spreadView.selectedIndex = index;
449 spreadView.selectedIndex = index;
401 snapAnimation.targetContentX = -shift;
450 snapAnimation.targetContentX = -shift;
@@ -481,6 +530,11 @@ AbstractStage {
481 }
530 }
482 }
531 }
483
532
533+ Behavior on contentX {
534+ enabled: root.altTabPressed
535+ UbuntuNumberAnimation {}
536+ }
537+
484 MouseArea {
538 MouseArea {
485 id: spreadRow
539 id: spreadRow
486 x: spreadView.contentX
540 x: spreadView.contentX
@@ -611,6 +665,7 @@ AbstractStage {
611 dragOffset: !isDash && model.appId == priv.mainStageAppId && root.inverseProgress > 0 && spreadView.phase === 0 ? root.inverseProgress : 0
665 dragOffset: !isDash && model.appId == priv.mainStageAppId && root.inverseProgress > 0 && spreadView.phase === 0 ? root.inverseProgress : 0
612 application: ApplicationManager.get(index)
666 application: ApplicationManager.get(index)
613 closeable: !isDash
667 closeable: !isDash
668+ highlightShown: root.altTabPressed && priv.highlightIndex == zIndex
614
669
615 readonly property bool wantsMainStage: model.stage == ApplicationInfoInterface.MainStage
670 readonly property bool wantsMainStage: model.stage == ApplicationInfoInterface.MainStage
616
671
@@ -805,4 +860,29 @@ AbstractStage {
805 }
860 }
806 }
861 }
807 }
862 }
863+
864+ EdgeBarrier {
865+ id: edgeBarrier
866+
867+ // NB: it does its own positioning according to the specified edge
868+ edge: Qt.RightEdge
869+
870+ onPassed: {
871+ spreadView.snapToSpread();
872+ }
873+ material: Component {
874+ Item {
875+ Rectangle {
876+ width: parent.height
877+ height: parent.width
878+ rotation: 90
879+ anchors.centerIn: parent
880+ gradient: Gradient {
881+ GradientStop { position: 0.0; color: Qt.rgba(0.16,0.16,0.16,0.7)}
882+ GradientStop { position: 1.0; color: Qt.rgba(0.16,0.16,0.16,0)}
883+ }
884+ }
885+ }
886+ }
887+ }
808}
888}
qml/Stages/WindowResizeArea.qml+8−5
@@ -40,6 +40,7 @@ MouseArea {
40 property int defaultHeight: units.gu(50)
40 property int defaultHeight: units.gu(50)
41 property int screenWidth: 0
41 property int screenWidth: 0
42 property int screenHeight: 0
42 property int screenHeight: 0
43+ property int leftMargin: 0
43
44
44 QtObject {
45 QtObject {
45 id: priv
46 id: priv
@@ -72,10 +73,12 @@ MouseArea {
72 var windowGeometry = windowStateStorage.getGeometry(root.windowId,
73 var windowGeometry = windowStateStorage.getGeometry(root.windowId,
73 Qt.rect(target.x, target.y, defaultWidth, defaultHeight));
74 Qt.rect(target.x, target.y, defaultWidth, defaultHeight));
74
75
75− target.requestedWidth = Math.min(Math.max(windowGeometry.width, d.minimumWidth), screenWidth);
76+ target.requestedWidth = Qt.binding(function() { return Math.min(Math.max(windowGeometry.width, d.minimumWidth), screenWidth - root.leftMargin); });
76− target.requestedHeight = Math.min(Math.max(windowGeometry.height, d.minimumHeight), root.screenHeight - PanelState.panelHeight);
77+ target.requestedHeight = Qt.binding(function() { return Math.min(Math.max(windowGeometry.height, d.minimumHeight),
78+ root.screenHeight - (target.fullscreen ? 0 : PanelState.panelHeight)); });
77− target.x = Math.max(Math.min(windowGeometry.x, root.screenWidth - target.requestedWidth), 0)
79+ target.x = Qt.binding(function() { return Math.max(Math.min(windowGeometry.x, root.screenWidth - root.leftMargin - target.requestedWidth),
80+ (target.fullscreen ? 0 : root.leftMargin)); });
78− target.y = Math.max(Math.min(windowGeometry.y, root.screenHeight - target.requestedHeight), PanelState.panelHeight)
81+ target.y = Qt.binding(function() { return Math.max(Math.min(windowGeometry.y, root.screenHeight - target.requestedHeight), PanelState.panelHeight); });
79
82
80 var windowState = windowStateStorage.getState(root.windowId, WindowStateStorage.WindowStateNormal)
83 var windowState = windowStateStorage.getState(root.windowId, WindowStateStorage.WindowStateNormal)
81 if (windowState === WindowStateStorage.WindowStateMaximized) {
84 if (windowState === WindowStateStorage.WindowStateMaximized) {
@@ -298,7 +301,7 @@ MouseArea {
298 }
301 }
299
302
300 if (d.topBorder) {
303 if (d.topBorder) {
301− var newTargetY = d.startY + deltaY;
304+ var newTargetY = Math.max(d.startY + deltaY, PanelState.panelHeight); // disallow resizing up past Panel
302 var bottomBorderY = target.y + target.height;
305 var bottomBorderY = target.y + target.height;
303 if (bottomBorderY > newTargetY + d.minimumHeight) {
306 if (bottomBorderY > newTargetY + d.minimumHeight) {
304 if (bottomBorderY < newTargetY + d.maximumHeight) {
307 if (bottomBorderY < newTargetY + d.maximumHeight) {
qml/Wizard/StackButton.qml+1−1
@@ -32,7 +32,7 @@ AbstractButton {
32 anchors.verticalCenter: parent.verticalCenter
32 anchors.verticalCenter: parent.verticalCenter
33 anchors.left: parent.left
33 anchors.left: parent.left
34 anchors.right: parent.right
34 anchors.right: parent.right
35− color: enabled ? theme.palette.selected.backgroundText : Qt.darker(theme.palette.selected.backgroundText, 1.5)
35+ color: enabled ? theme.palette.normal.backgroundText : Qt.darker(theme.palette.normal.backgroundText, 1.5)
36 text: {
36 text: {
37 if (backArrow) {
37 if (backArrow) {
38 // Translators: This is the arrow for "Back" buttons
38 // Translators: This is the arrow for "Back" buttons
src/CMakeLists.txt+1−1
@@ -33,7 +33,7 @@ endif()
33
33
34pkg_check_modules(ANDROID_PROPERTIES REQUIRED libandroid-properties)
34pkg_check_modules(ANDROID_PROPERTIES REQUIRED libandroid-properties)
35add_executable(${SHELL_APP} ${SOURCE_FILES})
35add_executable(${SHELL_APP} ${SOURCE_FILES})
36−qt5_use_modules(${SHELL_APP} Gui Qml Quick Test)
36+qt5_use_modules(${SHELL_APP} DBus Gui Qml Quick Test)
37
37
38if (NOT "${ANDROID_PROPERTIES_INCLUDE_DIRS}" STREQUAL "")
38if (NOT "${ANDROID_PROPERTIES_INCLUDE_DIRS}" STREQUAL "")
39 set_target_properties(${SHELL_APP} PROPERTIES INCLUDE_DIRECTORIES ${ANDROID_PROPERTIES_INCLUDE_DIRS})
39 set_target_properties(${SHELL_APP} PROPERTIES INCLUDE_DIRECTORIES ${ANDROID_PROPERTIES_INCLUDE_DIRS})
src/CachingNetworkManagerFactory.cpp+2−2
@@ -24,12 +24,12 @@
24CachingNetworkAccessManager::CachingNetworkAccessManager(QObject *parent)
24CachingNetworkAccessManager::CachingNetworkAccessManager(QObject *parent)
25 : QNetworkAccessManager(parent)
25 : QNetworkAccessManager(parent)
26{
26{
27− m_networkingStatus = new ubuntu::connectivity::NetworkingStatus(this);
27+ m_networkingStatus = new connectivityqt::Connectivity(QDBusConnection::sessionBus(), this);
28}
28}
29
29
30QNetworkReply* CachingNetworkAccessManager::createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData)
30QNetworkReply* CachingNetworkAccessManager::createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData)
31{
31{
32− if (m_networkingStatus->status() != ubuntu::connectivity::NetworkingStatus::Status::Online) {
32+ if (m_networkingStatus->status() != connectivityqt::Connectivity::Status::Online) {
33 qDebug() << "Not connected to the internet. Request for" << request.url().toString() << "will be served only from the cache.";
33 qDebug() << "Not connected to the internet. Request for" << request.url().toString() << "will be served only from the cache.";
34 QNetworkRequest req(request);
34 QNetworkRequest req(request);
35 req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysCache);
35 req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysCache);
src/CachingNetworkManagerFactory.h+3−2
@@ -21,10 +21,11 @@
21#include <QQmlNetworkAccessManagerFactory>
21#include <QQmlNetworkAccessManagerFactory>
22#include <QNetworkAccessManager>
22#include <QNetworkAccessManager>
23
23
24−#include <ubuntu/connectivity/networking-status.h>
24+#include <connectivityqt/connectivity.h>
25
25
26class CachingNetworkAccessManager : public QNetworkAccessManager
26class CachingNetworkAccessManager : public QNetworkAccessManager
27{
27{
28+Q_OBJECT
28public:
29public:
29 CachingNetworkAccessManager(QObject *parent = 0);
30 CachingNetworkAccessManager(QObject *parent = 0);
30
31
@@ -32,7 +33,7 @@ protected:
32 QNetworkReply* createRequest(Operation op, const QNetworkRequest &req, QIODevice *outgoingData = 0) override;
33 QNetworkReply* createRequest(Operation op, const QNetworkRequest &req, QIODevice *outgoingData = 0) override;
33
34
34private:
35private:
35− ubuntu::connectivity::NetworkingStatus* m_networkingStatus;
36+ connectivityqt::Connectivity* m_networkingStatus;
36};
37};
37
38
38class CachingNetworkManagerFactory : public QQmlNetworkAccessManagerFactory
39class CachingNetworkManagerFactory : public QQmlNetworkAccessManagerFactory
src/Dash/CMakeLists.txt+1−1
@@ -9,7 +9,7 @@ endif()
9
9
10add_executable(unity8-dash ${DASH_SRCS})
10add_executable(unity8-dash ${DASH_SRCS})
11
11
12−qt5_use_modules(unity8-dash Gui Qml Quick Test)
12+qt5_use_modules(unity8-dash DBus Gui Qml Quick Test)
13
13
14# For it to find libUbuntuGestures.so, needed by Ubuntu.Gestures QML module.
14# For it to find libUbuntuGestures.so, needed by Ubuntu.Gestures QML module.
15set_target_properties(unity8-dash PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}")
15set_target_properties(unity8-dash PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}")
tests/autopilot/unity8/dash.py+1−2
@@ -211,8 +211,7 @@ class GenericScopeView(ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase):
211 self.get_root_instance().select_single(
211 self.get_root_instance().select_single(
212 objectName='processingIndicator').visible.wait_for(False)
212 objectName='processingIndicator').visible.wait_for(False)
213 return preview_list.select_single(
213 return preview_list.select_single(
214− Preview, objectName='preview{}'.format(
214+ Preview, objectName='preview')
215− preview_list.initialIndex))
216
215
217 @autopilot_logging.log_action(logger.debug)
216 @autopilot_logging.log_action(logger.debug)
218 def click_scope_item(self, category, title, press_duration=0.10):
217 def click_scope_item(self, category, title, press_duration=0.10):
tests/autopilot/unity8/shell/tests/test_helpers.py−2
@@ -117,13 +117,11 @@ class GenericScopeViewHelperTestCase(tests.DashBaseTestCase):
117 def test_open_preview(self):
117 def test_open_preview(self):
118 preview = self.generic_scope.open_preview('0', 'Title.0.0')
118 preview = self.generic_scope.open_preview('0', 'Title.0.0')
119 self.assertIsInstance(preview, dash_helpers.Preview)
119 self.assertIsInstance(preview, dash_helpers.Preview)
120− self.assertTrue(preview.isCurrent)
121
120
122 def test_open_preview_of_non_visible_item(self):
121 def test_open_preview_of_non_visible_item(self):
123 """Open an item that requires swiping to make it visible."""
122 """Open an item that requires swiping to make it visible."""
124 preview = self.generic_scope.open_preview('2', 'Title.2.0')
123 preview = self.generic_scope.open_preview('2', 'Title.2.0')
125 self.assertIsInstance(preview, dash_helpers.Preview)
124 self.assertIsInstance(preview, dash_helpers.Preview)
126− self.assertTrue(preview.isCurrent)
127
125
128
126
129class DashAppsHelperTestCase(tests.DashBaseTestCase):
127class DashAppsHelperTestCase(tests.DashBaseTestCase):
tests/mocks/GSettings.1.0/fake_gsettings.cpp+64
@@ -22,6 +22,8 @@ GSettingsControllerQml* GSettingsControllerQml::s_controllerInstance = 0;
22
22
23GSettingsControllerQml::GSettingsControllerQml()
23GSettingsControllerQml::GSettingsControllerQml()
24 : m_usageMode("Staged")
24 : m_usageMode("Staged")
25+ , m_autohideLauncher(false)
26+ , m_launcherWidth(8)
25{
27{
26}
28}
27
29
@@ -88,6 +90,32 @@ void GSettingsControllerQml::setLifecycleExemptAppids(const QStringList &appIds)
88 }
90 }
89}
91}
90
92
93+bool GSettingsControllerQml::autohideLauncher() const
94+{
95+ return m_autohideLauncher;
96+}
97+
98+void GSettingsControllerQml::setAutohideLauncher(bool autohideLauncher)
99+{
100+ if (m_autohideLauncher != autohideLauncher) {
101+ m_autohideLauncher = autohideLauncher;
102+ Q_EMIT autohideLauncherChanged(autohideLauncher);
103+ }
104+}
105+
106+int GSettingsControllerQml::launcherWidth() const
107+{
108+ return m_launcherWidth;
109+}
110+
111+void GSettingsControllerQml::setLauncherWidth(int launcherWidth)
112+{
113+ if (m_launcherWidth != launcherWidth) {
114+ m_launcherWidth = launcherWidth;
115+ Q_EMIT launcherWidthChanged(launcherWidth);
116+ }
117+}
118+
91GSettingsSchemaQml::GSettingsSchemaQml(QObject *parent): QObject(parent) {
119GSettingsSchemaQml::GSettingsSchemaQml(QObject *parent): QObject(parent) {
92}
120}
93
121
@@ -129,6 +157,10 @@ GSettingsQml::GSettingsQml(QObject *parent)
129 this, &GSettingsQml::lockedOutTimeChanged);
157 this, &GSettingsQml::lockedOutTimeChanged);
130 connect(GSettingsControllerQml::instance(), &GSettingsControllerQml::lifecycleExemptAppidsChanged,
158 connect(GSettingsControllerQml::instance(), &GSettingsControllerQml::lifecycleExemptAppidsChanged,
131 this, &GSettingsQml::lifecycleExemptAppidsChanged);
159 this, &GSettingsQml::lifecycleExemptAppidsChanged);
160+ connect(GSettingsControllerQml::instance(), &GSettingsControllerQml::autohideLauncherChanged,
161+ this, &GSettingsQml::autohideLauncherChanged);
162+ connect(GSettingsControllerQml::instance(), &GSettingsControllerQml::launcherWidthChanged,
163+ this, &GSettingsQml::launcherWidthChanged);
132}
164}
133
165
134GSettingsSchemaQml * GSettingsQml::schema() const {
166GSettingsSchemaQml * GSettingsQml::schema() const {
@@ -192,9 +224,41 @@ QStringList GSettingsQml::lifecycleExemptAppids() const
192 }
224 }
193}
225}
194
226
227+bool GSettingsQml::autohideLauncher() const
228+{
229+ if (m_schema->id() == "com.canonical.Unity8") {
230+ return GSettingsControllerQml::instance()->autohideLauncher();
231+ } else {
232+ return false;
233+ }
234+}
235+
236+int GSettingsQml::launcherWidth() const
237+{
238+ if (m_schema->id() == "com.canonical.Unity8") {
239+ return GSettingsControllerQml::instance()->launcherWidth();
240+ } else {
241+ return false;
242+ }
243+}
244+
195void GSettingsQml::setLifecycleExemptAppids(const QStringList &appIds)
245void GSettingsQml::setLifecycleExemptAppids(const QStringList &appIds)
196{
246{
197 if (m_schema->id() == "com.canonical.qtmir") {
247 if (m_schema->id() == "com.canonical.qtmir") {
198 GSettingsControllerQml::instance()->setLifecycleExemptAppids(appIds);
248 GSettingsControllerQml::instance()->setLifecycleExemptAppids(appIds);
199 }
249 }
200}
250}
251+
252+void GSettingsQml::setAutohideLauncher(bool autohideLauncher)
253+{
254+ if (m_schema->id() == "com.canonical.Unity8") {
255+ GSettingsControllerQml::instance()->setAutohideLauncher(autohideLauncher);
256+ }
257+}
258+
259+void GSettingsQml::setLauncherWidth(int launcherWidth)
260+{
261+ if (m_schema->id() == "com.canonical.Unity8") {
262+ GSettingsControllerQml::instance()->setLauncherWidth(launcherWidth);
263+ }
264+}
tests/mocks/GSettings.1.0/fake_gsettings.h+18
@@ -50,6 +50,8 @@ class GSettingsQml: public QObject
50 Q_PROPERTY(QString usageMode READ usageMode WRITE setUsageMode NOTIFY usageModeChanged)
50 Q_PROPERTY(QString usageMode READ usageMode WRITE setUsageMode NOTIFY usageModeChanged)
51 Q_PROPERTY(qint64 lockedOutTime READ lockedOutTime WRITE setLockedOutTime NOTIFY lockedOutTimeChanged)
51 Q_PROPERTY(qint64 lockedOutTime READ lockedOutTime WRITE setLockedOutTime NOTIFY lockedOutTimeChanged)
52 Q_PROPERTY(QStringList lifecycleExemptAppids READ lifecycleExemptAppids WRITE setLifecycleExemptAppids NOTIFY lifecycleExemptAppidsChanged)
52 Q_PROPERTY(QStringList lifecycleExemptAppids READ lifecycleExemptAppids WRITE setLifecycleExemptAppids NOTIFY lifecycleExemptAppidsChanged)
53+ Q_PROPERTY(bool autohideLauncher READ autohideLauncher WRITE setAutohideLauncher NOTIFY autohideLauncherChanged)
54+ Q_PROPERTY(int launcherWidth READ launcherWidth WRITE setLauncherWidth NOTIFY launcherWidthChanged)
53
55
54public:
56public:
55 GSettingsQml(QObject *parent = nullptr);
57 GSettingsQml(QObject *parent = nullptr);
@@ -59,11 +61,15 @@ public:
59 QString usageMode() const;
61 QString usageMode() const;
60 qint64 lockedOutTime() const;
62 qint64 lockedOutTime() const;
61 QStringList lifecycleExemptAppids() const;
63 QStringList lifecycleExemptAppids() const;
64+ bool autohideLauncher() const;
65+ int launcherWidth() const;
62
66
63 void setPictureUri(const QString &str);
67 void setPictureUri(const QString &str);
64 void setUsageMode(const QString &usageMode);
68 void setUsageMode(const QString &usageMode);
65 void setLockedOutTime(qint64 timestamp);
69 void setLockedOutTime(qint64 timestamp);
66 void setLifecycleExemptAppids(const QStringList &appIds);
70 void setLifecycleExemptAppids(const QStringList &appIds);
71+ void setAutohideLauncher(bool autohideLauncher);
72+ void setLauncherWidth(int launcherWidth);
67
73
68Q_SIGNALS:
74Q_SIGNALS:
69 void schemaChanged();
75 void schemaChanged();
@@ -71,6 +77,8 @@ Q_SIGNALS:
71 void usageModeChanged(const QString&);
77 void usageModeChanged(const QString&);
72 void lockedOutTimeChanged(qint64);
78 void lockedOutTimeChanged(qint64);
73 void lifecycleExemptAppidsChanged(const QStringList &);
79 void lifecycleExemptAppidsChanged(const QStringList &);
80+ void autohideLauncherChanged(bool);
81+ void launcherWidthChanged(int launcherWidth);
74
82
75private:
83private:
76 GSettingsSchemaQml* m_schema;
84 GSettingsSchemaQml* m_schema;
@@ -98,11 +106,19 @@ public:
98 QStringList lifecycleExemptAppids() const;
106 QStringList lifecycleExemptAppids() const;
99 Q_INVOKABLE void setLifecycleExemptAppids(const QStringList &appIds);
107 Q_INVOKABLE void setLifecycleExemptAppids(const QStringList &appIds);
100
108
109+ bool autohideLauncher() const;
110+ Q_INVOKABLE void setAutohideLauncher(bool autohideLauncher);
111+
112+ int launcherWidth() const;
113+ Q_INVOKABLE void setLauncherWidth(int launcherWidth);
114+
101Q_SIGNALS:
115Q_SIGNALS:
102 void pictureUriChanged(const QString&);
116 void pictureUriChanged(const QString&);
103 void usageModeChanged(const QString&);
117 void usageModeChanged(const QString&);
104 void lockedOutTimeChanged(qint64 timestamp);
118 void lockedOutTimeChanged(qint64 timestamp);
105 void lifecycleExemptAppidsChanged(const QStringList&);
119 void lifecycleExemptAppidsChanged(const QStringList&);
120+ void autohideLauncherChanged(bool autohideLauncher);
121+ void launcherWidthChanged(int launcherWidth);
106
122
107private:
123private:
108 GSettingsControllerQml();
124 GSettingsControllerQml();
@@ -111,6 +127,8 @@ private:
111 QString m_usageMode;
127 QString m_usageMode;
112 qint64 m_lockedOutTime;
128 qint64 m_lockedOutTime;
113 QStringList m_lifecycleExemptAppids;
129 QStringList m_lifecycleExemptAppids;
130+ bool m_autohideLauncher;
131+ int m_launcherWidth;
114
132
115 static GSettingsControllerQml* s_controllerInstance;
133 static GSettingsControllerQml* s_controllerInstance;
116 QList<GSettingsQml *> m_registeredGSettings;
134 QList<GSettingsQml *> m_registeredGSettings;
tests/mocks/IntegratedLightDM/liblightdm/UsersModel.cpp−14
@@ -47,20 +47,6 @@ UsersModel::UsersModel(QObject *parent) :
47 roles[HasMessagesRole] = "hasMessages";
47 roles[HasMessagesRole] = "hasMessages";
48 roles[ImagePathRole] = "imagePath";
48 roles[ImagePathRole] = "imagePath";
49 setRoleNames(roles);
49 setRoleNames(roles);
50−
51− // Now modify our mock user backgrounds
52− QDir bgdir = QDir("/usr/share/demo-assets/shell/backgrounds/");
53− QStringList backgrounds = bgdir.entryList(QDir::Files | QDir::NoDotAndDotDot);
54−
55− for (int i = 0, j = 0; i < d->entries.size(); i++) {
56− Entry &entry = d->entries[i];
57− if (entry.background.isNull() && !backgrounds.isEmpty()) {
58− entry.background = bgdir.filePath(backgrounds[j++]);
59− if (j >= backgrounds.length()) {
60− j = 0;
61− }
62− }
63− }
64}
50}
65
51
66UsersModel::~UsersModel()
52UsersModel::~UsersModel()
tests/mocks/Unity/Application/MirSurface.cpp+6−2
@@ -17,13 +17,15 @@
17#include "MirSurface.h"
17#include "MirSurface.h"
18
18
19#include <QDebug>
19#include <QDebug>
20+#include <QQmlEngine>
20
21
21MirSurface::MirSurface(const QString& name,
22MirSurface::MirSurface(const QString& name,
22 Mir::Type type,
23 Mir::Type type,
23 Mir::State state,
24 Mir::State state,
24 const QUrl& screenshot,
25 const QUrl& screenshot,
25− const QUrl &qmlFilePath)
26+ const QUrl &qmlFilePath,
27+ QObject *parent)
26− : unity::shell::application::MirSurfaceInterface(nullptr)
28+ : unity::shell::application::MirSurfaceInterface(parent)
27 , m_name(name)
29 , m_name(name)
28 , m_type(type)
30 , m_type(type)
29 , m_state(state)
31 , m_state(state)
@@ -38,6 +40,8 @@ MirSurface::MirSurface(const QString& name,
38 , m_slowToResize(false)
40 , m_slowToResize(false)
39{
41{
40// qDebug() << "MirSurface::MirSurface() " << name;
42// qDebug() << "MirSurface::MirSurface() " << name;
43+ QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
44+
41 m_delayedResizeTimer.setInterval(600);
45 m_delayedResizeTimer.setInterval(600);
42 m_delayedResizeTimer.setSingleShot(true);
46 m_delayedResizeTimer.setSingleShot(true);
43 connect(&m_delayedResizeTimer, &QTimer::timeout, this, &MirSurface::applyDelayedResize);
47 connect(&m_delayedResizeTimer, &QTimer::timeout, this, &MirSurface::applyDelayedResize);
tests/mocks/Unity/Application/MirSurface.h+2−1
@@ -41,7 +41,8 @@ public:
41 Mir::Type type,
41 Mir::Type type,
42 Mir::State state,
42 Mir::State state,
43 const QUrl& screenshot,
43 const QUrl& screenshot,
44− const QUrl &qmlFilePath = QUrl());
44+ const QUrl &qmlFilePath = QUrl(),
45+ QObject *parent = nullptr);
45 virtual ~MirSurface();
46 virtual ~MirSurface();
46
47
47 ////
48 ////
tests/mocks/Unity/Application/SurfaceManager.cpp+8−9
@@ -34,6 +34,13 @@ SurfaceManager::SurfaceManager(QObject *parent) :
34 QObject(parent)
34 QObject(parent)
35 , m_virtualKeyboard(nullptr)
35 , m_virtualKeyboard(nullptr)
36{
36{
37+ m_virtualKeyboard = new VirtualKeyboard(this);
38+ connect(m_virtualKeyboard, &QObject::destroyed, this, [this](QObject *obj) {
39+ MirSurface* surface = qobject_cast<MirSurface*>(obj);
40+ m_virtualKeyboard = nullptr;
41+ Q_EMIT inputMethodSurfaceChanged();
42+ Q_EMIT surfaceDestroyed(surface);
43+ });
37}
44}
38
45
39MirSurface *SurfaceManager::createSurface(const QString& name,
46MirSurface *SurfaceManager::createSurface(const QString& name,
@@ -58,16 +65,8 @@ MirSurface *SurfaceManager::createSurface(const QString& name,
58 return surface;
65 return surface;
59}
66}
60
67
61−MirSurface *SurfaceManager::inputMethodSurface()
68+MirSurface *SurfaceManager::inputMethodSurface() const
62{
69{
63− if (!m_virtualKeyboard) {
64− m_virtualKeyboard = new VirtualKeyboard;
65− connect(m_virtualKeyboard, &QObject::destroyed, this, [this](QObject *obj) {
66− MirSurface* surface = qobject_cast<MirSurface*>(obj);
67− Q_EMIT surfaceDestroyed(surface);
68− });
69− Q_EMIT surfaceCreated(m_virtualKeyboard);
70− }
71 return m_virtualKeyboard;
70 return m_virtualKeyboard;
72}
71}
73
72
tests/mocks/Unity/Application/SurfaceManager.h+3−3
@@ -25,7 +25,7 @@
25class SurfaceManager : public QObject
25class SurfaceManager : public QObject
26{
26{
27 Q_OBJECT
27 Q_OBJECT
28−
28+ Q_PROPERTY(MirSurface* inputMethodSurface READ inputMethodSurface NOTIFY inputMethodSurfaceChanged)
29 Q_PROPERTY(int newSurfaceMinimumWidth READ newSurfaceMinimumWidth WRITE setNewSurfaceMinimumWidth NOTIFY newSurfaceMinimumWidthChanged)
29 Q_PROPERTY(int newSurfaceMinimumWidth READ newSurfaceMinimumWidth WRITE setNewSurfaceMinimumWidth NOTIFY newSurfaceMinimumWidthChanged)
30 Q_PROPERTY(int newSurfaceMaximumWidth READ newSurfaceMaximumWidth WRITE setNewSurfaceMaximumWidth NOTIFY newSurfaceMaximumWidthChanged)
30 Q_PROPERTY(int newSurfaceMaximumWidth READ newSurfaceMaximumWidth WRITE setNewSurfaceMaximumWidth NOTIFY newSurfaceMaximumWidthChanged)
31 Q_PROPERTY(int newSurfaceMinimumHeight READ newSurfaceMinimumHeight WRITE setNewSurfaceMinimumHeight NOTIFY newSurfaceMinimumHeightChanged)
31 Q_PROPERTY(int newSurfaceMinimumHeight READ newSurfaceMinimumHeight WRITE setNewSurfaceMinimumHeight NOTIFY newSurfaceMinimumHeightChanged)
@@ -43,8 +43,7 @@ public:
43 Mir::State state,
43 Mir::State state,
44 const QUrl& screenshot);
44 const QUrl& screenshot);
45
45
46− // To be used in the tests
47− Q_INVOKABLE MirSurface* inputMethodSurface();
46+ MirSurface* inputMethodSurface() const;
48
47
49 int newSurfaceMinimumWidth() const { return m_newSurfaceMinimumWidth; }
48 int newSurfaceMinimumWidth() const { return m_newSurfaceMinimumWidth; }
50 void setNewSurfaceMinimumWidth(int value);
49 void setNewSurfaceMinimumWidth(int value);
@@ -65,6 +64,7 @@ public:
65 void setNewSurfaceHeightIncrement(int);
64 void setNewSurfaceHeightIncrement(int);
66
65
67Q_SIGNALS:
66Q_SIGNALS:
67+ void inputMethodSurfaceChanged();
68 void countChanged();
68 void countChanged();
69 void surfaceCreated(MirSurface *surface);
69 void surfaceCreated(MirSurface *surface);
70 void surfaceDestroyed(MirSurface*surface);
70 void surfaceDestroyed(MirSurface*surface);
tests/mocks/Unity/Application/VirtualKeyboard.cpp+3−2
@@ -22,12 +22,13 @@
22
22
23#include <QDebug>
23#include <QDebug>
24
24
25−VirtualKeyboard::VirtualKeyboard()
25+VirtualKeyboard::VirtualKeyboard(QObject *parent)
26 : MirSurface("input-method",
26 : MirSurface("input-method",
27 Mir::InputMethodType,
27 Mir::InputMethodType,
28 Mir::MinimizedState,
28 Mir::MinimizedState,
29 QUrl("qrc:///Unity/Application/vkb_portrait.png"),
29 QUrl("qrc:///Unity/Application/vkb_portrait.png"),
30− QUrl("qrc:///Unity/Application/VirtualKeyboard.qml"))
30+ QUrl("qrc:///Unity/Application/VirtualKeyboard.qml"),
31+ parent)
31{
32{
32}
33}
33
34
tests/mocks/Unity/Application/VirtualKeyboard.h+1−1
@@ -25,7 +25,7 @@ class VirtualKeyboard : public MirSurface
25{
25{
26 Q_OBJECT
26 Q_OBJECT
27public:
27public:
28− explicit VirtualKeyboard();
28+ explicit VirtualKeyboard(QObject *parent = nullptr);
29 ~VirtualKeyboard();
29 ~VirtualKeyboard();
30};
30};
31
31
tests/mocks/Unity/Application/plugin.cpp+2−1
@@ -78,8 +78,9 @@ void FakeUnityApplicationQmlPlugin::registerTypes(const char *uri)
78 qmlRegisterUncreatableType<unity::shell::application::ApplicationInfoInterface>(uri, 0, 1, "ApplicationInfoInterface", "Abstract interface. Cannot be created in QML");
78 qmlRegisterUncreatableType<unity::shell::application::ApplicationInfoInterface>(uri, 0, 1, "ApplicationInfoInterface", "Abstract interface. Cannot be created in QML");
79 qmlRegisterUncreatableType<Session>(uri, 0, 1, "Session", "Session can't be instantiated from QML");
79 qmlRegisterUncreatableType<Session>(uri, 0, 1, "Session", "Session can't be instantiated from QML");
80 qmlRegisterUncreatableType<MirSurface>(uri, 0, 1, "MirSurface", "MirSurface can't be instantiated from QML");
80 qmlRegisterUncreatableType<MirSurface>(uri, 0, 1, "MirSurface", "MirSurface can't be instantiated from QML");
81+ qmlRegisterUncreatableType<unity::shell::application::MirSurfaceInterface>(
82+ uri, 0, 1, "MirSurface", "MirSurface can't be instantiated from QML");
81 qmlRegisterType<MirSurfaceItem>(uri, 0, 1, "MirSurfaceItem");
83 qmlRegisterType<MirSurfaceItem>(uri, 0, 1, "MirSurfaceItem");
82−
83 qmlRegisterType<ApplicationInfo>(uri, 0, 1, "ApplicationInfo");
84 qmlRegisterType<ApplicationInfo>(uri, 0, 1, "ApplicationInfo");
84
85
85 qmlRegisterSingletonType<ApplicationManager>(uri, 0, 1, "ApplicationManager", applicationManagerSingleton);
86 qmlRegisterSingletonType<ApplicationManager>(uri, 0, 1, "ApplicationManager", applicationManagerSingleton);
tests/mocks/Unity/Launcher/MockLauncherModel.cpp+2
@@ -25,6 +25,7 @@ MockLauncherModel::MockLauncherModel(QObject* parent): LauncherModelInterface(pa
25 MockLauncherItem *item = new MockLauncherItem("dialer-app", "/usr/share/applications/dialer-app.desktop", "Dialer", "dialer-app", this);
25 MockLauncherItem *item = new MockLauncherItem("dialer-app", "/usr/share/applications/dialer-app.desktop", "Dialer", "dialer-app", this);
26 item->setProgress(0);
26 item->setProgress(0);
27 item->setPinned(true);
27 item->setPinned(true);
28+ item->setRunning(true);
28 item->setFocused(true);
29 item->setFocused(true);
29 m_list.append(item);
30 m_list.append(item);
30 item = new MockLauncherItem("camera-app", "/usr/share/applications/camera-app.desktop", "Camera", "camera", this);
31 item = new MockLauncherItem("camera-app", "/usr/share/applications/camera-app.desktop", "Camera", "camera", this);
@@ -34,6 +35,7 @@ MockLauncherModel::MockLauncherModel(QObject* parent): LauncherModelInterface(pa
34 item = new MockLauncherItem("gallery-app", "/usr/share/applications/gallery-app.desktop", "Gallery", "gallery", this);
35 item = new MockLauncherItem("gallery-app", "/usr/share/applications/gallery-app.desktop", "Gallery", "gallery", this);
35 item->setProgress(50);
36 item->setProgress(50);
36 item->setCountVisible(true);
37 item->setCountVisible(true);
38+ item->setRunning(true);
37 item->setAlerting(false);
39 item->setAlerting(false);
38 m_list.append(item);
40 m_list.append(item);
39 item = new MockLauncherItem("music-app", "/usr/share/applications/music-app.desktop", "Music", "soundcloud", this);
41 item = new MockLauncherItem("music-app", "/usr/share/applications/music-app.desktop", "Music", "soundcloud", this);
tests/mocks/Utils/CMakeLists.txt+1
@@ -18,6 +18,7 @@ set(QMLPLUGIN_SRC
18 ${CMAKE_SOURCE_DIR}/plugins/Utils/inputwatcher.cpp
18 ${CMAKE_SOURCE_DIR}/plugins/Utils/inputwatcher.cpp
19 ${CMAKE_SOURCE_DIR}/plugins/Utils/applicationsfiltermodel.cpp
19 ${CMAKE_SOURCE_DIR}/plugins/Utils/applicationsfiltermodel.cpp
20 ${CMAKE_SOURCE_DIR}/plugins/Utils/inputeventgenerator.cpp
20 ${CMAKE_SOURCE_DIR}/plugins/Utils/inputeventgenerator.cpp
21+ ${CMAKE_SOURCE_DIR}/plugins/Utils/deviceconfigparser.cpp
21 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
22 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
22 constants.cpp
23 constants.cpp
23 plugin.cpp
24 plugin.cpp
tests/mocks/Utils/plugin.cpp+2
@@ -37,6 +37,7 @@
37#include <easingcurve.h>
37#include <easingcurve.h>
38#include <applicationsfiltermodel.h>
38#include <applicationsfiltermodel.h>
39#include <inputeventgenerator.h>
39#include <inputeventgenerator.h>
40+#include <deviceconfigparser.h>
40
41
41static QObject *createWindowStateStorage(QQmlEngine *engine, QJSEngine *scriptEngine)
42static QObject *createWindowStateStorage(QQmlEngine *engine, QJSEngine *scriptEngine)
42{
43{
@@ -67,6 +68,7 @@ void FakeUtilsPlugin::registerTypes(const char *uri)
67 qmlRegisterType<ActiveFocusLogger>(uri, 0, 1, "ActiveFocusLogger");
68 qmlRegisterType<ActiveFocusLogger>(uri, 0, 1, "ActiveFocusLogger");
68 qmlRegisterType<ApplicationsFilterModel>(uri, 0, 1, "ApplicationsFilterModel");
69 qmlRegisterType<ApplicationsFilterModel>(uri, 0, 1, "ApplicationsFilterModel");
69 qmlRegisterType<InputEventGenerator>(uri, 0, 1, "InputEventGenerator");
70 qmlRegisterType<InputEventGenerator>(uri, 0, 1, "InputEventGenerator");
71+ qmlRegisterType<DeviceConfigParser>(uri, 0, 1, "DeviceConfigParser");
70}
72}
71
73
72void FakeUtilsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
74void FakeUtilsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
tests/plugins/AccountsService/CMakeLists.txt+5
@@ -10,11 +10,13 @@ macro(make_dbus_class NAME INTERFACE)
10endmacro(make_dbus_class)
10endmacro(make_dbus_class)
11
11
12make_dbus_class(Accounts org.freedesktop.Accounts)
12make_dbus_class(Accounts org.freedesktop.Accounts)
13+make_dbus_class(Input com.ubuntu.AccountsService.Input)
13make_dbus_class(Properties org.freedesktop.DBus.Properties)
14make_dbus_class(Properties org.freedesktop.DBus.Properties)
14make_dbus_class(SecurityPrivacy com.ubuntu.touch.AccountsService.SecurityPrivacy)
15make_dbus_class(SecurityPrivacy com.ubuntu.touch.AccountsService.SecurityPrivacy)
15make_dbus_class(Location com.ubuntu.location.providers.here.AccountsService)
16make_dbus_class(Location com.ubuntu.location.providers.here.AccountsService)
16make_dbus_class(AccountsUser org.freedesktop.Accounts.User)
17make_dbus_class(AccountsUser org.freedesktop.Accounts.User)
17make_dbus_class(AccountsPrivate com.canonical.unity.AccountsService.Private)
18make_dbus_class(AccountsPrivate com.canonical.unity.AccountsService.Private)
19+make_dbus_class(UscInput com.canonical.Unity.Input)
18
20
19include_directories(
21include_directories(
20 ${CMAKE_CURRENT_BINARY_DIR}
22 ${CMAKE_CURRENT_BINARY_DIR}
@@ -27,12 +29,15 @@ add_executable(mock-server
27 ${CMAKE_CURRENT_BINARY_DIR}/AccountsAdaptor.cpp
29 ${CMAKE_CURRENT_BINARY_DIR}/AccountsAdaptor.cpp
28 ${CMAKE_CURRENT_BINARY_DIR}/AccountsPrivateAdaptor.cpp
30 ${CMAKE_CURRENT_BINARY_DIR}/AccountsPrivateAdaptor.cpp
29 ${CMAKE_CURRENT_BINARY_DIR}/AccountsUserAdaptor.cpp
31 ${CMAKE_CURRENT_BINARY_DIR}/AccountsUserAdaptor.cpp
32+ ${CMAKE_CURRENT_BINARY_DIR}/InputAdaptor.cpp
30 ${CMAKE_CURRENT_BINARY_DIR}/PropertiesAdaptor.cpp
33 ${CMAKE_CURRENT_BINARY_DIR}/PropertiesAdaptor.cpp
31 ${CMAKE_CURRENT_BINARY_DIR}/LocationAdaptor.cpp
34 ${CMAKE_CURRENT_BINARY_DIR}/LocationAdaptor.cpp
32 ${CMAKE_CURRENT_BINARY_DIR}/SecurityPrivacyAdaptor.cpp
35 ${CMAKE_CURRENT_BINARY_DIR}/SecurityPrivacyAdaptor.cpp
36+ ${CMAKE_CURRENT_BINARY_DIR}/UscInputAdaptor.cpp
33 server.cpp
37 server.cpp
34 AccountsServer.cpp
38 AccountsServer.cpp
35 PropertiesServer.cpp
39 PropertiesServer.cpp
40+ UscServer.cpp
36 )
41 )
37qt5_use_modules(mock-server Core DBus)
42qt5_use_modules(mock-server Core DBus)
38
43
tests/plugins/AccountsService/PropertiesServer.cpp+16−4
@@ -32,9 +32,9 @@ PropertiesServer::PropertiesServer(QObject *parent)
32 Reset();
32 Reset();
33}
33}
34
34
35−QDBusVariant PropertiesServer::Get(const QString &interface, const QString &property)
35+QDBusVariant PropertiesServer::Get(const QString &interface, const QString &property) const
36{
36{
37− if (m_properties[interface].contains(property)) {
37+ if (m_properties.contains(interface) && m_properties[interface].contains(property)) {
38 return QDBusVariant(m_properties[interface][property]);
38 return QDBusVariant(m_properties[interface][property]);
39 } else {
39 } else {
40 sendErrorReply(QDBusError::InvalidArgs, "Bad interface or property");
40 sendErrorReply(QDBusError::InvalidArgs, "Bad interface or property");
@@ -42,6 +42,16 @@ QDBusVariant PropertiesServer::Get(const QString &interface, const QString &prop
42 }
42 }
43}
43}
44
44
45+QVariantMap PropertiesServer::GetAll(const QString &interface) const
46+{
47+ if (m_properties.contains(interface)) {
48+ return m_properties[interface];
49+ } else {
50+ sendErrorReply(QDBusError::InvalidArgs, "Bad interface");
51+ return QVariantMap();
52+ }
53+}
54+
45void PropertiesServer::Set(const QString &interface, const QString &property, const QDBusVariant &variant)
55void PropertiesServer::Set(const QString &interface, const QString &property, const QDBusVariant &variant)
46{
56{
47 QVariant newValue = variant.variant();
57 QVariant newValue = variant.variant();
@@ -57,8 +67,8 @@ void PropertiesServer::Set(const QString &interface, const QString &property, co
57
67
58 oldValue = newValue;
68 oldValue = newValue;
59
69
60− // Special case for Background file.
70+ // Special case for user properties.
61− if (interface == "org.freedesktop.Accounts.User" && property == "BackgroundFile") {
71+ if (interface == "org.freedesktop.Accounts.User") {
62 Q_EMIT Changed();
72 Q_EMIT Changed();
63 } else {
73 } else {
64 QVariantMap propertyChanges;
74 QVariantMap propertyChanges;
@@ -82,10 +92,12 @@ void PropertiesServer::Reset()
82 m_properties["com.canonical.unity.AccountsService"]["LauncherItems"] = QVariant::fromValue(QList<QVariantMap>());
92 m_properties["com.canonical.unity.AccountsService"]["LauncherItems"] = QVariant::fromValue(QList<QVariantMap>());
83 m_properties["com.canonical.unity.AccountsService.Private"]["FailedLogins"] = 0;
93 m_properties["com.canonical.unity.AccountsService.Private"]["FailedLogins"] = 0;
84 m_properties["com.ubuntu.touch.AccountsService.SecurityPrivacy"]["StatsWelcomeScreen"] = true;
94 m_properties["com.ubuntu.touch.AccountsService.SecurityPrivacy"]["StatsWelcomeScreen"] = true;
95+ m_properties["com.ubuntu.AccountsService.Input"]["MousePrimaryButton"] = "right";
85 m_properties["com.ubuntu.AccountsService.SecurityPrivacy"]["EnableLauncherWhileLocked"] = true;
96 m_properties["com.ubuntu.AccountsService.SecurityPrivacy"]["EnableLauncherWhileLocked"] = true;
86 m_properties["com.ubuntu.AccountsService.SecurityPrivacy"]["EnableIndicatorsWhileLocked"] = true;
97 m_properties["com.ubuntu.AccountsService.SecurityPrivacy"]["EnableIndicatorsWhileLocked"] = true;
87 m_properties["com.ubuntu.AccountsService.SecurityPrivacy"]["PasswordDisplayHint"] = AccountsService::Keyboard;
98 m_properties["com.ubuntu.AccountsService.SecurityPrivacy"]["PasswordDisplayHint"] = AccountsService::Keyboard;
88 m_properties["com.ubuntu.location.providers.here.AccountsService"]["LicenseAccepted"] = false;
99 m_properties["com.ubuntu.location.providers.here.AccountsService"]["LicenseAccepted"] = false;
89 m_properties["com.ubuntu.location.providers.here.AccountsService"]["LicenseBasePath"] = "";
100 m_properties["com.ubuntu.location.providers.here.AccountsService"]["LicenseBasePath"] = "";
90 m_properties["org.freedesktop.Accounts.User"]["BackgroundFile"] = "";
101 m_properties["org.freedesktop.Accounts.User"]["BackgroundFile"] = "";
102+ m_properties["org.freedesktop.Accounts.User"]["RealName"] = "";
91}
103}
tests/plugins/AccountsService/PropertiesServer.h+2−1
@@ -34,7 +34,8 @@ public:
34 explicit PropertiesServer(QObject *parent = 0);
34 explicit PropertiesServer(QObject *parent = 0);
35
35
36public Q_SLOTS:
36public Q_SLOTS:
37− QDBusVariant Get(const QString &interface, const QString &property);
37+ QDBusVariant Get(const QString &interface, const QString &property) const;
38+ QVariantMap GetAll(const QString &interface) const;
38 void Set(const QString &interface, const QString &property, const QDBusVariant &variant);
39 void Set(const QString &interface, const QString &property, const QDBusVariant &variant);
39
40
40 // mock only.
41 // mock only.
tests/plugins/AccountsService/UscServer.cppnew file+28
@@ -0,0 +1,28 @@
1+/*
2+ * Copyright 2016 Canonical Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it
5+ * under the terms of the GNU General Public License version 3, as published
6+ * by the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but
9+ * WITHOUT ANY WARRANTY; without even the implied warranties of
10+ * MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
11+ * PURPOSE. See the GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * version 3 along with this program. If not, see
15+ * <http://www.gnu.org/licenses/>
16+ */
17+
18+#include "UscServer.h"
19+
20+UscServer::UscServer(QObject *parent)
21+ : QObject(parent)
22+{
23+}
24+
25+void UscServer::setMousePrimaryButton(int button)
26+{
27+ Q_EMIT setMousePrimaryButtonCalled(button);
28+}
tests/plugins/AccountsService/UscServer.hnew file+39
@@ -0,0 +1,39 @@
1+/*
2+ * Copyright 2016 Canonical Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it
5+ * under the terms of the GNU General Public License version 3, as published
6+ * by the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but
9+ * WITHOUT ANY WARRANTY; without even the implied warranties of
10+ * MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
11+ * PURPOSE. See the GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * version 3 along with this program. If not, see
15+ * <http://www.gnu.org/licenses/>
16+ */
17+
18+#ifndef UNITY_USCSERVER_H
19+#define UNITY_USCSERVER_H
20+
21+#include <QDBusContext>
22+#include <QObject>
23+
24+class UscServer: public QObject, protected QDBusContext
25+{
26+ Q_OBJECT
27+
28+public:
29+ explicit UscServer(QObject *parent = nullptr);
30+
31+public Q_SLOTS:
32+ void setMousePrimaryButton(int button);
33+
34+Q_SIGNALS:
35+ // mock only.
36+ void setMousePrimaryButtonCalled(int button);
37+};
38+
39+#endif
tests/plugins/AccountsService/client.cpp+63−9
@@ -42,7 +42,16 @@ public:
42 : QObject(parent)
42 : QObject(parent)
43 , m_userInterface(nullptr)
43 , m_userInterface(nullptr)
44 , m_spy(this, &AccountsServiceTest::propertiesChanged)
44 , m_spy(this, &AccountsServiceTest::propertiesChanged)
45+ , m_mousePrimaryButtonSpy(this, &AccountsServiceTest::setMousePrimaryButtonCalled)
45 {
46 {
47+ m_uscInputInterface = new QDBusInterface("com.canonical.Unity.Input",
48+ "/com/canonical/Unity/Input",
49+ "com.canonical.Unity.Input",
50+ QDBusConnection::sessionBus(),
51+ this);
52+
53+ QObject::connect(m_uscInputInterface, SIGNAL(setMousePrimaryButtonCalled(int)),
54+ this, SIGNAL(setMousePrimaryButtonCalled(int)));
46 }
55 }
47
56
48private Q_SLOTS:
57private Q_SLOTS:
@@ -71,6 +80,7 @@ private Q_SLOTS:
71
80
72 delete m_userInterface;
81 delete m_userInterface;
73 m_spy.clear();
82 m_spy.clear();
83+ m_mousePrimaryButtonSpy.clear();
74 }
84 }
75
85
76 void testInvalids()
86 void testInvalids()
@@ -107,7 +117,7 @@ private Q_SLOTS:
107 QCOMPARE(session.hereEnabled(), true);
117 QCOMPARE(session.hereEnabled(), true);
108 }
118 }
109
119
110− void testAsynchornousChangeForDemoEdges()
120+ void testAsynchronousChangeForDemoEdges()
111 {
121 {
112 AccountsService session(this, QTest::currentTestFunction());
122 AccountsService session(this, QTest::currentTestFunction());
113
123
@@ -119,7 +129,7 @@ private Q_SLOTS:
119 QTRY_COMPARE(session.demoEdges(), true);
129 QTRY_COMPARE(session.demoEdges(), true);
120 }
130 }
121
131
122− void testAsynchornousChangeForFailedLogins()
132+ void testAsynchronousChangeForFailedLogins()
123 {
133 {
124 AccountsService session(this, QTest::currentTestFunction());
134 AccountsService session(this, QTest::currentTestFunction());
125
135
@@ -131,7 +141,7 @@ private Q_SLOTS:
131 QTRY_COMPARE(session.failedLogins(), (uint)5);
141 QTRY_COMPARE(session.failedLogins(), (uint)5);
132 }
142 }
133
143
134− void testAsynchornousChangeForStatsWelcomeScreen()
144+ void testAsynchronousChangeForStatsWelcomeScreen()
135 {
145 {
136 AccountsService session(this, QTest::currentTestFunction());
146 AccountsService session(this, QTest::currentTestFunction());
137
147
@@ -143,7 +153,7 @@ private Q_SLOTS:
143 QTRY_COMPARE(session.statsWelcomeScreen(), false);
153 QTRY_COMPARE(session.statsWelcomeScreen(), false);
144 }
154 }
145
155
146− void testAsynchornousChangeForStatsEnableLauncherWhileLocked()
156+ void testAsynchronousChangeForEnableLauncherWhileLocked()
147 {
157 {
148 AccountsService session(this, QTest::currentTestFunction());
158 AccountsService session(this, QTest::currentTestFunction());
149
159
@@ -155,7 +165,7 @@ private Q_SLOTS:
155 QTRY_COMPARE(session.enableLauncherWhileLocked(), false);
165 QTRY_COMPARE(session.enableLauncherWhileLocked(), false);
156 }
166 }
157
167
158− void testAsynchornousChangeForStatsEnableIndicatorsWhileLocked()
168+ void testAsynchronousChangeForEnableIndicatorsWhileLocked()
159 {
169 {
160 AccountsService session(this, QTest::currentTestFunction());
170 AccountsService session(this, QTest::currentTestFunction());
161
171
@@ -167,7 +177,7 @@ private Q_SLOTS:
167 QTRY_COMPARE(session.enableIndicatorsWhileLocked(), false);
177 QTRY_COMPARE(session.enableIndicatorsWhileLocked(), false);
168 }
178 }
169
179
170− void testAsynchornousChangeForStatsPasswordDisplayHint()
180+ void testAsynchronousChangeForPasswordDisplayHint()
171 {
181 {
172 AccountsService session(this, QTest::currentTestFunction());
182 AccountsService session(this, QTest::currentTestFunction());
173
183
@@ -179,7 +189,7 @@ private Q_SLOTS:
179 QTRY_COMPARE(session.passwordDisplayHint(), AccountsService::Numeric);
189 QTRY_COMPARE(session.passwordDisplayHint(), AccountsService::Numeric);
180 }
190 }
181
191
182− void testAsynchornousChangeForStatsLicenseAccepted()
192+ void testAsynchronousChangeForLicenseAccepted()
183 {
193 {
184 AccountsService session(this, QTest::currentTestFunction());
194 AccountsService session(this, QTest::currentTestFunction());
185
195
@@ -191,7 +201,7 @@ private Q_SLOTS:
191 QTRY_COMPARE(session.hereEnabled(), true);
201 QTRY_COMPARE(session.hereEnabled(), true);
192 }
202 }
193
203
194− void testAsynchornousChangeForLicenseBasePath()
204+ void testAsynchronousChangeForLicenseBasePath()
195 {
205 {
196 AccountsService session(this, QTest::currentTestFunction());
206 AccountsService session(this, QTest::currentTestFunction());
197
207
@@ -203,7 +213,7 @@ private Q_SLOTS:
203 QTRY_COMPARE(session.hereLicensePath(), QString("/"));
213 QTRY_COMPARE(session.hereLicensePath(), QString("/"));
204 }
214 }
205
215
206− void testAsynchornousChangeForStatsBackgroundFile()
216+ void testAsynchronousChangeForBackgroundFile()
207 {
217 {
208 AccountsService session(this, QTest::currentTestFunction());
218 AccountsService session(this, QTest::currentTestFunction());
209
219
@@ -215,12 +225,56 @@ private Q_SLOTS:
215 QTRY_COMPARE(session.backgroundFile(), QString("/test/BackgroundFile"));
225 QTRY_COMPARE(session.backgroundFile(), QString("/test/BackgroundFile"));
216 }
226 }
217
227
228+ void testProxyOnStartup()
229+ {
230+ AccountsService session(this, QTest::currentTestFunction());
231+
232+ QTRY_COMPARE(m_mousePrimaryButtonSpy.count(), 1);
233+ QList<QVariant> arguments = m_mousePrimaryButtonSpy.takeFirst();
234+ QCOMPARE(arguments.at(0).toInt(), 1);
235+ }
236+
237+ void testProxyOnChange()
238+ {
239+ AccountsService session(this, QTest::currentTestFunction());
240+ QTRY_COMPARE(m_mousePrimaryButtonSpy.count(), 1);
241+ m_mousePrimaryButtonSpy.clear();
242+
243+ ASSERT_DBUS_CALL(m_userInterface->asyncCall("Set",
244+ "com.ubuntu.AccountsService.Input",
245+ "MousePrimaryButton",
246+ dbusVariant("left")));
247+
248+ QTRY_COMPARE(m_mousePrimaryButtonSpy.count(), 1);
249+ QList<QVariant> arguments = m_mousePrimaryButtonSpy.takeFirst();
250+ QCOMPARE(arguments.at(0).toInt(), 0);
251+ }
252+
253+ void testInvalidPrimaryButton()
254+ {
255+ AccountsService session(this, QTest::currentTestFunction());
256+ QTRY_COMPARE(m_mousePrimaryButtonSpy.count(), 1);
257+ m_mousePrimaryButtonSpy.clear();
258+
259+ ASSERT_DBUS_CALL(m_userInterface->asyncCall("Set",
260+ "com.ubuntu.AccountsService.Input",
261+ "MousePrimaryButton",
262+ dbusVariant("NOPE")));
263+
264+ QTRY_COMPARE(m_mousePrimaryButtonSpy.count(), 1);
265+ QList<QVariant> arguments = m_mousePrimaryButtonSpy.takeFirst();
266+ QCOMPARE(arguments.at(0).toInt(), 0);
267+ }
268+
218Q_SIGNALS:
269Q_SIGNALS:
219 void propertiesChanged(const QString &interface, const QVariantMap &changed, const QStringList &invalid);
270 void propertiesChanged(const QString &interface, const QVariantMap &changed, const QStringList &invalid);
271+ void setMousePrimaryButtonCalled(int button);
220
272
221private:
273private:
274+ QDBusInterface* m_uscInputInterface;
222 QDBusInterface* m_userInterface;
275 QDBusInterface* m_userInterface;
223 QSignalSpy m_spy;
276 QSignalSpy m_spy;
277+ QSignalSpy m_mousePrimaryButtonSpy;
224};
278};
225
279
226QTEST_MAIN(AccountsServiceTest)
280QTEST_MAIN(AccountsServiceTest)
tests/plugins/AccountsService/interfaces.xml+16
@@ -5,6 +5,11 @@
5 <arg name="property" type="s" direction="in" />
5 <arg name="property" type="s" direction="in" />
6 <arg name="value" type="v" direction="out" />
6 <arg name="value" type="v" direction="out" />
7 </method>
7 </method>
8+ <method name="GetAll">
9+ <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QVariantMap"/>
10+ <arg name="interface" type="s" direction="in" />
11+ <arg name="value" type="a{sv}" direction="out" />
12+ </method>
8 <method name="Set">
13 <method name="Set">
9 <arg name="interface" type="s" direction="in" />
14 <arg name="interface" type="s" direction="in" />
10 <arg name="property" type="s" direction="in" />
15 <arg name="property" type="s" direction="in" />
@@ -32,10 +37,21 @@
32 <arg name="success" type="b" direction="out" />
37 <arg name="success" type="b" direction="out" />
33 </method>
38 </method>
34 </interface>
39 </interface>
40+ <interface name="com.ubuntu.AccountsService.Input" />
35 <interface name="com.ubuntu.touch.AccountsService.SecurityPrivacy" />
41 <interface name="com.ubuntu.touch.AccountsService.SecurityPrivacy" />
36 <interface name="com.ubuntu.location.providers.here.AccountsService" />
42 <interface name="com.ubuntu.location.providers.here.AccountsService" />
37 <interface name="org.freedesktop.Accounts.User">
43 <interface name="org.freedesktop.Accounts.User">
38 <signal name="Changed" />
44 <signal name="Changed" />
39 </interface>
45 </interface>
40 <interface name="com.canonical.unity.AccountsService.Private" />
46 <interface name="com.canonical.unity.AccountsService.Private" />
47+
48+ <interface name="com.canonical.Unity.Input">
49+ <method name="setMousePrimaryButton">
50+ <arg name="button" type="i" direction="in" />
51+ </method>
52+ <!-- Just for testing -->
53+ <signal name="setMousePrimaryButtonCalled">
54+ <arg name="button" type="i" direction="out" />
55+ </signal>
56+ </interface>
41</node>
57</node>
tests/plugins/AccountsService/server.cpp+12
@@ -19,10 +19,13 @@
19
19
20#include "AccountsAdaptor.h"
20#include "AccountsAdaptor.h"
21#include "AccountsServer.h"
21#include "AccountsServer.h"
22+#include "InputAdaptor.h"
22#include "PropertiesServer.h"
23#include "PropertiesServer.h"
23#include "SecurityPrivacyAdaptor.h"
24#include "SecurityPrivacyAdaptor.h"
24#include "LocationAdaptor.h"
25#include "LocationAdaptor.h"
25#include "AccountsPrivateAdaptor.h"
26#include "AccountsPrivateAdaptor.h"
27+#include "UscInputAdaptor.h"
28+#include "UscServer.h"
26#include <QCoreApplication>
29#include <QCoreApplication>
27
30
28int main(int argc, char *argv[])
31int main(int argc, char *argv[])
@@ -31,11 +34,20 @@ int main(int argc, char *argv[])
31
34
32 auto accounts = new AccountsServer(&a);
35 auto accounts = new AccountsServer(&a);
33 new AccountsAdaptor(accounts);
36 new AccountsAdaptor(accounts);
37+ new InputAdaptor(accounts);
34 new SecurityPrivacyAdaptor(accounts);
38 new SecurityPrivacyAdaptor(accounts);
35 new LocationAdaptor(accounts);
39 new LocationAdaptor(accounts);
36 new AccountsPrivateAdaptor(accounts);
40 new AccountsPrivateAdaptor(accounts);
41+
42+ auto usc = new UscServer(&a);
43+ new UscInputAdaptor(usc);
44+
37 // We use the session bus for testing. The real plugin uses the system bus
45 // We use the session bus for testing. The real plugin uses the system bus
38 auto connection = QDBusConnection::sessionBus();
46 auto connection = QDBusConnection::sessionBus();
47+ if (!connection.registerObject("/com/canonical/Unity/Input", usc))
48+ return 1;
49+ if (!connection.registerService("com.canonical.Unity.Input"))
50+ return 1;
39 if (!connection.registerObject("/org/freedesktop/Accounts", accounts))
51 if (!connection.registerObject("/org/freedesktop/Accounts", accounts))
40 return 1;
52 return 1;
41 if (!connection.registerService("org.freedesktop.Accounts"))
53 if (!connection.registerService("org.freedesktop.Accounts"))
tests/plugins/Dash/cardcreator/1.res+4−6
@@ -5,12 +5,10 @@ AbstractButton {
5 property string backgroundShapeStyle: "inset";
5 property string backgroundShapeStyle: "inset";
6 property real fontScale: 1.0;
6 property real fontScale: 1.0;
7 property var scopeStyle: null;
7 property var scopeStyle: null;
8− property int titleAlignment: Text.AlignLeft;
9 property int fixedHeaderHeight: -1;
8 property int fixedHeaderHeight: -1;
10 property size fixedArtShapeSize: Qt.size(-1, -1);
9 property size fixedArtShapeSize: Qt.size(-1, -1);
11 readonly property string title: cardData && cardData["title"] || "";
10 readonly property string title: cardData && cardData["title"] || "";
12− property bool asynchronous: true;
13− property bool showHeader: true;
11+ property bool showHeader: true;
14 implicitWidth: childrenRect.width;
12 implicitWidth: childrenRect.width;
15 enabled: true;
13 enabled: true;
16
14
@@ -25,7 +23,7 @@ Item {
25 objectName: "artShapeLoader";
23 objectName: "artShapeLoader";
26 readonly property string cardArt: cardData && cardData["art"] || "";
24 readonly property string cardArt: cardData && cardData["art"] || "";
27 active: cardArt != "";
25 active: cardArt != "";
28− asynchronous: root.asynchronous;
26+ asynchronous: true;
29 visible: status == Loader.Ready;
27 visible: status == Loader.Ready;
30 sourceComponent: Item {
28 sourceComponent: Item {
31 id: artShape;
29 id: artShape;
@@ -82,7 +80,7 @@ Item {
82 id: artImage;
80 id: artImage;
83 objectName: "artImage";
81 objectName: "artImage";
84 source: artShapeLoader.cardArt;
82 source: artShapeLoader.cardArt;
85− asynchronous: root.asynchronous;
83+ asynchronous: true;
86 width: root.width;
84 width: root.width;
87 height: width / artShape.aspect;
85 height: width / artShape.aspect;
88 }
86 }
@@ -108,7 +106,7 @@ Label {
108 width: undefined;
106 width: undefined;
109 text: root.title;
107 text: root.title;
110 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
108 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
111− horizontalAlignment: root.titleAlignment;
109+ horizontalAlignment: Text.AlignHCenter;
112 }
110 }
113UbuntuShape {
111UbuntuShape {
114 id: touchdown;
112 id: touchdown;
tests/plugins/Dash/cardcreator/1.res.cardcreatornew file+119
@@ -0,0 +1,119 @@
1+AbstractButton {
2+ id: root;
3+ property var cardData;
4+ property string artShapeStyle: "inset";
5+ property string backgroundShapeStyle: "inset";
6+ property real fontScale: 1.0;
7+ property var scopeStyle: null;
8+ property size fixedArtShapeSize: Qt.size(-1, -1);
9+ readonly property string title: cardData && cardData["title"] || "";
10+ property bool showHeader: true;
11+ implicitWidth: childrenRect.width;
12+ enabled: true;
13+
14+readonly property size artShapeSize: artShapeLoader.item ? Qt.size(artShapeLoader.item.width, artShapeLoader.item.height) : Qt.size(-1, -1);
15+Item {
16+ id: artShapeHolder;
17+ height: root.fixedArtShapeSize.height > 0 ? root.fixedArtShapeSize.height : artShapeLoader.height;
18+ width: root.fixedArtShapeSize.width > 0 ? root.fixedArtShapeSize.width : artShapeLoader.width;
19+ anchors { horizontalCenter: parent.horizontalCenter; }
20+ Loader {
21+ id: artShapeLoader;
22+ objectName: "artShapeLoader";
23+ readonly property string cardArt: cardData && cardData["art"] || "";
24+ active: cardArt != "";
25+ asynchronous: false;
26+ visible: status == Loader.Ready;
27+ sourceComponent: Item {
28+ id: artShape;
29+ objectName: "artShape";
30+ visible: image.status == Image.Ready;
31+ readonly property alias image: artImage;
32+ ShaderEffectSource {
33+ id: artShapeSource;
34+ sourceItem: artImage;
35+ anchors.centerIn: parent;
36+ width: 1;
37+ height: 1;
38+ hideSource: true;
39+ }
40+ Loader {
41+ anchors.fill: parent;
42+ visible: true;
43+ sourceComponent: root.artShapeStyle === "icon" ? artShapeIconComponent : artShapeShapeComponent;
44+ Component {
45+ id: artShapeShapeComponent;
46+ UbuntuShape {
47+ source: artShapeSource;
48+ sourceFillMode: UbuntuShape.PreserveAspectCrop;
49+ radius: "medium";
50+ aspect: {
51+ switch (root.artShapeStyle) {
52+ case "inset": return UbuntuShape.Inset;
53+ case "shadow": return UbuntuShape.DropShadow;
54+ default:
55+ case "flat": return UbuntuShape.Flat;
56+ }
57+ }
58+ }
59+ }
60+ Component {
61+ id: artShapeIconComponent;
62+ ProportionalShape { source: artShapeSource; aspect: UbuntuShape.DropShadow; }
63+ }
64+ }
65+ readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1;
66+ readonly property real aspect: fixedArtShapeSizeAspect > 0 ? fixedArtShapeSizeAspect : 1.6;
67+ Component.onCompleted: { updateWidthHeightBindings(); }
68+ Connections { target: root; onFixedArtShapeSizeChanged: updateWidthHeightBindings(); }
69+ function updateWidthHeightBindings() {
70+ if (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) {
71+ width = root.fixedArtShapeSize.width;
72+ height = root.fixedArtShapeSize.height;
73+ } else {
74+ width = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.width });
75+ height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height });
76+ }
77+ }
78+ CroppedImageMinimumSourceSize {
79+ id: artImage;
80+ objectName: "artImage";
81+ source: artShapeLoader.cardArt;
82+ asynchronous: false;
83+ width: root.width;
84+ height: width / artShape.aspect;
85+ }
86+ }
87+ }
88+ }
89+readonly property int headerHeight: titleLabel.height;
90+Label {
91+ id: titleLabel;
92+ objectName: "titleLabel";
93+ anchors { right: parent.right;
94+ left: parent.left;
95+ top: artShapeHolder.bottom;
96+ topMargin: units.gu(1);
97+ }
98+ elide: Text.ElideRight;
99+ fontSize: "small";
100+ wrapMode: Text.Wrap;
101+ maximumLineCount: 2;
102+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
103+ color: root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText;
104+ visible: showHeader ;
105+ width: undefined;
106+ text: root.title;
107+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
108+ horizontalAlignment: Text.AlignHCenter;
109+ }
110+UbuntuShape {
111+ id: touchdown;
112+ objectName: "touchdown";
113+ anchors { fill: artShapeHolder }
114+ visible: root.artShapeStyle != "shadow" && root.artShapeStyle != "icon" && root.pressed;
115+ radius: "medium";
116+ borderSource: "radius_pressed.sci"
117+}
118+implicitHeight: titleLabel.y + titleLabel.height + units.gu(1);
119+}
tests/plugins/Dash/cardcreator/10.res+3−5
@@ -5,11 +5,9 @@ AbstractButton {
5 property string backgroundShapeStyle: "inset";
5 property string backgroundShapeStyle: "inset";
6 property real fontScale: 1.0;
6 property real fontScale: 1.0;
7 property var scopeStyle: null;
7 property var scopeStyle: null;
8− property int titleAlignment: Text.AlignLeft;
9 property int fixedHeaderHeight: -1;
8 property int fixedHeaderHeight: -1;
10 property size fixedArtShapeSize: Qt.size(-1, -1);
9 property size fixedArtShapeSize: Qt.size(-1, -1);
11 readonly property string title: cardData && cardData["title"] || "";
10 readonly property string title: cardData && cardData["title"] || "";
12− property bool asynchronous: true;
13 property bool showHeader: true;
11 property bool showHeader: true;
14 implicitWidth: childrenRect.width;
12 implicitWidth: childrenRect.width;
15 enabled: true;
13 enabled: true;
@@ -18,7 +16,7 @@ Loader {
18 id: backgroundLoader;
16 id: backgroundLoader;
19 objectName: "backgroundLoader";
17 objectName: "backgroundLoader";
20 anchors.fill: parent;
18 anchors.fill: parent;
21− asynchronous: root.asynchronous;
19+ asynchronous: true;
22 visible: status == Loader.Ready;
20 visible: status == Loader.Ready;
23 sourceComponent: UbuntuShape {
21 sourceComponent: UbuntuShape {
24 objectName: "background";
22 objectName: "background";
@@ -59,7 +57,7 @@ Row {
59 objectName: "outerRow";
57 objectName: "outerRow";
60 property real margins: units.gu(1);
58 property real margins: units.gu(1);
61 spacing: margins;
59 spacing: margins;
62− height: root.fixedHeaderHeight != -1 ? root.fixedHeaderHeight : implicitHeight;
60+ height: root.fixedHeaderHeight;
63 anchors { top: parent.top;
61 anchors { top: parent.top;
64 topMargin: units.gu(1);
62 topMargin: units.gu(1);
65left: parent.left;
63left: parent.left;
@@ -103,7 +101,7 @@ left: parent.left;
103 width: undefined;
101 width: undefined;
104 text: root.title;
102 text: root.title;
105 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
103 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
106− horizontalAlignment: root.titleAlignment;
104+ horizontalAlignment: Text.AlignLeft;
107 }
105 }
108,Label {
106,Label {
109 id: subtitleLabel;
107 id: subtitleLabel;
tests/plugins/Dash/cardcreator/10.res.cardcreatornew file+137
@@ -0,0 +1,137 @@
1+AbstractButton {
2+ id: root;
3+ property var cardData;
4+ property string artShapeStyle: "inset";
5+ property string backgroundShapeStyle: "inset";
6+ property real fontScale: 1.0;
7+ property var scopeStyle: null;
8+ property size fixedArtShapeSize: Qt.size(-1, -1);
9+ readonly property string title: cardData && cardData["title"] || "";
10+ property bool showHeader: true;
11+ implicitWidth: childrenRect.width;
12+ enabled: true;
13+
14+Loader {
15+ id: backgroundLoader;
16+ objectName: "backgroundLoader";
17+ anchors.fill: parent;
18+ asynchronous: false;
19+ visible: status == Loader.Ready;
20+ sourceComponent: UbuntuShape {
21+ objectName: "background";
22+ radius: "medium";
23+ aspect: {
24+ switch (root.backgroundShapeStyle) {
25+ case "inset": return UbuntuShape.Inset;
26+ case "shadow": return UbuntuShape.DropShadow;
27+ default:
28+ case "flat": return UbuntuShape.Flat;
29+ }
30+ }
31+ backgroundColor: getColor(0) || "white";
32+ secondaryBackgroundColor: getColor(1) || backgroundColor;
33+ backgroundMode: UbuntuShape.VerticalGradient;
34+ anchors.fill: parent;
35+ source: backgroundImage.source ? backgroundImage : null;
36+ property real luminance: Style.luminance(backgroundColor);
37+ property Image backgroundImage: Image {
38+ objectName: "backgroundImage";
39+ source: {
40+ if (cardData && typeof cardData["background"] === "string") return cardData["background"];
41+ else return "";
42+ }
43+ }
44+ function getColor(index) {
45+ if (cardData && typeof cardData["background"] === "object"
46+ && (cardData["background"]["type"] === "color" || cardData["background"]["type"] === "gradient")) {
47+ return cardData["background"]["elements"][index];
48+ } else return index === 0 ? "" : "";
49+ }
50+ }
51+ }
52+readonly property size artShapeSize: Qt.size(-1, -1);
53+readonly property int headerHeight: row.height;
54+Row {
55+ id: row;
56+ objectName: "outerRow";
57+ property real margins: units.gu(1);
58+ spacing: margins;
59+ anchors { top: parent.top;
60+ topMargin: units.gu(1);
61+left: parent.left;
62+ }
63+ anchors.right: parent.right;
64+ anchors.margins: margins;
65+ anchors.rightMargin: 0;
66+ data: [
67+ CroppedImageMinimumSourceSize {
68+ id: mascotImage;
69+ objectName: "mascotImage";
70+ anchors { verticalCenter: parent.verticalCenter; }
71+ source: cardData && cardData["mascot"] || "";
72+ width: units.gu(6);
73+ height: units.gu(5.625);
74+ horizontalAlignment: Image.AlignHCenter;
75+ verticalAlignment: Image.AlignVCenter;
76+ visible: showHeader;
77+
78+ }
79+,Item {
80+ id: headerTitleContainer;
81+ anchors { verticalCenter: parent.verticalCenter; }
82+ width: parent.width - x;
83+ implicitHeight: titleLabel.height + subtitleLabel.height;
84+ data: [
85+ Label {
86+ id: titleLabel;
87+ objectName: "titleLabel";
88+ anchors { right: parent.right;
89+rightMargin: units.gu(1);
90+left: parent.left;
91+ top: parent.top; }
92+ elide: Text.ElideRight;
93+ fontSize: "small";
94+ wrapMode: Text.Wrap;
95+ maximumLineCount: 2;
96+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
97+ color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? theme.palette.normal.baseText : "white");
98+ visible: showHeader ;
99+ width: undefined;
100+ text: root.title;
101+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
102+ horizontalAlignment: Text.AlignLeft;
103+ }
104+,Label {
105+ id: subtitleLabel;
106+ objectName: "subtitleLabel";
107+ anchors { right: parent.right;
108+ left: parent.left;
109+rightMargin: units.gu(1);
110+top: titleLabel.bottom;
111+ }
112+ anchors.topMargin: units.dp(2);
113+ elide: Text.ElideRight;
114+ maximumLineCount: 1;
115+ fontSize: "x-small";
116+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
117+ color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? theme.palette.normal.baseText : "white");
118+ visible: titleLabel.visible && titleLabel.text;
119+ text: cardData && cardData["subtitle"] || "";
120+ font.weight: Font.Light;
121+ }
122+
123+ ]
124+ }
125+
126+ ]
127+ }
128+UbuntuShape {
129+ id: touchdown;
130+ objectName: "touchdown";
131+ anchors { fill: backgroundLoader }
132+ visible: root.artShapeStyle != "shadow" && root.artShapeStyle != "icon" && root.pressed;
133+ radius: "medium";
134+ borderSource: "radius_pressed.sci"
135+ }
136+implicitHeight: row.y + row.height + units.gu(1);
137+}
tests/plugins/Dash/cardcreator/11.res+5−7
@@ -5,11 +5,9 @@ AbstractButton {
5 property string backgroundShapeStyle: "inset";
5 property string backgroundShapeStyle: "inset";
6 property real fontScale: 1.0;
6 property real fontScale: 1.0;
7 property var scopeStyle: null;
7 property var scopeStyle: null;
8− property int titleAlignment: Text.AlignLeft;
9 property int fixedHeaderHeight: -1;
8 property int fixedHeaderHeight: -1;
10 property size fixedArtShapeSize: Qt.size(-1, -1);
9 property size fixedArtShapeSize: Qt.size(-1, -1);
11 readonly property string title: cardData && cardData["title"] || "";
10 readonly property string title: cardData && cardData["title"] || "";
12− property bool asynchronous: true;
13 property bool showHeader: true;
11 property bool showHeader: true;
14 implicitWidth: childrenRect.width;
12 implicitWidth: childrenRect.width;
15 enabled: true;
13 enabled: true;
@@ -18,7 +16,7 @@ Loader {
18 id: backgroundLoader;
16 id: backgroundLoader;
19 objectName: "backgroundLoader";
17 objectName: "backgroundLoader";
20 anchors.fill: parent;
18 anchors.fill: parent;
21− asynchronous: root.asynchronous;
19+ asynchronous: true;
22 visible: status == Loader.Ready;
20 visible: status == Loader.Ready;
23 sourceComponent: UbuntuShape {
21 sourceComponent: UbuntuShape {
24 objectName: "background";
22 objectName: "background";
@@ -63,7 +61,7 @@ Item {
63 objectName: "artShapeLoader";
61 objectName: "artShapeLoader";
64 readonly property string cardArt: cardData && cardData["art"] || decodeURI("%5C");
62 readonly property string cardArt: cardData && cardData["art"] || decodeURI("%5C");
65 active: cardArt != "";
63 active: cardArt != "";
66− asynchronous: root.asynchronous;
64+ asynchronous: true;
67 visible: status == Loader.Ready;
65 visible: status == Loader.Ready;
68 sourceComponent: Item {
66 sourceComponent: Item {
69 id: artShape;
67 id: artShape;
@@ -120,7 +118,7 @@ Item {
120 id: artImage;
118 id: artImage;
121 objectName: "artImage";
119 objectName: "artImage";
122 source: artShapeLoader.cardArt;
120 source: artShapeLoader.cardArt;
123− asynchronous: root.asynchronous;
121+ asynchronous: true;
124 width: root.width;
122 width: root.width;
125 height: width / artShape.aspect;
123 height: width / artShape.aspect;
126 onStatusChanged: if (status === Image.Error) source = decodeURI("%5C");
124 onStatusChanged: if (status === Image.Error) source = decodeURI("%5C");
@@ -134,7 +132,7 @@ Row {
134 objectName: "outerRow";
132 objectName: "outerRow";
135 property real margins: units.gu(1);
133 property real margins: units.gu(1);
136 spacing: margins;
134 spacing: margins;
137− height: root.fixedHeaderHeight != -1 ? root.fixedHeaderHeight : implicitHeight;
135+ height: root.fixedHeaderHeight;
138 anchors { top: artShapeHolder.bottom;
136 anchors { top: artShapeHolder.bottom;
139 topMargin: units.gu(1);
137 topMargin: units.gu(1);
140left: parent.left;
138left: parent.left;
@@ -178,7 +176,7 @@ left: parent.left;
178 width: undefined;
176 width: undefined;
179 text: root.title;
177 text: root.title;
180 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
178 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
181− horizontalAlignment: root.titleAlignment;
179+ horizontalAlignment: Text.AlignLeft;
182 }
180 }
183,Label {
181,Label {
184 id: subtitleLabel;
182 id: subtitleLabel;
tests/plugins/Dash/cardcreator/11.res.cardcreatornew file+210
@@ -0,0 +1,210 @@
1+AbstractButton {
2+ id: root;
3+ property var cardData;
4+ property string artShapeStyle: "inset";
5+ property string backgroundShapeStyle: "inset";
6+ property real fontScale: 1.0;
7+ property var scopeStyle: null;
8+ property size fixedArtShapeSize: Qt.size(-1, -1);
9+ readonly property string title: cardData && cardData["title"] || "";
10+ property bool showHeader: true;
11+ implicitWidth: childrenRect.width;
12+ enabled: true;
13+
14+Loader {
15+ id: backgroundLoader;
16+ objectName: "backgroundLoader";
17+ anchors.fill: parent;
18+ asynchronous: false;
19+ visible: status == Loader.Ready;
20+ sourceComponent: UbuntuShape {
21+ objectName: "background";
22+ radius: "medium";
23+ aspect: {
24+ switch (root.backgroundShapeStyle) {
25+ case "inset": return UbuntuShape.Inset;
26+ case "shadow": return UbuntuShape.DropShadow;
27+ default:
28+ case "flat": return UbuntuShape.Flat;
29+ }
30+ }
31+ backgroundColor: getColor(0) || "white";
32+ secondaryBackgroundColor: getColor(1) || backgroundColor;
33+ backgroundMode: UbuntuShape.VerticalGradient;
34+ anchors.fill: parent;
35+ source: backgroundImage.source ? backgroundImage : null;
36+ property real luminance: Style.luminance(backgroundColor);
37+ property Image backgroundImage: Image {
38+ objectName: "backgroundImage";
39+ source: {
40+ if (cardData && typeof cardData["background"] === "string") return cardData["background"];
41+ else return "";
42+ }
43+ }
44+ function getColor(index) {
45+ if (cardData && typeof cardData["background"] === "object"
46+ && (cardData["background"]["type"] === "color" || cardData["background"]["type"] === "gradient")) {
47+ return cardData["background"]["elements"][index];
48+ } else return index === 0 ? "#E9E9E9" : undefined;
49+ }
50+ }
51+ }
52+readonly property size artShapeSize: artShapeLoader.item ? Qt.size(artShapeLoader.item.width, artShapeLoader.item.height) : Qt.size(-1, -1);
53+Item {
54+ id: artShapeHolder;
55+ height: root.fixedArtShapeSize.height > 0 ? root.fixedArtShapeSize.height : artShapeLoader.height;
56+ width: root.fixedArtShapeSize.width > 0 ? root.fixedArtShapeSize.width : artShapeLoader.width;
57+ anchors { horizontalCenter: parent.horizontalCenter; }
58+ Loader {
59+ id: artShapeLoader;
60+ objectName: "artShapeLoader";
61+ readonly property string cardArt: cardData && cardData["art"] || "";
62+ active: cardArt != "";
63+ asynchronous: false;
64+ visible: status == Loader.Ready;
65+ sourceComponent: Item {
66+ id: artShape;
67+ objectName: "artShape";
68+ visible: image.status == Image.Ready;
69+ readonly property alias image: artImage;
70+ ShaderEffectSource {
71+ id: artShapeSource;
72+ sourceItem: artImage;
73+ anchors.centerIn: parent;
74+ width: 1;
75+ height: 1;
76+ hideSource: true;
77+ }
78+ Loader {
79+ anchors.fill: parent;
80+ visible: true;
81+ sourceComponent: root.artShapeStyle === "icon" ? artShapeIconComponent : artShapeShapeComponent;
82+ Component {
83+ id: artShapeShapeComponent;
84+ UbuntuShape {
85+ source: artShapeSource;
86+ sourceFillMode: UbuntuShape.PreserveAspectCrop;
87+ radius: "medium";
88+ aspect: {
89+ switch (root.artShapeStyle) {
90+ case "inset": return UbuntuShape.Inset;
91+ case "shadow": return UbuntuShape.DropShadow;
92+ default:
93+ case "flat": return UbuntuShape.Flat;
94+ }
95+ }
96+ }
97+ }
98+ Component {
99+ id: artShapeIconComponent;
100+ ProportionalShape { source: artShapeSource; aspect: UbuntuShape.DropShadow; }
101+ }
102+ }
103+ readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1;
104+ readonly property real aspect: fixedArtShapeSizeAspect > 0 ? fixedArtShapeSizeAspect : 1;
105+ Component.onCompleted: { updateWidthHeightBindings(); }
106+ Connections { target: root; onFixedArtShapeSizeChanged: updateWidthHeightBindings(); }
107+ function updateWidthHeightBindings() {
108+ if (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) {
109+ width = root.fixedArtShapeSize.width;
110+ height = root.fixedArtShapeSize.height;
111+ } else {
112+ width = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.width });
113+ height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height });
114+ }
115+ }
116+ CroppedImageMinimumSourceSize {
117+ id: artImage;
118+ objectName: "artImage";
119+ source: artShapeLoader.cardArt;
120+ asynchronous: false;
121+ width: root.width;
122+ height: width / artShape.aspect;
123+ }
124+ }
125+ }
126+ }
127+readonly property int headerHeight: row.height;
128+Row {
129+ id: row;
130+ objectName: "outerRow";
131+ property real margins: units.gu(1);
132+ spacing: margins;
133+ anchors { top: artShapeHolder.bottom;
134+ topMargin: units.gu(1);
135+left: parent.left;
136+ }
137+ anchors.right: parent.right;
138+ anchors.margins: margins;
139+ anchors.rightMargin: 0;
140+ data: [
141+ CroppedImageMinimumSourceSize {
142+ id: mascotImage;
143+ objectName: "mascotImage";
144+ anchors { verticalCenter: parent.verticalCenter; }
145+ source: cardData && cardData["mascot"] || "";
146+ width: units.gu(6);
147+ height: units.gu(5.625);
148+ horizontalAlignment: Image.AlignHCenter;
149+ verticalAlignment: Image.AlignVCenter;
150+ visible: showHeader;
151+ }
152+,Item {
153+ id: headerTitleContainer;
154+ anchors { verticalCenter: parent.verticalCenter; }
155+ width: parent.width - x;
156+ implicitHeight: titleLabel.height + subtitleLabel.height;
157+ data: [
158+ Label {
159+ id: titleLabel;
160+ objectName: "titleLabel";
161+ anchors { right: parent.right;
162+rightMargin: units.gu(1);
163+left: parent.left;
164+ top: parent.top; }
165+ elide: Text.ElideRight;
166+ fontSize: "small";
167+ wrapMode: Text.Wrap;
168+ maximumLineCount: 2;
169+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
170+ color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? theme.palette.normal.baseText : "white");
171+ visible: showHeader ;
172+ width: undefined;
173+ text: root.title;
174+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
175+ horizontalAlignment: Text.AlignLeft;
176+ }
177+,Label {
178+ id: subtitleLabel;
179+ objectName: "subtitleLabel";
180+ anchors { right: parent.right;
181+ left: parent.left;
182+rightMargin: units.gu(1);
183+top: titleLabel.bottom;
184+ }
185+ anchors.topMargin: units.dp(2);
186+ elide: Text.ElideRight;
187+ maximumLineCount: 1;
188+ fontSize: "x-small";
189+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
190+ color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? theme.palette.normal.baseText : "white");
191+ visible: titleLabel.visible && titleLabel.text;
192+ text: cardData && cardData["subtitle"] || "";
193+ font.weight: Font.Light;
194+ }
195+
196+ ]
197+ }
198+
199+ ]
200+ }
201+UbuntuShape {
202+ id: touchdown;
203+ objectName: "touchdown";
204+ anchors { fill: backgroundLoader }
205+ visible: root.artShapeStyle != "shadow" && root.artShapeStyle != "icon" && root.pressed;
206+ radius: "medium";
207+ borderSource: "radius_pressed.sci"
208+ }
209+implicitHeight: row.y + row.height + units.gu(1);
210+}
tests/plugins/Dash/cardcreator/2.res+3−5
@@ -5,11 +5,9 @@ AbstractButton {
5 property string backgroundShapeStyle: "inset";
5 property string backgroundShapeStyle: "inset";
6 property real fontScale: 1.0;
6 property real fontScale: 1.0;
7 property var scopeStyle: null;
7 property var scopeStyle: null;
8− property int titleAlignment: Text.AlignLeft;
9 property int fixedHeaderHeight: -1;
8 property int fixedHeaderHeight: -1;
10 property size fixedArtShapeSize: Qt.size(-1, -1);
9 property size fixedArtShapeSize: Qt.size(-1, -1);
11 readonly property string title: cardData && cardData["title"] || "";
10 readonly property string title: cardData && cardData["title"] || "";
12− property bool asynchronous: true;
13 property bool showHeader: true;
11 property bool showHeader: true;
14 implicitWidth: childrenRect.width;
12 implicitWidth: childrenRect.width;
15 enabled: true;
13 enabled: true;
@@ -18,7 +16,7 @@ Loader {
18 id: backgroundLoader;
16 id: backgroundLoader;
19 objectName: "backgroundLoader";
17 objectName: "backgroundLoader";
20 anchors.fill: parent;
18 anchors.fill: parent;
21− asynchronous: root.asynchronous;
19+ asynchronous: true;
22 visible: status == Loader.Ready;
20 visible: status == Loader.Ready;
23 sourceComponent: UbuntuShape {
21 sourceComponent: UbuntuShape {
24 objectName: "background";
22 objectName: "background";
@@ -59,7 +57,7 @@ Row {
59 objectName: "outerRow";
57 objectName: "outerRow";
60 property real margins: units.gu(1);
58 property real margins: units.gu(1);
61 spacing: margins;
59 spacing: margins;
62− height: root.fixedHeaderHeight != -1 ? root.fixedHeaderHeight : implicitHeight;
60+ height: root.fixedHeaderHeight;
63 anchors { top: parent.top;
61 anchors { top: parent.top;
64 topMargin: units.gu(1);
62 topMargin: units.gu(1);
65 left: parent.left;
63 left: parent.left;
@@ -102,7 +100,7 @@ CroppedImageMinimumSourceSize {
102 width: undefined;
100 width: undefined;
103 text: root.title;
101 text: root.title;
104 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
102 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
105− horizontalAlignment: root.titleAlignment;
103+ horizontalAlignment: Text.AlignLeft;
106 }
104 }
107 ,Label {
105 ,Label {
108 id: subtitleLabel;
106 id: subtitleLabel;
tests/plugins/Dash/cardcreator/2.res.cardcreatornew file+136
@@ -0,0 +1,136 @@
1+AbstractButton {
2+ id: root;
3+ property var cardData;
4+ property string artShapeStyle: "inset";
5+ property string backgroundShapeStyle: "inset";
6+ property real fontScale: 1.0;
7+ property var scopeStyle: null;
8+ property size fixedArtShapeSize: Qt.size(-1, -1);
9+ readonly property string title: cardData && cardData["title"] || "";
10+ property bool showHeader: true;
11+ implicitWidth: childrenRect.width;
12+ enabled: true;
13+
14+Loader {
15+ id: backgroundLoader;
16+ objectName: "backgroundLoader";
17+ anchors.fill: parent;
18+ asynchronous: false;
19+ visible: status == Loader.Ready;
20+ sourceComponent: UbuntuShape {
21+ objectName: "background";
22+ radius: "medium";
23+ aspect: {
24+ switch (root.backgroundShapeStyle) {
25+ case "inset": return UbuntuShape.Inset;
26+ case "shadow": return UbuntuShape.DropShadow;
27+ default:
28+ case "flat": return UbuntuShape.Flat;
29+ }
30+ }
31+ backgroundColor: getColor(0) || "white";
32+ secondaryBackgroundColor: getColor(1) || backgroundColor;
33+ backgroundMode: UbuntuShape.VerticalGradient;
34+ anchors.fill: parent;
35+ source: backgroundImage.source ? backgroundImage : null;
36+ property real luminance: Style.luminance(backgroundColor);
37+ property Image backgroundImage: Image {
38+ objectName: "backgroundImage";
39+ source: {
40+ if (cardData && typeof cardData["background"] === "string") return cardData["background"];
41+ else return "";
42+ }
43+ }
44+ function getColor(index) {
45+ if (cardData && typeof cardData["background"] === "object"
46+ && (cardData["background"]["type"] === "color" || cardData["background"]["type"] === "gradient")) {
47+ return cardData["background"]["elements"][index];
48+ } else return index === 0 ? "#E9E9E9" : undefined;
49+ }
50+ }
51+ }
52+readonly property size artShapeSize: Qt.size(-1, -1);
53+readonly property int headerHeight: row.height;
54+Row {
55+ id: row;
56+ objectName: "outerRow";
57+ property real margins: units.gu(1);
58+ spacing: margins;
59+ anchors { top: parent.top;
60+ topMargin: units.gu(1);
61+ left: parent.left;
62+ }
63+ anchors.right: parent.right;
64+ anchors.margins: margins;
65+ anchors.rightMargin: 0;
66+ data: [
67+CroppedImageMinimumSourceSize {
68+ id: mascotImage;
69+ objectName: "mascotImage";
70+ anchors { verticalCenter: parent.verticalCenter; }
71+ source: cardData && cardData["mascot"] || "";
72+ width: units.gu(6);
73+ height: units.gu(5.625);
74+ horizontalAlignment: Image.AlignHCenter;
75+ verticalAlignment: Image.AlignVCenter;
76+ visible: showHeader;
77+ }
78+,Item {
79+ id: headerTitleContainer;
80+ anchors { verticalCenter: parent.verticalCenter; }
81+ width: parent.width - x;
82+ implicitHeight: titleLabel.height + subtitleLabel.height;
83+ data: [
84+ Label {
85+ id: titleLabel;
86+ objectName: "titleLabel";
87+ anchors { right: parent.right;
88+ rightMargin: units.gu(1);
89+ left: parent.left;
90+ top: parent.top; }
91+ elide: Text.ElideRight;
92+ fontSize: "small";
93+ wrapMode: Text.Wrap;
94+ maximumLineCount: 2;
95+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
96+ color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? theme.palette.normal.baseText : "white");
97+ visible: showHeader ;
98+ width: undefined;
99+ text: root.title;
100+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
101+ horizontalAlignment: Text.AlignLeft;
102+ }
103+ ,Label {
104+ id: subtitleLabel;
105+ objectName: "subtitleLabel";
106+ anchors { right: parent.right;
107+ left: parent.left;
108+ rightMargin: units.gu(1);
109+ top: titleLabel.bottom;
110+ }
111+ anchors.topMargin: units.dp(2);
112+ elide: Text.ElideRight;
113+ maximumLineCount: 1;
114+ fontSize: "x-small";
115+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
116+ color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? theme.palette.normal.baseText : "white");
117+ visible: titleLabel.visible && titleLabel.text;
118+ text: cardData && cardData["subtitle"] || "";
119+ font.weight: Font.Light;
120+ }
121+
122+ ]
123+ }
124+
125+ ]
126+ }
127+UbuntuShape {
128+ id: touchdown;
129+ objectName: "touchdown";
130+ anchors { fill: backgroundLoader }
131+ visible: root.artShapeStyle != "shadow" && root.artShapeStyle != "icon" && root.pressed;
132+ radius: "medium";
133+ borderSource: "radius_pressed.sci"
134+}
135+implicitHeight: row.y + row.height + units.gu(1);
136+}
tests/plugins/Dash/cardcreator/3.res+3−5
@@ -5,11 +5,9 @@ AbstractButton {
5 property string backgroundShapeStyle: "inset";
5 property string backgroundShapeStyle: "inset";
6 property real fontScale: 1.0;
6 property real fontScale: 1.0;
7 property var scopeStyle: null;
7 property var scopeStyle: null;
8− property int titleAlignment: Text.AlignLeft;
9 property int fixedHeaderHeight: -1;
8 property int fixedHeaderHeight: -1;
10 property size fixedArtShapeSize: Qt.size(-1, -1);
9 property size fixedArtShapeSize: Qt.size(-1, -1);
11 readonly property string title: cardData && cardData["title"] || "";
10 readonly property string title: cardData && cardData["title"] || "";
12− property bool asynchronous: true;
13 property bool showHeader: true;
11 property bool showHeader: true;
14 implicitWidth: childrenRect.width;
12 implicitWidth: childrenRect.width;
15 enabled: true;
13 enabled: true;
@@ -25,7 +23,7 @@ Item {
25 objectName: "artShapeLoader";
23 objectName: "artShapeLoader";
26 readonly property string cardArt: cardData && cardData["art"] || decodeURI("IHAVE%5C%22ESCAPED%5C%22QUOTES%5C%22");
24 readonly property string cardArt: cardData && cardData["art"] || decodeURI("IHAVE%5C%22ESCAPED%5C%22QUOTES%5C%22");
27 active: cardArt != "";
25 active: cardArt != "";
28− asynchronous: root.asynchronous;
26+ asynchronous: true;
29 visible: status == Loader.Ready;
27 visible: status == Loader.Ready;
30 sourceComponent: Item {
28 sourceComponent: Item {
31 id: artShape;
29 id: artShape;
@@ -82,7 +80,7 @@ Item {
82 id: artImage;
80 id: artImage;
83 objectName: "artImage";
81 objectName: "artImage";
84 source: artShapeLoader.cardArt;
82 source: artShapeLoader.cardArt;
85− asynchronous: root.asynchronous;
83+ asynchronous: true;
86 width: root.width;
84 width: root.width;
87 height: width / artShape.aspect;
85 height: width / artShape.aspect;
88 onStatusChanged: if (status === Image.Error) source = decodeURI("IHAVE%5C%22ESCAPED%5C%22QUOTES%5C%22");
86 onStatusChanged: if (status === Image.Error) source = decodeURI("IHAVE%5C%22ESCAPED%5C%22QUOTES%5C%22");
@@ -109,7 +107,7 @@ Label {
109 width: undefined;
107 width: undefined;
110 text: root.title;
108 text: root.title;
111 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
109 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
112− horizontalAlignment: root.titleAlignment;
110+ horizontalAlignment: Text.AlignLeft;
113 }
111 }
114Label {
112Label {
115 id: subtitleLabel;
113 id: subtitleLabel;
tests/plugins/Dash/cardcreator/3.res.cardcreatornew file+137
@@ -0,0 +1,137 @@
1+AbstractButton {
2+ id: root;
3+ property var cardData;
4+ property string artShapeStyle: "inset";
5+ property string backgroundShapeStyle: "inset";
6+ property real fontScale: 1.0;
7+ property var scopeStyle: null;
8+ property size fixedArtShapeSize: Qt.size(-1, -1);
9+ readonly property string title: cardData && cardData["title"] || "";
10+ property bool showHeader: true;
11+ implicitWidth: childrenRect.width;
12+ enabled: true;
13+
14+readonly property size artShapeSize: artShapeLoader.item ? Qt.size(artShapeLoader.item.width, artShapeLoader.item.height) : Qt.size(-1, -1);
15+Item {
16+ id: artShapeHolder;
17+ height: root.fixedArtShapeSize.height > 0 ? root.fixedArtShapeSize.height : artShapeLoader.height;
18+ width: root.fixedArtShapeSize.width > 0 ? root.fixedArtShapeSize.width : artShapeLoader.width;
19+ anchors { horizontalCenter: parent.horizontalCenter; }
20+ Loader {
21+ id: artShapeLoader;
22+ objectName: "artShapeLoader";
23+ readonly property string cardArt: cardData && cardData["art"] || "";
24+ active: cardArt != "";
25+ asynchronous: false;
26+ visible: status == Loader.Ready;
27+ sourceComponent: Item {
28+ id: artShape;
29+ objectName: "artShape";
30+ visible: image.status == Image.Ready;
31+ readonly property alias image: artImage;
32+ ShaderEffectSource {
33+ id: artShapeSource;
34+ sourceItem: artImage;
35+ anchors.centerIn: parent;
36+ width: 1;
37+ height: 1;
38+ hideSource: true;
39+ }
40+ Loader {
41+ anchors.fill: parent;
42+ visible: true;
43+ sourceComponent: root.artShapeStyle === "icon" ? artShapeIconComponent : artShapeShapeComponent;
44+ Component {
45+ id: artShapeShapeComponent;
46+ UbuntuShape {
47+ source: artShapeSource;
48+ sourceFillMode: UbuntuShape.PreserveAspectCrop;
49+ radius: "medium";
50+ aspect: {
51+ switch (root.artShapeStyle) {
52+ case "inset": return UbuntuShape.Inset;
53+ case "shadow": return UbuntuShape.DropShadow;
54+ default:
55+ case "flat": return UbuntuShape.Flat;
56+ }
57+ }
58+ }
59+ }
60+ Component {
61+ id: artShapeIconComponent;
62+ ProportionalShape { source: artShapeSource; aspect: UbuntuShape.DropShadow; }
63+ }
64+ }
65+ readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1;
66+ readonly property real aspect: fixedArtShapeSizeAspect > 0 ? fixedArtShapeSizeAspect : 0.75;
67+ Component.onCompleted: { updateWidthHeightBindings(); }
68+ Connections { target: root; onFixedArtShapeSizeChanged: updateWidthHeightBindings(); }
69+ function updateWidthHeightBindings() {
70+ if (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) {
71+ width = root.fixedArtShapeSize.width;
72+ height = root.fixedArtShapeSize.height;
73+ } else {
74+ width = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.width });
75+ height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height });
76+ }
77+ }
78+ CroppedImageMinimumSourceSize {
79+ id: artImage;
80+ objectName: "artImage";
81+ source: artShapeLoader.cardArt;
82+ asynchronous: false;
83+ width: root.width;
84+ height: width / artShape.aspect;
85+ }
86+ }
87+ }
88+ }
89+readonly property int headerHeight: titleLabel.height + subtitleLabel.height + subtitleLabel.anchors.topMargin;
90+Label {
91+ id: titleLabel;
92+ objectName: "titleLabel";
93+ anchors { right: parent.right;
94+ left: parent.left;
95+ top: artShapeHolder.bottom;
96+ topMargin: units.gu(1);
97+ }
98+ elide: Text.ElideRight;
99+ fontSize: "small";
100+ wrapMode: Text.Wrap;
101+ maximumLineCount: 2;
102+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
103+ color: root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText;
104+ visible: showHeader ;
105+ width: undefined;
106+ text: root.title;
107+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
108+ horizontalAlignment: Text.AlignLeft;
109+ }
110+Label {
111+ id: subtitleLabel;
112+ objectName: "subtitleLabel";
113+ anchors { left: titleLabel.left;
114+ leftMargin: titleLabel.leftMargin;
115+ right: titleLabel.right;
116+ top: titleLabel.bottom;
117+ }
118+ anchors.topMargin: units.dp(2);
119+ elide: Text.ElideRight;
120+ maximumLineCount: 1;
121+ fontSize: "x-small";
122+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
123+ color: root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText;
124+ visible: titleLabel.visible && titleLabel.text;
125+ text: cardData && cardData["subtitle"] || "";
126+ font.weight: Font.Light;
127+ }
128+UbuntuShape {
129+ id: touchdown;
130+ objectName: "touchdown";
131+ anchors { fill: artShapeHolder }
132+ visible: root.artShapeStyle != "shadow" && root.artShapeStyle != "icon" && root.pressed;
133+ radius: "medium";
134+ borderSource: "radius_pressed.sci"
135+}
136+implicitHeight: subtitleLabel.y + subtitleLabel.height + units.gu(1);
137+}
tests/plugins/Dash/cardcreator/4.res+3−5
@@ -5,11 +5,9 @@ AbstractButton {
5 property string backgroundShapeStyle: "inset";
5 property string backgroundShapeStyle: "inset";
6 property real fontScale: 1.0;
6 property real fontScale: 1.0;
7 property var scopeStyle: null;
7 property var scopeStyle: null;
8− property int titleAlignment: Text.AlignLeft;
9 property int fixedHeaderHeight: -1;
8 property int fixedHeaderHeight: -1;
10 property size fixedArtShapeSize: Qt.size(-1, -1);
9 property size fixedArtShapeSize: Qt.size(-1, -1);
11 readonly property string title: cardData && cardData["title"] || "";
10 readonly property string title: cardData && cardData["title"] || "";
12− property bool asynchronous: true;
13 property bool showHeader: true;
11 property bool showHeader: true;
14 implicitWidth: childrenRect.width;
12 implicitWidth: childrenRect.width;
15 enabled: true;
13 enabled: true;
@@ -21,7 +19,7 @@ Row {
21 objectName: "outerRow";
19 objectName: "outerRow";
22 property real margins: units.gu(1);
20 property real margins: units.gu(1);
23 spacing: margins;
21 spacing: margins;
24− height: root.fixedHeaderHeight != -1 ? root.fixedHeaderHeight : implicitHeight;
22+ height: root.fixedHeaderHeight;
25 anchors { top: parent.top;
23 anchors { top: parent.top;
26 topMargin: units.gu(1);
24 topMargin: units.gu(1);
27 left: parent.left;
25 left: parent.left;
@@ -33,7 +31,7 @@ data: [
33Loader {
31Loader {
34 id: mascotShapeLoader;
32 id: mascotShapeLoader;
35 objectName: "mascotShapeLoader";
33 objectName: "mascotShapeLoader";
36− asynchronous: root.asynchronous;
34+ asynchronous: true;
37 active: mascotImage.status === Image.Ready;
35 active: mascotImage.status === Image.Ready;
38 visible: showHeader && active && status == Loader.Ready;
36 visible: showHeader && active && status == Loader.Ready;
39 width: units.gu(6);
37 width: units.gu(6);
@@ -77,7 +75,7 @@ Label {
77 width: undefined;
75 width: undefined;
78 text: root.title;
76 text: root.title;
79 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
77 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
80− horizontalAlignment: root.titleAlignment;
78+ horizontalAlignment: Text.AlignLeft;
81 }
79 }
82,Label {
80,Label {
83 id: subtitleLabel;
81 id: subtitleLabel;
tests/plugins/Dash/cardcreator/4.res.cardcreatornew file+109
@@ -0,0 +1,109 @@
1+AbstractButton {
2+ id: root;
3+ property var cardData;
4+ property string artShapeStyle: "inset";
5+ property string backgroundShapeStyle: "inset";
6+ property real fontScale: 1.0;
7+ property var scopeStyle: null;
8+ property size fixedArtShapeSize: Qt.size(-1, -1);
9+ readonly property string title: cardData && cardData["title"] || "";
10+ property bool showHeader: true;
11+ implicitWidth: childrenRect.width;
12+ enabled: true;
13+
14+readonly property size artShapeSize: Qt.size(-1, -1);
15+readonly property int headerHeight: row.height;
16+Row {
17+ id: row;
18+ objectName: "outerRow";
19+ property real margins: units.gu(1);
20+ spacing: margins;
21+ anchors { top: parent.top;
22+ topMargin: units.gu(1);
23+ left: parent.left;
24+}
25+ anchors.right: parent.right;
26+ anchors.margins: margins;
27+ anchors.rightMargin: 0;
28+data: [
29+Loader {
30+ id: mascotShapeLoader;
31+ objectName: "mascotShapeLoader";
32+ asynchronous: false;
33+ active: mascotImage.status === Image.Ready;
34+ visible: showHeader && active && status == Loader.Ready;
35+ width: units.gu(6);
36+ height: units.gu(5.625);
37+ sourceComponent: UbuntuShape { image: mascotImage }
38+ anchors { verticalCenter: parent.verticalCenter; }
39+ }
40+
41+,CroppedImageMinimumSourceSize {
42+ id: mascotImage;
43+ objectName: "mascotImage";
44+ anchors { verticalCenter: parent.verticalCenter; }
45+ source: cardData && cardData["mascot"] || "";
46+ width: units.gu(6);
47+ height: units.gu(5.625);
48+ horizontalAlignment: Image.AlignHCenter;
49+ verticalAlignment: Image.AlignVCenter;
50+ visible: false;
51+ }
52+
53+,Item {
54+ id: headerTitleContainer;
55+ anchors { verticalCenter: parent.verticalCenter; }
56+ width: parent.width - x;
57+ implicitHeight: titleLabel.height + subtitleLabel.height;
58+ data: [
59+Label {
60+ id: titleLabel;
61+ objectName: "titleLabel";
62+ anchors { right: parent.right;
63+ rightMargin: units.gu(1);
64+ left: parent.left;
65+ top: parent.top; }
66+ elide: Text.ElideRight;
67+ fontSize: "small";
68+ wrapMode: Text.Wrap;
69+ maximumLineCount: 2;
70+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
71+ color: root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText;
72+ visible: showHeader ;
73+ width: undefined;
74+ text: root.title;
75+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
76+ horizontalAlignment: Text.AlignLeft;
77+ }
78+,Label {
79+ id: subtitleLabel;
80+ objectName: "subtitleLabel";
81+ anchors { right: parent.right;
82+ left: parent.left;
83+ rightMargin: units.gu(1);
84+ top: titleLabel.bottom;
85+ }
86+ anchors.topMargin: units.dp(2);
87+ elide: Text.ElideRight;
88+ maximumLineCount: 1;
89+ fontSize: "x-small";
90+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
91+ color: root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText;
92+ visible: titleLabel.visible && titleLabel.text;
93+ text: cardData && cardData["subtitle"] || "";
94+ font.weight: Font.Light;
95+ }
96+]
97+}
98+]
99+}
100+UbuntuShape {
101+ id: touchdown;
102+ objectName: "touchdown";
103+ anchors { fill: root }
104+ visible: root.artShapeStyle != "shadow" && root.artShapeStyle != "icon" && root.pressed;
105+ radius: "medium";
106+ borderSource: "radius_pressed.sci"
107+}
108+implicitHeight: row.y + row.height + units.gu(1);
109+}
tests/plugins/Dash/cardcreator/5.res+5−7
@@ -5,11 +5,9 @@ AbstractButton {
5 property string backgroundShapeStyle: "inset";
5 property string backgroundShapeStyle: "inset";
6 property real fontScale: 1.0;
6 property real fontScale: 1.0;
7 property var scopeStyle: null;
7 property var scopeStyle: null;
8− property int titleAlignment: Text.AlignLeft;
9 property int fixedHeaderHeight: -1;
8 property int fixedHeaderHeight: -1;
10 property size fixedArtShapeSize: Qt.size(-1, -1);
9 property size fixedArtShapeSize: Qt.size(-1, -1);
11 readonly property string title: cardData && cardData["title"] || "";
10 readonly property string title: cardData && cardData["title"] || "";
12− property bool asynchronous: true;
13 property bool showHeader: true;
11 property bool showHeader: true;
14 implicitWidth: childrenRect.width;
12 implicitWidth: childrenRect.width;
15 enabled: false;
13 enabled: false;
@@ -25,7 +23,7 @@ Item {
25 objectName: "artShapeLoader";
23 objectName: "artShapeLoader";
26 readonly property string cardArt: cardData && cardData["art"] || "";
24 readonly property string cardArt: cardData && cardData["art"] || "";
27 active: cardArt != "";
25 active: cardArt != "";
28− asynchronous: root.asynchronous;
26+ asynchronous: true;
29 visible: status == Loader.Ready;
27 visible: status == Loader.Ready;
30 sourceComponent: Item {
28 sourceComponent: Item {
31 id: artShape;
29 id: artShape;
@@ -82,7 +80,7 @@ Item {
82 id: artImage;
80 id: artImage;
83 objectName: "artImage";
81 objectName: "artImage";
84 source: artShapeLoader.cardArt;
82 source: artShapeLoader.cardArt;
85− asynchronous: root.asynchronous;
83+ asynchronous: true;
86 width: root.width;
84 width: root.width;
87 height: width / artShape.aspect;
85 height: width / artShape.aspect;
88 }
86 }
@@ -91,10 +89,10 @@ Item {
91 }
89 }
92Loader {
90Loader {
93 id: overlayLoader;
91 id: overlayLoader;
94− readonly property real overlayHeight: (fixedHeaderHeight > 0 ? fixedHeaderHeight : headerHeight) + units.gu(2);
92+ readonly property real overlayHeight: root.fixedHeaderHeight + units.gu(2);
95 anchors.fill: artShapeHolder;
93 anchors.fill: artShapeHolder;
96 active: artShapeLoader.active && artShapeLoader.item && artShapeLoader.item.image.status === Image.Ready || false;
94 active: artShapeLoader.active && artShapeLoader.item && artShapeLoader.item.image.status === Image.Ready || false;
97− asynchronous: root.asynchronous;
95+ asynchronous: true;
98 visible: showHeader && status == Loader.Ready;
96 visible: showHeader && status == Loader.Ready;
99 sourceComponent: UbuntuShapeOverlay {
97 sourceComponent: UbuntuShapeOverlay {
100 id: overlay;
98 id: overlay;
@@ -126,7 +124,7 @@ Label {
126 width: undefined;
124 width: undefined;
127 text: root.title;
125 text: root.title;
128 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
126 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
129− horizontalAlignment: root.titleAlignment;
127+ horizontalAlignment: Text.AlignLeft;
130 }
128 }
131Label {
129Label {
132 id: subtitleLabel;
130 id: subtitleLabel;
tests/plugins/Dash/cardcreator/5.res.cardcreatornew file+156
@@ -0,0 +1,156 @@
1+AbstractButton {
2+ id: root;
3+ property var cardData;
4+ property string artShapeStyle: "inset";
5+ property string backgroundShapeStyle: "inset";
6+ property real fontScale: 1.0;
7+ property var scopeStyle: null;
8+ property size fixedArtShapeSize: Qt.size(-1, -1);
9+ readonly property string title: cardData && cardData["title"] || "";
10+ property bool showHeader: true;
11+ implicitWidth: childrenRect.width;
12+ enabled: false;
13+
14+readonly property size artShapeSize: artShapeLoader.item ? Qt.size(artShapeLoader.item.width, artShapeLoader.item.height) : Qt.size(-1, -1);
15+Item {
16+ id: artShapeHolder;
17+ height: root.fixedArtShapeSize.height > 0 ? root.fixedArtShapeSize.height : artShapeLoader.height;
18+ width: root.fixedArtShapeSize.width > 0 ? root.fixedArtShapeSize.width : artShapeLoader.width;
19+ anchors { horizontalCenter: parent.horizontalCenter; }
20+ Loader {
21+ id: artShapeLoader;
22+ objectName: "artShapeLoader";
23+ readonly property string cardArt: cardData && cardData["art"] || "";
24+ active: cardArt != "";
25+ asynchronous: false;
26+ visible: status == Loader.Ready;
27+ sourceComponent: Item {
28+ id: artShape;
29+ objectName: "artShape";
30+ visible: image.status == Image.Ready;
31+ readonly property alias image: artImage;
32+ ShaderEffectSource {
33+ id: artShapeSource;
34+ sourceItem: artImage;
35+ anchors.centerIn: parent;
36+ width: 1;
37+ height: 1;
38+ hideSource: false;
39+ }
40+ Loader {
41+ anchors.fill: parent;
42+ visible: false;
43+ sourceComponent: root.artShapeStyle === "icon" ? artShapeIconComponent : artShapeShapeComponent;
44+ Component {
45+ id: artShapeShapeComponent;
46+ UbuntuShape {
47+ source: artShapeSource;
48+ sourceFillMode: UbuntuShape.PreserveAspectCrop;
49+ radius: "medium";
50+ aspect: {
51+ switch (root.artShapeStyle) {
52+ case "inset": return UbuntuShape.Inset;
53+ case "shadow": return UbuntuShape.DropShadow;
54+ default:
55+ case "flat": return UbuntuShape.Flat;
56+ }
57+ }
58+ }
59+ }
60+ Component {
61+ id: artShapeIconComponent;
62+ ProportionalShape { source: artShapeSource; aspect: UbuntuShape.DropShadow; }
63+ }
64+ }
65+ readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1;
66+ readonly property real aspect: fixedArtShapeSizeAspect > 0 ? fixedArtShapeSizeAspect : 1;
67+ Component.onCompleted: { updateWidthHeightBindings(); }
68+ Connections { target: root; onFixedArtShapeSizeChanged: updateWidthHeightBindings(); }
69+ function updateWidthHeightBindings() {
70+ if (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) {
71+ width = root.fixedArtShapeSize.width;
72+ height = root.fixedArtShapeSize.height;
73+ } else {
74+ width = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.width });
75+ height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height });
76+ }
77+ }
78+ CroppedImageMinimumSourceSize {
79+ id: artImage;
80+ objectName: "artImage";
81+ source: artShapeLoader.cardArt;
82+ asynchronous: false;
83+ width: root.width;
84+ height: width / artShape.aspect;
85+ }
86+ }
87+ }
88+ }
89+Loader {
90+ id: overlayLoader;
91+ readonly property real overlayHeight: headerHeight + units.gu(2);
92+ anchors.fill: artShapeHolder;
93+ active: artShapeLoader.active && artShapeLoader.item && artShapeLoader.item.image.status === Image.Ready || false;
94+ asynchronous: false;
95+ visible: showHeader && status == Loader.Ready;
96+ sourceComponent: UbuntuShapeOverlay {
97+ id: overlay;
98+ property real luminance: Style.luminance(overlayColor);
99+ aspect: UbuntuShape.Flat;
100+ radius: "medium";
101+ overlayColor: cardData && cardData["overlayColor"] || "#99000000";
102+ overlayRect: Qt.rect(0, 1 - overlayLoader.overlayHeight / height, 1, 1);
103+ }
104+ }
105+readonly property int headerHeight: titleLabel.height + subtitleLabel.height + subtitleLabel.anchors.topMargin;
106+Label {
107+ id: titleLabel;
108+ objectName: "titleLabel";
109+ anchors { right: parent.right;
110+ rightMargin: units.gu(1);
111+ left: parent.left;
112+ leftMargin: units.gu(1);
113+ top: overlayLoader.top;
114+ topMargin: units.gu(1) + overlayLoader.height - overlayLoader.overlayHeight;
115+ }
116+ elide: Text.ElideRight;
117+ fontSize: "small";
118+ wrapMode: Text.Wrap;
119+ maximumLineCount: 2;
120+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
121+ color: root.scopeStyle && overlayLoader.item ? root.scopeStyle.getTextColor(overlayLoader.item.luminance) : (overlayLoader.item && overlayLoader.item.luminance > 0.7 ? theme.palette.normal.baseText : "white");
122+ visible: showHeader && overlayLoader.active;
123+ width: undefined;
124+ text: root.title;
125+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
126+ horizontalAlignment: Text.AlignLeft;
127+ }
128+Label {
129+ id: subtitleLabel;
130+ objectName: "subtitleLabel";
131+ anchors { left: titleLabel.left;
132+ leftMargin: titleLabel.leftMargin;
133+ rightMargin: units.gu(1);
134+ right: titleLabel.right;
135+ top: titleLabel.bottom;
136+ }
137+ anchors.topMargin: units.dp(2);
138+ elide: Text.ElideRight;
139+ maximumLineCount: 1;
140+ fontSize: "x-small";
141+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
142+ color: root.scopeStyle && overlayLoader.item ? root.scopeStyle.getTextColor(overlayLoader.item.luminance) : (overlayLoader.item && overlayLoader.item.luminance > 0.7 ? theme.palette.normal.baseText : "white");
143+ visible: titleLabel.visible && titleLabel.text;
144+ text: cardData && cardData["subtitle"] || "";
145+ font.weight: Font.Light;
146+ }
147+UbuntuShape {
148+ id: touchdown;
149+ objectName: "touchdown";
150+ anchors { fill: artShapeHolder }
151+ visible: root.artShapeStyle != "shadow" && root.artShapeStyle != "icon" && root.pressed;
152+ radius: "medium";
153+ borderSource: "radius_pressed.sci"
154+}
155+implicitHeight: artShapeHolder.height;
156+}
tests/plugins/Dash/cardcreator/6.res+2−4
@@ -5,11 +5,9 @@ AbstractButton {
5 property string backgroundShapeStyle: "inset";
5 property string backgroundShapeStyle: "inset";
6 property real fontScale: 1.0;
6 property real fontScale: 1.0;
7 property var scopeStyle: null;
7 property var scopeStyle: null;
8− property int titleAlignment: Text.AlignLeft;
9 property int fixedHeaderHeight: -1;
8 property int fixedHeaderHeight: -1;
10 property size fixedArtShapeSize: Qt.size(-1, -1);
9 property size fixedArtShapeSize: Qt.size(-1, -1);
11 readonly property string title: cardData && cardData["title"] || "";
10 readonly property string title: cardData && cardData["title"] || "";
12− property bool asynchronous: true;
13 property bool showHeader: true;
11 property bool showHeader: true;
14 implicitWidth: childrenRect.width;
12 implicitWidth: childrenRect.width;
15 enabled: true;
13 enabled: true;
@@ -18,7 +16,7 @@ Loader {
18 id: backgroundLoader;
16 id: backgroundLoader;
19 objectName: "backgroundLoader";
17 objectName: "backgroundLoader";
20 anchors.fill: parent;
18 anchors.fill: parent;
21− asynchronous: root.asynchronous;
19+ asynchronous: true;
22 visible: status == Loader.Ready;
20 visible: status == Loader.Ready;
23 sourceComponent: UbuntuShape {
21 sourceComponent: UbuntuShape {
24 objectName: "background";
22 objectName: "background";
@@ -81,7 +79,7 @@ Item {
81 width: undefined;
79 width: undefined;
82 text: root.title;
80 text: root.title;
83 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
81 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
84− horizontalAlignment: root.titleAlignment;
82+ horizontalAlignment: Text.AlignLeft;
85 }
83 }
86,Label {
84,Label {
87 id: subtitleLabel;
85 id: subtitleLabel;
tests/plugins/Dash/cardcreator/6.res.cardcreatornew file+126
@@ -0,0 +1,126 @@
1+AbstractButton {
2+ id: root;
3+ property var cardData;
4+ property string artShapeStyle: "inset";
5+ property string backgroundShapeStyle: "inset";
6+ property real fontScale: 1.0;
7+ property var scopeStyle: null;
8+ property size fixedArtShapeSize: Qt.size(-1, -1);
9+ readonly property string title: cardData && cardData["title"] || "";
10+ property bool showHeader: true;
11+ implicitWidth: childrenRect.width;
12+ enabled: true;
13+
14+Loader {
15+ id: backgroundLoader;
16+ objectName: "backgroundLoader";
17+ anchors.fill: parent;
18+ asynchronous: false;
19+ visible: status == Loader.Ready;
20+ sourceComponent: UbuntuShape {
21+ objectName: "background";
22+ radius: "medium";
23+ aspect: {
24+ switch (root.backgroundShapeStyle) {
25+ case "inset": return UbuntuShape.Inset;
26+ case "shadow": return UbuntuShape.DropShadow;
27+ default:
28+ case "flat": return UbuntuShape.Flat;
29+ }
30+ }
31+ backgroundColor: getColor(0) || "white";
32+ secondaryBackgroundColor: getColor(1) || backgroundColor;
33+ backgroundMode: UbuntuShape.VerticalGradient;
34+ anchors.fill: parent;
35+ source: backgroundImage.source ? backgroundImage : null;
36+ property real luminance: Style.luminance(backgroundColor);
37+ property Image backgroundImage: Image {
38+ objectName: "backgroundImage";
39+ source: {
40+ if (cardData && typeof cardData["background"] === "string") return cardData["background"];
41+ else return decodeURI("http://assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu-grey.png");
42+ }
43+ }
44+ function getColor(index) {
45+ if (cardData && typeof cardData["background"] === "object"
46+ && (cardData["background"]["type"] === "color" || cardData["background"]["type"] === "gradient")) {
47+ return cardData["background"]["elements"][index];
48+ } else return index === 0 ? undefined : undefined;
49+ }
50+ }
51+ }
52+readonly property size artShapeSize: Qt.size(-1, -1);
53+readonly property int headerHeight: titleLabel.height + subtitleLabel.height + subtitleLabel.anchors.topMargin;
54+Item {
55+ id: headerTitleContainer;
56+ anchors { right: parent.right; left: parent.left;
57+ top: parent.top;
58+ topMargin: units.gu(1);
59+ leftMargin: units.gu(1);
60+ }
61+ width: parent.width - x;
62+ implicitHeight: titleLabel.height + subtitleLabel.height;
63+ data: [
64+ Label {
65+ id: titleLabel;
66+ objectName: "titleLabel";
67+ anchors { right: emblemIcon.left;
68+ rightMargin: emblemIcon.width > 0 ? units.gu(0.5) : 0;
69+ left: parent.left;
70+ top: parent.top; }
71+ elide: Text.ElideRight;
72+ fontSize: "small";
73+ wrapMode: Text.Wrap;
74+ maximumLineCount: 2;
75+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
76+ color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? theme.palette.normal.baseText : "white");
77+ visible: showHeader ;
78+ width: undefined;
79+ text: root.title;
80+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
81+ horizontalAlignment: Text.AlignLeft;
82+ }
83+,Label {
84+ id: subtitleLabel;
85+ objectName: "subtitleLabel";
86+ anchors { right: parent.right;
87+ left: parent.left;
88+ rightMargin: units.gu(1);
89+ top: titleLabel.bottom;
90+ }
91+ anchors.topMargin: units.dp(2);
92+ elide: Text.ElideRight;
93+ maximumLineCount: 1;
94+ fontSize: "x-small";
95+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
96+ color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? theme.palette.normal.baseText : "white");
97+ visible: titleLabel.visible && titleLabel.text;
98+ text: cardData && cardData["subtitle"] || "";
99+ font.weight: Font.Light;
100+ }
101+,Icon {
102+ id: emblemIcon;
103+ objectName: "emblemIcon";
104+ anchors {
105+ bottom: titleLabel.baseline;
106+ right: parent.right;
107+ rightMargin: units.gu(1);
108+ }
109+ source: cardData && cardData["emblem"] || "";
110+ color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? theme.palette.normal.baseText : "white");
111+ height: source != "" ? titleLabel.font.pixelSize : 0;
112+ width: implicitWidth > 0 && implicitHeight > 0 ? (implicitWidth / implicitHeight * height) : implicitWidth;
113+ }
114+
115+ ]
116+ }
117+UbuntuShape {
118+ id: touchdown;
119+ objectName: "touchdown";
120+ anchors { fill: backgroundLoader }
121+ visible: root.artShapeStyle != "shadow" && root.artShapeStyle != "icon" && root.pressed;
122+ radius: "medium";
123+ borderSource: "radius_pressed.sci"
124+}
125+implicitHeight: headerTitleContainer.y + headerTitleContainer.height + units.gu(1);
126+}
tests/plugins/Dash/cardcreator/7.res+3−5
@@ -5,11 +5,9 @@ AbstractButton {
5 property string backgroundShapeStyle: "inset";
5 property string backgroundShapeStyle: "inset";
6 property real fontScale: 1.0;
6 property real fontScale: 1.0;
7 property var scopeStyle: null;
7 property var scopeStyle: null;
8− property int titleAlignment: Text.AlignLeft;
9 property int fixedHeaderHeight: -1;
8 property int fixedHeaderHeight: -1;
10 property size fixedArtShapeSize: Qt.size(-1, -1);
9 property size fixedArtShapeSize: Qt.size(-1, -1);
11 readonly property string title: cardData && cardData["title"] || "";
10 readonly property string title: cardData && cardData["title"] || "";
12− property bool asynchronous: true;
13 property bool showHeader: true;
11 property bool showHeader: true;
14 implicitWidth: childrenRect.width;
12 implicitWidth: childrenRect.width;
15 enabled: true;
13 enabled: true;
@@ -18,7 +16,7 @@ Loader {
18 id: backgroundLoader;
16 id: backgroundLoader;
19 objectName: "backgroundLoader";
17 objectName: "backgroundLoader";
20 anchors.fill: parent;
18 anchors.fill: parent;
21− asynchronous: root.asynchronous;
19+ asynchronous: true;
22 visible: status == Loader.Ready;
20 visible: status == Loader.Ready;
23 sourceComponent: UbuntuShape {
21 sourceComponent: UbuntuShape {
24 objectName: "background";
22 objectName: "background";
@@ -59,7 +57,7 @@ Row {
59 objectName: "outerRow";
57 objectName: "outerRow";
60 property real margins: units.gu(1);
58 property real margins: units.gu(1);
61 spacing: margins;
59 spacing: margins;
62− height: root.fixedHeaderHeight != -1 ? root.fixedHeaderHeight : implicitHeight;
60+ height: root.fixedHeaderHeight;
63 anchors { top: parent.top;
61 anchors { top: parent.top;
64 topMargin: units.gu(1);
62 topMargin: units.gu(1);
65 left: parent.left;
63 left: parent.left;
@@ -103,7 +101,7 @@ CroppedImageMinimumSourceSize {
103 width: undefined;
101 width: undefined;
104 text: root.title;
102 text: root.title;
105 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
103 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
106− horizontalAlignment: root.titleAlignment;
104+ horizontalAlignment: Text.AlignLeft;
107 }
105 }
108,Label {
106,Label {
109 id: subtitleLabel;
107 id: subtitleLabel;
tests/plugins/Dash/cardcreator/7.res.cardcreatornew file+149
@@ -0,0 +1,149 @@
1+AbstractButton {
2+ id: root;
3+ property var cardData;
4+ property string artShapeStyle: "inset";
5+ property string backgroundShapeStyle: "inset";
6+ property real fontScale: 1.0;
7+ property var scopeStyle: null;
8+ property size fixedArtShapeSize: Qt.size(-1, -1);
9+ readonly property string title: cardData && cardData["title"] || "";
10+ property bool showHeader: true;
11+ implicitWidth: childrenRect.width;
12+ enabled: true;
13+
14+Loader {
15+ id: backgroundLoader;
16+ objectName: "backgroundLoader";
17+ anchors.fill: parent;
18+ asynchronous: false;
19+ visible: status == Loader.Ready;
20+ sourceComponent: UbuntuShape {
21+ objectName: "background";
22+ radius: "medium";
23+ aspect: {
24+ switch (root.backgroundShapeStyle) {
25+ case "inset": return UbuntuShape.Inset;
26+ case "shadow": return UbuntuShape.DropShadow;
27+ default:
28+ case "flat": return UbuntuShape.Flat;
29+ }
30+ }
31+ backgroundColor: getColor(0) || "white";
32+ secondaryBackgroundColor: getColor(1) || backgroundColor;
33+ backgroundMode: UbuntuShape.VerticalGradient;
34+ anchors.fill: parent;
35+ source: backgroundImage.source ? backgroundImage : null;
36+ property real luminance: Style.luminance(backgroundColor);
37+ property Image backgroundImage: Image {
38+ objectName: "backgroundImage";
39+ source: {
40+ if (cardData && typeof cardData["background"] === "string") return cardData["background"];
41+ else return "";
42+ }
43+ }
44+ function getColor(index) {
45+ if (cardData && typeof cardData["background"] === "object"
46+ && (cardData["background"]["type"] === "color" || cardData["background"]["type"] === "gradient")) {
47+ return cardData["background"]["elements"][index];
48+ } else return index === 0 ? "#E9E9E9" : "#E9AAE9";
49+ }
50+ }
51+ }
52+readonly property size artShapeSize: Qt.size(-1, -1);
53+readonly property int headerHeight: row.height;
54+Row {
55+ id: row;
56+ objectName: "outerRow";
57+ property real margins: units.gu(1);
58+ spacing: margins;
59+ anchors { top: parent.top;
60+ topMargin: units.gu(1);
61+ left: parent.left;
62+ }
63+ anchors.right: parent.right;
64+ anchors.margins: margins;
65+ anchors.rightMargin: 0;
66+ data: [
67+CroppedImageMinimumSourceSize {
68+ id: mascotImage;
69+ objectName: "mascotImage";
70+ anchors { verticalCenter: parent.verticalCenter; }
71+ source: cardData && cardData["mascot"] || "";
72+ width: units.gu(6);
73+ height: units.gu(5.625);
74+ horizontalAlignment: Image.AlignHCenter;
75+ verticalAlignment: Image.AlignVCenter;
76+ visible: showHeader;
77+ }
78+
79+,Item {
80+ id: headerTitleContainer;
81+ anchors { verticalCenter: parent.verticalCenter; }
82+ width: parent.width - x;
83+ implicitHeight: titleLabel.height + subtitleLabel.height + attributesRow.height;
84+ data: [
85+ Label {
86+ id: titleLabel;
87+ objectName: "titleLabel";
88+ anchors { right: parent.right;
89+ rightMargin: units.gu(1);
90+ left: parent.left;
91+ top: parent.top; }
92+ elide: Text.ElideRight;
93+ fontSize: "small";
94+ wrapMode: Text.Wrap;
95+ maximumLineCount: 2;
96+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
97+ color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? theme.palette.normal.baseText : "white");
98+ visible: showHeader ;
99+ width: undefined;
100+ text: root.title;
101+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
102+ horizontalAlignment: Text.AlignLeft;
103+ }
104+,Label {
105+ id: subtitleLabel;
106+ objectName: "subtitleLabel";
107+ anchors { right: parent.right;
108+ left: parent.left;
109+ rightMargin: units.gu(1);
110+ top: titleLabel.bottom;
111+ }
112+ anchors.topMargin: units.dp(2);
113+ elide: Text.ElideRight;
114+ maximumLineCount: 1;
115+ fontSize: "x-small";
116+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
117+ color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? theme.palette.normal.baseText : "white");
118+ visible: titleLabel.visible && titleLabel.text;
119+ text: cardData && cardData["subtitle"] || "";
120+ font.weight: Font.Light;
121+ }
122+,CardAttributes {
123+ id: attributesRow;
124+ objectName: "attributesRow";
125+ anchors { right: parent.right;
126+ left: parent.left;
127+ rightMargin: units.gu(1);
128+ top: subtitleLabel.bottom;
129+ }
130+ color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? theme.palette.normal.baseText : "white");
131+ fontScale: root.fontScale;
132+ model: cardData && cardData["attributes"];
133+ }
134+
135+ ]
136+ }
137+
138+ ]
139+ }
140+UbuntuShape {
141+ id: touchdown;
142+ objectName: "touchdown";
143+ anchors { fill: backgroundLoader }
144+ visible: root.artShapeStyle != "shadow" && root.artShapeStyle != "icon" && root.pressed;
145+ radius: "medium";
146+ borderSource: "radius_pressed.sci"
147+}
148+implicitHeight: row.y + row.height + units.gu(1);
149+}
tests/plugins/Dash/cardcreator/8.res+3−5
@@ -5,11 +5,9 @@ AbstractButton {
5 property string backgroundShapeStyle: "inset";
5 property string backgroundShapeStyle: "inset";
6 property real fontScale: 1.0;
6 property real fontScale: 1.0;
7 property var scopeStyle: null;
7 property var scopeStyle: null;
8− property int titleAlignment: Text.AlignLeft;
9 property int fixedHeaderHeight: -1;
8 property int fixedHeaderHeight: -1;
10 property size fixedArtShapeSize: Qt.size(-1, -1);
9 property size fixedArtShapeSize: Qt.size(-1, -1);
11 readonly property string title: cardData && cardData["title"] || "";
10 readonly property string title: cardData && cardData["title"] || "";
12− property bool asynchronous: true;
13 property bool showHeader: true;
11 property bool showHeader: true;
14 implicitWidth: childrenRect.width;
12 implicitWidth: childrenRect.width;
15 enabled: true;
13 enabled: true;
@@ -18,7 +16,7 @@ Loader {
18 id: backgroundLoader;
16 id: backgroundLoader;
19 objectName: "backgroundLoader";
17 objectName: "backgroundLoader";
20 anchors.fill: parent;
18 anchors.fill: parent;
21− asynchronous: root.asynchronous;
19+ asynchronous: true;
22 visible: status == Loader.Ready;
20 visible: status == Loader.Ready;
23 sourceComponent: UbuntuShape {
21 sourceComponent: UbuntuShape {
24 objectName: "background";
22 objectName: "background";
@@ -59,7 +57,7 @@ Row {
59 objectName: "outerRow";
57 objectName: "outerRow";
60 property real margins: units.gu(1);
58 property real margins: units.gu(1);
61 spacing: margins;
59 spacing: margins;
62− height: root.fixedHeaderHeight != -1 ? root.fixedHeaderHeight : implicitHeight;
60+ height: root.fixedHeaderHeight;
63 anchors { top: parent.top;
61 anchors { top: parent.top;
64 topMargin: units.gu(1);
62 topMargin: units.gu(1);
65left: parent.left;
63left: parent.left;
@@ -94,7 +92,7 @@ left: parent.left;
94 width: parent.width - x;
92 width: parent.width - x;
95 text: root.title;
93 text: root.title;
96 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
94 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
97− horizontalAlignment: root.titleAlignment;
95+ horizontalAlignment: Text.AlignLeft;
98 }
96 }
99
97
100 ]
98 ]
tests/plugins/Dash/cardcreator/8.res.cardcreatornew file+107
@@ -0,0 +1,107 @@
1+AbstractButton {
2+ id: root;
3+ property var cardData;
4+ property string artShapeStyle: "inset";
5+ property string backgroundShapeStyle: "inset";
6+ property real fontScale: 1.0;
7+ property var scopeStyle: null;
8+ property size fixedArtShapeSize: Qt.size(-1, -1);
9+ readonly property string title: cardData && cardData["title"] || "";
10+ property bool showHeader: true;
11+ implicitWidth: childrenRect.width;
12+ enabled: true;
13+
14+Loader {
15+ id: backgroundLoader;
16+ objectName: "backgroundLoader";
17+ anchors.fill: parent;
18+ asynchronous: false;
19+ visible: status == Loader.Ready;
20+ sourceComponent: UbuntuShape {
21+ objectName: "background";
22+ radius: "medium";
23+ aspect: {
24+ switch (root.backgroundShapeStyle) {
25+ case "inset": return UbuntuShape.Inset;
26+ case "shadow": return UbuntuShape.DropShadow;
27+ default:
28+ case "flat": return UbuntuShape.Flat;
29+ }
30+ }
31+ backgroundColor: getColor(0) || "white";
32+ secondaryBackgroundColor: getColor(1) || backgroundColor;
33+ backgroundMode: UbuntuShape.VerticalGradient;
34+ anchors.fill: parent;
35+ source: backgroundImage.source ? backgroundImage : null;
36+ property real luminance: Style.luminance(backgroundColor);
37+ property Image backgroundImage: Image {
38+ objectName: "backgroundImage";
39+ source: {
40+ if (cardData && typeof cardData["background"] === "string") return cardData["background"];
41+ else return "";
42+ }
43+ }
44+ function getColor(index) {
45+ if (cardData && typeof cardData["background"] === "object"
46+ && (cardData["background"]["type"] === "color" || cardData["background"]["type"] === "gradient")) {
47+ return cardData["background"]["elements"][index];
48+ } else return index === 0 ? "#E9E9E9" : "#E9AAE9";
49+ }
50+ }
51+ }
52+readonly property size artShapeSize: Qt.size(-1, -1);
53+readonly property int headerHeight: row.height;
54+Row {
55+ id: row;
56+ objectName: "outerRow";
57+ property real margins: units.gu(1);
58+ spacing: margins;
59+ anchors { top: parent.top;
60+ topMargin: units.gu(1);
61+left: parent.left;
62+ }
63+ anchors.right: parent.right;
64+ anchors.margins: margins;
65+ anchors.rightMargin: 0;
66+ data: [
67+ CroppedImageMinimumSourceSize {
68+ id: mascotImage;
69+ objectName: "mascotImage";
70+ anchors { verticalCenter: parent.verticalCenter; }
71+ source: cardData && cardData["mascot"] || "";
72+ width: units.gu(6);
73+ height: units.gu(5.625);
74+ horizontalAlignment: Image.AlignHCenter;
75+ verticalAlignment: Image.AlignVCenter;
76+ visible: showHeader;
77+ }
78+,Label {
79+ id: titleLabel;
80+ objectName: "titleLabel";
81+ anchors { verticalCenter: parent.verticalCenter;
82+ }
83+ elide: Text.ElideRight;
84+ fontSize: "small";
85+ wrapMode: Text.Wrap;
86+ maximumLineCount: 2;
87+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
88+ color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? theme.palette.normal.baseText : "white");
89+ visible: showHeader ;
90+ width: parent.width - x;
91+ text: root.title;
92+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
93+ horizontalAlignment: Text.AlignLeft;
94+ }
95+
96+ ]
97+ }
98+UbuntuShape {
99+ id: touchdown;
100+ objectName: "touchdown";
101+ anchors { fill: backgroundLoader }
102+ visible: root.artShapeStyle != "shadow" && root.artShapeStyle != "icon" && root.pressed;
103+ radius: "medium";
104+ borderSource: "radius_pressed.sci"
105+}
106+implicitHeight: row.y + row.height + units.gu(1);
107+}
tests/plugins/Dash/cardcreator/9.res+4−5
@@ -5,11 +5,9 @@ AbstractButton {
5 property string backgroundShapeStyle: "inset";
5 property string backgroundShapeStyle: "inset";
6 property real fontScale: 1.0;
6 property real fontScale: 1.0;
7 property var scopeStyle: null;
7 property var scopeStyle: null;
8− property int titleAlignment: Text.AlignLeft;
9 property int fixedHeaderHeight: -1;
8 property int fixedHeaderHeight: -1;
10 property size fixedArtShapeSize: Qt.size(-1, -1);
9 property size fixedArtShapeSize: Qt.size(-1, -1);
11 readonly property string title: cardData && cardData["title"] || "";
10 readonly property string title: cardData && cardData["title"] || "";
12− property bool asynchronous: true;
13 property bool showHeader: true;
11 property bool showHeader: true;
14 implicitWidth: childrenRect.width;
12 implicitWidth: childrenRect.width;
15 enabled: true;
13 enabled: true;
@@ -36,7 +34,7 @@ top: parent.top;
36 width: undefined;
34 width: undefined;
37 text: root.title;
35 text: root.title;
38 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
36 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
39− horizontalAlignment: root.titleAlignment;
37+ horizontalAlignment: Text.AlignLeft;
40 }
38 }
41Label {
39Label {
42 id: subtitleLabel;
40 id: subtitleLabel;
@@ -72,7 +70,7 @@ CardAudioProgress {
72 id: audioButton;
70 id: audioButton;
73 anchors.fill: undefined;
71 anchors.fill: undefined;
74 width: height;
72 width: height;
75− height: (root.fixedHeaderHeight > 0 ? root.fixedHeaderHeight : headerHeight) + 2 * units.gu(1);
73+ height: root.fixedHeaderHeight + 2 * units.gu(1);
76 readonly property url source: (cardData["quickPreviewData"] && cardData["quickPreviewData"]["uri"]) || "";
74 readonly property url source: (cardData["quickPreviewData"] && cardData["quickPreviewData"]["uri"]) || "";
77 UbuntuShape {
75 UbuntuShape {
78 anchors.fill: parent;
76 anchors.fill: parent;
@@ -93,7 +91,8 @@ CardAudioProgress {
93 opacity: 0.9;
91 opacity: 0.9;
94 name: DashAudioPlayer.playing && AudioUrlComparer.compare(parent.source, DashAudioPlayer.currentSource) ? "media-playback-pause" : "media-playback-start";
92 name: DashAudioPlayer.playing && AudioUrlComparer.compare(parent.source, DashAudioPlayer.currentSource) ? "media-playback-pause" : "media-playback-start";
95 color: "white";
93 color: "white";
94+ asynchronous: true;
96− }
95+ }
97 onClicked: {
96 onClicked: {
98 if (AudioUrlComparer.compare(source, DashAudioPlayer.currentSource)) {
97 if (AudioUrlComparer.compare(source, DashAudioPlayer.currentSource)) {
99 if (DashAudioPlayer.playing) {
98 if (DashAudioPlayer.playing) {
tests/plugins/Dash/cardcreator/9.res.cardcreatornew file+119
@@ -0,0 +1,119 @@
1+AbstractButton {
2+ id: root;
3+ property var cardData;
4+ property string artShapeStyle: "inset";
5+ property string backgroundShapeStyle: "inset";
6+ property real fontScale: 1.0;
7+ property var scopeStyle: null;
8+ property size fixedArtShapeSize: Qt.size(-1, -1);
9+ readonly property string title: cardData && cardData["title"] || "";
10+ property bool showHeader: true;
11+ implicitWidth: childrenRect.width;
12+ enabled: true;
13+
14+readonly property size artShapeSize: Qt.size(-1, -1);
15+readonly property int headerHeight: titleLabel.height + subtitleLabel.height + subtitleLabel.anchors.topMargin + audioProgressBar.height + audioProgressBar.anchors.topMargin;
16+Label {
17+ id: titleLabel;
18+ objectName: "titleLabel";
19+ anchors { right: parent.right;
20+rightMargin: units.gu(1);
21+left: audioButton.right;
22+ leftMargin: units.gu(1);
23+top: parent.top;
24+ topMargin: units.gu(1);
25+ }
26+ elide: Text.ElideRight;
27+ fontSize: "small";
28+ wrapMode: Text.Wrap;
29+ maximumLineCount: 2;
30+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
31+ color: root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText;
32+ visible: showHeader ;
33+ width: undefined;
34+ text: root.title;
35+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
36+ horizontalAlignment: Text.AlignLeft;
37+ }
38+Label {
39+ id: subtitleLabel;
40+ objectName: "subtitleLabel";
41+ anchors { left: titleLabel.left;
42+ leftMargin: titleLabel.leftMargin;
43+rightMargin: units.gu(1);
44+right: titleLabel.right;
45+top: titleLabel.bottom;
46+ }
47+ anchors.topMargin: units.dp(2);
48+ elide: Text.ElideRight;
49+ maximumLineCount: 1;
50+ fontSize: "x-small";
51+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
52+ color: root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText;
53+ visible: titleLabel.visible && titleLabel.text;
54+ text: cardData && cardData["subtitle"] || "";
55+ font.weight: Font.Light;
56+ }
57+CardAudioProgress {
58+ id: audioProgressBar;
59+ duration: (cardData["quickPreviewData"] && cardData["quickPreviewData"]["duration"]) || 0;
60+ source: (cardData["quickPreviewData"] && cardData["quickPreviewData"]["uri"]) || "";
61+ anchors {
62+ bottom: audioButton.bottom;
63+ left: audioButton.right;
64+ right: parent.right;
65+ margins: units.gu(1);
66+ }
67+ color: root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText;
68+ }AbstractButton {
69+ id: audioButton;
70+ anchors.fill: undefined;
71+ width: height;
72+ height: headerHeight + 2 * units.gu(1);
73+ readonly property url source: (cardData["quickPreviewData"] && cardData["quickPreviewData"]["uri"]) || "";
74+ UbuntuShape {
75+ anchors.fill: parent;
76+ visible: parent.pressed;
77+ radius: "medium";
78+ }
79+ Rectangle {
80+ color: Qt.rgba(0, 0, 0, 0.5);
81+ anchors.centerIn: parent;
82+ width: parent.width * 0.5;
83+ height: width;
84+ radius: width / 2;
85+ }
86+ Icon {
87+ anchors.centerIn: parent;
88+ width: parent.width * 0.3;
89+ height: width;
90+ opacity: 0.9;
91+ name: DashAudioPlayer.playing && AudioUrlComparer.compare(parent.source, DashAudioPlayer.currentSource) ? "media-playback-pause" : "media-playback-start";
92+ color: "white";
93+ asynchronous: false;
94+ }
95+ onClicked: {
96+ if (AudioUrlComparer.compare(source, DashAudioPlayer.currentSource)) {
97+ if (DashAudioPlayer.playing) {
98+ DashAudioPlayer.pause();
99+ } else {
100+ DashAudioPlayer.play();
101+ }
102+ } else {
103+ var playlist = (cardData["quickPreviewData"] && cardData["quickPreviewData"]["playlist"]) || null;
104+ DashAudioPlayer.playSource(source, playlist);
105+ }
106+ }
107+ onPressAndHold: {
108+ root.pressAndHold();
109+ }
110+ }UbuntuShape {
111+ id: touchdown;
112+ objectName: "touchdown";
113+ anchors { fill: root }
114+ visible: root.artShapeStyle != "shadow" && root.artShapeStyle != "icon" && root.pressed;
115+ radius: "medium";
116+ borderSource: "radius_pressed.sci"
117+ }
118+implicitHeight: audioButton.height;
119+}
tests/plugins/Dash/cardcreatortest.cpp+32−22
@@ -45,6 +45,30 @@ private Q_SLOTS:
45 delete view;
45 delete view;
46 }
46 }
47
47
48+ void compareFileContents(const QString &filePath, const QString cardStringResult)
49+ {
50+ QFile testResultFile(filePath);
51+ QVERIFY(testResultFile.open(QIODevice::ReadOnly));
52+ QTextStream ts2(&testResultFile);
53+
54+ // Record failed results to /tmp
55+ const QString executedResult = cardStringResult;
56+ QTemporaryFile tmpFile(QDir::tempPath() + QDir::separator() + "testCardCreatorFailedResultXXXXXX");
57+ tmpFile.open();
58+ tmpFile.setAutoRemove(false);
59+ tmpFile.write(executedResult.toUtf8().constData());
60+
61+ // Line by line comparison
62+ const QStringList expectedLines = ts2.readAll().trimmed().replace(QRegExp("\n\\s*\n"),"\n").split("\n");
63+ const QStringList cardStringResultLines = cardStringResult.trimmed().replace(QRegExp("\n\\s*\n"),"\n").split("\n");
64+ for (int i = 0; i < expectedLines.size(); ++i) {
65+ QCOMPARE(cardStringResultLines[i].simplified(), expectedLines[i].simplified());
66+ }
67+
68+ // Remove the result if it passed
69+ tmpFile.setAutoRemove(true);
70+ }
71+
48 void testKnownCases()
72 void testKnownCases()
49 {
73 {
50 const QString templateString("template: ");
74 const QString templateString("template: ");
@@ -68,33 +92,19 @@ private Q_SLOTS:
68 const QString templateJSON = lines[0].mid(templateString.length());
92 const QString templateJSON = lines[0].mid(templateString.length());
69 const QString componentsJSON = lines[1].mid(componentsString.length());
93 const QString componentsJSON = lines[1].mid(componentsString.length());
70 const QString resultFileName = lines[2].mid(resultString.length());
94 const QString resultFileName = lines[2].mid(resultString.length());
71−
72 QVariant cardStringResult;
95 QVariant cardStringResult;
73− QMetaObject::invokeMethod(view->rootObject(), "cardString", Q_RETURN_ARG(QVariant, cardStringResult), Q_ARG(QVariant, templateJSON), Q_ARG(QVariant, componentsJSON));
96+ QVariant createCardComponentResult;
74−
75− QFile testResultFile(testDirPath + resultFileName);
76− QVERIFY(testResultFile.open(QIODevice::ReadOnly));
77− QTextStream ts2(&testResultFile);
78
97
79− // Record failed results to /tmp
98+ QMetaObject::invokeMethod(view->rootObject(), "cardString", Q_RETURN_ARG(QVariant, cardStringResult), Q_ARG(QVariant, templateJSON), Q_ARG(QVariant, componentsJSON), Q_ARG(QVariant, false));
80− const QString executedResult = cardStringResult.toString();
99+ compareFileContents(testDirPath + resultFileName, cardStringResult.toString());
81− QTemporaryFile tmpFile(QDir::tempPath() + QDir::separator() + "testCardCreatorFailedResultXXXXXX");
82− tmpFile.open();
83− tmpFile.setAutoRemove(false);
84− tmpFile.write(executedResult.toUtf8().constData());
85
100
86− // Line by line comparison
101+ QMetaObject::invokeMethod(view->rootObject(), "cardString", Q_RETURN_ARG(QVariant, cardStringResult), Q_ARG(QVariant, templateJSON), Q_ARG(QVariant, componentsJSON), Q_ARG(QVariant, true));
87− const QStringList expectedLines = ts2.readAll().trimmed().replace(QRegExp("\n\\s*\n"),"\n").split("\n");
102+ compareFileContents(testDirPath + resultFileName + ".cardcreator", cardStringResult.toString());
88− const QStringList cardStringResultLines = cardStringResult.toString().trimmed().replace(QRegExp("\n\\s*\n"),"\n").split("\n");
89− for (int i = 0; i < expectedLines.size(); ++i) {
90− QCOMPARE(cardStringResultLines[i].simplified(), expectedLines[i].simplified());
91− }
92
103
93− // Remove the result if it passed
104+ QMetaObject::invokeMethod(view->rootObject(), "createCardComponent", Q_RETURN_ARG(QVariant, createCardComponentResult), Q_ARG(QVariant, templateJSON), Q_ARG(QVariant, componentsJSON), Q_ARG(QVariant, false));
94− tmpFile.setAutoRemove(true);
105+ QVERIFY(createCardComponentResult.toBool());
95
106
96− QVariant createCardComponentResult;
97− QMetaObject::invokeMethod(view->rootObject(), "createCardComponent", Q_RETURN_ARG(QVariant, createCardComponentResult), Q_ARG(QVariant, templateJSON), Q_ARG(QVariant, componentsJSON));
107+ QMetaObject::invokeMethod(view->rootObject(), "createCardComponent", Q_RETURN_ARG(QVariant, createCardComponentResult), Q_ARG(QVariant, templateJSON), Q_ARG(QVariant, componentsJSON), Q_ARG(QVariant, true));
98 QVERIFY(createCardComponentResult.toBool());
108 QVERIFY(createCardComponentResult.toBool());
99 }
109 }
100 }
110 }
tests/plugins/Dash/cardcreatortest.qml+4−4
@@ -19,11 +19,11 @@ import "../../../plugins/Dash/CardCreator.js" as CardCreator
19
19
20Item {
20Item {
21 id: root
21 id: root
22− function cardString(template, components) {
22+ function cardString(template, components, isCardCreator) {
23− return CardCreator.cardString(JSON.parse(template), JSON.parse(components));
23+ return CardCreator.cardString(JSON.parse(template), JSON.parse(components), isCardCreator);
24 }
24 }
25
25
26− function createCardComponent(template, components) {
26+ function createCardComponent(template, components, isCardCreator) {
27− return CardCreator.createCardComponent(root, JSON.parse(template), JSON.parse(components)) !== null;
27+ return CardCreator.createCardComponent(root, JSON.parse(template), JSON.parse(components), isCardCreator) !== null;
28 }
28 }
29}
29}
tests/plugins/IntegratedLightDM/CMakeLists.txt+25
@@ -65,3 +65,28 @@ add_unity8_uitest(GreeterUsers GreeterUsersModelTestExec
65 DEPENDS MockLightDM
65 DEPENDS MockLightDM
66 LIGHTDM
66 LIGHTDM
67 )
67 )
68+
69+add_executable(GreeterIntegratedTestExec
70+ integrated.cpp
71+ )
72+qt5_use_modules(GreeterIntegratedTestExec Core DBus Quick Test)
73+target_link_libraries(GreeterIntegratedTestExec
74+ ${GLIB_LIBRARIES}
75+ integratedLightDMSession
76+ )
77+target_include_directories(GreeterIntegratedTestExec PUBLIC
78+ ${GLIB_INCLUDE_DIRS}
79+ ${CMAKE_SOURCE_DIR}/plugins/IntegratedLightDM/liblightdm
80+ )
81+add_unity8_unittest(GreeterIntegrated dbus-test-runner
82+ ENVIRONMENT LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/plugins/IntegratedLightDM/liblightdm/
83+ ARG_PREFIX "--parameter"
84+ ARGS
85+ --task $<TARGET_FILE:mock-server>
86+ --task-name server
87+ --ignore-return
88+ --task $<TARGET_FILE:GreeterIntegratedTestExec>
89+ --task-name client
90+ --wait-for org.freedesktop.Accounts
91+ DEPENDS integratedLightDMSession
92+ )
tests/plugins/IntegratedLightDM/integrated.cppnew file+91
@@ -0,0 +1,91 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "UsersModel.h"
18+
19+#include <glib.h>
20+#include <QDBusInterface>
21+#include <QDBusReply>
22+#include <QtTest>
23+
24+class GreeterIntegratedTest : public QObject
25+{
26+ Q_OBJECT
27+
28+private Q_SLOTS:
29+
30+ void init()
31+ {
32+ m_accounts = new QDBusInterface(QStringLiteral("org.freedesktop.Accounts"),
33+ QStringLiteral("/org/freedesktop/Accounts"),
34+ QStringLiteral("org.freedesktop.Accounts"),
35+ QDBusConnection::sessionBus());
36+ QDBusReply<bool> addReply = m_accounts->call(QStringLiteral("AddUser"),
37+ g_get_user_name());
38+ QVERIFY(addReply.isValid());
39+ QCOMPARE(addReply.value(), true);
40+
41+ m_user = new QDBusInterface(QStringLiteral("org.freedesktop.Accounts"),
42+ QStringLiteral("/%1").arg(g_get_user_name()),
43+ QStringLiteral("org.freedesktop.DBus.Properties"),
44+ QDBusConnection::sessionBus());
45+
46+ m_model = new QLightDM::UsersModel();
47+ QVERIFY(m_model);
48+ }
49+
50+ void cleanup()
51+ {
52+ QDBusReply<bool> addReply = m_accounts->call(QStringLiteral("RemoveUser"),
53+ g_get_user_name());
54+ QVERIFY(addReply.isValid());
55+ QCOMPARE(addReply.value(), true);
56+
57+ delete m_model;
58+ delete m_accounts;
59+ delete m_user;
60+ }
61+
62+ void testWatchRealName()
63+ {
64+ auto index = m_model->index(0, 0);
65+
66+ QCOMPARE(m_model->data(index, QLightDM::UsersModel::RealNameRole).toString(),
67+ QStringLiteral(""));
68+
69+ // The real AccountsService doesn't let you set via dbus properties. You
70+ // have to call SetRealName instead (so that they can protect the call
71+ // via policykit). But our test server does let us.
72+ QVariant wrapped = QVariant::fromValue(QDBusVariant(QStringLiteral("Test User")));
73+ QDBusReply<void> reply = m_user->call(QStringLiteral("Set"),
74+ QStringLiteral("org.freedesktop.Accounts.User"),
75+ QStringLiteral("RealName"),
76+ wrapped);
77+ QVERIFY(reply.isValid());
78+
79+ QTRY_COMPARE(m_model->data(index, QLightDM::UsersModel::RealNameRole).toString(),
80+ QStringLiteral("Test User"));
81+ }
82+
83+private:
84+ QLightDM::UsersModel *m_model;
85+ QDBusInterface *m_accounts;
86+ QDBusInterface *m_user;
87+};
88+
89+QTEST_MAIN(GreeterIntegratedTest)
90+
91+#include "integrated.moc"
tests/plugins/Utils/CMakeLists.txt+7−1
@@ -4,15 +4,21 @@ include_directories(
4 ${CMAKE_CURRENT_BINARY_DIR}
4 ${CMAKE_CURRENT_BINARY_DIR}
5 )
5 )
6
6
7+add_definitions(-DCONFIG_TESTING)
8+
7foreach(util_test
9foreach(util_test
8 QLimitProxyModel
10 QLimitProxyModel
9 UnitySortFilterProxyModel
11 UnitySortFilterProxyModel
10 WindowInputMonitor
12 WindowInputMonitor
13+ DeviceConfigParser
11)
14)
12 add_executable(${util_test}TestExec ${util_test}Test.cpp ModelTest.cpp)
15 add_executable(${util_test}TestExec ${util_test}Test.cpp ModelTest.cpp)
13 qt5_use_modules(${util_test}TestExec Test Core Qml)
16 qt5_use_modules(${util_test}TestExec Test Core Qml)
14 target_link_libraries(${util_test}TestExec Utils-qml)
17 target_link_libraries(${util_test}TestExec Utils-qml)
15− add_unity8_unittest(${util_test} ${util_test}TestExec ADD_TEST)
18+ add_unity8_unittest(${util_test} ${util_test}TestExec ADD_TEST
19+ ENVIRONMENT XDG_CONFIG_HOME=${CMAKE_CURRENT_BINARY_DIR}
20+ )
21+
16endforeach()
22endforeach()
17
23
18# plain qml test
24# plain qml test
tests/plugins/Utils/DeviceConfigParserTest.cppnew file+70
@@ -0,0 +1,70 @@
1+/*
2+ * Copyright (C) 2016 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+// local
18+#include "deviceconfigparser.h"
19+
20+// Qt
21+#include <QTest>
22+#include <QDebug>
23+#include <QSettings>
24+
25+class DeviceConfigParserTest : public QObject
26+{
27+ Q_OBJECT
28+
29+private Q_SLOTS:
30+
31+ void initTestCase() {
32+ }
33+
34+ void testDefaults()
35+ {
36+ DeviceConfigParser p;
37+ p.setName("nonexistent");
38+
39+ QCOMPARE(p.supportedOrientations(), Qt::PortraitOrientation | Qt::InvertedPortraitOrientation | Qt::LandscapeOrientation | Qt::InvertedLandscapeOrientation);
40+ QCOMPARE(p.primaryOrientation(), Qt::PrimaryOrientation);
41+ QCOMPARE(p.portraitOrientation(), Qt::PortraitOrientation);
42+ QCOMPARE(p.invertedPortraitOrientation(), Qt::InvertedPortraitOrientation);
43+ QCOMPARE(p.landscapeOrientation(), Qt::LandscapeOrientation);
44+ QCOMPARE(p.invertedLandscapeOrientation(), Qt::InvertedLandscapeOrientation);
45+ }
46+
47+ void testCustomFile() {
48+ QSettings s("./devices.conf", QSettings::IniFormat);
49+ s.beginGroup("fakedevice");
50+
51+ s.setValue("SupportedOrientations", QStringList() << "Portrait" << "Landscape" << "InvertedLandscape");
52+ s.setValue("PrimaryOrientation", "InvertedLandscape");
53+ s.sync();
54+
55+ DeviceConfigParser p;
56+ p.setName("fakedevice");
57+
58+ QCOMPARE(p.supportedOrientations(), Qt::PortraitOrientation | Qt::LandscapeOrientation | Qt::InvertedLandscapeOrientation);
59+ QCOMPARE(p.primaryOrientation(), Qt::InvertedLandscapeOrientation);
60+ QCOMPARE(p.portraitOrientation(), Qt::PortraitOrientation);
61+ QCOMPARE(p.invertedPortraitOrientation(), Qt::InvertedPortraitOrientation);
62+ QCOMPARE(p.landscapeOrientation(), Qt::LandscapeOrientation);
63+ QCOMPARE(p.invertedLandscapeOrientation(), Qt::InvertedLandscapeOrientation);
64+ }
65+
66+};
67+
68+QTEST_GUILESS_MAIN(DeviceConfigParserTest)
69+
70+#include "DeviceConfigParserTest.moc"
tests/qmltests/CMakeLists.txt+1
@@ -5,6 +5,7 @@ add_unity8_qmltest(. OrientedShell LIGHTDM)
5add_unity8_qmltest(. DisabledScreenNotice)
5add_unity8_qmltest(. DisabledScreenNotice)
6add_unity8_qmltest(. Shell LIGHTDM)
6add_unity8_qmltest(. Shell LIGHTDM)
7add_unity8_qmltest(. ShellWithPin LIGHTDM)
7add_unity8_qmltest(. ShellWithPin LIGHTDM)
8+add_unity8_qmltest(. DeviceConfiguration)
8add_unity8_qmltest(Components Background)
9add_unity8_qmltest(Components Background)
9add_unity8_qmltest(Components Carousel)
10add_unity8_qmltest(Components Carousel)
10add_unity8_qmltest(Components Dialogs LIGHTDM)
11add_unity8_qmltest(Components Dialogs LIGHTDM)
tests/qmltests/Components/tst_Lockscreen.qml+14−7
@@ -235,11 +235,14 @@ Rectangle {
235
235
236 function test_unlock_data() {
236 function test_unlock_data() {
237 return [
237 return [
238− {tag: "numeric", alphanumeric: false, password: "1234", minPinLength: 4, maxPinLength: 4},
238+ {tag: "numeric", alphanumeric: false, password: "1234", minPinLength: 4, maxPinLength: 4, keyboard: false},
239− {tag: "alphanumeric", alphanumeric: true, password: "password", minPinLength: -1, maxPinLength: -1},
239+ {tag: "alphanumeric", alphanumeric: true, password: "password", minPinLength: -1, maxPinLength: -1, keyboard: false},
240− {tag: "numeric (wrong)", alphanumeric: false, password: "4321", minPinLength: 4, maxPinLength: 4},
240+ {tag: "numeric (wrong)", alphanumeric: false, password: "4321", minPinLength: 4, maxPinLength: 4, keyboard: false},
241− {tag: "alphanumeric (wrong)", alphanumeric: true, password: "drowssap", minPinLength: -1, maxPinLength: -1},
241+ {tag: "alphanumeric (wrong)", alphanumeric: true, password: "drowssap", minPinLength: -1, maxPinLength: -1, keyboard: false},
242− {tag: "flexible length", alphanumeric: false, password: "1234", minPinLength: -1, maxPinLength: -1},
242+ {tag: "flexible length", alphanumeric: false, password: "1234", minPinLength: -1, maxPinLength: -1, keyboard: false},
243+ {tag: "numeric", alphanumeric: false, password: "1234", minPinLength: 4, maxPinLength: 4, keyboard: true},
244+ {tag: "numeric (wrong)", alphanumeric: false, password: "4321", minPinLength: 4, maxPinLength: 4, keyboard: true},
245+ {tag: "flexible length", alphanumeric: false, password: "1234", minPinLength: -1, maxPinLength: -1, keyboard: true}
243 ]
246 ]
244 }
247 }
245
248
@@ -259,8 +262,12 @@ Rectangle {
259 } else {
262 } else {
260 for (var i = 0; i < data.password.length; ++i) {
263 for (var i = 0; i < data.password.length; ++i) {
261 var character = data.password.charAt(i)
264 var character = data.password.charAt(i)
265+ if (data.keyboard) {
266+ typeString(character)
267+ } else {
262− var button = findChild(lockscreen, "pinPadButton" + character)
268+ var button = findChild(lockscreen, "pinPadButton" + character)
263− mouseClick(button, units.gu(1), units.gu(1))
269+ mouseClick(button, units.gu(1), units.gu(1))
270+ }
264 }
271 }
265 var confirmButton = findChild(lockscreen, "confirmButton");
272 var confirmButton = findChild(lockscreen, "confirmButton");
266 mouseClick(confirmButton, units.gu(1), units.gu(1));
273 mouseClick(confirmButton, units.gu(1), units.gu(1));
tests/qmltests/Dash/Previews/tst_PreviewHeader.qml+18−1
@@ -38,6 +38,14 @@ Rectangle {
38 "attributes": [{"value":"text1","icon":"image://theme/ok"},{"value":"text2","icon":"image://theme/cancel"}]
38 "attributes": [{"value":"text1","icon":"image://theme/ok"},{"value":"text2","icon":"image://theme/cancel"}]
39 }
39 }
40
40
41+ property var emblemheaderjson: {
42+ "title": "THE TITLE",
43+ "subtitle": "Something catchy",
44+ "mascot": "../graphics/play_button.png",
45+ "attributes": [{"value":"text1","icon":"image://theme/ok"},{"value":"text2","icon":"image://theme/cancel"}],
46+ "emblem": Qt.resolvedUrl("../artwork/emblem.png")
47+ }
48+
41 property var brokenheaderjson: {
49 property var brokenheaderjson: {
42 "title": "THE TITLE",
50 "title": "THE TITLE",
43 "subtitle": "Something catchy",
51 "subtitle": "Something catchy",
@@ -64,7 +72,7 @@ Rectangle {
64
72
65 PreviewHeader {
73 PreviewHeader {
66 id: previewHeader
74 id: previewHeader
67− widgetData: headerjson
75+ widgetData: emblemheaderjson
68 width: units.gu(30)
76 width: units.gu(30)
69
77
70 Rectangle {
78 Rectangle {
@@ -136,6 +144,15 @@ Rectangle {
136 }
144 }
137 }
145 }
138
146
147+ function test_emblem() {
148+ previewHeader.widgetData = emblemheaderjson;
149+
150+ var emblemIcon = findChild(previewHeader, "emblemIcon");
151+ var titleLabel = findChild(previewHeader, "titleLabel");
152+ verify(emblemIcon.height > 0);
153+ compare(emblemIcon.height, titleLabel.font.pixelSize);
154+ }
155+
139 function test_json() {
156 function test_json() {
140 headerjson = origHeaderjson;
157 headerjson = origHeaderjson;
141 previewHeader.widgetData = headerjson;
158 previewHeader.widgetData = headerjson;
tests/qmltests/Dash/Previews/tst_PreviewSharing.qml+17−3
@@ -28,13 +28,18 @@ Rectangle {
28
28
29 property var shareData: {
29 property var shareData: {
30 "uri": [
30 "uri": [
31− "Text here",
31+ "file:///this/is/an/url",
32− "text here 2",
32+ "file:///this/is/an/url/2",
33− "text here 3"
33+ "file:///this/is/an/url/3"
34 ],
34 ],
35 "content-type": "text"
35 "content-type": "text"
36 }
36 }
37
37
38+ property var shareDataString: {
39+ "uri": "file:///this/is/an/url",
40+ "content-type": "text"
41+ }
42+
38 PreviewSharing {
43 PreviewSharing {
39 id: previewSharing
44 id: previewSharing
40 anchors { left: parent.left; bottom: parent.bottom; }
45 anchors { left: parent.left; bottom: parent.bottom; }
@@ -55,5 +60,14 @@ Rectangle {
55 mouseClick(previewSharing);
60 mouseClick(previewSharing);
56 compare(peerPicker.visible, true);
61 compare(peerPicker.visible, true);
57 }
62 }
63+
64+ function test_createExportedItems() {
65+ var exportedItems = previewSharing.createExportedItems(shareData["uri"]);
66+ for (var i = 0; i < exportedItems.length; i++) {
67+ compare(exportedItems[i].url, shareData["uri"][i]);
68+ }
69+ exportedItems = previewSharing.createExportedItems(shareDataString["uri"]);
70+ compare(exportedItems[0].url, shareDataString["uri"]);
71+ }
58 }
72 }
59}
73}
tests/qmltests/Dash/tst_CardTool.qml+4−4
@@ -339,22 +339,22 @@ Rectangle {
339 function test_card_title_alignment(data) {
339 function test_card_title_alignment(data) {
340 selector.selectedIndex = data.index;
340 selector.selectedIndex = data.index;
341
341
342− tryCompare(cardTool, "titleAlignment", Text.AlignLeft);
342+ tryCompareFunction(function() { return findChild(internalCard, "titleLabel").horizontalAlignment == Text.AlignLeft; }, true);
343
343
344 cardTool.components['title'] = { "field": "title", "align": "center" };
344 cardTool.components['title'] = { "field": "title", "align": "center" };
345 cardTool.componentsChanged();
345 cardTool.componentsChanged();
346
346
347− tryCompare(cardTool, "titleAlignment", data.value);
347+ tryCompareFunction(function() { return findChild(internalCard, "titleLabel").horizontalAlignment == data.value; }, true);
348
348
349 cardTool.components['title'] = { "field": "title" };
349 cardTool.components['title'] = { "field": "title" };
350 cardTool.componentsChanged();
350 cardTool.componentsChanged();
351
351
352− tryCompare(cardTool, "titleAlignment", data.value);
352+ tryCompareFunction(function() { return findChild(internalCard, "titleLabel").horizontalAlignment == data.value; }, true);
353
353
354 cardTool.components['title'] = { "field": "title", "align": "left" };
354 cardTool.components['title'] = { "field": "title", "align": "left" };
355 cardTool.componentsChanged();
355 cardTool.componentsChanged();
356
356
357− tryCompare(cardTool, "titleAlignment", Text.AlignLeft);
357+ tryCompareFunction(function() { return findChild(internalCard, "titleLabel").horizontalAlignment == Text.AlignLeft; }, true);
358 }
358 }
359
359
360 function test_categoryLayout_data() {
360 function test_categoryLayout_data() {
tests/qmltests/Dash/tst_Dash.qml+89
@@ -70,6 +70,42 @@ Item {
70 waitForRendering(findChild(dash, "scopeLoader0").item);
70 waitForRendering(findChild(dash, "scopeLoader0").item);
71 }
71 }
72
72
73+ function scrollToCategory(categoryName) {
74+ var dashContentList = findChild(dash, "dashContentList");
75+ var genericScopeView = dashContentList.currentItem;
76+ var categoryListView = findChild(genericScopeView, "categoryListView");
77+ tryCompareFunction(function() {
78+ var category = findChild(genericScopeView, categoryName);
79+ if (category && category.y > 0 && category.y < genericScopeView.height) return true;
80+ touchFlick(genericScopeView, genericScopeView.width/2, units.gu(20),
81+ genericScopeView.width/2, genericScopeView.y)
82+ tryCompare(categoryListView, "moving", false);
83+ return false;
84+ }, true);
85+
86+ tryCompareFunction(function() { return findChild(genericScopeView, "delegate0") !== null; }, true);
87+ return findChild(genericScopeView, categoryName);
88+ }
89+
90+ function clickCategoryDelegate(category, delegate) {
91+ var dashContentList = findChild(dash, "dashContentList");
92+ var genericScopeView = dashContentList.currentItem;
93+ if (category === undefined) category = 0;
94+ if (delegate === undefined) delegate = 0;
95+ tryCompareFunction(function() {
96+ var cardGrid = findChild(genericScopeView, "dashCategory"+category);
97+ if (cardGrid != null) {
98+ var tile = findChild(cardGrid, "delegate"+delegate);
99+ return tile != null;
100+ }
101+ return false;
102+ },
103+ true);
104+ var tile = findChild(findChild(genericScopeView, "dashCategory"+category), "delegate"+delegate);
105+ waitForRendering(tile);
106+ mouseClick(tile);
107+ }
108+
73 function test_manage_dash_clickscope_unfavoritable() {
109 function test_manage_dash_clickscope_unfavoritable() {
74 // Show the manage dash
110 // Show the manage dash
75 touchFlick(dash, dash.width / 2, dash.height - 1, dash.width / 2, units.gu(2));
111 touchFlick(dash, dash.width / 2, dash.height - 1, dash.width / 2, units.gu(2));
@@ -565,5 +601,58 @@ Item {
565 tryCompare(dashTempScopeItem, "x", dashTempScopeItem.width);
601 tryCompare(dashTempScopeItem, "x", dashTempScopeItem.width);
566 tryCompare(dashTempScopeItem, "visible", false);
602 tryCompare(dashTempScopeItem, "visible", false);
567 }
603 }
604+
605+ function test_openScope()
606+ {
607+ scrollToCategory("dashCategory2");
608+ clickCategoryDelegate(2, 2);
609+
610+ var dashTempScopeItem = findChild(dash, "dashTempScopeItem");
611+ tryCompare(dashTempScopeItem, "x", 0);
612+ tryCompare(dashTempScopeItem, "visible", true);
613+ tryCompare(dashContent, "x", -dash.width);
614+
615+ // Go back
616+ var dashTempScopeItemHeader = findChild(dashTempScopeItem, "scopePageHeader");
617+ var backButton = findChild(findChild(dashTempScopeItemHeader, "innerPageHeader"), "customBackButton");
618+ mouseClick(backButton);
619+
620+ // Check temp scope is gone
621+ tryCompare(dashTempScopeItem, "x", dash.width);
622+ tryCompare(dashTempScopeItem, "visible", false);
623+ tryCompare(dashContent, "x", 0);
624+ }
625+
626+ function test_tempScopeItemXOnResize()
627+ {
628+ // Go to a temp scope
629+ touchFlick(dash, dash.width / 2, dash.height - 1, dash.width / 2, units.gu(2));
630+ var bottomEdgeController = findInvisibleChild(dash, "bottomEdgeController");
631+ tryCompare(bottomEdgeController, "progress", 1);
632+ var nonfavScopesListCategory = findChild(dash, "scopesListCategoryother");
633+ var nonfavScopesListCategoryList = findChild(nonfavScopesListCategory, "scopesListCategoryInnerList");
634+ tryCompare(nonfavScopesListCategoryList, "currentIndex", 0);
635+ mouseClick(nonfavScopesListCategoryList.currentItem);
636+ var dashTempScopeItem = findChild(dash, "dashTempScopeItem");
637+ tryCompare(dashTempScopeItem, "x", 0);
638+ tryCompare(dashTempScopeItem, "visible", true);
639+
640+ shell.width = units.gu(80);
641+ tryCompare(dashTempScopeItem, "x", 0);
642+ tryCompare(dashContent, "x", -dash.width);
643+
644+ shell.width = units.gu(40);
645+ tryCompare(dashTempScopeItem, "x", 0);
646+
647+ // Go back
648+ var dashTempScopeItemHeader = findChild(dashTempScopeItem, "scopePageHeader");
649+ var backButton = findChild(findChild(dashTempScopeItemHeader, "innerPageHeader"), "customBackButton");
650+ mouseClick(backButton);
651+
652+ // Check temp scope is gone
653+ tryCompare(dashTempScopeItem, "x", dash.width);
654+ tryCompare(dashTempScopeItem, "visible", false);
655+ tryCompare(dashContent, "x", 0);
656+ }
568 }
657 }
569}
658}
tests/qmltests/Greeter/tst_NarrowView.qml+9
@@ -518,5 +518,14 @@ Item {
518 tryCompare(coverPage, "shown", false);
518 tryCompare(coverPage, "shown", false);
519 tryCompare(coverPage, "showProgress", 0);
519 tryCompare(coverPage, "showProgress", 0);
520 }
520 }
521+
522+ // Make sure that if user has a mouse, they can still get rid of cover page
523+ function test_mouseClickHidesCoverPage() {
524+ var coverPage = findChild(view, "coverPage");
525+
526+ verify(coverPage.shown);
527+ mouseClick(coverPage, coverPage.width/2, coverPage.height - units.gu(2));
528+ verify(!coverPage.shown);
529+ }
521 }
530 }
522}
531}
tests/qmltests/Launcher/tst_Launcher.qml+254−18
@@ -28,12 +28,13 @@ import Utils 0.1 // For EdgeBarrierSettings
28 launcher. */
28 launcher. */
29Item {
29Item {
30 id: root
30 id: root
31− width: units.gu(50)
31+ width: units.gu(140)
32− height: units.gu(55)
32+ height: units.gu(70)
33
33
34 Loader {
34 Loader {
35 id: launcherLoader
35 id: launcherLoader
36 anchors.fill: parent
36 anchors.fill: parent
37+ focus: true
37 property bool itemDestroyed: false
38 property bool itemDestroyed: false
38 sourceComponent: Component {
39 sourceComponent: Component {
39 Launcher {
40 Launcher {
@@ -68,6 +69,7 @@ Item {
68
69
69 Component.onCompleted: {
70 Component.onCompleted: {
70 launcherLoader.itemDestroyed = false;
71 launcherLoader.itemDestroyed = false;
72+ launcherLoader.focus = true
71 edgeBarrierControls.target = testCase.findChild(this, "edgeBarrierController");
73 edgeBarrierControls.target = testCase.findChild(this, "edgeBarrierController");
72 }
74 }
73 Component.onDestruction: {
75 Component.onDestruction: {
@@ -77,11 +79,40 @@ Item {
77 }
79 }
78 }
80 }
79
81
82+ Binding {
83+ target: launcherLoader.item
84+ property: "lockedVisible"
85+ value: lockedVisibleCheckBox.checked
86+ }
87+ Binding {
88+ target: launcherLoader.item
89+ property: "panelWidth"
90+ value: units.gu(Math.round(widthSlider.value))
91+ }
92+
80 ColumnLayout {
93 ColumnLayout {
81 anchors { bottom: parent.bottom; right: parent.right; margins: units.gu(1) }
94 anchors { bottom: parent.bottom; right: parent.right; margins: units.gu(1) }
82 spacing: units.gu(1)
95 spacing: units.gu(1)
83 width: childrenRect.width
96 width: childrenRect.width
84
97
98+ RowLayout {
99+ CheckBox {
100+ id: lockedVisibleCheckBox
101+ checked: false
102+ }
103+ Label {
104+ text: "Launcher always visible"
105+ }
106+ }
107+
108+ Slider {
109+ id: widthSlider
110+ Layout.fillWidth: true
111+ minimumValue: 6
112+ maximumValue: 12
113+ value: 10
114+ }
115+
85 MouseTouchEmulationCheckbox {}
116 MouseTouchEmulationCheckbox {}
86
117
87 EdgeBarrierControls {
118 EdgeBarrierControls {
@@ -102,6 +133,15 @@ Item {
102 Layout.fillWidth: true
133 Layout.fillWidth: true
103 }
134 }
104
135
136+ Button {
137+ text: "open for kbd navigation"
138+ onClicked: {
139+ launcherLoader.item.openForKeyboardNavigation()
140+ launcherLoader.item.forceActiveFocus();// = true
141+ }
142+ Layout.fillWidth: true
143+ }
144+
105 Row {
145 Row {
106 spacing: units.gu(1)
146 spacing: units.gu(1)
107
147
@@ -206,10 +246,6 @@ Item {
206 // growing while populating it with icons etc.
246 // growing while populating it with icons etc.
207 tryCompare(listView, "flicking", false);
247 tryCompare(listView, "flicking", false);
208
248
209− // Make sure noone changed the height of the window. The issue this test case
210− // is verifying only happens on certain heights of the Launcher
211− compare(root.height, units.gu(55));
212−
213 compare(listView.contentY, -listView.topMargin, "Launcher did not start up with first item unfolded");
249 compare(listView.contentY, -listView.topMargin, "Launcher did not start up with first item unfolded");
214
250
215 // Now do check that snapping is in fact enabled
251 // Now do check that snapping is in fact enabled
@@ -266,13 +302,39 @@ Item {
266
302
267 function positionLauncherListAtBeginning() {
303 function positionLauncherListAtBeginning() {
268 var listView = testCase.findChild(launcherLoader.item, "launcherListView");
304 var listView = testCase.findChild(launcherLoader.item, "launcherListView");
269− listView.contentY = -listView.topMargin;
305+ var moveAnimation = findInvisibleChild(listView, "moveAnimation")
306+
307+ listView.moveToIndex(0);
308+
309+ waitForRendering(listView);
310+ tryCompare(moveAnimation, "running", false);
270 }
311 }
271 function positionLauncherListAtEnd() {
312 function positionLauncherListAtEnd() {
272 var listView = testCase.findChild(launcherLoader.item, "launcherListView");
313 var listView = testCase.findChild(launcherLoader.item, "launcherListView");
273− if ((listView.contentHeight + listView.topMargin + listView.bottomMargin) > listView.height) {
314+ var moveAnimation = findInvisibleChild(listView, "moveAnimation")
274− listView.contentY = listView.topMargin + listView.contentHeight
315+
275− - listView.height;
316+ listView.moveToIndex(listView.count -1);
317+
318+ waitForRendering(listView);
319+ tryCompare(moveAnimation, "running", false);
320+ }
321+
322+ function assertFocusOnIndex(index) {
323+ var launcherPanel = findChild(launcher, "launcherPanel");
324+ var launcherListView = findChild(launcher, "launcherListView");
325+ var bfbFocusHighlight = findChild(launcher, "bfbFocusHighlight");
326+
327+ waitForRendering(launcher);
328+ tryCompare(launcherPanel, "highlightIndex", index);
329+ compare(bfbFocusHighlight.visible, index === -1);
330+ for (var i = 0; i < launcherListView.count; i++) {
331+ var item = findChild(launcher, "launcherDelegate" + i);
332+ // Delegates might be destroyed when not visible. We can't check if they paint a focus highlight.
333+ // Make sure the requested index does have focus. for the others, try best effort to check if they don't
334+ if (index === i || item) {
335+ var focusRing = findChild(item, "focusRing")
336+ tryCompare(focusRing, "visible", index === i);
337+ }
276 }
338 }
277 }
339 }
278
340
@@ -290,10 +352,10 @@ Item {
290 dragLauncherIntoView()
352 dragLauncherIntoView()
291
353
292 // tapping on the center of the screen should dismiss the launcher
354 // tapping on the center of the screen should dismiss the launcher
293− mouseClick(launcher)
355+ mouseClick(launcher, panel.width + units.gu(5), launcher.height / 2)
294
356
295 // should eventually get fully retracted (hidden)
357 // should eventually get fully retracted (hidden)
296− tryCompare(panel, "x", -launcher.panelWidth, 1000)
358+ tryCompare(panel, "x", -launcher.panelWidth, 2000)
297 }
359 }
298
360
299 /* If I click on the icon of an application on the launcher
361 /* If I click on the icon of an application on the launcher
@@ -377,6 +439,7 @@ Item {
377 wait(100)
439 wait(100)
378 compare(launcher.maxPanelX, -launcher.panelWidth, "Launcher moved even if it shouldn't")
440 compare(launcher.maxPanelX, -launcher.panelWidth, "Launcher moved even if it shouldn't")
379 }
441 }
442+
380 waitUntilLauncherDisappears();
443 waitUntilLauncherDisappears();
381 launcher.available = true;
444 launcher.available = true;
382 }
445 }
@@ -400,6 +463,8 @@ Item {
400 dragLauncherIntoView();
463 dragLauncherIntoView();
401 var launcherListView = findChild(launcher, "launcherListView");
464 var launcherListView = findChild(launcher, "launcherListView");
402 for (var i = 0; i < launcherListView.count; ++i) {
465 for (var i = 0; i < launcherListView.count; ++i) {
466+ launcherListView.moveToIndex(i);
467+ waitForRendering(launcherListView);
403 var delegate = findChild(launcherListView, "launcherDelegate" + i)
468 var delegate = findChild(launcherListView, "launcherDelegate" + i)
404 compare(findChild(delegate, "countEmblem").visible, LauncherModel.get(i).countVisible)
469 compare(findChild(delegate, "countEmblem").visible, LauncherModel.get(i).countVisible)
405 // Intentionally allow type coercion (string/number)
470 // Intentionally allow type coercion (string/number)
@@ -421,7 +486,7 @@ Item {
421 var launcherListView = findChild(launcher, "launcherListView");
486 var launcherListView = findChild(launcher, "launcherListView");
422 for (var i = 0; i < launcherListView.count; ++i) {
487 for (var i = 0; i < launcherListView.count; ++i) {
423 var delegate = findChild(launcherListView, "launcherDelegate" + i)
488 var delegate = findChild(launcherListView, "launcherDelegate" + i)
424− compare(findChild(delegate, "runningHighlight").visible, LauncherModel.get(i).running)
489+ compare(findChild(delegate, "runningHighlight0").visible, LauncherModel.get(i).running)
425 }
490 }
426 }
491 }
427
492
@@ -460,6 +525,7 @@ Item {
460 launcher.lastSelectedApplication = "";
525 launcher.lastSelectedApplication = "";
461 dragLauncherIntoView();
526 dragLauncherIntoView();
462 var listView = findChild(launcher, "launcherListView");
527 var listView = findChild(launcher, "launcherListView");
528+ var moveAnimation = findInvisibleChild(listView, "moveAnimation")
463
529
464 // flicking is unreliable. sometimes it works, sometimes the
530 // flicking is unreliable. sometimes it works, sometimes the
465 // list view moves just a tiny bit or not at all, making tests fail.
531 // list view moves just a tiny bit or not at all, making tests fail.
@@ -470,12 +536,14 @@ Item {
470 } else {
536 } else {
471 positionLauncherListAtEnd();
537 positionLauncherListAtEnd();
472 }
538 }
473− tryCompare(listView, "flicking", false);
474−
475 var oldY = listView.contentY;
539 var oldY = listView.contentY;
476
540
477 mouseClick(listView, listView.width / 2, data.clickY);
541 mouseClick(listView, listView.width / 2, data.clickY);
542+
543+ if (data.expectFlick) {
544+ tryCompare(moveAnimation, "running", true);
545+ }
478− tryCompare(listView, "flicking", false);
546+ tryCompare(moveAnimation, "running", false);
479
547
480 if (data.expectFlick) {
548 if (data.expectFlick) {
481 verify(listView.contentY != oldY);
549 verify(listView.contentY != oldY);
@@ -764,14 +832,15 @@ Item {
764 function test_launcher_dismiss() {
832 function test_launcher_dismiss() {
765 dragLauncherIntoView();
833 dragLauncherIntoView();
766 verify(launcher.state == "visible");
834 verify(launcher.state == "visible");
835+
767− mouseClick(root);
836+ mouseClick(root, root.width / 2, units.gu(1));
768 waitUntilLauncherDisappears();
837 waitUntilLauncherDisappears();
769 verify(launcher.state == "");
838 verify(launcher.state == "");
770
839
771 // and repeat, as a test for regression in lpbug#1531339
840 // and repeat, as a test for regression in lpbug#1531339
772 dragLauncherIntoView();
841 dragLauncherIntoView();
773 verify(launcher.state == "visible");
842 verify(launcher.state == "visible");
774− mouseClick(root);
843+ mouseClick(root, root.width / 2, units.gu(1));
775 waitUntilLauncherDisappears();
844 waitUntilLauncherDisappears();
776 verify(launcher.state == "");
845 verify(launcher.state == "");
777 }
846 }
@@ -1044,5 +1113,172 @@ Item {
1044 LauncherModel.setCountVisible(LauncherModel.get(1).appId, 0)
1113 LauncherModel.setCountVisible(LauncherModel.get(1).appId, 0)
1045 LauncherModel.setCount(LauncherModel.get(1).appId, oldCount)
1114 LauncherModel.setCount(LauncherModel.get(1).appId, oldCount)
1046 }
1115 }
1116+
1117+ function test_longpressSuperKeyShowsHints() {
1118+ var shortCutHint0 = findChild(findChild(launcher, "launcherDelegate0"), "shortcutHint");
1119+
1120+ tryCompare(shortCutHint0, "visible", false);
1121+
1122+ launcher.superPressed = true;
1123+ tryCompare(launcher, "state", "visible");
1124+ tryCompare(shortCutHint0, "visible", true);
1125+
1126+ launcher.superPressed = false;
1127+ tryCompare(launcher, "state", "");
1128+ tryCompare(shortCutHint0, "visible", false);
1129+ }
1130+
1131+ function test_keyboardNavigation() {
1132+ var bfbFocusHighlight = findChild(launcher, "bfbFocusHighlight");
1133+ var quickList = findChild(launcher, "quickList");
1134+ var launcherPanel = findChild(launcher, "launcherPanel");
1135+ var launcherListView = findChild(launcher, "launcherListView");
1136+ var last = launcherListView.count - 1;
1137+
1138+ compare(bfbFocusHighlight.visible, false);
1139+ launcher.openForKeyboardNavigation();
1140+ tryCompare(launcherPanel, "x", 0);
1141+ waitForRendering(launcher);
1142+
1143+ assertFocusOnIndex(-1);
1144+
1145+ // Down should go down
1146+ keyClick(Qt.Key_Down);
1147+ assertFocusOnIndex(0);
1148+
1149+ // Tab should go down
1150+ keyClick(Qt.Key_Tab);
1151+ assertFocusOnIndex(1);
1152+
1153+ // Up should go up
1154+ keyClick(Qt.Key_Up);
1155+ assertFocusOnIndex(0);
1156+
1157+ // Backtab should go up
1158+ keyClick(Qt.Key_Backtab);
1159+ assertFocusOnIndex(-1); // BFB
1160+
1161+ // The list should wrap around
1162+ keyClick(Qt.Key_Up);
1163+ waitForRendering(launcher);
1164+ assertFocusOnIndex(last);
1165+
1166+ keyClick(Qt.Key_Down);
1167+ waitForRendering(launcher);
1168+ keyClick(Qt.Key_Down);
1169+ assertFocusOnIndex(0); // Back to Top
1170+
1171+ // Right opens the quicklist
1172+ keyClick(Qt.Key_Right);
1173+ assertFocusOnIndex(0); // Navigating the quicklist... the launcher focus should not move
1174+ tryCompare(quickList, "visible", true);
1175+ tryCompare(quickList, "selectedIndex", 0)
1176+
1177+ // Down should move down the quicklist
1178+ keyClick(Qt.Key_Down);
1179+ tryCompare(quickList, "selectedIndex", 1)
1180+
1181+ // The quicklist should wrap around too
1182+ keyClick(Qt.Key_Down);
1183+ keyClick(Qt.Key_Down);
1184+ keyClick(Qt.Key_Down);
1185+ tryCompare(quickList, "selectedIndex", 0)
1186+
1187+ // Left gets us back to the launcher
1188+ keyClick(Qt.Key_Left);
1189+ assertFocusOnIndex(0);
1190+ tryCompare(quickList, "visible", false);
1191+
1192+ // Launcher navigation should still work
1193+ // Go bar to top by wrapping around
1194+ keyClick(Qt.Key_Down);
1195+ assertFocusOnIndex(1);
1196+
1197+ keyClick(Qt.Key_Enter);
1198+ assertFocusOnIndex(-2);
1199+ }
1200+
1201+ function test_selectQuicklistItemByKeyboard() {
1202+ launcher.openForKeyboardNavigation();
1203+ waitForRendering(launcher);
1204+
1205+ signalSpy.clear();
1206+ signalSpy.signalName = "quickListTriggered"
1207+
1208+ keyClick(Qt.Key_Down); // Down to launcher item 0
1209+ keyClick(Qt.Key_Down); // Down to launcher item 1
1210+ keyClick(Qt.Key_Right); // Into quicklist
1211+ keyClick(Qt.Key_Down); // Down to quicklist item 1
1212+ keyClick(Qt.Key_Down); // Down to quicklist item 2
1213+ keyClick(Qt.Key_Enter); // Trigger it
1214+
1215+ compare(signalSpy.count, 1, "Quicklist signal wasn't triggered")
1216+ compare(signalSpy.signalArguments[0][0], LauncherModel.get(1).appId)
1217+ compare(signalSpy.signalArguments[0][1], 2)
1218+ assertFocusOnIndex(-2);
1219+ }
1220+
1221+ function test_hideNotWorkingWhenLockedOut_data() {
1222+ return [
1223+ {tag: "locked visible", locked: true},
1224+ {tag: "no locked visible", locked: false},
1225+ ]
1226+ }
1227+
1228+ function test_hideNotWorkingWhenLockedOut(data) {
1229+ launcher.lockedVisible = data.locked;
1230+ if (data.locked) {
1231+ tryCompare(launcher, "state", "visible");
1232+ } else {
1233+ tryCompare(launcher, "state", "");
1234+ }
1235+
1236+ launcher.hide();
1237+ waitForRendering(launcher);
1238+ if (data.locked) {
1239+ verify(launcher.state == "visible");
1240+ } else {
1241+ verify(launcher.state == "");
1242+ }
1243+ }
1244+
1245+ function test_cancelKbdNavigationWitMouse_data() {
1246+ return [
1247+ {tag: "locked out - no quicklist", autohide: false, withQuickList: false },
1248+ {tag: "locked out - with quicklist", autohide: false, withQuickList: true },
1249+ {tag: "autohide - no quicklist", autohide: true, withQuickList: false },
1250+ {tag: "autohide - with quicklist", autohide: true, withQuickList: true },
1251+ ]
1252+ }
1253+
1254+ function test_cancelKbdNavigationWitMouse(data) {
1255+ launcher.autohideEnabled = data.autohide;
1256+ launcher.openForKeyboardNavigation();
1257+ waitForRendering(launcher);
1258+
1259+ var launcherPanel = findChild(launcher, "launcherPanel");
1260+ tryCompare(launcherPanel, "x", 0);
1261+
1262+ var quickList = findChild(launcher, "quickList");
1263+
1264+ keyClick(Qt.Key_Down); // Down to launcher item 0
1265+ keyClick(Qt.Key_Down); // Down to launcher item 1
1266+
1267+ if (data.withQuickList) {
1268+ keyClick(Qt.Key_Right); // Into quicklist
1269+ tryCompare(quickList, "visible", true)
1270+ }
1271+ waitForRendering(launcher)
1272+
1273+ mouseClick(root);
1274+
1275+ if (data.autohide) {
1276+ tryCompare(launcher, "state", "");
1277+ } else {
1278+ tryCompare(launcher, "state", "visible");
1279+ }
1280+
1281+ assertFocusOnIndex(-2);
1282+ }
1047 }
1283 }
1048}
1284}
tests/qmltests/Notifications/tst_OptionToggle.qml+1−1
@@ -225,7 +225,7 @@ Row {
225 }
225 }
226
226
227 // test input does not fall through
227 // test input does not fall through
228− mouseClick(notification)
228+ mouseClick(notification, units.gu(2), units.gu(2))
229 if(data.type == Notification.Interactive) {
229 if(data.type == Notification.Interactive) {
230 actionSpy.wait()
230 actionSpy.wait()
231 compare(actionSpy.signalArguments[0][0], data.actions[0]["id"], "got wrong id for interactive action")
231 compare(actionSpy.signalArguments[0][0], data.actions[0]["id"], "got wrong id for interactive action")
tests/qmltests/Notifications/tst_VisualSnapDecisionsQueue.qml+1
@@ -226,6 +226,7 @@ Row {
226
226
227 // remove top-most and verify one of the remaining ones is still getting expanded
227 // remove top-most and verify one of the remaining ones is still getting expanded
228
228
229+ waitForRendering(notifications);
229 // make first snap-decision expand
230 // make first snap-decision expand
230 mouseClick(snap_decision[0]);
231 mouseClick(snap_decision[0]);
231
232
tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+2−4
@@ -274,15 +274,14 @@ Item {
274
274
275 function test_create_progressMenu_data() {
275 function test_create_progressMenu_data() {
276 return [
276 return [
277− {label: "testLabel1", enabled: true, value: 10 },
277+ {label: "testLabel1", value: 10 },
278− {label: "testLabel2", enabled: false, value: 55 },
278+ {label: "testLabel2", value: 55 },
279 ];
279 ];
280 }
280 }
281
281
282 function test_create_progressMenu(data) {
282 function test_create_progressMenu(data) {
283 menuData.type = "com.canonical.indicator.progress"
283 menuData.type = "com.canonical.indicator.progress"
284 menuData.label = data.label;
284 menuData.label = data.label;
285− menuData.sensitive = data.enabled;
286 menuData.actionState = data.value;
285 menuData.actionState = data.value;
287
286
288 loader.data = menuData;
287 loader.data = menuData;
@@ -292,7 +291,6 @@ Item {
292
291
293 compare(loader.item.text, data.label, "Label does not match data");
292 compare(loader.item.text, data.label, "Label does not match data");
294 compare(loader.item.value, data.value, "Value does not match data");
293 compare(loader.item.value, data.value, "Value does not match data");
295− compare(loader.item.enabled, data.enabled, "Enabled does not match data");
296 }
294 }
297
295
298 function test_create_standardMenu_data() {
296 function test_create_standardMenu_data() {
tests/qmltests/Panel/tst_IndicatorItem.qml+16−14
@@ -24,7 +24,9 @@ import "../../../qml/Panel"
24Rectangle {
24Rectangle {
25 width: units.gu(80)
25 width: units.gu(80)
26 height: units.gu(30)
26 height: units.gu(30)
27− color: "white"
27+ color: theme.palette.normal.background
28+
29+ Component.onCompleted: theme.name = "Ubuntu.Components.Themes.SuruDark"
28
30
29 RowLayout {
31 RowLayout {
30 anchors.fill: parent
32 anchors.fill: parent
@@ -37,7 +39,7 @@ Rectangle {
37 Layout.fillHeight: true
39 Layout.fillHeight: true
38
40
39 Rectangle {
41 Rectangle {
40− color: "black"
42+ color: theme.palette.normal.background
41 anchors.fill: indicatorItem
43 anchors.fill: indicatorItem
42 }
44 }
43
45
@@ -181,25 +183,25 @@ Rectangle {
181 }
183 }
182
184
183 function test_select() {
185 function test_select() {
184− tryCompare(findChild(indicatorItem, "icon0"), "color", "#ffffff");
186+ tryCompare(findChild(indicatorItem, "icon0"), "color", theme.palette.normal.backgroundText);
185 tryCompare(findChild(indicatorItem, "icon0"), "opacity", 1.0);
187 tryCompare(findChild(indicatorItem, "icon0"), "opacity", 1.0);
186− tryCompare(findChild(indicatorItem, "leftLabel"), "color", "#ffffff");
188+ tryCompare(findChild(indicatorItem, "leftLabel"), "color", theme.palette.normal.backgroundText);
187− tryCompare(findChild(indicatorItem, "rightLabel"), "color", "#ffffff");
189+ tryCompare(findChild(indicatorItem, "rightLabel"), "color", theme.palette.normal.backgroundText);
188− tryCompare(findChild(indicatorItem, "indicatorName"), "color", "#ffffff");
190+ tryCompare(findChild(indicatorItem, "indicatorName"), "color", theme.palette.normal.backgroundText);
189
191
190 indicatorItem.expanded = true;
192 indicatorItem.expanded = true;
191− tryCompare(findChild(indicatorItem, "icon0"), "color", "#888888");
193+ tryCompare(findChild(indicatorItem, "icon0"), "color", theme.palette.disabled.backgroundText);
192 tryCompare(findChild(indicatorItem, "icon0"), "opacity", 0.6);
194 tryCompare(findChild(indicatorItem, "icon0"), "opacity", 0.6);
193− tryCompare(findChild(indicatorItem, "leftLabel"), "color", "#888888");
195+ tryCompare(findChild(indicatorItem, "leftLabel"), "color", theme.palette.disabled.backgroundText);
194− tryCompare(findChild(indicatorItem, "rightLabel"), "color", "#888888");
196+ tryCompare(findChild(indicatorItem, "rightLabel"), "color", theme.palette.disabled.backgroundText);
195− tryCompare(findChild(indicatorItem, "indicatorName"), "color", "#888888");
197+ tryCompare(findChild(indicatorItem, "indicatorName"), "color", theme.palette.disabled.backgroundText);
196
198
197 indicatorItem.selected = true;
199 indicatorItem.selected = true;
198− tryCompare(findChild(indicatorItem, "icon0"), "color", "#ffffff");
200+ tryCompare(findChild(indicatorItem, "icon0"), "color", theme.palette.normal.backgroundText);
199 tryCompare(findChild(indicatorItem, "icon0"), "opacity", 1.0);
201 tryCompare(findChild(indicatorItem, "icon0"), "opacity", 1.0);
200− tryCompare(findChild(indicatorItem, "leftLabel"), "color", "#ffffff");
202+ tryCompare(findChild(indicatorItem, "leftLabel"), "color", theme.palette.normal.backgroundText);
201− tryCompare(findChild(indicatorItem, "rightLabel"), "color", "#ffffff");
203+ tryCompare(findChild(indicatorItem, "rightLabel"), "color", theme.palette.normal.backgroundText);
202− tryCompare(findChild(indicatorItem, "indicatorName"), "color", "#ffffff");
204+ tryCompare(findChild(indicatorItem, "indicatorName"), "color", theme.palette.normal.backgroundText);
203 }
205 }
204 }
206 }
205}
207}
tests/qmltests/Panel/tst_Panel.qml+2
@@ -31,6 +31,8 @@ IndicatorTest {
31 height: units.gu(71)
31 height: units.gu(71)
32 color: "white"
32 color: "white"
33
33
34+ Component.onCompleted: theme.name = "Ubuntu.Components.Themes.SuruDark"
35+
34 Binding {
36 Binding {
35 target: mouseEmulation
37 target: mouseEmulation
36 property: "checked"
38 property: "checked"
tests/qmltests/Stages/tst_DesktopStage.qml+2−1
@@ -65,8 +65,9 @@ Item {
65 property bool itemDestroyed: false
65 property bool itemDestroyed: false
66 sourceComponent: Component {
66 sourceComponent: Component {
67 DesktopStage {
67 DesktopStage {
68− color: "darkblue"
68+ color: "white"
69 anchors.fill: parent
69 anchors.fill: parent
70+ background: "../../../qml/graphics/tablet_background.jpg"
70
71
71 Component.onCompleted: {
72 Component.onCompleted: {
72 edgeBarrierControls.target = testCase.findChild(this, "edgeBarrierController");
73 edgeBarrierControls.target = testCase.findChild(this, "edgeBarrierController");
tests/qmltests/Stages/tst_PhoneStage.qml+19−6
@@ -40,12 +40,6 @@ Item {
40 orientations: Orientations {}
40 orientations: Orientations {}
41 }
41 }
42
42
43− Binding {
44− target: ApplicationManager
45− property: "rightMargin"
46− value: phoneStage.anchors.rightMargin
47− }
48−
49 Rectangle {
43 Rectangle {
50 anchors { fill: parent; leftMargin: phoneStage.width }
44 anchors { fill: parent; leftMargin: phoneStage.width }
51
45
@@ -77,6 +71,15 @@ Item {
77 ApplicationManager.get(appList.selectedAppIndex).setState(ApplicationInfoInterface.Stopped);
71 ApplicationManager.get(appList.selectedAppIndex).setState(ApplicationInfoInterface.Stopped);
78 }
72 }
79 }
73 }
74+ EdgeBarrierControls {
75+ id: edgeBarrierControls
76+ text: "Drag here to pull out spread"
77+ backgroundColor: "blue"
78+ onDragged: { phoneStage.pushRightEdge(amount); }
79+ Component.onCompleted: {
80+ edgeBarrierControls.target = testCase.findChild(phoneStage, "edgeBarrierController");
81+ }
82+ }
80 }
83 }
81 ListView {
84 ListView {
82 id: appList
85 id: appList
@@ -463,5 +466,15 @@ Item {
463
466
464 tryCompare(delegate.application, "requestedState", ApplicationInfoInterface.RequestedRunning);
467 tryCompare(delegate.application, "requestedState", ApplicationInfoInterface.RequestedRunning);
465 }
468 }
469+
470+ function test_mouseEdgePush() {
471+ var spreadView = findChild(phoneStage, "spreadView")
472+ addApps(1);
473+ mouseMove(phoneStage, phoneStage.width - 1, units.gu(10));
474+ for (var i = 0; i < units.gu(10); i++) {
475+ phoneStage.pushRightEdge(1);
476+ }
477+ tryCompare(spreadView, "phase", 2);
478+ }
466 }
479 }
467}
480}
tests/qmltests/Stages/tst_SpreadDelegate.qml+7
@@ -308,5 +308,12 @@ Rectangle {
308 tryCompare(closeAnimation, "running", false);
308 tryCompare(closeAnimation, "running", false);
309 }
309 }
310
310
311+ function test_showHighLight() {
312+ loadWithGalleryApp.clicked();
313+ var highlightRect = findChild(spreadDelegateLoader.item, "selectionHighlight")
314+ tryCompare(highlightRect, "visible", false)
315+ spreadDelegateLoader.item.highlightShown = true;
316+ tryCompare(highlightRect, "visible", true)
317+ }
311 }
318 }
312}
319}
tests/qmltests/Stages/tst_TabletStage.qml+19−1
@@ -21,6 +21,7 @@ import Ubuntu.Components.ListItems 1.3 as ListItem
21import Unity.Application 0.1
21import Unity.Application 0.1
22import Unity.Test 0.1
22import Unity.Test 0.1
23
23
24+import ".."
24import "../../../qml/Stages"
25import "../../../qml/Stages"
25import "../../../qml/Components"
26import "../../../qml/Components"
26
27
@@ -77,6 +78,15 @@ Rectangle {
77 Column {
78 Column {
78 anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
79 anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
79 spacing: units.gu(1)
80 spacing: units.gu(1)
81+ EdgeBarrierControls {
82+ id: edgeBarrierControls
83+ text: "Drag here to pull out spread"
84+ backgroundColor: "blue"
85+ onDragged: { tabletStageLoader.item.pushRightEdge(amount); }
86+ Component.onCompleted: {
87+ edgeBarrierControls.target = testCase.findChild(tabletStageLoader, "edgeBarrierController");
88+ }
89+ }
80 ApplicationCheckBox {
90 ApplicationCheckBox {
81 id: webbrowserCheckBox
91 id: webbrowserCheckBox
82 appId: "webbrowser-app"
92 appId: "webbrowser-app"
@@ -365,6 +375,14 @@ Rectangle {
365 tryCompare(webbrowserApp, "requestedState", ApplicationInfoInterface.RequestedRunning);
375 tryCompare(webbrowserApp, "requestedState", ApplicationInfoInterface.RequestedRunning);
366 tryCompare(dialerApp, "requestedState", ApplicationInfoInterface.RequestedRunning);
376 tryCompare(dialerApp, "requestedState", ApplicationInfoInterface.RequestedRunning);
367 }
377 }
368− }
369
378
379+ function test_mouseEdgePush() {
380+ var spreadView = findChild(tabletStageLoader, "spreadView")
381+ mouseMove(tabletStageLoader, tabletStageLoader.width - 1, units.gu(10));
382+ for (var i = 0; i < units.gu(10); i++) {
383+ tabletStageLoader.item.pushRightEdge(1);
384+ }
385+ tryCompare(spreadView, "phase", 2);
386+ }
387+ }
370}
388}
tests/qmltests/Wizard/tst_Wizard.qml+1−1
@@ -96,7 +96,7 @@ Item {
96 }
96 }
97
97
98 Component.onCompleted: {
98 Component.onCompleted: {
99− theme.name = "Ubuntu.Components.Themes.SuruGradient";
99+ theme.name = "Ubuntu.Components.Themes.SuruDark";
100 setup();
100 setup();
101 }
101 }
102
102
tests/qmltests/tst_DeviceConfiguration.qmlnew file+49
@@ -0,0 +1,49 @@
1+/*
2+ * Copyright (C) 2016 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.4
18+import QtTest 1.0
19+import Unity.Test 0.1
20+import "../../qml"
21+
22+Item {
23+ id: root
24+ width: units.gu(40)
25+ height: units.gu(70)
26+
27+ DeviceConfiguration {
28+ id: deviceConfiguration
29+ }
30+
31+ UnityTestCase {
32+ id: testCase
33+ name: "DeviceConfiguration"
34+ when: windowShown
35+
36+ function test_defaults() {
37+ deviceConfiguration.name = "nonexisting"
38+ compare(deviceConfiguration.primaryOrientation, -1)
39+ compare(deviceConfiguration.landscapeOrientation, Qt.LandscapeOrientation)
40+ compare(deviceConfiguration.portraitOrientation, Qt.PortraitOrientation)
41+ compare(deviceConfiguration.invertedLandscapeOrientation, Qt.InvertedLandscapeOrientation)
42+ compare(deviceConfiguration.invertedPortraitOrientation, Qt.InvertedPortraitOrientation)
43+ compare(deviceConfiguration.supportedOrientations, Qt.PortraitOrientation
44+ | Qt.InvertedPortraitOrientation
45+ | Qt.LandscapeOrientation
46+ | Qt.InvertedLandscapeOrientation)
47+ }
48+ }
49+}
tests/qmltests/tst_DisabledScreenNotice.qml+76−2
@@ -15,18 +15,62 @@
15 */
15 */
16
16
17import QtQuick 2.4
17import QtQuick 2.4
18+import QtQuick.Layouts 1.1
18import QtTest 1.0
19import QtTest 1.0
19import Unity.Test 0.1
20import Unity.Test 0.1
21+import Ubuntu.Components 1.3
22+import Ubuntu.Components.ListItems 1.3
20import "../../qml"
23import "../../qml"
21
24
22Item {
25Item {
23 id: root
26 id: root
24− width: units.gu(40)
27+ width: units.gu(80)
25 height: units.gu(70)
28 height: units.gu(70)
26
29
27 DisabledScreenNotice {
30 DisabledScreenNotice {
28 id: touchScreenPad
31 id: touchScreenPad
29 anchors.fill: parent
32 anchors.fill: parent
33+ anchors.rightMargin: units.gu(40)
34+
35+ screen: QtObject {
36+ property int orientation: {
37+ switch (orientationSelector.selectedIndex) {
38+ case 0:
39+ return Qt.PortraitOrientation;
40+ case 1:
41+ return Qt.LandscapeOrientation;
42+ case 2:
43+ return Qt.InvertedPortraitOrientation;
44+ case 3:
45+ return Qt.InvertedLandscapeOrientation;
46+ }
47+ }
48+ }
49+ orientationLock: QtObject {
50+ property bool enabled: orientationLockCheckBox.checked
51+ }
52+ }
53+
54+ Column {
55+ anchors.fill: parent
56+ anchors.leftMargin: units.gu(40)
57+
58+ ItemSelector {
59+ id: orientationSelector
60+ model: ["Portrait", "Landscape", "InvertedPortrait", "InvertedLandscape"]
61+ selectedIndex: 0
62+ }
63+
64+ RowLayout {
65+ CheckBox {
66+ id: orientationLockCheckBox
67+ checked: false
68+ }
69+ Label {
70+ text: "Rotation lock"
71+ Layout.fillWidth: true
72+ }
73+ }
30 }
74 }
31
75
32 UnityTestCase {
76 UnityTestCase {
@@ -36,10 +80,40 @@ Item {
36
80
37 function test_mouseAreaHidesOnFirstTap() {
81 function test_mouseAreaHidesOnFirstTap() {
38 var noticeArea = findChild(touchScreenPad, "infoNoticeArea")
82 var noticeArea = findChild(touchScreenPad, "infoNoticeArea")
39− print("noticeArea", noticeArea.visible)
40 compare(noticeArea.visible, true)
83 compare(noticeArea.visible, true)
41 tap(root)
84 tap(root)
42 tryCompare(noticeArea, "visible", false)
85 tryCompare(noticeArea, "visible", false)
43 }
86 }
87+
88+ function test_rotation_data() {
89+ return [
90+ {tag: "portrait", selectedOrientation: 0, expectedAngle: 0},
91+ {tag: "landscape", selectedOrientation: 1, expectedAngle: 270},
92+ {tag: "invertedportrait", selectedOrientation: 2, expectedAngle: 180},
93+ {tag: "invertetlandscape", selectedOrientation: 3, expectedAngle: 90}
94+ ];
95+ }
96+
97+ function test_rotation(data) {
98+ var content = findChild(touchScreenPad, "contentContainer");
99+
100+ var oldRotation = content.rotation;
101+
102+ // Turn on orientation lock
103+ orientationLockCheckBox.checked = true;
104+
105+ // simulate the rotation
106+ orientationSelector.selectedIndex = data.selectedOrientation;
107+
108+ // Make sure it is still in the old rotation (as we have the lock turned on)
109+ expectFail("", "Rotation lock set. Expecting automatic rotation to fail.");
110+ tryCompareFunction(function() { return content.rotation != oldRotation; }, true, 300);
111+
112+ // Now uncheck the rotation lock
113+ orientationLockCheckBox.checked = false;
114+
115+ // And make sure it catches up to the expected angle
116+ tryCompare(content, "rotation", data.expectedAngle);
117+ }
44 }
118 }
45}
119}
tests/qmltests/tst_OrientedShell.qml+71−5
@@ -47,6 +47,10 @@ Rectangle {
47 QtObject {
47 QtObject {
48 id: mockUnity8Settings
48 id: mockUnity8Settings
49 property string usageMode: usageModeSelector.model[usageModeSelector.selectedIndex]
49 property string usageMode: usageModeSelector.model[usageModeSelector.selectedIndex]
50+ onUsageModeChanged: {
51+print("usage mode changed", usageMode);
52+ usageModeSelector.selectedIndex = usageModeSelector.model.indexOf(usageMode)
53+ }
50 }
54 }
51
55
52 QtObject{
56 QtObject{
@@ -295,6 +299,10 @@ Rectangle {
295 function selectStaged() {selectedIndex = 0;}
299 function selectStaged() {selectedIndex = 0;}
296 function selectWindowed() {selectedIndex = 1;}
300 function selectWindowed() {selectedIndex = 1;}
297 function selectAutomatic() {selectedIndex = 2;}
301 function selectAutomatic() {selectedIndex = 2;}
302+ onSelectedIndexChanged: {
303+ print("usageModeSelector index changed", selectedIndex)
304+ mockUnity8Settings.usageMode = usageModeSelector.model[usageModeSelector.selectedIndex]
305+ }
298 }
306 }
299 MouseTouchEmulationCheckbox {
307 MouseTouchEmulationCheckbox {
300 checked: true
308 checked: true
@@ -314,7 +322,7 @@ Rectangle {
314 checked: false
322 checked: false
315 activeFocusOnPress: false
323 activeFocusOnPress: false
316 onCheckedChanged: {
324 onCheckedChanged: {
317− var surface = SurfaceManager.inputMethodSurface();
325+ var surface = SurfaceManager.inputMethodSurface;
318 if (checked) {
326 if (checked) {
319 surface.setState(Mir.RestoredState);
327 surface.setState(Mir.RestoredState);
320 } else {
328 } else {
@@ -1011,7 +1019,7 @@ Rectangle {
1011 { tag: "big screen, mouse", screenWidth: units.gu(200), mouse: true, kbd: false, expectedMode: "desktop", oskExpected: true },
1019 { tag: "big screen, mouse", screenWidth: units.gu(200), mouse: true, kbd: false, expectedMode: "desktop", oskExpected: true },
1012 { tag: "small screen, kbd", screenWidth: units.gu(50), mouse: false, kbd: true, expectedMode: "phone", oskExpected: false },
1020 { tag: "small screen, kbd", screenWidth: units.gu(50), mouse: false, kbd: true, expectedMode: "phone", oskExpected: false },
1013 { tag: "medium screen, kbd", screenWidth: units.gu(100), mouse: false, kbd: true, expectedMode: "phone", oskExpected: false },
1021 { tag: "medium screen, kbd", screenWidth: units.gu(100), mouse: false, kbd: true, expectedMode: "phone", oskExpected: false },
1014− { tag: "big screen, kbd", screenWidth: units.gu(200), mouse: false, kbd: true, expectedMode: "desktop", oskExpected: false },
1022+ { tag: "big screen, kbd", screenWidth: units.gu(200), mouse: false, kbd: true, expectedMode: "phone", oskExpected: false },
1015 { tag: "small screen, mouse & kbd", screenWidth: units.gu(50), mouse: true, kbd: true, expectedMode: "phone", oskExpected: false },
1023 { tag: "small screen, mouse & kbd", screenWidth: units.gu(50), mouse: true, kbd: true, expectedMode: "phone", oskExpected: false },
1016 { tag: "medium screen, mouse & kbd", screenWidth: units.gu(100), mouse: true, kbd: true, expectedMode: "desktop", oskExpected: false },
1024 { tag: "medium screen, mouse & kbd", screenWidth: units.gu(100), mouse: true, kbd: true, expectedMode: "desktop", oskExpected: false },
1017 { tag: "big screen, mouse & kbd", screenWidth: units.gu(200), mouse: true, kbd: true, expectedMode: "desktop", oskExpected: false },
1025 { tag: "big screen, mouse & kbd", screenWidth: units.gu(200), mouse: true, kbd: true, expectedMode: "desktop", oskExpected: false },
@@ -1019,9 +1027,6 @@ Rectangle {
1019 }
1027 }
1020
1028
1021 function test_attachRemoveInputDevices(data) {
1029 function test_attachRemoveInputDevices(data) {
1022− usageModeSelector.selectAutomatic();
1023− tryCompare(mockUnity8Settings, "usageMode", "Automatic")
1024−
1025 loadShell("mako")
1030 loadShell("mako")
1026 var shell = findChild(orientedShell, "shell");
1031 var shell = findChild(orientedShell, "shell");
1027 var inputMethod = findChild(shell, "inputMethod");
1032 var inputMethod = findChild(shell, "inputMethod");
@@ -1055,6 +1060,67 @@ Rectangle {
1055 orientedShellLoader.width = oldWidth;
1060 orientedShellLoader.width = oldWidth;
1056 }
1061 }
1057
1062
1063+ function test_overrideStaged() {
1064+ loadShell("mako")
1065+
1066+ // make sure we're big enough so that the automatism starts working
1067+ var oldWidth = orientedShellLoader.width;
1068+ orientedShellLoader.width = units.gu(100);
1069+
1070+ // start off by plugging a mouse, we should switch to windowed
1071+ MockInputDeviceBackend.addMockDevice("/mouse0", InputInfo.Mouse);
1072+ tryCompare(shell, "usageScenario", "desktop");
1073+
1074+ // Use the toggle to go back to Staged
1075+ usageModeSelector.selectStaged();
1076+ tryCompare(shell, "usageScenario", "phone");
1077+
1078+ // attach a second mouse, we should switch again
1079+ MockInputDeviceBackend.addMockDevice("/mouse1", InputInfo.Mouse);
1080+ tryCompare(shell, "usageScenario", "desktop");
1081+
1082+ // Remove one mouse again, stay in windowed as there is another
1083+ MockInputDeviceBackend.removeDevice("/mouse1");
1084+ tryCompare(shell, "usageScenario", "desktop");
1085+
1086+ // use the toggle again
1087+ usageModeSelector.selectStaged();
1088+ tryCompare(shell, "usageScenario", "phone");
1089+
1090+ // Remove the other mouse again, stay in staged
1091+ MockInputDeviceBackend.removeDevice("/mouse0");
1092+ tryCompare(shell, "usageScenario", "phone");
1093+
1094+ // Restore width
1095+ orientedShellLoader.width = oldWidth;
1096+ }
1097+
1098+ function test_overrideWindowed() {
1099+ loadShell("mako")
1100+
1101+ // make sure we're big enough so that the automatism starts working
1102+ var oldWidth = orientedShellLoader.width;
1103+ orientedShellLoader.width = units.gu(100);
1104+
1105+ // No mouse attached... we should be in staged
1106+ tryCompare(shell, "usageScenario", "phone");
1107+
1108+ // use the toggle to go to windowed
1109+ usageModeSelector.selectWindowed();
1110+ tryCompare(shell, "usageScenario", "desktop");
1111+
1112+ // Connect a mouse, stay in windowed
1113+ MockInputDeviceBackend.addMockDevice("/mouse0", InputInfo.Mouse);
1114+ tryCompare(shell, "usageScenario", "desktop");
1115+
1116+ // Remove the mouse again, we should go to staged
1117+ MockInputDeviceBackend.removeDevice("/mouse0");
1118+ tryCompare(shell, "usageScenario", "phone");
1119+
1120+ // Restore width
1121+ orientedShellLoader.width = oldWidth;
1122+ }
1123+
1058 /*
1124 /*
1059 Regression test for https://bugs.launchpad.net/ubuntu/+source/unity8/+bug/1471609
1125 Regression test for https://bugs.launchpad.net/ubuntu/+source/unity8/+bug/1471609
1060
1126
tests/qmltests/tst_Shell.qml+241−59
@@ -26,6 +26,7 @@ import Unity.Application 0.1
26import Unity.Connectivity 0.1
26import Unity.Connectivity 0.1
27import Unity.Indicators 0.1
27import Unity.Indicators 0.1
28import Unity.Notifications 1.0
28import Unity.Notifications 1.0
29+import Unity.Launcher 0.1
29import Unity.Test 0.1
30import Unity.Test 0.1
30import Powerd 0.1
31import Powerd 0.1
31import Wizard 0.1 as Wizard
32import Wizard 0.1 as Wizard
@@ -49,11 +50,6 @@ Rectangle {
49 shellLoader.active = true;
50 shellLoader.active = true;
50 }
51 }
51
52
52− MouseArea {
53− id: clickThroughCatcher
54− anchors.fill: shellContainer
55− }
56−
57 Item {
53 Item {
58 id: shellContainer
54 id: shellContainer
59 anchors.left: root.left
55 anchors.left: root.left
@@ -121,10 +117,6 @@ Rectangle {
121 Component.onDestruction: {
117 Component.onDestruction: {
122 shellLoader.itemDestroyed = true;
118 shellLoader.itemDestroyed = true;
123 }
119 }
124− Component.onCompleted: {
125− var keyMapper = testCase.findChild(__shell, "physicalKeysMapper");
126− keyMapper.controlInsteadOfAlt = true;
127− }
128 }
120 }
129 }
121 }
130 }
122 }
@@ -213,6 +205,31 @@ Rectangle {
213 checked: true
205 checked: true
214 color: "white"
206 color: "white"
215 }
207 }
208+ ListItem.ItemSelector {
209+ id: ctrlModifier
210+ anchors { left: parent.left; right: parent.right }
211+ activeFocusOnPress: false
212+ text: "Ctrl key as"
213+ model: ["Ctrl", "Alt", "Super"]
214+ onSelectedIndexChanged: {
215+ var keyMapper = testCase.findChild(shellContainer, "physicalKeysMapper");
216+ keyMapper.controlInsteadOfAlt = selectedIndex == 1;
217+ keyMapper.controlInsteadOfSuper = selectedIndex == 2;
218+ }
219+ }
220+
221+ Row {
222+ anchors { left: parent.left; right: parent.right }
223+ CheckBox {
224+ id: autohideLauncherCheckbox
225+ onCheckedChanged: {
226+ GSettingsController.setAutohideLauncher(checked)
227+ }
228+ }
229+ Label {
230+ text: "Autohide launcher"
231+ }
232+ }
216
233
217 Label { text: "Applications"; font.bold: true }
234 Label { text: "Applications"; font.bold: true }
218
235
@@ -296,12 +313,6 @@ Rectangle {
296 signalName: "applicationRemoved"
313 signalName: "applicationRemoved"
297 }
314 }
298
315
299− SignalSpy {
300− id: clickThroughSpy
301− target: clickThroughCatcher
302− signalName: "clicked"
303− }
304−
305 Telephony.CallEntry {
316 Telephony.CallEntry {
306 id: phoneCall
317 id: phoneCall
307 phoneNumber: "+447812221111"
318 phoneNumber: "+447812221111"
@@ -670,6 +681,7 @@ Rectangle {
670 function swipeAwayGreeter() {
681 function swipeAwayGreeter() {
671 var greeter = findChild(shell, "greeter");
682 var greeter = findChild(shell, "greeter");
672 tryCompare(greeter, "fullyShown", true);
683 tryCompare(greeter, "fullyShown", true);
684+ waitForGreeterToStabilize();
673 removeTimeConstraintsFromDirectionalDragAreas(greeter);
685 removeTimeConstraintsFromDirectionalDragAreas(greeter);
674
686
675 var touchX = shell.width - (shell.edgeSize / 2);
687 var touchX = shell.width - (shell.edgeSize / 2);
@@ -773,7 +785,7 @@ Rectangle {
773 loadShell("phone");
785 loadShell("phone");
774 swipeAwayGreeter();
786 swipeAwayGreeter();
775 var item = findChild(shell, "inputMethod");
787 var item = findChild(shell, "inputMethod");
776− var surface = SurfaceManager.inputMethodSurface();
788+ var surface = SurfaceManager.inputMethodSurface;
777
789
778 surface.setState(Mir.MinimizedState);
790 surface.setState(Mir.MinimizedState);
779 tryCompare(item, "visible", false);
791 tryCompare(item, "visible", false);
@@ -844,7 +856,6 @@ Rectangle {
844 function test_launchedAppHasActiveFocus(data) {
856 function test_launchedAppHasActiveFocus(data) {
845 loadShell(data.formFactor);
857 loadShell(data.formFactor);
846 shell.usageScenario = data.usageScenario;
858 shell.usageScenario = data.usageScenario;
847− waitForGreeterToStabilize();
848 swipeAwayGreeter();
859 swipeAwayGreeter();
849
860
850 var webApp = ApplicationManager.startApplication("webbrowser-app");
861 var webApp = ApplicationManager.startApplication("webbrowser-app");
@@ -912,6 +923,7 @@ Rectangle {
912 function dragLauncherIntoView() {
923 function dragLauncherIntoView() {
913 var launcher = findChild(shell, "launcher");
924 var launcher = findChild(shell, "launcher");
914 var launcherPanel = findChild(launcher, "launcherPanel");
925 var launcherPanel = findChild(launcher, "launcherPanel");
926+ waitForRendering(launcher);
915 verify(launcherPanel.x = - launcherPanel.width);
927 verify(launcherPanel.x = - launcherPanel.width);
916
928
917 var touchStartX = 2;
929 var touchStartX = 2;
@@ -1424,9 +1436,17 @@ Rectangle {
1424 tryCompare(galleryApp, "requestedState", ApplicationInfoInterface.RequestedRunning);
1436 tryCompare(galleryApp, "requestedState", ApplicationInfoInterface.RequestedRunning);
1425 }
1437 }
1426
1438
1439+ function test_altTabSwitchesFocus_data() {
1440+ return [
1441+ { tag: "windowed", shellType: "desktop" },
1442+ { tag: "staged", shellType: "phone" },
1443+ { tag: "sidestaged", shellType: "tablet" }
1444+ ];
1445+ }
1446+
1427− function test_altTabSwitchesFocus() {
1447+ function test_altTabSwitchesFocus(data) {
1428− loadShell("desktop");
1448+ loadShell(data.shellType);
1429− shell.usageScenario = "desktop"
1449+ shell.usageScenario = data.shellType;
1430 waitForRendering(root)
1450 waitForRendering(root)
1431
1451
1432 var desktopStage = findChild(shell, "stage");
1452 var desktopStage = findChild(shell, "stage");
@@ -1441,21 +1461,13 @@ Rectangle {
1441
1461
1442 // Do a quick alt-tab and see if focus changes
1462 // Do a quick alt-tab and see if focus changes
1443 tryCompare(app3.session.lastSurface, "activeFocus", true)
1463 tryCompare(app3.session.lastSurface, "activeFocus", true)
1444− keyClick(Qt.Key_Tab, Qt.ControlModifier)
1464+ keyClick(Qt.Key_Tab, Qt.AltModifier)
1445 tryCompare(app2.session.lastSurface, "activeFocus", true)
1465 tryCompare(app2.session.lastSurface, "activeFocus", true)
1446
1466
1447− var desktopSpread = findChild(shell, "spread")
1467+ // Press Alt+Tab
1448−
1449− tryCompare(desktopSpread, "state", "")
1450−
1451− // Just press Alt, make sure the spread comes up
1452− keyPress(Qt.Key_Control);
1468+ keyPress(Qt.Key_Alt);
1453 keyClick(Qt.Key_Tab);
1469 keyClick(Qt.Key_Tab);
1454− tryCompare(desktopSpread, "state", "altTab")
1455−
1456− // Release control, check if spread disappears
1457− keyRelease(Qt.Key_Control)
1470+ keyRelease(Qt.Key_Alt)
1458− tryCompare(desktopSpread, "state", "")
1459
1471
1460 // Focus should have switched back now
1472 // Focus should have switched back now
1461 tryCompare(app3.session.lastSurface, "activeFocus", true)
1473 tryCompare(app3.session.lastSurface, "activeFocus", true)
@@ -1482,7 +1494,7 @@ Rectangle {
1482 tryCompare(desktopSpread, "state", "")
1494 tryCompare(desktopSpread, "state", "")
1483
1495
1484 // Just press Alt, make sure the spread comes up
1496 // Just press Alt, make sure the spread comes up
1485− keyPress(Qt.Key_Control);
1497+ keyPress(Qt.Key_Alt);
1486 keyClick(Qt.Key_Tab);
1498 keyClick(Qt.Key_Tab);
1487 tryCompare(desktopSpread, "state", "altTab")
1499 tryCompare(desktopSpread, "state", "altTab")
1488 tryCompare(spreadRepeater, "highlightedIndex", 1)
1500 tryCompare(spreadRepeater, "highlightedIndex", 1)
@@ -1503,7 +1515,7 @@ Rectangle {
1503 tryCompare(spreadRepeater, "highlightedIndex", 0)
1515 tryCompare(spreadRepeater, "highlightedIndex", 0)
1504
1516
1505 // Release control, check if spread disappears
1517 // Release control, check if spread disappears
1506− keyRelease(Qt.Key_Control)
1518+ keyRelease(Qt.Key_Alt)
1507 tryCompare(desktopSpread, "state", "")
1519 tryCompare(desktopSpread, "state", "")
1508
1520
1509 // Make sure that after wrapping around once, we have the same one focused as at the beginning
1521 // Make sure that after wrapping around once, we have the same one focused as at the beginning
@@ -1516,7 +1528,7 @@ Rectangle {
1516 var spreadRepeater = findInvisibleChild(shell, "spreadRepeater");
1528 var spreadRepeater = findInvisibleChild(shell, "spreadRepeater");
1517 verify(spreadRepeater !== null);
1529 verify(spreadRepeater !== null);
1518
1530
1519− keyPress(Qt.Key_Control)
1531+ keyPress(Qt.Key_Alt)
1520 keyClick(Qt.Key_Tab);
1532 keyClick(Qt.Key_Tab);
1521 tryCompare(spreadRepeater, "highlightedIndex", 1);
1533 tryCompare(spreadRepeater, "highlightedIndex", 1);
1522
1534
@@ -1538,7 +1550,7 @@ Rectangle {
1538 keyClick(Qt.Key_Backtab);
1550 keyClick(Qt.Key_Backtab);
1539 tryCompare(spreadRepeater, "highlightedIndex", 1);
1551 tryCompare(spreadRepeater, "highlightedIndex", 1);
1540
1552
1541− keyRelease(Qt.Key_Control);
1553+ keyRelease(Qt.Key_Alt);
1542 }
1554 }
1543
1555
1544 function test_highlightFollowsMouse() {
1556 function test_highlightFollowsMouse() {
@@ -1547,7 +1559,7 @@ Rectangle {
1547 var spreadRepeater = findInvisibleChild(shell, "spreadRepeater");
1559 var spreadRepeater = findInvisibleChild(shell, "spreadRepeater");
1548 verify(spreadRepeater !== null);
1560 verify(spreadRepeater !== null);
1549
1561
1550− keyPress(Qt.Key_Control)
1562+ keyPress(Qt.Key_Alt)
1551 keyClick(Qt.Key_Tab);
1563 keyClick(Qt.Key_Tab);
1552
1564
1553 tryCompare(spreadRepeater, "highlightedIndex", 1);
1565 tryCompare(spreadRepeater, "highlightedIndex", 1);
@@ -1566,7 +1578,7 @@ Rectangle {
1566
1578
1567 verify(y < 4000);
1579 verify(y < 4000);
1568
1580
1569− keyRelease(Qt.Key_Control);
1581+ keyRelease(Qt.Key_Alt);
1570 }
1582 }
1571
1583
1572 function test_closeFromSpread() {
1584 function test_closeFromSpread() {
@@ -1575,7 +1587,7 @@ Rectangle {
1575 var spreadRepeater = findInvisibleChild(shell, "spreadRepeater");
1587 var spreadRepeater = findInvisibleChild(shell, "spreadRepeater");
1576 verify(spreadRepeater !== null);
1588 verify(spreadRepeater !== null);
1577
1589
1578− keyPress(Qt.Key_Control)
1590+ keyPress(Qt.Key_Alt)
1579 keyClick(Qt.Key_Tab);
1591 keyClick(Qt.Key_Tab);
1580
1592
1581 appRemovedSpy.clear();
1593 appRemovedSpy.clear();
@@ -1602,7 +1614,7 @@ Rectangle {
1602 tryCompare(appRemovedSpy, "count", 1)
1614 tryCompare(appRemovedSpy, "count", 1)
1603 compare(appRemovedSpy.signalArguments[0][0], closedAppId);
1615 compare(appRemovedSpy.signalArguments[0][0], closedAppId);
1604
1616
1605− keyRelease(Qt.Key_Control);
1617+ keyRelease(Qt.Key_Alt);
1606 }
1618 }
1607
1619
1608 function test_selectFromSpreadWithMouse_data() {
1620 function test_selectFromSpreadWithMouse_data() {
@@ -1622,7 +1634,7 @@ Rectangle {
1622 var spreadRepeater = findInvisibleChild(shell, "spreadRepeater");
1634 var spreadRepeater = findInvisibleChild(shell, "spreadRepeater");
1623 verify(spreadRepeater !== null);
1635 verify(spreadRepeater !== null);
1624
1636
1625− keyPress(Qt.Key_Control)
1637+ keyPress(Qt.Key_Alt)
1626 keyClick(Qt.Key_Tab);
1638 keyClick(Qt.Key_Tab);
1627
1639
1628 var focusAppId = ApplicationManager.get(2).appId;
1640 var focusAppId = ApplicationManager.get(2).appId;
@@ -1649,7 +1661,7 @@ Rectangle {
1649 tryCompare(stage, "state", "");
1661 tryCompare(stage, "state", "");
1650 tryCompare(ApplicationManager, "focusedApplicationId", focusAppId);
1662 tryCompare(ApplicationManager, "focusedApplicationId", focusAppId);
1651
1663
1652− keyRelease(Qt.Key_Control);
1664+ keyRelease(Qt.Key_Alt);
1653 }
1665 }
1654
1666
1655 function test_progressiveAutoScrolling() {
1667 function test_progressiveAutoScrolling() {
@@ -1658,7 +1670,7 @@ Rectangle {
1658 var appRepeater = findInvisibleChild(shell, "appRepeater");
1670 var appRepeater = findInvisibleChild(shell, "appRepeater");
1659 verify(appRepeater !== null);
1671 verify(appRepeater !== null);
1660
1672
1661− keyPress(Qt.Key_Control)
1673+ keyPress(Qt.Key_Alt)
1662 keyClick(Qt.Key_Tab);
1674 keyClick(Qt.Key_Tab);
1663
1675
1664 var spreadFlickable = findChild(shell, "spreadFlickable")
1676 var spreadFlickable = findChild(shell, "spreadFlickable")
@@ -1669,7 +1681,7 @@ Rectangle {
1669 var x = 0;
1681 var x = 0;
1670 var y = shell.height * .5
1682 var y = shell.height * .5
1671 mouseMove(shell, x, y)
1683 mouseMove(shell, x, y)
1672− while (x <= spreadFlickable.width) {
1684+ while (x <= shell.width) {
1673 x+=10;
1685 x+=10;
1674 mouseMove(shell, x, y)
1686 mouseMove(shell, x, y)
1675 wait(0); // spin the loop so bindings get evaluated
1687 wait(0); // spin the loop so bindings get evaluated
@@ -1684,7 +1696,7 @@ Rectangle {
1684 }
1696 }
1685 tryCompare(spreadFlickable, "contentX", 0);
1697 tryCompare(spreadFlickable, "contentX", 0);
1686
1698
1687− keyRelease(Qt.Key_Control);
1699+ keyRelease(Qt.Key_Alt);
1688 }
1700 }
1689
1701
1690 // This makes sure the hoverMouseArea is set to invisible AND disabled
1702 // This makes sure the hoverMouseArea is set to invisible AND disabled
@@ -1696,13 +1708,13 @@ Rectangle {
1696 tryCompare(hoverMouseArea, "enabled", false)
1708 tryCompare(hoverMouseArea, "enabled", false)
1697 tryCompare(hoverMouseArea, "visible", false)
1709 tryCompare(hoverMouseArea, "visible", false)
1698
1710
1699− keyPress(Qt.Key_Control)
1711+ keyPress(Qt.Key_Alt)
1700 keyClick(Qt.Key_Tab);
1712 keyClick(Qt.Key_Tab);
1701
1713
1702 tryCompare(hoverMouseArea, "enabled", true)
1714 tryCompare(hoverMouseArea, "enabled", true)
1703 tryCompare(hoverMouseArea, "visible", true)
1715 tryCompare(hoverMouseArea, "visible", true)
1704
1716
1705− keyRelease(Qt.Key_Control)
1717+ keyRelease(Qt.Key_Alt)
1706
1718
1707 tryCompare(hoverMouseArea, "enabled", false)
1719 tryCompare(hoverMouseArea, "enabled", false)
1708 tryCompare(hoverMouseArea, "visible", false)
1720 tryCompare(hoverMouseArea, "visible", false)
@@ -1719,7 +1731,7 @@ Rectangle {
1719 var appRepeater = findInvisibleChild(shell, "appRepeater");
1731 var appRepeater = findInvisibleChild(shell, "appRepeater");
1720 verify(appRepeater !== null);
1732 verify(appRepeater !== null);
1721
1733
1722− keyPress(Qt.Key_Control)
1734+ keyPress(Qt.Key_Alt)
1723 keyClick(Qt.Key_Tab);
1735 keyClick(Qt.Key_Tab);
1724
1736
1725 tryCompare(spreadRepeater, "highlightedIndex", 1);
1737 tryCompare(spreadRepeater, "highlightedIndex", 1);
@@ -1740,33 +1752,46 @@ Rectangle {
1740
1752
1741 verify(y < 4000);
1753 verify(y < 4000);
1742
1754
1743− keyRelease(Qt.Key_Control);
1755+ keyRelease(Qt.Key_Alt);
1744 }
1756 }
1745
1757
1746− function test_focusAppFromLauncherExitsSpread() {
1758+ function test_focusAppFromLauncherExitsSpread_data() {
1747− loadDesktopShellWithApps()
1759+ return [
1760+ {tag: "autohide launcher", launcherLocked: false },
1761+ {tag: "locked launcher", launcherLocked: true }
1762+ ]
1763+ }
1748
1764
1749− var desktopSpread = findChild(shell, "spread");
1765+ function test_focusAppFromLauncherExitsSpread(data) {
1766+ loadDesktopShellWithApps()
1750 var launcher = findChild(shell, "launcher");
1767 var launcher = findChild(shell, "launcher");
1768+ var desktopSpread = findChild(shell, "spread");
1751 var bfb = findChild(launcher, "buttonShowDashHome");
1769 var bfb = findChild(launcher, "buttonShowDashHome");
1752
1770
1771+ GSettingsController.setAutohideLauncher(!data.launcherLocked);
1772+ waitForRendering(shell);
1773+
1753− keyPress(Qt.Key_Control)
1774+ keyPress(Qt.Key_Alt)
1754 keyClick(Qt.Key_Tab);
1775 keyClick(Qt.Key_Tab);
1755
1776
1756 tryCompare(desktopSpread, "state", "altTab")
1777 tryCompare(desktopSpread, "state", "altTab")
1757
1778
1779+ if (!data.launcherLocked) {
1758− revealLauncherByEdgePushWithMouse();
1780+ revealLauncherByEdgePushWithMouse();
1759− tryCompare(launcher, "x", 0);
1781+ tryCompare(launcher, "x", 0);
1760− mouseMove(bfb, bfb.width / 2, bfb.height / 2)
1782+ mouseMove(bfb, bfb.width / 2, bfb.height / 2)
1761− waitForRendering(shell)
1783+ waitForRendering(shell)
1784+ }
1762
1785
1763 mouseClick(bfb, bfb.width / 2, bfb.height / 2)
1786 mouseClick(bfb, bfb.width / 2, bfb.height / 2)
1787+ if (!data.launcherLocked) {
1764− tryCompare(launcher, "state", "")
1788+ tryCompare(launcher, "state", "")
1789+ }
1765 tryCompare(desktopSpread, "state", "")
1790 tryCompare(desktopSpread, "state", "")
1766
1791
1767 tryCompare(ApplicationManager, "focusedApplicationId", "unity8-dash")
1792 tryCompare(ApplicationManager, "focusedApplicationId", "unity8-dash")
1768
1793
1769− keyRelease(Qt.Key_Control);
1794+ keyRelease(Qt.Key_Alt);
1770 }
1795 }
1771
1796
1772 // regression test for http://pad.lv/1443319
1797 // regression test for http://pad.lv/1443319
@@ -1854,6 +1879,31 @@ Rectangle {
1854 compare(appDelegate.y >= PanelState.panelHeight, true);
1879 compare(appDelegate.y >= PanelState.panelHeight, true);
1855 }
1880 }
1856
1881
1882+ function test_cantResizeWindowUnderPanel() {
1883+ loadShell("desktop");
1884+ shell.usageScenario = "desktop";
1885+ waitForRendering(shell);
1886+
1887+ var app = ApplicationManager.startApplication("dialer-app")
1888+ waitUntilAppWindowIsFullyLoaded(app);
1889+
1890+ var appContainer = findChild(shell, "appContainer");
1891+ var appDelegate = findChild(appContainer, "appDelegate_dialer-app");
1892+ var decoration = findChild(appDelegate, "appWindowDecoration_dialer-app");
1893+ verify(decoration);
1894+
1895+ // move it away from launcher and panel
1896+ appDelegate.x = units.gu(10)
1897+ appDelegate.y = units.gu(10)
1898+
1899+ // drag-resize the area up
1900+ mousePress(decoration, decoration.width/2, -units.gu(1));
1901+ mouseMove(decoration, decoration.width/2, -units.gu(100));
1902+
1903+ // verify we don't go past the panel
1904+ compare(appDelegate.y >= PanelState.panelHeight, true);
1905+ }
1906+
1857 function test_restoreWindowStateFixesIfUnderPanel() {
1907 function test_restoreWindowStateFixesIfUnderPanel() {
1858 loadDesktopShellWithApps();
1908 loadDesktopShellWithApps();
1859 var appRepeater = findChild(shell, "appRepeater")
1909 var appRepeater = findChild(shell, "appRepeater")
@@ -1989,6 +2039,138 @@ Rectangle {
1989 }
2039 }
1990 }
2040 }
1991
2041
2042+ function test_superTabToCycleLauncher_data() {
2043+ return [
2044+ {tag: "autohide launcher", launcherLocked: false},
2045+ {tag: "locked launcher", launcherLocked: true}
2046+ ]
2047+ }
2048+
2049+ function test_superTabToCycleLauncher(data) {
2050+ loadShell("desktop");
2051+ shell.usageScenario = "desktop";
2052+ GSettingsController.setAutohideLauncher(!data.launcherLocked);
2053+ waitForRendering(shell);
2054+
2055+ var launcher = findChild(shell, "launcher");
2056+ var launcherPanel = findChild(launcher, "launcherPanel");
2057+ var firstAppInLauncher = LauncherModel.get(0).appId;
2058+
2059+ compare(launcher.state, data.launcherLocked ? "visible": "");
2060+ compare(launcherPanel.highlightIndex, -2);
2061+ compare(ApplicationManager.focusedApplicationId, "unity8-dash");
2062+
2063+ // Use Super + Tab Tab to cycle to the first entry in the launcher
2064+ keyPress(Qt.Key_Super_L, Qt.MetaModifier);
2065+ keyClick(Qt.Key_Tab);
2066+ tryCompare(launcher, "state", "visible");
2067+ tryCompare(launcherPanel, "highlightIndex", -1);
2068+ keyClick(Qt.Key_Tab);
2069+ tryCompare(launcherPanel, "highlightIndex", 0);
2070+ keyRelease(Qt.Key_Super_L, Qt.MetaModifier);
2071+ tryCompare(launcher, "state", data.launcherLocked ? "visible" : "");
2072+ tryCompare(launcherPanel, "highlightIndex", -2);
2073+ tryCompare(ApplicationManager, "focusedApplicationId", firstAppInLauncher);
2074+
2075+ // Now go back to the dash
2076+ keyPress(Qt.Key_Super_L, Qt.MetaModifier);
2077+ keyClick(Qt.Key_Tab);
2078+ tryCompare(launcher, "state", "visible");
2079+ tryCompare(launcherPanel, "highlightIndex", -1);
2080+ keyRelease(Qt.Key_Super_L, Qt.MetaModifier);
2081+ tryCompare(launcher, "state", data.launcherLocked ? "visible" : "");
2082+ tryCompare(launcherPanel, "highlightIndex", -2);
2083+ tryCompare(ApplicationManager, "focusedApplicationId", "unity8-dash");
2084+ }
2085+
2086+ function test_longpressSuperOpensLauncher() {
2087+ loadShell("desktop");
2088+ var launcher = findChild(shell, "launcher");
2089+ var shortcutHint = findChild(findChild(launcher, "launcherDelegate0"), "shortcutHint")
2090+
2091+ compare(launcher.state, "");
2092+ keyPress(Qt.Key_Super_L, Qt.MetaModifier);
2093+ tryCompare(launcher, "state", "visible");
2094+ tryCompare(shortcutHint, "visible", true);
2095+
2096+ keyRelease(Qt.Key_Super_L, Qt.MetaModifier);
2097+ tryCompare(launcher, "state", "");
2098+ tryCompare(shortcutHint, "visible", false);
2099+ }
2100+
2101+ function test_metaNumberLaunchesFromLauncher_data() {
2102+ return [
2103+ {tag: "Meta+1", key: Qt.Key_1, index: 0},
2104+ {tag: "Meta+2", key: Qt.Key_2, index: 1},
2105+ {tag: "Meta+4", key: Qt.Key_5, index: 4},
2106+ {tag: "Meta+0", key: Qt.Key_0, index: 9},
2107+ ]
2108+ }
2109+
2110+ function test_metaNumberLaunchesFromLauncher(data) {
2111+ loadShell("desktop");
2112+ var launcher = findChild(shell, "launcher");
2113+ var appId = LauncherModel.get(data.index).appId;
2114+ waitForRendering(shell);
2115+
2116+ keyClick(data.key, Qt.MetaModifier);
2117+ tryCompare(ApplicationManager, "focusedApplicationId", appId);
2118+ }
2119+
2120+ function test_altF1OpensLauncherForKeyboardNavigation() {
2121+ loadShell("desktop");
2122+ waitForRendering(shell);
2123+ var launcher = findChild(shell, "launcher");
2124+
2125+ keyClick(Qt.Key_F1, Qt.AltModifier);
2126+ tryCompare(launcher, "state", "visible");
2127+ tryCompare(launcher, "focus", true)
2128+ }
2129+
2130+ function test_lockedOutLauncherAddsMarginsToMaximized() {
2131+ loadShell("desktop");
2132+ shell.usageScenario = "desktop";
2133+ waitForRendering(shell);
2134+ var appContainer = findChild(shell, "appContainer");
2135+ var launcher = findChild(shell, "launcher");
2136+
2137+ var app = ApplicationManager.startApplication("music-app");
2138+ waitUntilAppWindowIsFullyLoaded(app);
2139+ var appDelegate = findChild(appContainer, "appDelegate_music-app");
2140+ appDelegate.maximize();
2141+ tryCompare(appDelegate, "visuallyMaximized", true);
2142+ waitForRendering(shell);
2143+
2144+ GSettingsController.setAutohideLauncher(true);
2145+ waitForRendering(shell)
2146+ var hiddenSize = appDelegate.width;
2147+
2148+ GSettingsController.setAutohideLauncher(false);
2149+ waitForRendering(shell)
2150+ var shownSize = appDelegate.width;
2151+
2152+ compare(shownSize + launcher.panelWidth, hiddenSize);
2153+ }
2154+
2155+ function test_fullscreenAppHidesLockedOutLauncher() {
2156+ loadShell("desktop");
2157+ shell.usageScenario = "desktop";
2158+
2159+ var launcher = findChild(shell, "launcher");
2160+ var launcherPanel = findChild(launcher, "launcherPanel");
2161+
2162+ GSettingsController.setAutohideLauncher(false);
2163+ waitForRendering(shell)
2164+
2165+ tryCompare(launcher, "lockedVisible", true);
2166+
2167+ var cameraApp = ApplicationManager.startApplication("camera-app");
2168+ waitUntilAppWindowIsFullyLoaded(cameraApp);
2169+
2170+ tryCompare(launcher, "lockedVisible", false);
2171+ }
2172+
2173+
1992 function test_inputEventsOnEdgesEndUpInAppSurface_data() {
2174 function test_inputEventsOnEdgesEndUpInAppSurface_data() {
1993 return [
2175 return [
1994 { tag: "phone", repeaterName: "spreadRepeater" },
2176 { tag: "phone", repeaterName: "spreadRepeater" },