on xenial help sign in
merge prereq
commitb1684945595c491f29148879b5d9998093a26f46 authorLukáš Tinkl <lukas.tinkl@canonical.com> dateMon 14 Mar 2016, 13:52 (11 years ago) parent91646e6f10ff6d
254 files changed+5913−2654
CMakeLists.txt+1−1 cmake/modules/QmlTest.cmake+1−1 data/com.canonical.Unity8.gschema.xml+11 data/unity8-dash.conf+1 debian/changelog+126 debian/control+9−8 debian/unity8-common.udev+2 debian/unity8-doc.install+1 doc/devices.conf+30 plugins/AccountsService/AccountsService.cpp+189−342 plugins/AccountsService/AccountsService.h+25−20 plugins/AccountsService/AccountsServiceDBusAdaptor.cpp+11−4 plugins/AccountsService/AccountsServiceDBusAdaptor.h+5−6 plugins/Dash/AudioProgressBar.qml+1 plugins/Dash/CardCreator.js+69−34 plugins/Dash/CardCreatorCache.qml+3−3 plugins/Dash/plugin.cpp+6−6 plugins/GlobalShortcut/globalshortcutregistry.cpp+4−4 plugins/IntegratedLightDM/liblightdm/CMakeLists.txt+16−3 plugins/IntegratedLightDM/liblightdm/UsersModel.cpp+4−18 plugins/IntegratedLightDM/liblightdm/UsersModel.h+1−1 plugins/IntegratedLightDM/liblightdm/UsersModelPrivate.cpp+43−9 plugins/IntegratedLightDM/liblightdm/UsersModelPrivate.h+15−3 plugins/Unity/Indicators/indicatorsmanager.cpp+2−2 plugins/Unity/Indicators/rootstateparser.h+1 plugins/Unity/Launcher/desktopfilehandler.cpp+2−2 plugins/Unity/Launcher/launcheritem.cpp+1 plugins/Unity/Launcher/launcheritem.h+1−1 plugins/Unity/Launcher/launchermodel.cpp+15−5 plugins/Unity/Launcher/launchermodel.h+1−1 plugins/Utils/CMakeLists.txt+1 plugins/Utils/deviceconfigparser.cpp+150 plugins/Utils/deviceconfigparser.h+62 plugins/Utils/plugin.cpp+2 po/aa.po+7−15 po/am.po+13−15 po/ar.po+13−15 po/ast.po+13−15 po/az.po+13−15 po/be.po+13−15 po/bg.po+7−15 po/bn.po+13−15 po/br.po+13−15 po/bs.po+13−15 po/ca.po+13−15 po/ca@valencia.po+13−15 po/ce.po+7−15 po/ckb.po+7−15 po/cs.po+13−15 po/cy.po+13−15 po/da.po+13−15 po/de.po+13−15 po/el.po+13−15 po/en_AU.po+13−15 po/en_GB.po+13−15 po/eo.po+10−15 po/es.po+13−15 po/eu.po+13−15 po/fa.po+13−15 po/fi.po+13−15 po/fo.po+7−15 po/fr.po+13−15 po/ga.po+13−15 po/gd.po+13−15 po/gl.po+13−15 po/gv.po+7−15 po/he.po+13−15 po/hi.po+7−15 po/hr.po+13−15 po/hu.po+13−15 po/hy.po+13−15 po/ia.po+13−15 po/id.po+13−15 po/is.po+13−15 po/it.po+13−15 po/ja.po+13−15 po/km.po+13−15 po/kn.po+7−15 po/ko.po+16−18 po/ku.po+13−15 po/ky.po+7−15 po/lo.po+7−15 po/lt.po+7−15 po/lv.po+13−15 po/ml.po+7−15 po/mr.po+7−15 po/ms.po+13−15 po/my.po+10−15 po/nb.po+13−15 po/ne.po+7−15 po/nl.po+13−15 po/nn.po+7−15 po/oc.po+7−15 po/or.po+7−15 po/pa.po+13−15 po/pl.po+13−15 po/pt.po+13−15 po/pt_BR.po+13−15 po/ro.po+13−15 po/ru.po+13−15 po/shn.po+7−15 po/si.po+7−15 po/sk.po+13−15 po/sl.po+13−15 po/sq.po+13−15 po/sr.po+15−17 po/sv.po+13−15 po/sw.po+13−15 po/ta.po+7−15 po/te.po+7−15 po/th.po+7−15 po/tr.po+13−15 po/ug.po+13−15 po/uk.po+13−15 po/unity8.pot+34−40 po/ur.po+7−15 po/uz.po+7−15 po/vi.po+7−15 po/wo.po+13−15 po/xh.po+7−15 po/zh_CN.po+13−15 po/zh_HK.po+7−15 po/zh_TW.po+13−15 qml/Components/EdgeBarrier.qml+1−1 qml/Components/Header.qml+1 qml/Components/InputMethod.qml+1−9 qml/Components/Lockscreen.qml+80−94 qml/Components/ModeSwitchWarningDialog.qml+1−1 qml/Components/PassphraseLockscreen.qml+5−4 qml/Components/PhysicalKeysMapper.qml+24 qml/Components/PinLockscreen.qml+22−1 qml/Components/ShellDialog.qml+8 qml/Dash/CardCarousel.qml−1 qml/Dash/CardGrid.qml−1 qml/Dash/CardHorizontalList.qml−1 qml/Dash/CardTool.qml+2−26 qml/Dash/CardVerticalJournal.qml−1 qml/Dash/Dash.qml+11−11 qml/Dash/DashPageHeader.qml+4 qml/Dash/GenericScopeView.qml+2 qml/Dash/Previews/PreviewHeader.qml+37−9 qml/Dash/Previews/PreviewOverlay.qml+1−1 qml/Dash/Previews/PreviewPayments.qml+1−3 qml/Dash/Previews/PreviewSharing.qml+17−7 qml/Dash/ScopesListCategoryItem.qml+8−4 qml/DeviceConfiguration.qml+54−16 qml/DisabledScreenNotice.qml+44−20 qml/Greeter/CoverPage.qml+13−2 qml/Greeter/Infographics.qml+2−1 qml/Greeter/NarrowView.qml+14−1 qml/Launcher/Launcher.qml+144−11 qml/Launcher/LauncherDelegate.qml+55−20 qml/Launcher/LauncherPanel.qml+122−51 qml/Launcher/graphics/launcher-app-focus-ring.svg+12 qml/Notifications/Notification.qml+9−5 qml/OrientedShell.qml+26−1 qml/Panel/Handle.qml+2−2 qml/Panel/IndicatorItem.qml+3−3 qml/Panel/Indicators/MenuItemFactory.qml+3−4 qml/Panel/Indicators/ModemInfoItem.qml−111 qml/Panel/Indicators/RoamingIndication.qml−40 qml/Panel/Indicators/client/IndicatorsClient.qml+1−1 qml/Panel/IndicatorsMenu.qml+3−2 qml/Panel/MenuContent.qml+1−1 qml/Panel/Panel.qml+5−1 qml/ScopeTool.qml−8 qml/Shell.qml+52−2 qml/Stages/AbstractStage.qml+3−1 qml/Stages/DesktopSpread.qml+64−17 qml/Stages/DesktopSpreadDelegate.qml+15−1 qml/Stages/DesktopStage.qml+34−34 qml/Stages/PhoneStage.qml+77−3 qml/Stages/Splash.qml+4−2 qml/Stages/SpreadDelegate.qml+20 qml/Stages/TabletStage.qml+83−3 qml/Stages/WindowResizeArea.qml+8−5 qml/Wizard/StackButton.qml+1−1 src/CMakeLists.txt+1−1 src/CachingNetworkManagerFactory.cpp+2−2 src/CachingNetworkManagerFactory.h+3−2 src/Dash/CMakeLists.txt+1−1 tests/autopilot/unity8/dash.py+1−2 tests/autopilot/unity8/shell/tests/test_helpers.py−2 tests/mocks/GSettings.1.0/fake_gsettings.cpp+64 tests/mocks/GSettings.1.0/fake_gsettings.h+18 tests/mocks/IntegratedLightDM/liblightdm/UsersModel.cpp−14 tests/mocks/Unity/Application/MirSurface.cpp+6−2 tests/mocks/Unity/Application/MirSurface.h+2−1 tests/mocks/Unity/Application/SurfaceManager.cpp+8−9 tests/mocks/Unity/Application/SurfaceManager.h+3−3 tests/mocks/Unity/Application/VirtualKeyboard.cpp+3−2 tests/mocks/Unity/Application/VirtualKeyboard.h+1−1 tests/mocks/Unity/Application/plugin.cpp+2−1 tests/mocks/Unity/Launcher/MockLauncherModel.cpp+2 tests/mocks/Utils/CMakeLists.txt+1 tests/mocks/Utils/plugin.cpp+2 tests/plugins/AccountsService/CMakeLists.txt+5 tests/plugins/AccountsService/PropertiesServer.cpp+16−4 tests/plugins/AccountsService/PropertiesServer.h+2−1 tests/plugins/AccountsService/UscServer.cpp+28 tests/plugins/AccountsService/UscServer.h+39 tests/plugins/AccountsService/client.cpp+63−9 tests/plugins/AccountsService/interfaces.xml+16 tests/plugins/AccountsService/server.cpp+12 tests/plugins/Dash/cardcreator/1.res+4−6 tests/plugins/Dash/cardcreator/1.res.cardcreator+119 tests/plugins/Dash/cardcreator/10.res+3−5 tests/plugins/Dash/cardcreator/10.res.cardcreator+137 tests/plugins/Dash/cardcreator/11.res+5−7 tests/plugins/Dash/cardcreator/11.res.cardcreator+210 tests/plugins/Dash/cardcreator/2.res+3−5 tests/plugins/Dash/cardcreator/2.res.cardcreator+136 tests/plugins/Dash/cardcreator/3.res+3−5 tests/plugins/Dash/cardcreator/3.res.cardcreator+137 tests/plugins/Dash/cardcreator/4.res+3−5 tests/plugins/Dash/cardcreator/4.res.cardcreator+109 tests/plugins/Dash/cardcreator/5.res+5−7 tests/plugins/Dash/cardcreator/5.res.cardcreator+156 tests/plugins/Dash/cardcreator/6.res+2−4 tests/plugins/Dash/cardcreator/6.res.cardcreator+126 tests/plugins/Dash/cardcreator/7.res+3−5 tests/plugins/Dash/cardcreator/7.res.cardcreator+149 tests/plugins/Dash/cardcreator/8.res+3−5 tests/plugins/Dash/cardcreator/8.res.cardcreator+107 tests/plugins/Dash/cardcreator/9.res+4−5 tests/plugins/Dash/cardcreator/9.res.cardcreator+119 tests/plugins/Dash/cardcreatortest.cpp+32−22 tests/plugins/Dash/cardcreatortest.qml+4−4 tests/plugins/IntegratedLightDM/CMakeLists.txt+25 tests/plugins/IntegratedLightDM/integrated.cpp+91 tests/plugins/Utils/CMakeLists.txt+7−1 tests/plugins/Utils/DeviceConfigParserTest.cpp+70 tests/qmltests/CMakeLists.txt+1 tests/qmltests/Components/tst_Lockscreen.qml+14−7 tests/qmltests/Dash/Previews/tst_PreviewHeader.qml+18−1 tests/qmltests/Dash/Previews/tst_PreviewSharing.qml+17−3 tests/qmltests/Dash/tst_CardTool.qml+4−4 tests/qmltests/Dash/tst_Dash.qml+89 tests/qmltests/Greeter/tst_NarrowView.qml+9 tests/qmltests/Launcher/tst_Launcher.qml+254−18 tests/qmltests/Notifications/tst_OptionToggle.qml+1−1 tests/qmltests/Notifications/tst_VisualSnapDecisionsQueue.qml+1 tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+2−4 tests/qmltests/Panel/tst_IndicatorItem.qml+16−14 tests/qmltests/Panel/tst_Panel.qml+2 tests/qmltests/Stages/tst_DesktopStage.qml+2−1 tests/qmltests/Stages/tst_PhoneStage.qml+19−6 tests/qmltests/Stages/tst_SpreadDelegate.qml+7 tests/qmltests/Stages/tst_TabletStage.qml+19−1 tests/qmltests/Wizard/tst_Wizard.qml+1−1 tests/qmltests/tst_DeviceConfiguration.qml+49 tests/qmltests/tst_DisabledScreenNotice.qml+76−2 tests/qmltests/tst_OrientedShell.qml+71−5 tests/qmltests/tst_Shell.qml+241−59
CMakeLists.txt+1−1
@@ -131,7 +131,7 @@ if(NOT QUIET_LOGGER)
131131 set(STDOUT_LOGGER "-o" "-,txt")
132132endif()
133133
134−execute_process(COMMAND arch OUTPUT_VARIABLE ARCH)
134+execute_process(COMMAND dpkg-architecture -qDEB_HOST_ARCH OUTPUT_VARIABLE ARCH)
135135if (NOT ARCH MATCHES "arm*")
136136 set(ENABLE_TOUCH_EMULATION true)
137137 add_definitions(-DUNITY8_ENABLE_TOUCH_EMULATION)
cmake/modules/QmlTest.cmake+1−1
@@ -183,7 +183,7 @@ function(add_manual_test COMPONENT_NAME TARGET)
183183 cmake_parse_arguments(QMLTEST "${QMLTEST_OPTIONS}" "${QMLTEST_SINGLE}" "${QMLTEST_MULTI}" ${ARGN})
184184 mangle_arguments()
185185
186− bake_arguments("${QMLTEST_ARG_PREFIX}" args -qmljsdebugger=port:3768)
186+ bake_arguments("${QMLTEST_ARG_PREFIX}" args -qmljsdebugger=port:3768,3800)
187187
188188 set(qmltry_command
189189 $<TARGET_FILE:${TARGET}>
data/com.canonical.Unity8.gschema.xml+11
@@ -27,6 +27,17 @@
2727 <summary>Maximum push needed to overcome edge barrier</summary>
2828 <description>How much you have to push (in grid units) the mouse against an edge barrier when sensibility is 1.</description>
2929 </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>
3041 </schema>
3142
3243 <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
1414oom score 50
1515
1616respawn
17+respawn limit unlimited
1718
1819env APP_ID=unity8-dash
1920
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+
1127unity8 (8.11+16.04.20160301-0ubuntu1) xenial; urgency=medium
2128
3129 [ Albert Astals Cid ]
debian/control+9−8
@@ -13,7 +13,7 @@ Build-Depends: cmake,
1313 libandroid-properties-dev,
1414 graphviz,
1515 gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
16− libconnectivity-qt1-dev,
16+ libconnectivity-qt1-dev (>= 0.7.1),
1717 libevdev-dev,
1818 libgl1-mesa-dev[!armhf] | libgl-dev[!armhf],
1919 libgl1-mesa-dri,
@@ -54,8 +54,8 @@ Build-Depends: cmake,
5454 qtdeclarative5-private-dev (>= 5.4),
5555 qtdeclarative5-qtmultimedia-plugin (>= 5.4.1-1ubuntu19~overlay2),
5656 qtdeclarative5-ubuntu-content1,
57− qtdeclarative5-ubuntu-settings-components (>= 0.6),
58− qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3.1676) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3.1676),
57+ qtdeclarative5-ubuntu-settings-components (>= 0.7),
58+ qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3.1845) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3.1845),
5959 qtdeclarative5-ubuntu-web-plugin,
6060 ttf-ubuntu-font-family,
6161Standards-Version: 3.9.4
@@ -70,7 +70,7 @@ X-Ubuntu-Use-Langpack: yes
7070Package: indicators-client
7171Architecture: amd64 armhf i386
7272Depends: 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),
7474 unity8 (= ${binary:Version}),
7575 ${misc:Depends},
7676 ${shlibs:Depends},
@@ -101,7 +101,6 @@ Depends: dmz-cursor-theme,
101101 qml-module-qt-labs-folderlistmodel,
102102 qml-module-qtquick-xmllistmodel,
103103 qml-module-qtsysteminfo,
104− qtdeclarative5-gsettings1.0,
105104 qtdeclarative5-qtmir-plugin (>= 0.4.5),
106105 qtdeclarative5-ubuntu-telephony0.1,
107106 qtdeclarative5-ubuntu-web-plugin,
@@ -126,9 +125,9 @@ Description: Unity 8 shell
126125Package: unity8-common
127126Architecture: all
128127Depends: qml-module-qtquick-layouts,
129− qtdeclarative5-ubuntu-settings-components (>= 0.6),
128+ qtdeclarative5-ubuntu-settings-components (>= 0.7),
130129 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),
132131 qtdeclarative5-unity-notifications-plugin (>= 0.1.2) | unity-notifications-impl,
133132 ubuntu-thumbnailer-impl-0,
134133 unity-application-impl-13,
@@ -159,7 +158,7 @@ Depends: autopilot-qt5 (>= 1.4),
159158 python3-fixtures,
160159 python3-gi,
161160 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),
163162 unity-scope-click,
164163 unity8 (= ${source:Version}),
165164 unity8-fake-env (= ${source:Version}),
@@ -193,6 +192,8 @@ Depends: accountsservice-ubuntu-schemas (>= 0.0.5),
193192 libhardware2,
194193 pay-service,
195194 unity-schemas (>= 7.3.1+14.10.20140915),
195+ qtdeclarative5-gsettings1.0,
196+ qml-module-qtmultimedia,
196197 ${misc:Depends},
197198 ${shlibs:Depends},
198199Provides: 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/
12usr/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 @@
2424#include <QStringList>
2525#include <QDebug>
2626
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+
2770AccountsService::AccountsService(QObject* parent, const QString &user)
28− : QObject(parent),
29− 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
71+ : QObject(parent)
72+ , m_service(new AccountsServiceDBusAdaptor(this))
3873{
3974 m_unityInput = new QDBusInterface(QStringLiteral("com.canonical.Unity.Input"),
4075 QStringLiteral("/com/canonical/Unity/Input"),
@@ -44,6 +79,43 @@ AccountsService::AccountsService(QObject* parent, const QString &user)
4479 connect(m_service, &AccountsServiceDBusAdaptor::propertiesChanged, this, &AccountsService::onPropertiesChanged);
4580 connect(m_service, &AccountsServiceDBusAdaptor::maybeChanged, this, &AccountsService::onMaybeChanged);
4681
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+
47119 setUser(!user.isEmpty() ? user : QString::fromUtf8(qgetenv("USER")));
48120}
49121
@@ -57,410 +129,200 @@ void AccountsService::setUser(const QString &user)
57129 if (user.isEmpty() || m_user == user)
58130 return;
59131
132+ bool wasEmpty = m_user.isEmpty();
133+
60134 m_user = user;
61135 Q_EMIT userChanged();
62136
63− updateDemoEdges(false);
64− updateEnableLauncherWhileLocked(false);
65− updateEnableIndicatorsWhileLocked(false);
66− updateBackgroundFile(false);
67− updateMouseCursorSpeed();
68− updateTouchpadCursorSpeed();
69− updateStatsWelcomeScreen(false);
70− updatePasswordDisplayHint(false);
71− updateFailedLogins(false);
72− updateHereEnabled(false);
73− updateHereLicensePath(false);
137+ // Do the first update synchronously, as a cheap way to block rendering
138+ // until we have the right values on bootup.
139+ refresh(!wasEmpty);
74140}
75141
76142bool AccountsService::demoEdges() const
77143{
78− return m_demoEdges;
144+ auto value = getProperty(IFACE_UNITY, PROP_DEMO_EDGES);
145+ return value.toBool();
79146}
80147
81148void AccountsService::setDemoEdges(bool demoEdges)
82149{
83− if (m_demoEdges != 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− }
150+ setProperty(IFACE_UNITY, PROP_DEMO_EDGES, demoEdges);
89151}
90152
91153bool AccountsService::enableLauncherWhileLocked() const
92154{
93− return m_enableLauncherWhileLocked;
155+ auto value = getProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_LAUNCHER_WHILE_LOCKED);
156+ return value.toBool();
94157}
95158
96159bool AccountsService::enableIndicatorsWhileLocked() const
97160{
98− return m_enableIndicatorsWhileLocked;
161+ auto value = getProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_INDICATORS_WHILE_LOCKED);
162+ return value.toBool();
99163}
100164
101165QString AccountsService::backgroundFile() const
102166{
103− return m_backgroundFile;
167+ auto value = getProperty(IFACE_ACCOUNTS_USER, PROP_BACKGROUND_FILE);
168+ return value.toString();
104169}
105170
106171bool AccountsService::statsWelcomeScreen() const
107172{
108− return m_statsWelcomeScreen;
173+ auto value = getProperty(IFACE_UBUNTU_SECURITY_OLD, PROP_STATS_WELCOME_SCREEN);
174+ return value.toBool();
109175}
110176
111177AccountsService::PasswordDisplayHint AccountsService::passwordDisplayHint() const
112178{
113− return m_passwordDisplayHint;
179+ auto value = getProperty(IFACE_UBUNTU_SECURITY, PROP_PASSWORD_DISPLAY_HINT);
180+ return (PasswordDisplayHint)value.toInt();
114181}
115182
116183bool AccountsService::hereEnabled() const
117184{
118− return m_hereEnabled;
185+ auto value = getProperty(IFACE_LOCATION_HERE, PROP_LICENSE_ACCEPTED);
186+ return value.toBool();
119187}
120188
121189void AccountsService::setHereEnabled(bool enabled)
122190{
123− if (m_hereEnabled != 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− }
191+ setProperty(IFACE_LOCATION_HERE, PROP_LICENSE_ACCEPTED, enabled);
129192}
130193
131194QString AccountsService::hereLicensePath() const
132195{
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;
134201}
135202
136203bool AccountsService::hereLicensePathValid() const
137204{
138− return !m_hereLicensePath.isNull();
139−}
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− }
205+ auto value = getProperty(IFACE_LOCATION_HERE, PROP_LICENSE_BASE_PATH);
206+ return !value.toString().isNull();
168207}
169208
170−void AccountsService::updateEnableLauncherWhileLocked(bool async)
209+uint AccountsService::failedLogins() const
171210{
172− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
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− }
211+ return getProperty(IFACE_UNITY_PRIVATE, PROP_FAILED_LOGINS).toUInt();
197212}
198213
199−void AccountsService::updateEnableIndicatorsWhileLocked(bool async)
214+void AccountsService::setFailedLogins(uint failedLogins)
200215{
201− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
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− }
216+ setProperty(IFACE_UNITY_PRIVATE, PROP_FAILED_LOGINS, failedLogins);
226217}
227218
228−void AccountsService::updateBackgroundFile(bool async)
229−{
230− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
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−}
219+// ====================================================
220+// Everything below this line is generic helper methods
221+// ====================================================
256222
257−void AccountsService::updateMouseCursorSpeed()
223+void AccountsService::emitChangedForProperty(const QString &interface, const QString &property)
258224{
259− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
260− QStringLiteral("com.ubuntu.AccountsService.Input"),
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− });
225+ QString signalName = m_properties[interface][property].signal;
226+ QMetaObject::invokeMethod(this, signalName.toUtf8().data());
278227}
279228
280−void AccountsService::updateTouchpadCursorSpeed()
229+QVariant AccountsService::getProperty(const QString &interface, const QString &property) const
281230{
282− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
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− });
231+ return m_properties[interface][property].value;
301232}
302233
303−void AccountsService::updateStatsWelcomeScreen(bool async)
234+void AccountsService::setProperty(const QString &interface, const QString &property, const QVariant &value)
304235{
305− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
306− QStringLiteral("com.ubuntu.touch.AccountsService.SecurityPrivacy"),
307− QStringLiteral("StatsWelcomeScreen"));
308− QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
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;
236+ if (m_properties[interface][property].value != value) {
237+ m_properties[interface][property].value = value;
238+ m_service->setUserPropertyAsync(m_user, interface, property, value);
239+ emitChangedForProperty(interface, property);
329240 }
330241}
331242
332−void AccountsService::updatePasswordDisplayHint(bool async)
243+void AccountsService::updateCache(const QString &interface, const QString &property, const QVariant &value)
333244{
334− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
335− QStringLiteral("com.ubuntu.AccountsService.SecurityPrivacy"),
336− QStringLiteral("PasswordDisplayHint"));
337− QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
338−
339− connect(watcher, &QDBusPendingCallWatcher::finished,
340− this, [this](QDBusPendingCallWatcher* watcher) {
341−
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();
245+ PropertyInfo &info = m_properties[interface][property];
246+
247+ if (info.proxyInterface) {
248+ QVariant finalValue;
249+ if (info.proxyConverter) {
250+ finalValue = info.proxyConverter(value);
251+ } else {
252+ finalValue = value;
353253 }
354− });
355− if (!async) {
356− watcher->waitForFinished();
357− delete watcher;
254+ info.proxyInterface->asyncCall(info.proxyMethod, finalValue);
255+ return; // don't bother saving a copy
358256 }
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− }
377257
378− const uint failedLogins = reply.value().toUInt();
379− if (m_failedLogins != failedLogins) {
380− m_failedLogins = failedLogins;
381− Q_EMIT failedLoginsChanged();
382− }
383− });
384− if (!async) {
385− watcher->waitForFinished();
386− delete watcher;
258+ if (info.value != value) {
259+ info.value = value;
260+ emitChangedForProperty(interface, property);
387261 }
388262}
389263
390−void AccountsService::updateHereEnabled(bool async)
264+void AccountsService::updateProperty(const QString &interface, const QString &property)
391265{
392266 QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
393− QStringLiteral("com.ubuntu.location.providers.here.AccountsService"),
394− QStringLiteral("LicenseAccepted"));
267+ interface,
268+ property);
395269 QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
396270
397271 connect(watcher, &QDBusPendingCallWatcher::finished,
398− this, [this](QDBusPendingCallWatcher* watcher) {
272+ this, [this, interface, property](QDBusPendingCallWatcher* watcher) {
399273
400274 QDBusPendingReply<QVariant> reply = *watcher;
401275 watcher->deleteLater();
402276 if (reply.isError()) {
403− qWarning() << "Failed to get 'LicenseAccepted' property - " << reply.error().message();
277+ qWarning() << "Failed to get '" << property << "' property:" << reply.error().message();
404278 return;
405279 }
406280
407− const bool hereEnabled = reply.value().toBool();
408− if (m_hereEnabled != hereEnabled) {
409− m_hereEnabled = hereEnabled;
410− Q_EMIT hereEnabledChanged();
411− }
281+ updateCache(interface, property, reply.value());
412282 });
413− if (!async) {
414− watcher->waitForFinished();
415− delete watcher;
416− }
417283}
418284
419−void AccountsService::updateHereLicensePath(bool async)
285+void AccountsService::updateAllProperties(const QString &interface, bool async)
420286{
421− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
422− QStringLiteral("com.ubuntu.location.providers.here.AccountsService"),
423− QStringLiteral("LicenseBasePath"));
287+ QDBusPendingCall pendingReply = m_service->getAllPropertiesAsync(m_user,
288+ interface);
424289 QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
425290
426291 connect(watcher, &QDBusPendingCallWatcher::finished,
427− this, [this](QDBusPendingCallWatcher* watcher) {
292+ this, [this, interface](QDBusPendingCallWatcher* watcher) {
428293
429− QDBusPendingReply<QVariant> reply = *watcher;
294+ QDBusPendingReply< QHash<QString, QVariant> > reply = *watcher;
430295 watcher->deleteLater();
431296 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();
433298 return;
434299 }
435300
436− QString hereLicensePath = reply.value().toString();
437− if (hereLicensePath.isEmpty() || !QFile::exists(hereLicensePath))
438− hereLicensePath = QLatin1String("");
439−
440− if (m_hereLicensePath.isNull() || m_hereLicensePath != hereLicensePath) {
441− m_hereLicensePath = hereLicensePath;
442− Q_EMIT hereLicensePathChanged();
301+ auto valueHash = reply.value();
302+ auto i = valueHash.constBegin();
303+ while (i != valueHash.constEnd()) {
304+ updateCache(interface, i.key(), i.value());
305+ ++i;
443306 }
444307 });
445308 if (!async) {
446309 watcher->waitForFinished();
447− delete watcher;
448310 }
449311}
450312
451−uint AccountsService::failedLogins() const
313+void AccountsService::registerProxy(const QString &interface, const QString &property, QDBusInterface *iface, const QString &method, ProxyConverter converter)
452314{
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;
454320}
455321
456−void AccountsService::setFailedLogins(uint failedLogins)
322+void AccountsService::registerProperty(const QString &interface, const QString &property, const QString &signal)
457323{
458− if (m_failedLogins != failedLogins) {
459− m_failedLogins = failedLogins;
460− m_service->setUserPropertyAsync(m_user, QStringLiteral("com.canonical.unity.AccountsService.Private"), QStringLiteral("FailedLogins"), failedLogins);
461−
462− Q_EMIT failedLoginsChanged();
463− }
324+ m_properties[interface][property] = PropertyInfo();
325+ m_properties[interface][property].signal = signal;
464326}
465327
466328void AccountsService::onPropertiesChanged(const QString &user, const QString &interface, const QStringList &changed)
@@ -469,42 +331,13 @@ void AccountsService::onPropertiesChanged(const QString &user, const QString &in
469331 return;
470332 }
471333
472− if (interface == QLatin1String("com.canonical.unity.AccountsService")) {
473− if (changed.contains(QStringLiteral("demo-edges"))) {
474− updateDemoEdges();
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"))) {
496− updateEnableLauncherWhileLocked();
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();
334+ auto propHash = m_properties.value(interface);
335+ auto i = propHash.constBegin();
336+ while (i != propHash.constEnd()) {
337+ if (changed.contains(i.key())) {
338+ updateProperty(interface, i.key());
507339 }
340+ ++i;
508341 }
509342}
510343
@@ -514,6 +347,20 @@ void AccountsService::onMaybeChanged(const QString &user)
514347 return;
515348 }
516349
517− // Standard properties might have changed
518− updateBackgroundFile();
350+ // Any of the standard properties might have changed!
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+ }
519366}
plugins/AccountsService/AccountsService.h+25−20
@@ -19,8 +19,10 @@
1919#ifndef UNITY_ACCOUNTSSERVICE_H
2020#define UNITY_ACCOUNTSSERVICE_H
2121
22+#include <QHash>
2223#include <QObject>
2324#include <QString>
25+#include <QVariant>
2426
2527class AccountsServiceDBusAdaptor;
2628class QDBusInterface;
@@ -109,30 +111,33 @@ private Q_SLOTS:
109111 void onMaybeChanged(const QString &user);
110112
111113private:
112− void updateDemoEdges(bool async = true);
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);
114+ typedef QVariant (*ProxyConverter)(const QVariant &);
123115
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;
124138 AccountsServiceDBusAdaptor *m_service;
125139 QDBusInterface *m_unityInput;
126140 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;
136141};
137142
138143#endif
plugins/AccountsService/AccountsServiceDBusAdaptor.cpp+11−4
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -12,8 +12,6 @@
1212 *
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Author: Michael Terry <michael.terry@canonical.com>
1715 */
1816
1917#include "AccountsServiceDBusAdaptor.h"
@@ -37,6 +35,15 @@ AccountsServiceDBusAdaptor::AccountsServiceDBusAdaptor(QObject* parent)
3735 connection, this);
3836}
3937
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+
4047QDBusPendingReply<QVariant> AccountsServiceDBusAdaptor::getUserPropertyAsync(const QString &user, const QString &interface, const QString &property)
4148{
4249 QDBusInterface *iface = getUserInterface(user);
@@ -80,7 +87,7 @@ void AccountsServiceDBusAdaptor::maybeChangedSlot()
8087 m_ignoreNextChanged = false;
8188}
8289
83−QString AccountsServiceDBusAdaptor::getUserForPath(const QString &path)
90+QString AccountsServiceDBusAdaptor::getUserForPath(const QString &path) const
8491{
8592 QMap<QString, QDBusInterface *>::const_iterator i;
8693 for (i = m_users.constBegin(); i != m_users.constEnd(); ++i) {
plugins/AccountsService/AccountsServiceDBusAdaptor.h+5−6
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -12,8 +12,6 @@
1212 *
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors: Michael Terry <michael.terry@canonical.com>
1715 */
1816
1917#ifndef UNITY_ACCOUNTSSERVICEDBUSADAPTOR_H
@@ -35,8 +33,9 @@ public:
3533 explicit AccountsServiceDBusAdaptor(QObject *parent = 0);
3634 ~AccountsServiceDBusAdaptor() = default;
3735
38− Q_INVOKABLE 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);
36+ QDBusPendingReply<QVariantMap> getAllPropertiesAsync(const QString &user, const QString &interface);
37+ QDBusPendingReply<QVariant> getUserPropertyAsync(const QString &user, const QString &interface, const QString &property);
38+ QDBusPendingCall setUserPropertyAsync(const QString &user, const QString &interface, const QString &property, const QVariant &value);
4039
4140Q_SIGNALS:
4241 void propertiesChanged(const QString &user, const QString &interface, const QStringList &changed);
@@ -48,7 +47,7 @@ private Q_SLOTS:
4847
4948private:
5049 QDBusInterface *getUserInterface(const QString &user);
51− QString getUserForPath(const QString &path);
50+ QString getUserForPath(const QString &path) const;
5251
5352 QDBusInterface *m_accountsManager;
5453 QMap<QString, QDBusInterface *> m_users;
plugins/Dash/AudioProgressBar.qml+1
@@ -31,6 +31,7 @@ Item {
3131 anchors { left: parent.left; right: parent.right }
3232 height: units.dp(6)
3333 source: "graphics/music_progress_bg.png"
34+ asynchronous: true
3435 sourceSize.width: width
3536 sourceSize.height: height
3637 }
plugins/Dash/CardCreator.js+69−34
@@ -18,12 +18,13 @@
1818
1919// %1 is the template["card-background"]["elements"][0]
2020// %2 is the template["card-background"]["elements"][1]
21−// %3 is the template["card-background"] string
21+// %3 is whether the loader should be asynchronous or not
22+// %4 is the template["card-background"] string
2223var kBackgroundLoaderCode = 'Loader {\n\
2324 id: backgroundLoader; \n\
2425 objectName: "backgroundLoader"; \n\
2526 anchors.fill: parent; \n\
26− asynchronous: root.asynchronous; \n\
27+ asynchronous: %3; \n\
2728 visible: status == Loader.Ready; \n\
2829 sourceComponent: UbuntuShape { \n\
2930 objectName: "background"; \n\
@@ -46,7 +47,7 @@ var kBackgroundLoaderCode = 'Loader {\n\
4647 objectName: "backgroundImage"; \n\
4748 source: { \n\
4849 if (cardData && typeof cardData["background"] === "string") return cardData["background"]; \n\
49− else return %3; \n\
50+ else return %4; \n\
5051 } \n\
5152 } \n\
5253 function getColor(index) { \n\
@@ -63,8 +64,9 @@ var kBackgroundLoaderCode = 'Loader {\n\
6364// %3 is used as image height
6465// %4 is used for artShapeSource.hideSource and inner Loader visible
6566// %5 is used as aspect ratio fallback
66−// %6 is injected as code to artImage
67−// %7 is used as image fallback
67+// %6 is whether the loader should be asynchronous or not
68+// %7 is injected as code to artImage
69+// %8 is used as image fallback
6870var kArtShapeHolderCode = 'Item { \n\
6971 id: artShapeHolder; \n\
7072 height: root.fixedArtShapeSize.height > 0 ? root.fixedArtShapeSize.height : artShapeLoader.height; \n\
@@ -73,9 +75,9 @@ var kArtShapeHolderCode = 'Item { \n\
7375 Loader { \n\
7476 id: artShapeLoader; \n\
7577 objectName: "artShapeLoader"; \n\
76− readonly property string cardArt: cardData && cardData["art"] || %7; \n\
78+ readonly property string cardArt: cardData && cardData["art"] || %8; \n\
7779 active: cardArt != ""; \n\
78− asynchronous: root.asynchronous; \n\
80+ asynchronous: %6; \n\
7981 visible: status == Loader.Ready; \n\
8082 sourceComponent: Item { \n\
8183 id: artShape; \n\
@@ -132,10 +134,10 @@ var kArtShapeHolderCode = 'Item { \n\
132134 id: artImage; \n\
133135 objectName: "artImage"; \n\
134136 source: artShapeLoader.cardArt; \n\
135− asynchronous: root.asynchronous; \n\
137+ asynchronous: %6; \n\
136138 width: %2; \n\
137139 height: %3; \n\
138− %6 \n\
140+ %7 \n\
139141 } \n\
140142 } \n\
141143 } \n\
@@ -144,6 +146,7 @@ var kArtShapeHolderCode = 'Item { \n\
144146// %1 is anchors.fill
145147// %2 is width
146148// %3 is height
149+// %4 is whether the icon should be asynchronous or not
147150var kAudioButtonCode = 'AbstractButton { \n\
148151 id: audioButton; \n\
149152 anchors.fill: %1; \n\
@@ -169,6 +172,7 @@ var kAudioButtonCode = 'AbstractButton { \n\
169172 opacity: 0.9; \n\
170173 name: DashAudioPlayer.playing && AudioUrlComparer.compare(parent.source, DashAudioPlayer.currentSource) ? "media-playback-pause" : "media-playback-start"; \n\
171174 color: "white"; \n\
175+ asynchronous: %4; \n\
172176 } \n\
173177 onClicked: { \n\
174178 if (AudioUrlComparer.compare(source, DashAudioPlayer.currentSource)) { \n\
@@ -187,12 +191,14 @@ var kAudioButtonCode = 'AbstractButton { \n\
187191 } \n\
188192 }';
189193
194+// %1 is whether the loader should be asynchronous or not
195+// %2 is the header height code
190196var kOverlayLoaderCode = 'Loader { \n\
191197 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\
193199 anchors.fill: artShapeHolder; \n\
194200 active: artShapeLoader.active && artShapeLoader.item && artShapeLoader.item.image.status === Image.Ready || false; \n\
195− asynchronous: root.asynchronous; \n\
201+ asynchronous: %1; \n\
196202 visible: showHeader && status == Loader.Ready; \n\
197203 sourceComponent: UbuntuShapeOverlay { \n\
198204 id: overlay; \n\
@@ -211,17 +217,19 @@ function kHeaderRowCodeGenerator() {
211217 objectName: "outerRow"; \n\
212218 property real margins: units.gu(1); \n\
213219 spacing: margins; \n\
214− height: root.fixedHeaderHeight != -1 ? root.fixedHeaderHeight : implicitHeight; \n\
220+ %2\
215221 anchors { %1 } \n\
216222 anchors.right: parent.right; \n\
217223 anchors.margins: margins; \n\
218224 anchors.rightMargin: 0; \n\
219225 data: [ \n\
220− %2 \n\
226+ %3 \n\
221227 ] \n\
222228 }\n';
223229 var args = Array.prototype.slice.call(arguments);
224− var code = kHeaderRowCodeTemplate.arg(args.shift()).arg(args.join(',\n'));
230+ var isCardTool = args.shift();
231+ var heightCode = isCardTool ? "" : "height: root.fixedHeaderHeight; \n";
232+ var code = kHeaderRowCodeTemplate.arg(args.shift()).arg(heightCode).arg(args.join(',\n'));
225233 return code;
226234}
227235
@@ -242,10 +250,11 @@ function kHeaderContainerCodeGenerator() {
242250}
243251
244252// %1 is used as anchors of mascotShapeLoader
253+// %2 is whether the loader should be asynchronous or not
245254var kMascotShapeLoaderCode = 'Loader { \n\
246255 id: mascotShapeLoader; \n\
247256 objectName: "mascotShapeLoader"; \n\
248− asynchronous: root.asynchronous; \n\
257+ asynchronous: %2; \n\
249258 active: mascotImage.status === Image.Ready; \n\
250259 visible: showHeader && active && status == Loader.Ready; \n\
251260 width: units.gu(6); \n\
@@ -275,6 +284,7 @@ var kMascotImageCode = 'CroppedImageMinimumSourceSize { \n\
275284// %2 is used as color of titleLabel
276285// %3 is used as extra condition for visible of titleLabel
277286// %4 is used as title width
287+// %5 is used as horizontal alignment
278288var kTitleLabelCode = 'Label { \n\
279289 id: titleLabel; \n\
280290 objectName: "titleLabel"; \n\
@@ -289,7 +299,7 @@ var kTitleLabelCode = 'Label { \n\
289299 width: %4; \n\
290300 text: root.title; \n\
291301 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal; \n\
292− horizontalAlignment: root.titleAlignment; \n\
302+ horizontalAlignment: %5; \n\
293303 }\n';
294304
295305// %1 is used as extra anchors of emblemIcon
@@ -398,7 +408,7 @@ function sanitizeColor(colorString) {
398408 return colorString;
399409}
400410
401−function cardString(template, components) {
411+function cardString(template, components, isCardTool) {
402412 var code;
403413
404414 var templateInteractive = (template == null ? true : (template["non-interactive"] !== undefined ? !template["non-interactive"] : true)) ? "true" : "false";
@@ -410,16 +420,16 @@ function cardString(template, components) {
410420 property string backgroundShapeStyle: "inset"; \n\
411421 property real fontScale: 1.0; \n\
412422 property var scopeStyle: null; \n\
413− property int titleAlignment: Text.AlignLeft; \n\
414− property int fixedHeaderHeight: -1; \n\
423+ %2\
415424 property size fixedArtShapeSize: Qt.size(-1, -1); \n\
416425 readonly property string title: cardData && cardData["title"] || ""; \n\
417− property bool asynchronous: true; \n\
418426 property bool showHeader: true; \n\
419427 implicitWidth: childrenRect.width; \n\
420428 enabled: %1; \n\
421429 \n'.arg(templateInteractive);
422430
431+ code = code.arg(isCardTool ? "" : "property int fixedHeaderHeight: -1; \n");
432+
423433 var hasArt = components["art"] && components["art"]["field"] || false;
424434 var hasSummary = components["summary"] || false;
425435 var isConciergeMode = components["art"] && components["art"]["conciergeMode"] || false;
@@ -435,6 +445,7 @@ function cardString(template, components) {
435445 var hasHeaderRow = hasMascot && hasTitle;
436446 var hasAttributes = hasTitle && components["attributes"] && components["attributes"]["field"] || false;
437447 var isAudio = template["quick-preview-type"] === "audio";
448+ var asynchronous = isCardTool ? "false" : "true";
438449
439450 if (isAudio) {
440451 // For now we only support audio cards with [optional] art, title, subtitle
@@ -468,7 +479,7 @@ function cardString(template, components) {
468479 backgroundElements1 = '"%1"'.arg(element1);
469480 }
470481 }
471− code += kBackgroundLoaderCode.arg(backgroundElements0).arg(backgroundElements1).arg(templateCardBackground);
482+ code += kBackgroundLoaderCode.arg(backgroundElements0).arg(backgroundElements1).arg(asynchronous).arg(templateCardBackground);
472483 }
473484
474485 if (hasArt) {
@@ -497,23 +508,31 @@ function cardString(template, components) {
497508 if (isNaN(aspectRatio)) {
498509 aspectRatio = 1;
499510 }
500− var fallback = components["art"] && components["art"]["fallback"] || "";
511+ var fallback = !isCardTool && components["art"] && components["art"]["fallback"] || "";
501512 fallback = encodeURI(fallback);
502513 var fallbackStatusCode = "";
503514 var fallbackURICode = '""';
504515 if (fallback !== "") {
505516 // fallbackStatusCode has %6 in it because we want to substitute it for fallbackURICode
506− // which in kArtShapeHolderCode is %7
507− fallbackStatusCode += 'onStatusChanged: if (status === Image.Error) source = %7;';
517+ // which in kArtShapeHolderCode is %8
518+ fallbackStatusCode += 'onStatusChanged: if (status === Image.Error) source = %8;';
508519 fallbackURICode = 'decodeURI("%1")'.arg(fallback);
509520 }
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);
511529 } else {
512530 code += 'readonly property size artShapeSize: Qt.size(-1, -1);\n'
513531 }
514532
515533 if (headerAsOverlay) {
516− code += kOverlayLoaderCode;
534+ var headerHeightCode = isCardTool ? "headerHeight" : "root.fixedHeaderHeight";
535+ code += kOverlayLoaderCode.arg(asynchronous).arg(headerHeightCode);
517536 }
518537
519538 var headerVerticalAnchors;
@@ -595,11 +614,11 @@ function cardString(template, components) {
595614 }
596615
597616 if (useMascotShape) {
598− mascotShapeCode = kMascotShapeLoaderCode.arg(mascotAnchors);
617+ mascotShapeCode = kMascotShapeLoaderCode.arg(mascotAnchors).arg(asynchronous);
599618 }
600619
601620 var mascotImageVisible = useMascotShape ? 'false' : 'showHeader';
602− var fallback = components["mascot"] && components["mascot"]["fallback"] || "";
621+ var fallback = !isCardTool && components["mascot"] && components["mascot"]["fallback"] || "";
603622 fallback = encodeURI(fallback);
604623 var fallbackStatusCode = "";
605624 var fallbackURICode = '""';
@@ -715,9 +734,24 @@ function cardString(template, components) {
715734 }
716735 }
717736
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+
718752 // code for different elements
719753 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);
721755 var subtitleCode;
722756 var attributesCode;
723757
@@ -759,7 +793,7 @@ function cardString(template, components) {
759793 if (mascotShapeCode != '') {
760794 rowCode.unshift(mascotShapeCode);
761795 }
762− code += kHeaderRowCodeGenerator(headerVerticalAnchors + headerLeftAnchor, rowCode)
796+ code += kHeaderRowCodeGenerator(isCardTool, headerVerticalAnchors + headerLeftAnchor, rowCode)
763797 } else {
764798 code += mascotShapeCode + mascotCode + titleSubtitleCode;
765799 }
@@ -783,9 +817,10 @@ function cardString(template, components) {
783817 } else {
784818 audioButtonAnchorsFill = 'undefined';
785819 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)';
787822 }
788− code += kAudioButtonCode.arg(audioButtonAnchorsFill).arg(audioButtonWidth).arg(audioButtonHeight);
823+ code += kAudioButtonCode.arg(audioButtonAnchorsFill).arg(audioButtonWidth).arg(audioButtonHeight).arg(asynchronous);
789824 }
790825
791826 if (hasSummary) {
@@ -854,13 +889,13 @@ function cardString(template, components) {
854889 return code;
855890}
856891
857−function createCardComponent(parent, template, components, identifier) {
892+function createCardComponent(parent, template, components, isCardTool, identifier) {
858893 var imports = 'import QtQuick 2.4; \n\
859894 import Ubuntu.Components 1.3; \n\
860895 import Ubuntu.Settings.Components 0.1; \n\
861896 import Dash 0.1;\n\
862897 import Utils 0.1;\n';
863− var card = cardString(template, components);
898+ var card = cardString(template, components, isCardTool);
864899 var code = imports + 'Component {\n' + card + '}\n';
865900
866901 try {
plugins/Dash/CardCreatorCache.qml+3−3
@@ -23,16 +23,16 @@ QtObject {
2323
2424 property var cache: new Object();
2525
26− function getCardComponent(template, components) {
26+ function getCardComponent(template, components, isCardTool) {
2727 if (template === undefined || components === undefined)
2828 return undefined;
2929
3030 var tString = JSON.stringify(template);
3131 var cString = JSON.stringify(components);
32− var allString = tString + cString;
32+ var allString = tString + cString + isCardTool;
3333 var component = cache[allString];
3434 if (component === undefined) {
35− component = CardCreator.createCardComponent(root, template, components, allString);
35+ component = CardCreator.createCardComponent(root, template, components, isCardTool, allString);
3636 cache[allString] = component;
3737 }
3838 return component;
plugins/Dash/plugin.cpp+6−6
@@ -28,12 +28,12 @@
2828static QUrl oauthCleanedUrl(QUrl u)
2929{
3030 QUrlQuery q(u);
31− q.removeQueryItem("oauth_nonce");
32− q.removeQueryItem("oauth_timestamp");
33− q.removeQueryItem("oauth_consumer_key");
34− q.removeQueryItem("oauth_signature_method");
35− q.removeQueryItem("oauth_version");
36− q.removeQueryItem("oauth_signature");
31+ q.removeQueryItem(QStringLiteral("oauth_nonce"));
32+ q.removeQueryItem(QStringLiteral("oauth_timestamp"));
33+ q.removeQueryItem(QStringLiteral("oauth_consumer_key"));
34+ q.removeQueryItem(QStringLiteral("oauth_signature_method"));
35+ q.removeQueryItem(QStringLiteral("oauth_version"));
36+ q.removeQueryItem(QStringLiteral("oauth_signature"));
3737 u.setQuery(q);
3838 return u;
3939}
plugins/GlobalShortcut/globalshortcutregistry.cpp+4−4
@@ -35,13 +35,13 @@ GlobalShortcutList GlobalShortcutRegistry::shortcuts() const
3535
3636bool GlobalShortcutRegistry::hasShortcut(const QVariant &seq) const
3737{
38− return m_shortcuts.keys().contains(seq);
38+ return m_shortcuts.contains(seq);
3939}
4040
4141void GlobalShortcutRegistry::addShortcut(const QVariant &seq, GlobalShortcut *sc)
4242{
4343 if (sc) {
44− if (!m_shortcuts.keys().contains(seq)) { // create a new entry
44+ if (!m_shortcuts.contains(seq)) { // create a new entry
4545 m_shortcuts.insert(seq, {sc});
4646 } else { // append to an existing one
4747 auto shortcuts = m_shortcuts[seq];
@@ -75,8 +75,8 @@ bool GlobalShortcutRegistry::eventFilter(QObject *obj, QEvent *event)
7575
7676 if (event->type() == QEvent::KeyPress) {
7777 QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
78− QKeySequence seq = QKeySequence(keyEvent->key() + keyEvent->modifiers());
79− if (m_shortcuts.keys().contains(seq)) {
78+ int seq = keyEvent->key() + keyEvent->modifiers();
79+ if (m_shortcuts.contains(seq)) {
8080 const auto shortcuts = m_shortcuts.value(seq);
8181 Q_FOREACH(const auto &shortcut, shortcuts) {
8282 if (shortcut) {
plugins/IntegratedLightDM/liblightdm/CMakeLists.txt+16−3
@@ -5,13 +5,16 @@ set(LibLightDM_SOURCES
55 UsersModel.cpp
66 GreeterPrivate.cpp
77 UsersModelPrivate.cpp
8+ ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsServiceDBusAdaptor.cpp
89 ${CMAKE_SOURCE_DIR}/plugins/Utils/qvariantlistmodel.cpp
910 )
1011
1112add_library(integratedLightDM STATIC ${LibLightDM_SOURCES})
13+add_library(integratedLightDMSession STATIC ${LibLightDM_SOURCES})
1214add_library(MockLightDM-demo-shared SHARED ${LibLightDM_SOURCES})
1315
1416include_directories(
17+ ${CMAKE_SOURCE_DIR}/plugins/AccountsService
1518 ${CMAKE_CURRENT_BINARY_DIR}
1619 ${GLIB_INCLUDE_DIRS}
1720 ${LIBUSERMETRICSOUTPUT_INCLUDE_DIRS}
@@ -22,17 +25,27 @@ target_link_libraries(integratedLightDM
2225 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
2326 -lpam
2427)
28+target_link_libraries(integratedLightDMSession
29+ ${GLIB_LIBRARIES}
30+ ${LIBUSERMETRICSOUTPUT_LDFLAGS}
31+ -lpam
32+)
2533target_link_libraries(MockLightDM-demo-shared
2634 ${GLIB_LIBRARIES}
2735 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
2836 -lpam
2937)
3038
31−qt5_use_modules(integratedLightDM Concurrent Gui)
32−qt5_use_modules(MockLightDM-demo-shared Concurrent Gui)
39+qt5_use_modules(integratedLightDM Concurrent DBus Gui)
40+qt5_use_modules(integratedLightDMSession Concurrent DBus Gui)
41+qt5_use_modules(MockLightDM-demo-shared Concurrent DBus Gui)
3342
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")
3547set_target_properties(MockLightDM-demo-shared PROPERTIES
48+ COMPILE_FLAGS "-DSM_BUSNAME=systemBus"
3649 OUTPUT_NAME lightdm-qt5-2)
3750
3851install(TARGETS MockLightDM-demo-shared
plugins/IntegratedLightDM/liblightdm/UsersModel.cpp+4−18
@@ -54,24 +54,10 @@ UsersModel::UsersModel(QObject *parent) :
5454 roles[ImagePathRole] = "imagePath";
5555 setRoleNames(roles);
5656
57− // Now modify our mock user backgrounds
58− QDir bgdir = QDir(QStringLiteral("/usr/share/demo-assets/shell/backgrounds/"));
59− QStringList backgrounds = bgdir.entryList(QDir::Files | QDir::NoDotAndDotDot);
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;
57+ connect(d_ptr, &UsersModelPrivate::dataChanged, this, [this](int i) {
58+ QModelIndex index = createIndex(i, 0);
59+ Q_EMIT dataChanged(index, index);
60+ });
7561}
7662
7763int UsersModel::rowCount(const QModelIndex &parent) const
plugins/IntegratedLightDM/liblightdm/UsersModel.h+1−1
@@ -41,7 +41,7 @@ class Q_DECL_EXPORT UsersModel : public QAbstractListModel
4141
4242public:
4343 explicit UsersModel(QObject *parent = 0);
44− virtual ~UsersModel();
44+ virtual ~UsersModel() = default;
4545
4646 enum UserModelRoles {NameRole = Qt::UserRole,
4747 RealNameRole,
plugins/IntegratedLightDM/liblightdm/UsersModelPrivate.cpp+43−9
@@ -18,7 +18,11 @@
1818
1919#include "UsersModelPrivate.h"
2020
21+#include "AccountsServiceDBusAdaptor.h"
22+#include "UsersModel.h"
23+
2124#include <glib.h>
25+#include <QDebug>
2226#include <QDir>
2327#include <QSettings>
2428#include <QStringList>
@@ -27,7 +31,9 @@ namespace QLightDM
2731{
2832
2933UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
30− : q_ptr(parent)
34+ : QObject(parent),
35+ q_ptr(parent),
36+ m_service(new AccountsServiceDBusAdaptor(this))
3137{
3238 QFileInfo demoFile(QDir::homePath() + "/.unity8-greeter-demo");
3339 QString currentUser = g_get_user_name();
@@ -43,15 +49,43 @@ UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
4349 entries.append({user, name, 0, 0, false, false, 0, 0});
4450 }
4551 } else {
46− // If we were using the actual liblightdm, we could just ask it
47− // for the user's real name. But we aren't. We *should* ask
48− // AccountsService for the real name, like liblightdm does internally,
49− // but this is close enough since AS and passwd are always in sync.
50− QString realName = QString::fromUtf8(g_get_real_name()); // gets name from passwd entry
51− if (realName == QStringLiteral("Unknown")) { // glib doesn't translate this string
52− realName.clear();
52+ entries.append({currentUser, 0, 0, 0, false, false, 0, 0});
53+
54+ connect(m_service, &AccountsServiceDBusAdaptor::maybeChanged,
55+ this, [this](const QString &user) {
56+ if (user == entries[0].username) {
57+ updateName(true);
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);
5385 }
54− entries.append({currentUser, realName, 0, 0, false, false, 0, 0});
86+ });
87+ if (!async) {
88+ watcher->waitForFinished();
5589 }
5690}
5791
plugins/IntegratedLightDM/liblightdm/UsersModelPrivate.h+15−3
@@ -19,8 +19,11 @@
1919#ifndef UNITY_MOCK_USERSMODEL_PRIVATE_H
2020#define UNITY_MOCK_USERSMODEL_PRIVATE_H
2121
22−#include <QtCore/QList>
23−#include <QtCore/QString>
22+#include <QList>
23+#include <QObject>
24+#include <QString>
25+
26+class AccountsServiceDBusAdaptor;
2427
2528namespace QLightDM
2629{
@@ -39,19 +42,28 @@ public:
3942 QString infographic;
4043};
4144
42−class UsersModelPrivate
45+class UsersModelPrivate : public QObject
4346{
47+ Q_OBJECT
48+
4449public:
4550 explicit UsersModelPrivate(UsersModel *parent = 0);
4651 virtual ~UsersModelPrivate() = default;
4752
4853 QList<Entry> entries;
4954
55+Q_SIGNALS:
56+ void dataChanged(int);
57+
5058protected:
5159 UsersModel * const q_ptr;
5260
5361private:
5462 Q_DECLARE_PUBLIC(UsersModel)
63+
64+ void updateName(bool async);
65+
66+ AccountsServiceDBusAdaptor *m_service;
5567};
5668
5769}
plugins/Unity/Indicators/indicatorsmanager.cpp+2−2
@@ -114,7 +114,7 @@ void IndicatorsManager::loadFile(const QFileInfo& file_info)
114114 QSettings indicator_settings(file_info.absoluteFilePath(), QSettings::IniFormat, this);
115115 const QString name = indicator_settings.value(QStringLiteral("Indicator Service/Name")).toString();
116116
117− if (m_platform.isPC() && name == "indicator-keyboard") {
117+ if (m_platform.isPC() && name == QLatin1String("indicator-keyboard")) {
118118 return; // convergence: skip this indicator until it works in Mir
119119 }
120120
@@ -291,7 +291,7 @@ Indicator::Ptr IndicatorsManager::indicator(const QString& indicator_name)
291291 // The rest of the indicators respect their default profile (which is "phone", even on desktop PCs)
292292 if ((new_indicator->identifier() == QStringLiteral("indicator-session"))
293293 || (new_indicator->identifier() == QStringLiteral("indicator-power") && m_platform.isPC())) {
294− new_indicator->setProfile("desktop");
294+ new_indicator->setProfile(QStringLiteral("desktop"));
295295 } else {
296296 new_indicator->setProfile(m_profile);
297297 }
plugins/Unity/Indicators/rootstateparser.h+1
@@ -23,6 +23,7 @@
2323
2424class UNITYINDICATORS_EXPORT RootStateParser : public ActionStateParser
2525{
26+Q_OBJECT
2627public:
2728 RootStateParser(QObject* parent = nullptr);
2829 virtual QVariant toQVariant(GVariant* state) const override;
plugins/Unity/Launcher/desktopfilehandler.cpp+2−2
@@ -146,9 +146,9 @@ QString DesktopFileHandler::icon() const
146146 QString iconString = settings.value(QStringLiteral("Icon")).toString();
147147 QString pathString = settings.value(QStringLiteral("Path")).toString();
148148
149− if (QFileInfo(iconString).exists()) {
149+ if (QFileInfo::exists(iconString)) {
150150 return QFileInfo(iconString).absoluteFilePath();
151− } else if (QFileInfo(pathString + '/' + iconString).exists()) {
151+ } else if (QFileInfo::exists(pathString + '/' + iconString)) {
152152 return pathString + '/' + iconString;
153153 }
154154 return "image://theme/" + iconString;
plugins/Unity/Launcher/launcheritem.cpp+1
@@ -37,6 +37,7 @@ LauncherItem::LauncherItem(const QString &appId, const QString &name, const QStr
3737 m_alerting(false),
3838 m_quickList(new QuickListModel(this))
3939{
40+ Q_ASSERT(parent != nullptr);
4041 QuickListEntry nameAction;
4142 nameAction.setActionId(QStringLiteral("launch_item"));
4243 nameAction.setText(m_name);
plugins/Unity/Launcher/launcheritem.h+1−1
@@ -32,7 +32,7 @@ class LauncherItem: public LauncherItemInterface
3232{
3333 Q_OBJECT
3434public:
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);
3636
3737 QString appId() const override;
3838 QString name() const override;
plugins/Unity/Launcher/launchermodel.cpp+15−5
@@ -103,7 +103,7 @@ void LauncherModel::setAlerting(const QString &appId, bool alerting) {
103103 LauncherItem *item = m_list.at(index);
104104 if (!item->focused()) {
105105 item->setAlerting(alerting);
106− Q_EMIT dataChanged(modelIndex, modelIndex, QVector<int>() << RoleAlerting);
106+ Q_EMIT dataChanged(modelIndex, modelIndex, {RoleAlerting});
107107 }
108108 }
109109}
@@ -389,7 +389,8 @@ void LauncherModel::countVisibleChanged(const QString &appId, bool countVisible)
389389 if (countVisible && desktopFile.isValid()) {
390390 LauncherItem *item = new LauncherItem(appId,
391391 desktopFile.displayName(),
392− desktopFile.icon());
392+ desktopFile.icon(),
393+ this);
393394 item->setCountVisible(true);
394395 beginInsertRows(QModelIndex(), m_list.count(), m_list.count());
395396 m_list.append(item);
@@ -414,10 +415,19 @@ void LauncherModel::refresh()
414415 } else {
415416 int idx = m_list.indexOf(item);
416417 item->setName(desktopFile.displayName());
417− item->setIcon(desktopFile.icon());
418418 item->setPinned(item->pinned()); // update pinned text if needed
419419 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});
421431 }
422432 }
423433
@@ -489,7 +499,7 @@ void LauncherModel::alert(const QString &appId)
489499 if (idx >= 0) {
490500 LauncherItem *item = m_list.at(idx);
491501 setAlerting(item->appId(), true);
492− Q_EMIT dataChanged(index(idx), index(idx), QVector<int>() << RoleAlerting);
502+ Q_EMIT dataChanged(index(idx), index(idx), {RoleAlerting});
493503 }
494504}
495505
plugins/Unity/Launcher/launchermodel.h+1−1
@@ -38,7 +38,7 @@ class LauncherModel: public LauncherModelInterface
3838 Q_OBJECT
3939
4040public:
41− LauncherModel(QObject *parent = 0);
41+ LauncherModel(QObject *parent = nullptr);
4242 ~LauncherModel();
4343
4444 int rowCount(const QModelIndex &parent = QModelIndex()) const override;
plugins/Utils/CMakeLists.txt+1
@@ -23,6 +23,7 @@ set(QMLPLUGIN_SRC
2323 windowstatestorage.cpp
2424 timezoneFormatter.cpp
2525 inputeventgenerator.cpp
26+ deviceconfigparser.cpp
2627 plugin.cpp
2728 )
2829
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 @@
3737#include "timezoneFormatter.h"
3838#include "applicationsfiltermodel.h"
3939#include "inputeventgenerator.h"
40+#include "deviceconfigparser.h"
4041
4142static QObject *createWindowStateStorage(QQmlEngine *engine, QJSEngine *scriptEngine)
4243{
@@ -70,6 +71,7 @@ void UtilsPlugin::registerTypes(const char *uri)
7071 qmlRegisterType<ActiveFocusLogger>(uri, 0, 1, "ActiveFocusLogger");
7172 qmlRegisterType<ApplicationsFilterModel>(uri, 0, 1, "ApplicationsFilterModel");
7273 qmlRegisterType<InputEventGenerator>(uri, 0, 1, "InputEventGenerator");
74+ qmlRegisterType<DeviceConfigParser>(uri, 0, 1, "DeviceConfigParser");
7375}
7476
7577void UtilsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
po/aa.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2016-02-12 10:18+0000\n"
1212"Last-Translator: Charif AYFARAH <ayfarah@ymail.com>\n"
1313"Language-Team: Afar <aa@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr "Inkih alif"
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr "Goranto"
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr "Massosu"
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr ""
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
po/am.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-11-19 19:27+0000\n"
1212"Last-Translator: samson <Unknown>\n"
1313"Language-Team: Amharic <am@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -173,26 +173,26 @@ msgstr "አሁን እንደገና መገናኛ!"
173173msgid "Close all"
174174msgstr "ሁሉንም መዝጊያ"
175175
176−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
177177msgctxt "Button: Open the Ubuntu Store"
178178msgid "Store"
179179msgstr "ማስቀመጫ"
180180
181−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
182182msgctxt "Button: Start a search in the current dash scope"
183183msgid "Search"
184184msgstr "መፈለጊያ"
185185
186−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
187187msgctxt "Button: Show the current dash scope settings"
188188msgid "Settings"
189189msgstr "ማሰናጃዎች"
190190
191−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
192192msgid "Remove from Favorites"
193193msgstr "ከምወዳቸው ማስወገጃ"
194194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196196msgid "Add to Favorites"
197197msgstr "ወደምወዳቸው መጨመሪያ"
198198
@@ -423,14 +423,6 @@ msgctxt "Button: Call back on phone"
423423msgid "Call back"
424424msgstr "መልሶ መደወያ"
425425
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−
434426#: qml/Tutorial/TutorialBottom.qml:28
435427msgid "Open special menus"
436428msgstr "የተለዩ ዝርዝሮች መክፈቻ"
@@ -751,12 +743,18 @@ msgstr "%1 〉"
751743#~ msgid "Settings"
752744#~ msgstr "ማሰናጃ"
753745
746+#~ msgid "Unlock SIM"
747+#~ msgstr "ሲም መክፈቻ"
748+
754749#~ msgid ""
755750#~ "You have now mastered the edge gestures and can start using the "
756751#~ "phone<br><br>Tap on the screen to start"
757752#~ msgstr ""
758753#~ "አሁን የ ጠርዝ እንቅስቃሴን አውቀዋል እና መጀመር ይችላሉ ስልኩን መጠቀም <br><br>መመልከቻውን መታ ያድርጉ ለመጀመር"
759754
755+#~ msgid "Roaming"
756+#~ msgstr "ማዘዋወሪያ"
757+
760758#~ msgid "Restart"
761759#~ msgstr "እንደገና ማስጀመሪያ"
762760
po/ar.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-07-29 09:41+0000\n"
1212"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
1313"Language-Team: Arabic <ar@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
1818"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n"
2020"X-Generator: Launchpad (build 17936)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -180,26 +180,26 @@ msgstr ""
180180msgid "Close all"
181181msgstr ""
182182
183−#: qml/Dash/DashPageHeader.qml:266
183+#: qml/Dash/DashPageHeader.qml:270
184184msgctxt "Button: Open the Ubuntu Store"
185185msgid "Store"
186186msgstr "المتجر"
187187
188−#: qml/Dash/DashPageHeader.qml:273
188+#: qml/Dash/DashPageHeader.qml:277
189189msgctxt "Button: Start a search in the current dash scope"
190190msgid "Search"
191191msgstr "بحث"
192192
193−#: qml/Dash/DashPageHeader.qml:283
193+#: qml/Dash/DashPageHeader.qml:287
194194msgctxt "Button: Show the current dash scope settings"
195195msgid "Settings"
196196msgstr "الإعدادات"
197197
198−#: qml/Dash/DashPageHeader.qml:290
198+#: qml/Dash/DashPageHeader.qml:294
199199msgid "Remove from Favorites"
200200msgstr "حذف من المفضلات"
201201
202−#: qml/Dash/DashPageHeader.qml:290
202+#: qml/Dash/DashPageHeader.qml:294
203203msgid "Add to Favorites"
204204msgstr "إضافة إلى المفضلات"
205205
@@ -441,14 +441,6 @@ msgctxt "Button: Call back on phone"
441441msgid "Call back"
442442msgstr ""
443443
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−
452444#: qml/Tutorial/TutorialBottom.qml:28
453445msgid "Open special menus"
454446msgstr "فتح قوائم خاصة"
@@ -786,6 +778,9 @@ msgstr ""
786778#~ msgid "Please re-enter"
787779#~ msgstr "برجاء إعادة إدخالها"
788780
781+#~ msgid "Roaming"
782+#~ msgstr "التجوال"
783+
789784#~ msgid "Welcome to your Ubuntu phone."
790785#~ msgstr "مرحبا بك في أوبونتو للهواتف."
791786
@@ -794,3 +789,6 @@ msgstr ""
794789
795790#~ msgid "Your phone is now ready to use."
796791#~ msgstr "هاتفك جاهز الآن للاستخدام."
792+
793+#~ msgid "Unlock SIM"
794+#~ msgstr "فتح قفل بطاقة SIM"
po/ast.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2016-02-19 19:39+0000\n"
1212"Last-Translator: Xuacu Saturio <xuacusk8@gmail.com>\n"
1313"Language-Team: Asturian <ast@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -176,26 +176,26 @@ msgstr "Reconeutar agora."
176176msgid "Close all"
177177msgstr "Zarrar too"
178178
179−#: qml/Dash/DashPageHeader.qml:266
179+#: qml/Dash/DashPageHeader.qml:270
180180msgctxt "Button: Open the Ubuntu Store"
181181msgid "Store"
182182msgstr "Tienda"
183183
184−#: qml/Dash/DashPageHeader.qml:273
184+#: qml/Dash/DashPageHeader.qml:277
185185msgctxt "Button: Start a search in the current dash scope"
186186msgid "Search"
187187msgstr "Guetar"
188188
189−#: qml/Dash/DashPageHeader.qml:283
189+#: qml/Dash/DashPageHeader.qml:287
190190msgctxt "Button: Show the current dash scope settings"
191191msgid "Settings"
192192msgstr "Axustes"
193193
194−#: qml/Dash/DashPageHeader.qml:290
194+#: qml/Dash/DashPageHeader.qml:294
195195msgid "Remove from Favorites"
196196msgstr "Desaniciar de favoritos"
197197
198−#: qml/Dash/DashPageHeader.qml:290
198+#: qml/Dash/DashPageHeader.qml:294
199199msgid "Add to Favorites"
200200msgstr "Amestar a favoritos"
201201
@@ -425,14 +425,6 @@ msgctxt "Button: Call back on phone"
425425msgid "Call back"
426426msgstr "Devolver llamada"
427427
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−
436428#: qml/Tutorial/TutorialBottom.qml:28
437429msgid "Open special menus"
438430msgstr "Abrir menús especiales"
@@ -763,9 +755,15 @@ msgstr "%1 〉"
763755#~ msgid "All"
764756#~ msgstr "Too"
765757
758+#~ msgid "Unlock SIM"
759+#~ msgstr "Desbloquiar SIM"
760+
766761#~ msgid "Store"
767762#~ msgstr "Tienda"
768763
764+#~ msgid "Roaming"
765+#~ msgstr "Roaming"
766+
769767#~ msgid "Restart"
770768#~ msgstr "Reaniciar"
771769
po/az.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2014-09-03 16:39+0000\n"
1212"Last-Translator: Nicat Məmmədov <n1c4t97@gmail.com>\n"
1313"Language-Team: Azerbaijani <az@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr ""
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr ""
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr "Seçilmişlәrdәn çıxart"
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr "Seçilmişlәrә әlavә et"
196196
@@ -420,14 +420,6 @@ msgctxt "Button: Call back on phone"
420420msgid "Call back"
421421msgstr ""
422422
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−
431423#: qml/Tutorial/TutorialBottom.qml:28
432424msgid "Open special menus"
433425msgstr ""
@@ -713,6 +705,12 @@ msgstr ""
713705#~ msgid "Done"
714706#~ msgstr "Başa çatdı"
715707
708+#~ msgid "Unlock SIM"
709+#~ msgstr "SIM kilidini aç"
710+
711+#~ msgid "Roaming"
712+#~ msgstr "Rominq"
713+
716714#~ msgid "Log out"
717715#~ msgstr "Çıxış"
718716
po/be.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-12-13 13:12+0000\n"
1212"Last-Translator: Mikhail_SaTuRn <mikhail_saturn@tut.by>\n"
1313"Language-Team: Belarusian <be@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n"
2020"X-Generator: Launchpad (build 17936)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -178,26 +178,26 @@ msgstr "Перападлучыцца зараз!"
178178msgid "Close all"
179179msgstr "Зачыніць усё"
180180
181−#: qml/Dash/DashPageHeader.qml:266
181+#: qml/Dash/DashPageHeader.qml:270
182182msgctxt "Button: Open the Ubuntu Store"
183183msgid "Store"
184184msgstr "Крама"
185185
186−#: qml/Dash/DashPageHeader.qml:273
186+#: qml/Dash/DashPageHeader.qml:277
187187msgctxt "Button: Start a search in the current dash scope"
188188msgid "Search"
189189msgstr "Пошук"
190190
191−#: qml/Dash/DashPageHeader.qml:283
191+#: qml/Dash/DashPageHeader.qml:287
192192msgctxt "Button: Show the current dash scope settings"
193193msgid "Settings"
194194msgstr "Налады"
195195
196−#: qml/Dash/DashPageHeader.qml:290
196+#: qml/Dash/DashPageHeader.qml:294
197197msgid "Remove from Favorites"
198198msgstr "Выдаліць з абранага"
199199
200−#: qml/Dash/DashPageHeader.qml:290
200+#: qml/Dash/DashPageHeader.qml:294
201201msgid "Add to Favorites"
202202msgstr "Дадаць да абранага"
203203
@@ -430,14 +430,6 @@ msgctxt "Button: Call back on phone"
430430msgid "Call back"
431431msgstr "Патэлефанаваць"
432432
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−
441433#: qml/Tutorial/TutorialBottom.qml:28
442434msgid "Open special menus"
443435msgstr "Адкрыць спецыяльныя меню"
@@ -705,6 +697,12 @@ msgstr "%1 〉"
705697#~ msgid "Confirm"
706698#~ msgstr "Пацвердзіць"
707699
700+#~ msgid "Unlock SIM"
701+#~ msgstr "Разблакаваць SIM"
702+
703+#~ msgid "Roaming"
704+#~ msgstr "Роўмінг"
705+
708706#~ msgid "Try swiping from the right edge to unlock the phone"
709707#~ msgstr "Правядзіце пальцам з правага краю, каб разблакаваць тэлефон"
710708
po/bg.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-04-12 14:43+0000\n"
1212"Last-Translator: George Karavasilev <kokoto-java@ubuntu.com>\n"
1313"Language-Team: Bulgarian <bg@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -173,26 +173,26 @@ msgstr ""
173173msgid "Close all"
174174msgstr ""
175175
176−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
177177msgctxt "Button: Open the Ubuntu Store"
178178msgid "Store"
179179msgstr ""
180180
181−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
182182msgctxt "Button: Start a search in the current dash scope"
183183msgid "Search"
184184msgstr ""
185185
186−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
187187msgctxt "Button: Show the current dash scope settings"
188188msgid "Settings"
189189msgstr ""
190190
191−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
192192msgid "Remove from Favorites"
193193msgstr ""
194194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196196msgid "Add to Favorites"
197197msgstr ""
198198
@@ -418,14 +418,6 @@ msgctxt "Button: Call back on phone"
418418msgid "Call back"
419419msgstr ""
420420
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−
429421#: qml/Tutorial/TutorialBottom.qml:28
430422msgid "Open special menus"
431423msgstr ""
po/bn.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-11-27 19:38+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Bengali <bn@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -173,26 +173,26 @@ msgstr ""
173173msgid "Close all"
174174msgstr ""
175175
176−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
177177msgctxt "Button: Open the Ubuntu Store"
178178msgid "Store"
179179msgstr "স্টোর"
180180
181−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
182182msgctxt "Button: Start a search in the current dash scope"
183183msgid "Search"
184184msgstr "খুঁজুন"
185185
186−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
187187msgctxt "Button: Show the current dash scope settings"
188188msgid "Settings"
189189msgstr "সেটিংস"
190190
191−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
192192msgid "Remove from Favorites"
193193msgstr "পছন্দ থেকে মুছে ফেলুন"
194194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196196msgid "Add to Favorites"
197197msgstr "পছন্দতে যোগ করুন"
198198
@@ -419,14 +419,6 @@ msgctxt "Button: Call back on phone"
419419msgid "Call back"
420420msgstr "কল ব্যাক"
421421
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−
430422#: qml/Tutorial/TutorialBottom.qml:28
431423msgid "Open special menus"
432424msgstr ""
@@ -726,6 +718,12 @@ msgstr ""
726718#~ msgid "Speak Now..."
727719#~ msgstr "এখন বলুন..."
728720
721+#~ msgid "Unlock SIM"
722+#~ msgstr "সিম লক খুলুন করুন"
723+
724+#~ msgid "Roaming"
725+#~ msgstr "রোমিং"
726+
729727#~ msgid "Please re-enter"
730728#~ msgstr "অনুগ্রহ করে আবার লিখুন"
731729
po/br.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2016-02-22 12:29+0000\n"
1212"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
1313"Language-Team: Breton <br@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -179,26 +179,26 @@ msgstr "Adkevreañ bremañ !"
179179msgid "Close all"
180180msgstr "Serriñ pep tra"
181181
182−#: qml/Dash/DashPageHeader.qml:266
182+#: qml/Dash/DashPageHeader.qml:270
183183msgctxt "Button: Open the Ubuntu Store"
184184msgid "Store"
185185msgstr "Stal"
186186
187−#: qml/Dash/DashPageHeader.qml:273
187+#: qml/Dash/DashPageHeader.qml:277
188188msgctxt "Button: Start a search in the current dash scope"
189189msgid "Search"
190190msgstr "Klask"
191191
192−#: qml/Dash/DashPageHeader.qml:283
192+#: qml/Dash/DashPageHeader.qml:287
193193msgctxt "Button: Show the current dash scope settings"
194194msgid "Settings"
195195msgstr "Arventennoù"
196196
197−#: qml/Dash/DashPageHeader.qml:290
197+#: qml/Dash/DashPageHeader.qml:294
198198msgid "Remove from Favorites"
199199msgstr "Lemel eus ar sinedoù"
200200
201−#: qml/Dash/DashPageHeader.qml:290
201+#: qml/Dash/DashPageHeader.qml:294
202202msgid "Add to Favorites"
203203msgstr "Ouzhpennañ d'ar sinedoù"
204204
@@ -430,14 +430,6 @@ msgctxt "Button: Call back on phone"
430430msgid "Call back"
431431msgstr "Gervel en-dro"
432432
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−
441433#: qml/Tutorial/TutorialBottom.qml:28
442434msgid "Open special menus"
443435msgstr "Digeriñ al lañserioù ispisial"
@@ -756,6 +748,12 @@ msgstr "%1 〉"
756748#~ msgid "All"
757749#~ msgstr "An holl anezho"
758750
751+#~ msgid "Unlock SIM"
752+#~ msgstr "Dibrennañ ar gartenn SIM"
753+
754+#~ msgid "Roaming"
755+#~ msgstr "O kantren"
756+
759757#~ msgid "Favorites"
760758#~ msgstr "Gwellañ deuet"
761759
po/bs.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-12-01 20:06+0000\n"
1212"Last-Translator: Kenan Gutić <Unknown>\n"
1313"Language-Team: Bosnian <bs@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n"
2020"X-Generator: Launchpad (build 17936)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -177,26 +177,26 @@ msgstr "Ponovo poveži sada"
177177msgid "Close all"
178178msgstr "Zatvori sve"
179179
180−#: qml/Dash/DashPageHeader.qml:266
180+#: qml/Dash/DashPageHeader.qml:270
181181msgctxt "Button: Open the Ubuntu Store"
182182msgid "Store"
183183msgstr "Trgovina"
184184
185−#: qml/Dash/DashPageHeader.qml:273
185+#: qml/Dash/DashPageHeader.qml:277
186186msgctxt "Button: Start a search in the current dash scope"
187187msgid "Search"
188188msgstr "Pretraživanje"
189189
190−#: qml/Dash/DashPageHeader.qml:283
190+#: qml/Dash/DashPageHeader.qml:287
191191msgctxt "Button: Show the current dash scope settings"
192192msgid "Settings"
193193msgstr "Podešavanja"
194194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196196msgid "Remove from Favorites"
197197msgstr "Ukloni iz Omiljenih"
198198
199−#: qml/Dash/DashPageHeader.qml:290
199+#: qml/Dash/DashPageHeader.qml:294
200200msgid "Add to Favorites"
201201msgstr "Dodaj u Omiljene"
202202
@@ -429,14 +429,6 @@ msgctxt "Button: Call back on phone"
429429msgid "Call back"
430430msgstr "Uzvrati poziv"
431431
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−
440432#: qml/Tutorial/TutorialBottom.qml:28
441433msgid "Open special menus"
442434msgstr "Otvorite posebne menije"
@@ -699,6 +691,12 @@ msgstr "%1 〉"
699691#~ msgid "Please re-enter"
700692#~ msgstr "Molimo ponovo unesite"
701693
694+#~ msgid "Unlock SIM"
695+#~ msgstr "Otključajte SIM"
696+
697+#~ msgid "Roaming"
698+#~ msgstr "Roaming"
699+
702700#~ msgid "Welcome to your Ubuntu phone."
703701#~ msgstr "Dobrodošli u vaš Ubuntu telefon."
704702
po/ca.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-07-04 09:48+0000\n"
1212"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
1313"Language-Team: Catalan <ca@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -179,26 +179,26 @@ msgstr "Torna a connectar"
179179msgid "Close all"
180180msgstr "Tanca-ho tot"
181181
182−#: qml/Dash/DashPageHeader.qml:266
182+#: qml/Dash/DashPageHeader.qml:270
183183msgctxt "Button: Open the Ubuntu Store"
184184msgid "Store"
185185msgstr "Botiga"
186186
187−#: qml/Dash/DashPageHeader.qml:273
187+#: qml/Dash/DashPageHeader.qml:277
188188msgctxt "Button: Start a search in the current dash scope"
189189msgid "Search"
190190msgstr "Cerca"
191191
192−#: qml/Dash/DashPageHeader.qml:283
192+#: qml/Dash/DashPageHeader.qml:287
193193msgctxt "Button: Show the current dash scope settings"
194194msgid "Settings"
195195msgstr "Paràmetres"
196196
197−#: qml/Dash/DashPageHeader.qml:290
197+#: qml/Dash/DashPageHeader.qml:294
198198msgid "Remove from Favorites"
199199msgstr "Suprimeix dels preferits"
200200
201−#: qml/Dash/DashPageHeader.qml:290
201+#: qml/Dash/DashPageHeader.qml:294
202202msgid "Add to Favorites"
203203msgstr "Afegeix als preferits"
204204
@@ -430,14 +430,6 @@ msgctxt "Button: Call back on phone"
430430msgid "Call back"
431431msgstr "Retorna la trucada"
432432
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−
441433#: qml/Tutorial/TutorialBottom.qml:28
442434msgid "Open special menus"
443435msgstr "Obre els menús especials"
@@ -747,12 +739,18 @@ msgstr "%1 〉"
747739#~ "Ja heu après com utilitzar els gestos de les vores per fer servir el "
748740#~ "telèfon<br><br>Feu un toc a la pantalla per començar"
749741
742+#~ msgid "Unlock SIM"
743+#~ msgstr "Desbloca la SIM"
744+
750745#~ msgid "Store"
751746#~ msgstr "Botiga"
752747
753748#~ msgid "Done"
754749#~ msgstr "Fet"
755750
751+#~ msgid "Roaming"
752+#~ msgstr "Itinerància"
753+
756754#~ msgid "Favorites"
757755#~ msgstr "Preferides"
758756
po/ca@valencia.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-02-22 15:22+0000\n"
1212"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
1313"Language-Team: Catalan <ca@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -177,26 +177,26 @@ msgstr ""
177177msgid "Close all"
178178msgstr ""
179179
180−#: qml/Dash/DashPageHeader.qml:266
180+#: qml/Dash/DashPageHeader.qml:270
181181msgctxt "Button: Open the Ubuntu Store"
182182msgid "Store"
183183msgstr ""
184184
185−#: qml/Dash/DashPageHeader.qml:273
185+#: qml/Dash/DashPageHeader.qml:277
186186msgctxt "Button: Start a search in the current dash scope"
187187msgid "Search"
188188msgstr ""
189189
190−#: qml/Dash/DashPageHeader.qml:283
190+#: qml/Dash/DashPageHeader.qml:287
191191msgctxt "Button: Show the current dash scope settings"
192192msgid "Settings"
193193msgstr ""
194194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196196msgid "Remove from Favorites"
197197msgstr "Suprimeix dels preferits"
198198
199−#: qml/Dash/DashPageHeader.qml:290
199+#: qml/Dash/DashPageHeader.qml:294
200200msgid "Add to Favorites"
201201msgstr "Afig als preferits"
202202
@@ -428,14 +428,6 @@ msgctxt "Button: Call back on phone"
428428msgid "Call back"
429429msgstr ""
430430
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−
439431#: qml/Tutorial/TutorialBottom.qml:28
440432msgid "Open special menus"
441433msgstr ""
@@ -771,6 +763,12 @@ msgstr "%1 〉"
771763#~ msgid "Speaking..."
772764#~ msgstr "S'està parlant..."
773765
766+#~ msgid "Unlock SIM"
767+#~ msgstr "Desbloca la SIM"
768+
769+#~ msgid "Roaming"
770+#~ msgstr "Itinerància"
771+
774772#~ msgid "Please re-enter"
775773#~ msgstr "Torneu-ho a introduir"
776774
po/ce.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-02-15 04:01+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Chechen <ce@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr ""
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr ""
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr ""
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
po/ckb.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2014-01-21 11:05+0000\n"
1212"Last-Translator: Aras <aras.noori@gmail.com>\n"
1313"Language-Team: Kurdish (Sorani) <ckb@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr ""
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr ""
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr ""
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
po/cs.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-07-07 10:44+0000\n"
1212"Last-Translator: Vojtěch Daněk <vdanek@outlook.com>\n"
1313"Language-Team: Czech <cs@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020"Language: cs\n"
2121
@@ -177,26 +177,26 @@ msgstr ""
177177msgid "Close all"
178178msgstr ""
179179
180−#: qml/Dash/DashPageHeader.qml:266
180+#: qml/Dash/DashPageHeader.qml:270
181181msgctxt "Button: Open the Ubuntu Store"
182182msgid "Store"
183183msgstr "Obchod"
184184
185−#: qml/Dash/DashPageHeader.qml:273
185+#: qml/Dash/DashPageHeader.qml:277
186186msgctxt "Button: Start a search in the current dash scope"
187187msgid "Search"
188188msgstr "Hledat"
189189
190−#: qml/Dash/DashPageHeader.qml:283
190+#: qml/Dash/DashPageHeader.qml:287
191191msgctxt "Button: Show the current dash scope settings"
192192msgid "Settings"
193193msgstr "Nastavení"
194194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196196msgid "Remove from Favorites"
197197msgstr "Odstranit z oblíbených"
198198
199−#: qml/Dash/DashPageHeader.qml:290
199+#: qml/Dash/DashPageHeader.qml:294
200200msgid "Add to Favorites"
201201msgstr "Přidat do oblíbených"
202202
@@ -429,14 +429,6 @@ msgctxt "Button: Call back on phone"
429429msgid "Call back"
430430msgstr ""
431431
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−
440432#: qml/Tutorial/TutorialBottom.qml:28
441433msgid "Open special menus"
442434msgstr "Otevřít speciální menu"
@@ -734,6 +726,12 @@ msgstr "%1 〉"
734726#~ msgid "Please re-enter"
735727#~ msgstr "Vložte znovu"
736728
729+#~ msgid "Unlock SIM"
730+#~ msgstr "Odemknout SIM"
731+
732+#~ msgid "Roaming"
733+#~ msgstr "Roaming"
734+
737735#~ msgid "Welcome to your Ubuntu phone."
738736#~ msgstr "Vítejte ve vašem Ubuntu telefonu."
739737
po/cy.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-07-31 13:21+0000\n"
1212"Last-Translator: Owen Llywelyn <owen.llywelyn@gmail.com>\n"
1313"Language-Team: Welsh <cy@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=4; plural=n==1 ? 0 : n==2 ? 1 : (n != 8 && n != 11) ? "
1818"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"
2020"X-Generator: Launchpad (build 17936)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -178,26 +178,26 @@ msgstr ""
178178msgid "Close all"
179179msgstr ""
180180
181−#: qml/Dash/DashPageHeader.qml:266
181+#: qml/Dash/DashPageHeader.qml:270
182182msgctxt "Button: Open the Ubuntu Store"
183183msgid "Store"
184184msgstr "Marchnad"
185185
186−#: qml/Dash/DashPageHeader.qml:273
186+#: qml/Dash/DashPageHeader.qml:277
187187msgctxt "Button: Start a search in the current dash scope"
188188msgid "Search"
189189msgstr "Chwilio"
190190
191−#: qml/Dash/DashPageHeader.qml:283
191+#: qml/Dash/DashPageHeader.qml:287
192192msgctxt "Button: Show the current dash scope settings"
193193msgid "Settings"
194194msgstr "Gosodiadau"
195195
196−#: qml/Dash/DashPageHeader.qml:290
196+#: qml/Dash/DashPageHeader.qml:294
197197msgid "Remove from Favorites"
198198msgstr "Tynnu o Ffefrynnau"
199199
200−#: qml/Dash/DashPageHeader.qml:290
200+#: qml/Dash/DashPageHeader.qml:294
201201msgid "Add to Favorites"
202202msgstr "Ychwanegu at Ffefrynnau"
203203
@@ -433,14 +433,6 @@ msgctxt "Button: Call back on phone"
433433msgid "Call back"
434434msgstr ""
435435
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−
444436#: qml/Tutorial/TutorialBottom.qml:28
445437msgid "Open special menus"
446438msgstr "Agor dewislenni arbennig"
@@ -717,6 +709,12 @@ msgstr "%1 〉"
717709#~ msgid "Tomorrow %H:%M"
718710#~ msgstr "Yfory %H:%M"
719711
712+#~ msgid "Unlock SIM"
713+#~ msgstr "Datgloi SIM"
714+
715+#~ msgid "Roaming"
716+#~ msgstr "Crwydrol"
717+
720718#~ msgid "Welcome to your Ubuntu phone."
721719#~ msgstr "Croeso i'ch ffôn Ubuntu."
722720
po/da.po+13−15
@@ -8,7 +8,7 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity8\n"
1010"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"
1212"PO-Revision-Date: 2015-07-06 12:05+0000\n"
1313"Last-Translator: Folmer Fredslund <Unknown>\n"
1414"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Type: text/plain; charset=UTF-8\n"
1717"Content-Transfer-Encoding: 8bit\n"
1818"Plural-Forms: nplurals=2; plural=n != 1;\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
2020"X-Generator: Launchpad (build 17936)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -178,26 +178,26 @@ msgstr ""
178178msgid "Close all"
179179msgstr ""
180180
181−#: qml/Dash/DashPageHeader.qml:266
181+#: qml/Dash/DashPageHeader.qml:270
182182msgctxt "Button: Open the Ubuntu Store"
183183msgid "Store"
184184msgstr "Butik"
185185
186−#: qml/Dash/DashPageHeader.qml:273
186+#: qml/Dash/DashPageHeader.qml:277
187187msgctxt "Button: Start a search in the current dash scope"
188188msgid "Search"
189189msgstr "Søg"
190190
191−#: qml/Dash/DashPageHeader.qml:283
191+#: qml/Dash/DashPageHeader.qml:287
192192msgctxt "Button: Show the current dash scope settings"
193193msgid "Settings"
194194msgstr "Indstillinger"
195195
196−#: qml/Dash/DashPageHeader.qml:290
196+#: qml/Dash/DashPageHeader.qml:294
197197msgid "Remove from Favorites"
198198msgstr "Fjern fra Favoritter"
199199
200−#: qml/Dash/DashPageHeader.qml:290
200+#: qml/Dash/DashPageHeader.qml:294
201201msgid "Add to Favorites"
202202msgstr "Tilføj til Favoritter"
203203
@@ -427,14 +427,6 @@ msgctxt "Button: Call back on phone"
427427msgid "Call back"
428428msgstr ""
429429
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−
438430#: qml/Tutorial/TutorialBottom.qml:28
439431msgid "Open special menus"
440432msgstr "Åben specialmenuer"
@@ -738,6 +730,9 @@ msgstr "%1 〉"
738730#~ "Du mestrer nu kantbevægelserne og kan begynde at bruge telefonen<br><br>Tryk "
739731#~ "på skærmen for at starte"
740732
733+#~ msgid "Unlock SIM"
734+#~ msgstr "Lås SIM-kort op"
735+
741736#~ msgid "Please re-enter"
742737#~ msgstr "Vær venlig at genindtaste"
743738
@@ -750,6 +745,9 @@ msgstr "%1 〉"
750745#~ msgid "Welcome to your Ubuntu phone."
751746#~ msgstr "Velkommen til din Ubuntu-telefon."
752747
748+#~ msgid "Roaming"
749+#~ msgstr "Roaming"
750+
753751#~ msgid "%a %d %b %H:%M"
754752#~ msgstr "%a %b. %d %H:%M"
755753
po/de.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2016-02-17 19:16+0000\n"
1212"Last-Translator: schuko24 <gerdsaenger@t-online.de>\n"
1313"Language-Team: German <de@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -179,26 +179,26 @@ msgstr "Jetzt verbinden!"
179179msgid "Close all"
180180msgstr "Alle schließen"
181181
182−#: qml/Dash/DashPageHeader.qml:266
182+#: qml/Dash/DashPageHeader.qml:270
183183msgctxt "Button: Open the Ubuntu Store"
184184msgid "Store"
185185msgstr "Speichern"
186186
187−#: qml/Dash/DashPageHeader.qml:273
187+#: qml/Dash/DashPageHeader.qml:277
188188msgctxt "Button: Start a search in the current dash scope"
189189msgid "Search"
190190msgstr "Suchen"
191191
192−#: qml/Dash/DashPageHeader.qml:283
192+#: qml/Dash/DashPageHeader.qml:287
193193msgctxt "Button: Show the current dash scope settings"
194194msgid "Settings"
195195msgstr "Einstellungen"
196196
197−#: qml/Dash/DashPageHeader.qml:290
197+#: qml/Dash/DashPageHeader.qml:294
198198msgid "Remove from Favorites"
199199msgstr "Aus den Favoriten entfernen"
200200
201−#: qml/Dash/DashPageHeader.qml:290
201+#: qml/Dash/DashPageHeader.qml:294
202202msgid "Add to Favorites"
203203msgstr "Zu Favoriten hinzufügen"
204204
@@ -430,14 +430,6 @@ msgctxt "Button: Call back on phone"
430430msgid "Call back"
431431msgstr "Zurückrufen"
432432
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−
441433#: qml/Tutorial/TutorialBottom.qml:28
442434msgid "Open special menus"
443435msgstr "Spezielle Menüs öffnen"
@@ -750,6 +742,9 @@ msgstr "%1 〉"
750742#~ msgid "All"
751743#~ msgstr "Alle"
752744
745+#~ msgid "Roaming"
746+#~ msgstr "Roaming"
747+
753748#~ msgid "Done"
754749#~ msgstr "Erledigt"
755750
@@ -777,6 +772,9 @@ msgstr "%1 〉"
777772#~ msgid "Restart"
778773#~ msgstr "Neustarten"
779774
775+#~ msgid "Unlock SIM"
776+#~ msgstr "SIM-Karte entsperren"
777+
780778#~ msgid "Manage Scopes"
781779#~ msgstr "Filter verwalten"
782780
po/el.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-12-04 09:38+0000\n"
1212"Last-Translator: Aggelos Arnaoutis <angelosarn@hotmail.com>\n"
1313"Language-Team: Greek <el@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -179,26 +179,26 @@ msgstr "Επανασύνδεση τώρα!"
179179msgid "Close all"
180180msgstr "Κλείσιμο όλων"
181181
182−#: qml/Dash/DashPageHeader.qml:266
182+#: qml/Dash/DashPageHeader.qml:270
183183msgctxt "Button: Open the Ubuntu Store"
184184msgid "Store"
185185msgstr "Κατάστημα"
186186
187−#: qml/Dash/DashPageHeader.qml:273
187+#: qml/Dash/DashPageHeader.qml:277
188188msgctxt "Button: Start a search in the current dash scope"
189189msgid "Search"
190190msgstr "Αναζήτηση"
191191
192−#: qml/Dash/DashPageHeader.qml:283
192+#: qml/Dash/DashPageHeader.qml:287
193193msgctxt "Button: Show the current dash scope settings"
194194msgid "Settings"
195195msgstr "Ρυθμίσεις"
196196
197−#: qml/Dash/DashPageHeader.qml:290
197+#: qml/Dash/DashPageHeader.qml:294
198198msgid "Remove from Favorites"
199199msgstr "Αφαίρεση από τα αγαπημένα"
200200
201−#: qml/Dash/DashPageHeader.qml:290
201+#: qml/Dash/DashPageHeader.qml:294
202202msgid "Add to Favorites"
203203msgstr "Προσθήκη στα αγαπημένα"
204204
@@ -430,14 +430,6 @@ msgctxt "Button: Call back on phone"
430430msgid "Call back"
431431msgstr "Επανάκληση"
432432
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−
441433#: qml/Tutorial/TutorialBottom.qml:28
442434msgid "Open special menus"
443435msgstr "Άνοιγμα ειδικών μενού"
@@ -756,6 +748,12 @@ msgstr "%1 〉"
756748#~ msgid "All"
757749#~ msgstr "Όλα"
758750
751+#~ msgid "Unlock SIM"
752+#~ msgstr "Ξεκλείδωμα SIM"
753+
754+#~ msgid "Roaming"
755+#~ msgstr "Περιαγωγή"
756+
759757#~ msgid "Favorites"
760758#~ msgstr "Αγαπημένα"
761759
po/en_AU.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2016-02-12 23:22+0000\n"
1212"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
1313"Language-Team: English (Australia) <en_AU@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -173,26 +173,26 @@ msgstr "Reconnect now!"
173173msgid "Close all"
174174msgstr "Close all"
175175
176−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
177177msgctxt "Button: Open the Ubuntu Store"
178178msgid "Store"
179179msgstr "Store"
180180
181−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
182182msgctxt "Button: Start a search in the current dash scope"
183183msgid "Search"
184184msgstr "Search"
185185
186−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
187187msgctxt "Button: Show the current dash scope settings"
188188msgid "Settings"
189189msgstr "Settings"
190190
191−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
192192msgid "Remove from Favorites"
193193msgstr "Remove from Favourites"
194194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196196msgid "Add to Favorites"
197197msgstr "Add to Favourites"
198198
@@ -424,14 +424,6 @@ msgctxt "Button: Call back on phone"
424424msgid "Call back"
425425msgstr "Call back"
426426
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−
435427#: qml/Tutorial/TutorialBottom.qml:28
436428msgid "Open special menus"
437429msgstr "Open special menus"
@@ -735,6 +727,9 @@ msgstr "%1 〉"
735727#~ msgid "All"
736728#~ msgstr "All"
737729
730+#~ msgid "Unlock SIM"
731+#~ msgstr "Unlock SIM"
732+
738733#~ msgid "Favorites"
739734#~ msgstr "Favourites"
740735
@@ -747,6 +742,9 @@ msgstr "%1 〉"
747742#~ msgid "Done"
748743#~ msgstr "Done"
749744
745+#~ msgid "Roaming"
746+#~ msgstr "Roaming"
747+
750748#~ msgid "Log out"
751749#~ msgstr "Log out"
752750
po/en_GB.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-04-23 12:59+0000\n"
1212"Last-Translator: Andi Chandler <Unknown>\n"
1313"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -173,26 +173,26 @@ msgstr "Reconnect now!"
173173msgid "Close all"
174174msgstr "Close all"
175175
176−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
177177msgctxt "Button: Open the Ubuntu Store"
178178msgid "Store"
179179msgstr "Store"
180180
181−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
182182msgctxt "Button: Start a search in the current dash scope"
183183msgid "Search"
184184msgstr "Search"
185185
186−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
187187msgctxt "Button: Show the current dash scope settings"
188188msgid "Settings"
189189msgstr "Settings"
190190
191−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
192192msgid "Remove from Favorites"
193193msgstr "Remove from Favourites"
194194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196196msgid "Add to Favorites"
197197msgstr "Add to Favourites"
198198
@@ -424,14 +424,6 @@ msgctxt "Button: Call back on phone"
424424msgid "Call back"
425425msgstr "Call back"
426426
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−
435427#: qml/Tutorial/TutorialBottom.qml:28
436428msgid "Open special menus"
437429msgstr "Open special menus"
@@ -738,6 +730,9 @@ msgstr "%1 〉"
738730#~ msgid "All"
739731#~ msgstr "All"
740732
733+#~ msgid "Unlock SIM"
734+#~ msgstr "Unlock SIM"
735+
741736#~ msgid "Favorites"
742737#~ msgstr "Favourites"
743738
@@ -747,6 +742,9 @@ msgstr "%1 〉"
747742#~ msgid "Done"
748743#~ msgstr "Done"
749744
745+#~ msgid "Roaming"
746+#~ msgstr "Roaming"
747+
750748#~ msgid "Log out"
751749#~ msgstr "Log out"
752750
po/eo.po+10−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-06-06 23:37+0000\n"
1212"Last-Translator: Eliovir <Unknown>\n"
1313"Language-Team: Esperanto <eo@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr "Programarejo"
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr "Serĉi"
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr "Agordoj"
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr "Aldoni al favoritoj"
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
@@ -663,6 +655,9 @@ msgstr "〈 %1"
663655msgid "%1 〉"
664656msgstr "%1 〉"
665657
658+#~ msgid "Roaming"
659+#~ msgstr "Retmigrado"
660+
666661#~ msgid "Welcome to your Ubuntu phone."
667662#~ msgstr "Bonvenon al via Ubuntu-telefono."
668663
po/es.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2016-01-15 14:48+0000\n"
1212"Last-Translator: Víctor R. Ruiz <Unknown>\n"
1313"Language-Team: Spanish <es@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -179,26 +179,26 @@ msgstr "¡Reconectar ahora!"
179179msgid "Close all"
180180msgstr "Cerrar todo"
181181
182−#: qml/Dash/DashPageHeader.qml:266
182+#: qml/Dash/DashPageHeader.qml:270
183183msgctxt "Button: Open the Ubuntu Store"
184184msgid "Store"
185185msgstr "Tienda"
186186
187−#: qml/Dash/DashPageHeader.qml:273
187+#: qml/Dash/DashPageHeader.qml:277
188188msgctxt "Button: Start a search in the current dash scope"
189189msgid "Search"
190190msgstr "Buscar"
191191
192−#: qml/Dash/DashPageHeader.qml:283
192+#: qml/Dash/DashPageHeader.qml:287
193193msgctxt "Button: Show the current dash scope settings"
194194msgid "Settings"
195195msgstr "Ajustes"
196196
197−#: qml/Dash/DashPageHeader.qml:290
197+#: qml/Dash/DashPageHeader.qml:294
198198msgid "Remove from Favorites"
199199msgstr "Quitar de favoritos"
200200
201−#: qml/Dash/DashPageHeader.qml:290
201+#: qml/Dash/DashPageHeader.qml:294
202202msgid "Add to Favorites"
203203msgstr "Añadir a favoritos"
204204
@@ -430,14 +430,6 @@ msgctxt "Button: Call back on phone"
430430msgid "Call back"
431431msgstr "Devolver llamada"
432432
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−
441433#: qml/Tutorial/TutorialBottom.qml:28
442434msgid "Open special menus"
443435msgstr "Abrir menús especiales"
@@ -744,9 +736,15 @@ msgstr "%1 〉"
744736#~ msgid "Power off"
745737#~ msgstr "Apagar"
746738
739+#~ msgid "Roaming"
740+#~ msgstr "Itinerancia"
741+
747742#~ msgid "All"
748743#~ msgstr "Todo"
749744
745+#~ msgid "Unlock SIM"
746+#~ msgstr "Desbloquear SIM"
747+
750748#~ msgid "Favorites"
751749#~ msgstr "Favoritos"
752750
po/eu.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-07-13 23:29+0000\n"
1212"Last-Translator: Ibai Oihanguren Sala <Unknown>\n"
1313"Language-Team: Basque <eu@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -174,26 +174,26 @@ msgstr ""
174174msgid "Close all"
175175msgstr ""
176176
177−#: qml/Dash/DashPageHeader.qml:266
177+#: qml/Dash/DashPageHeader.qml:270
178178msgctxt "Button: Open the Ubuntu Store"
179179msgid "Store"
180180msgstr "Denda"
181181
182−#: qml/Dash/DashPageHeader.qml:273
182+#: qml/Dash/DashPageHeader.qml:277
183183msgctxt "Button: Start a search in the current dash scope"
184184msgid "Search"
185185msgstr "Bilatu"
186186
187−#: qml/Dash/DashPageHeader.qml:283
187+#: qml/Dash/DashPageHeader.qml:287
188188msgctxt "Button: Show the current dash scope settings"
189189msgid "Settings"
190190msgstr "Ezarpenak"
191191
192−#: qml/Dash/DashPageHeader.qml:290
192+#: qml/Dash/DashPageHeader.qml:294
193193msgid "Remove from Favorites"
194194msgstr "Kendu gogokoetatik"
195195
196−#: qml/Dash/DashPageHeader.qml:290
196+#: qml/Dash/DashPageHeader.qml:294
197197msgid "Add to Favorites"
198198msgstr "Gehitu gogokoetara"
199199
@@ -423,14 +423,6 @@ msgctxt "Button: Call back on phone"
423423msgid "Call back"
424424msgstr ""
425425
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−
434426#: qml/Tutorial/TutorialBottom.qml:28
435427msgid "Open special menus"
436428msgstr "Ireki menu bereziak"
@@ -749,6 +741,12 @@ msgstr "%1 〉"
749741#~ msgid "All"
750742#~ msgstr "Guztiak"
751743
744+#~ msgid "Unlock SIM"
745+#~ msgstr "Desblokeatu SIMa"
746+
747+#~ msgid "Roaming"
748+#~ msgstr "Ibiltaritza"
749+
752750#~ msgid "Favorites"
753751#~ msgstr "Gogokoak"
754752
po/fa.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-07-11 15:43+0000\n"
1212"Last-Translator: Danial Behzadi <dani.behzi@gmail.com>\n"
1313"Language-Team: Persian <fa@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -174,26 +174,26 @@ msgstr "هم‌اکنون دوباره وصل شود"
174174msgid "Close all"
175175msgstr "بستن همه"
176176
177−#: qml/Dash/DashPageHeader.qml:266
177+#: qml/Dash/DashPageHeader.qml:270
178178msgctxt "Button: Open the Ubuntu Store"
179179msgid "Store"
180180msgstr "ذخیره"
181181
182−#: qml/Dash/DashPageHeader.qml:273
182+#: qml/Dash/DashPageHeader.qml:277
183183msgctxt "Button: Start a search in the current dash scope"
184184msgid "Search"
185185msgstr "جست‌وجو"
186186
187−#: qml/Dash/DashPageHeader.qml:283
187+#: qml/Dash/DashPageHeader.qml:287
188188msgctxt "Button: Show the current dash scope settings"
189189msgid "Settings"
190190msgstr "تنظیمات"
191191
192−#: qml/Dash/DashPageHeader.qml:290
192+#: qml/Dash/DashPageHeader.qml:294
193193msgid "Remove from Favorites"
194194msgstr "برداشتن از برگزیده‌ها"
195195
196−#: qml/Dash/DashPageHeader.qml:290
196+#: qml/Dash/DashPageHeader.qml:294
197197msgid "Add to Favorites"
198198msgstr "افزودن به برگزیده‌ها"
199199
@@ -420,14 +420,6 @@ msgctxt "Button: Call back on phone"
420420msgid "Call back"
421421msgstr "پاسخ تماس"
422422
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−
431423#: qml/Tutorial/TutorialBottom.qml:28
432424msgid "Open special menus"
433425msgstr "باز کردن فهرست‌های مخصوص"
@@ -733,6 +725,9 @@ msgstr "%1 〉"
733725#~ msgid "All"
734726#~ msgstr "همه"
735727
728+#~ msgid "Unlock SIM"
729+#~ msgstr "باز کردن قفل سیم‌کارت"
730+
736731#~ msgid "Favorites"
737732#~ msgstr "برگزیده‌ها"
738733
@@ -745,6 +740,9 @@ msgstr "%1 〉"
745740#~ msgid "Done"
746741#~ msgstr "انجام شد"
747742
743+#~ msgid "Roaming"
744+#~ msgstr "رومینگ"
745+
748746#~ msgid "Power"
749747#~ msgstr "توان"
750748
po/fi.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-07-04 18:32+0000\n"
1212"Last-Translator: Jiri Grönroos <Unknown>\n"
1313"Language-Team: Finnish <fi@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -177,26 +177,26 @@ msgstr "Yhdistä uudelleen nyt!"
177177msgid "Close all"
178178msgstr "Sulje kaikki"
179179
180−#: qml/Dash/DashPageHeader.qml:266
180+#: qml/Dash/DashPageHeader.qml:270
181181msgctxt "Button: Open the Ubuntu Store"
182182msgid "Store"
183183msgstr "Kauppa"
184184
185−#: qml/Dash/DashPageHeader.qml:273
185+#: qml/Dash/DashPageHeader.qml:277
186186msgctxt "Button: Start a search in the current dash scope"
187187msgid "Search"
188188msgstr "Etsi"
189189
190−#: qml/Dash/DashPageHeader.qml:283
190+#: qml/Dash/DashPageHeader.qml:287
191191msgctxt "Button: Show the current dash scope settings"
192192msgid "Settings"
193193msgstr "Asetukset"
194194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196196msgid "Remove from Favorites"
197197msgstr "Poista suosikeista"
198198
199−#: qml/Dash/DashPageHeader.qml:290
199+#: qml/Dash/DashPageHeader.qml:294
200200msgid "Add to Favorites"
201201msgstr "Lisää suosikkeihin"
202202
@@ -428,14 +428,6 @@ msgctxt "Button: Call back on phone"
428428msgid "Call back"
429429msgstr "Soita takaisin"
430430
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−
439431#: qml/Tutorial/TutorialBottom.qml:28
440432msgid "Open special menus"
441433msgstr "Avaa erikoisvalikot"
@@ -737,6 +729,9 @@ msgstr "%1 〉"
737729#~ "Hallitset nyt reunaeleet, joten voit aloittaa puhelimen "
738730#~ "käytön<br><br>Napauta näyttöä aloittaaksesi"
739731
732+#~ msgid "Unlock SIM"
733+#~ msgstr "Avaa SIM-kortin lukitus"
734+
740735#~ msgid "All"
741736#~ msgstr "Kaikki"
742737
@@ -752,6 +747,9 @@ msgstr "%1 〉"
752747#~ msgid "Done"
753748#~ msgstr "Valmis"
754749
750+#~ msgid "Roaming"
751+#~ msgstr "Verkkovierailu"
752+
755753#~ msgid "Log out"
756754#~ msgstr "Kirjaudu ulos"
757755
po/fo.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2014-01-14 20:08+0000\n"
1212"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
1313"Language-Team: Faroese <fo@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr ""
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr ""
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr ""
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
po/fr.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2016-02-28 17:22+0000\n"
1212"Last-Translator: Anne <anneonyme017@gmail.com>\n"
1313"Language-Team: French <fr@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -181,26 +181,26 @@ msgstr "Se reconnecter maintenant !"
181181msgid "Close all"
182182msgstr "Tout fermer"
183183
184−#: qml/Dash/DashPageHeader.qml:266
184+#: qml/Dash/DashPageHeader.qml:270
185185msgctxt "Button: Open the Ubuntu Store"
186186msgid "Store"
187187msgstr "Logithèque"
188188
189−#: qml/Dash/DashPageHeader.qml:273
189+#: qml/Dash/DashPageHeader.qml:277
190190msgctxt "Button: Start a search in the current dash scope"
191191msgid "Search"
192192msgstr "Rechercher"
193193
194−#: qml/Dash/DashPageHeader.qml:283
194+#: qml/Dash/DashPageHeader.qml:287
195195msgctxt "Button: Show the current dash scope settings"
196196msgid "Settings"
197197msgstr "Paramètres"
198198
199−#: qml/Dash/DashPageHeader.qml:290
199+#: qml/Dash/DashPageHeader.qml:294
200200msgid "Remove from Favorites"
201201msgstr "Retirer des favoris"
202202
203−#: qml/Dash/DashPageHeader.qml:290
203+#: qml/Dash/DashPageHeader.qml:294
204204msgid "Add to Favorites"
205205msgstr "Ajouter aux favoris"
206206
@@ -434,14 +434,6 @@ msgctxt "Button: Call back on phone"
434434msgid "Call back"
435435msgstr "Rappeler"
436436
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−
445437#: qml/Tutorial/TutorialBottom.qml:28
446438msgid "Open special menus"
447439msgstr "Ouvrir les menus spéciaux"
@@ -756,6 +748,9 @@ msgstr "%1 〉"
756748#~ "Faites glisser votre doigt à partir du bord gauche pour afficher le lanceur "
757749#~ "d'applications."
758750
751+#~ msgid "Unlock SIM"
752+#~ msgstr "Déverrouiller la carte SIM"
753+
759754#~ msgid "Power off"
760755#~ msgstr "Éteindre"
761756
@@ -771,6 +766,9 @@ msgstr "%1 〉"
771766#~ msgid "Favorites"
772767#~ msgstr "Favorites"
773768
769+#~ msgid "Roaming"
770+#~ msgstr "Roaming"
771+
774772#~ msgid "Log out"
775773#~ msgstr "Se déconnecter"
776774
po/ga.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2016-01-25 11:33+0000\n"
1212"Last-Translator: Joshua Kiley <Unknown>\n"
1313"Language-Team: Irish <ga@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n==2 ? 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"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -174,26 +174,26 @@ msgstr "Athnasc anois!"
174174msgid "Close all"
175175msgstr "Dún Gach Rud"
176176
177−#: qml/Dash/DashPageHeader.qml:266
177+#: qml/Dash/DashPageHeader.qml:270
178178msgctxt "Button: Open the Ubuntu Store"
179179msgid "Store"
180180msgstr "Siopa"
181181
182−#: qml/Dash/DashPageHeader.qml:273
182+#: qml/Dash/DashPageHeader.qml:277
183183msgctxt "Button: Start a search in the current dash scope"
184184msgid "Search"
185185msgstr "Cuardach"
186186
187−#: qml/Dash/DashPageHeader.qml:283
187+#: qml/Dash/DashPageHeader.qml:287
188188msgctxt "Button: Show the current dash scope settings"
189189msgid "Settings"
190190msgstr "Socruithe"
191191
192−#: qml/Dash/DashPageHeader.qml:290
192+#: qml/Dash/DashPageHeader.qml:294
193193msgid "Remove from Favorites"
194194msgstr "Bain ó Cheanáin"
195195
196−#: qml/Dash/DashPageHeader.qml:290
196+#: qml/Dash/DashPageHeader.qml:294
197197msgid "Add to Favorites"
198198msgstr "Cuir le Ceanáin"
199199
@@ -426,14 +426,6 @@ msgctxt "Button: Call back on phone"
426426msgid "Call back"
427427msgstr "Glaoch Ar Ais"
428428
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−
437429#: qml/Tutorial/TutorialBottom.qml:28
438430msgid "Open special menus"
439431msgstr "Oscail Roghchláir Speisialta"
@@ -680,6 +672,12 @@ msgstr ""
680672msgid "%1 〉"
681673msgstr ""
682674
675+#~ msgid "Unlock SIM"
676+#~ msgstr "Díghlasail an SIM"
677+
678+#~ msgid "Roaming"
679+#~ msgstr "Fánaíocht"
680+
683681#~ msgid "Welcome to your Ubuntu phone."
684682#~ msgstr "Tá fáilte romhat chuig do fhón Ubuntu."
685683
po/gd.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-07-16 10:56+0000\n"
1212"Last-Translator: GunChleoc <Unknown>\n"
1313"Language-Team: Fòram na Gàidhlig\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
1818"(n > 2 && n < 20) ? 2 : 3;\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
2020"X-Generator: Launchpad (build 17936)\n"
2121"Language: gd\n"
2222
@@ -183,26 +183,26 @@ msgstr "Ath-cheangail an-dràsta!"
183183msgid "Close all"
184184msgstr "Dùin na h-uile"
185185
186−#: qml/Dash/DashPageHeader.qml:266
186+#: qml/Dash/DashPageHeader.qml:270
187187msgctxt "Button: Open the Ubuntu Store"
188188msgid "Store"
189189msgstr "Am bùth"
190190
191−#: qml/Dash/DashPageHeader.qml:273
191+#: qml/Dash/DashPageHeader.qml:277
192192msgctxt "Button: Start a search in the current dash scope"
193193msgid "Search"
194194msgstr "Lorg"
195195
196−#: qml/Dash/DashPageHeader.qml:283
196+#: qml/Dash/DashPageHeader.qml:287
197197msgctxt "Button: Show the current dash scope settings"
198198msgid "Settings"
199199msgstr "Roghainnean"
200200
201−#: qml/Dash/DashPageHeader.qml:290
201+#: qml/Dash/DashPageHeader.qml:294
202202msgid "Remove from Favorites"
203203msgstr "Thoir air falbh o na h-annsachdan"
204204
205−#: qml/Dash/DashPageHeader.qml:290
205+#: qml/Dash/DashPageHeader.qml:294
206206msgid "Add to Favorites"
207207msgstr "Cuir ris na h-annsachdan"
208208
@@ -443,14 +443,6 @@ msgctxt "Button: Call back on phone"
443443msgid "Call back"
444444msgstr "Fònaig air ais"
445445
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−
454446#: qml/Tutorial/TutorialBottom.qml:28
455447msgid "Open special menus"
456448msgstr "Fosgail na clàran-taice sònraichte"
@@ -766,6 +758,9 @@ msgstr "%1 〉"
766758#~ msgid "All"
767759#~ msgstr "Na h-uile"
768760
761+#~ msgid "Unlock SIM"
762+#~ msgstr "Thoir a' ghlas far an SIM"
763+
769764#~ msgid "Favorites"
770765#~ msgstr "Annsachdan"
771766
@@ -778,6 +773,9 @@ msgstr "%1 〉"
778773#~ msgid "Done"
779774#~ msgstr "Deiseil"
780775
776+#~ msgid "Roaming"
777+#~ msgstr "Air fàrsan"
778+
781779#~ msgid "Log out"
782780#~ msgstr "Clàraich a-mach"
783781
po/gl.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2016-01-15 14:56+0000\n"
1212"Last-Translator: Marcos Lans <Unknown>\n"
1313"Language-Team: Galician <gl@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -173,26 +173,26 @@ msgstr "Reconectar agora."
173173msgid "Close all"
174174msgstr "Pechar todo"
175175
176−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
177177msgctxt "Button: Open the Ubuntu Store"
178178msgid "Store"
179179msgstr "Tenda"
180180
181−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
182182msgctxt "Button: Start a search in the current dash scope"
183183msgid "Search"
184184msgstr "Buscar"
185185
186−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
187187msgctxt "Button: Show the current dash scope settings"
188188msgid "Settings"
189189msgstr "Axustes"
190190
191−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
192192msgid "Remove from Favorites"
193193msgstr "Eliminar dos favoritos"
194194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196196msgid "Add to Favorites"
197197msgstr "Engadir aos favoritos"
198198
@@ -424,14 +424,6 @@ msgctxt "Button: Call back on phone"
424424msgid "Call back"
425425msgstr "Chamar de volta"
426426
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−
435427#: qml/Tutorial/TutorialBottom.qml:28
436428msgid "Open special menus"
437429msgstr "Abrir menús especiais"
@@ -738,6 +730,9 @@ msgstr "%1 〉"
738730#~ msgid "All"
739731#~ msgstr "Todos"
740732
733+#~ msgid "Unlock SIM"
734+#~ msgstr "Desbloquear a SIM"
735+
741736#~ msgid "Favorites"
742737#~ msgstr "Favoritos"
743738
@@ -750,6 +745,9 @@ msgstr "%1 〉"
750745#~ msgid "Done"
751746#~ msgstr "Feito"
752747
748+#~ msgid "Roaming"
749+#~ msgstr "Itinerancia"
750+
753751#~ msgid "Log out"
754752#~ msgstr "Saír da sesión"
755753
po/gv.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-04-02 14:24+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Manx <gv@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : (n == 2 ? 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"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -178,26 +178,26 @@ msgstr ""
178178msgid "Close all"
179179msgstr ""
180180
181−#: qml/Dash/DashPageHeader.qml:266
181+#: qml/Dash/DashPageHeader.qml:270
182182msgctxt "Button: Open the Ubuntu Store"
183183msgid "Store"
184184msgstr ""
185185
186−#: qml/Dash/DashPageHeader.qml:273
186+#: qml/Dash/DashPageHeader.qml:277
187187msgctxt "Button: Start a search in the current dash scope"
188188msgid "Search"
189189msgstr ""
190190
191−#: qml/Dash/DashPageHeader.qml:283
191+#: qml/Dash/DashPageHeader.qml:287
192192msgctxt "Button: Show the current dash scope settings"
193193msgid "Settings"
194194msgstr ""
195195
196−#: qml/Dash/DashPageHeader.qml:290
196+#: qml/Dash/DashPageHeader.qml:294
197197msgid "Remove from Favorites"
198198msgstr "Jean scughey woish Reihyn"
199199
200−#: qml/Dash/DashPageHeader.qml:290
200+#: qml/Dash/DashPageHeader.qml:294
201201msgid "Add to Favorites"
202202msgstr "Cur ayns Reihyn"
203203
@@ -423,14 +423,6 @@ msgctxt "Button: Call back on phone"
423423msgid "Call back"
424424msgstr ""
425425
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−
434426#: qml/Tutorial/TutorialBottom.qml:28
435427msgid "Open special menus"
436428msgstr ""
po/he.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-07-12 08:47+0000\n"
1212"Last-Translator: Yaron <sh.yaron@gmail.com>\n"
1313"Language-Team: Hebrew <he@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr "חנות"
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr "חיפוש"
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr "הגדרות"
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr "הסרה מהמועדפים"
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr "הוספה למועדפים"
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr "פתיחת תפריטים מיוחדים"
@@ -730,9 +722,15 @@ msgstr ""
730722#~ msgid "All"
731723#~ msgstr "הכול"
732724
725+#~ msgid "Roaming"
726+#~ msgstr "נדידה"
727+
733728#~ msgid "Favorites"
734729#~ msgstr "מועדפים"
735730
731+#~ msgid "Unlock SIM"
732+#~ msgstr "שחרור נעילת ה־SIM"
733+
736734#~ msgid "Welcome to your Ubuntu phone."
737735#~ msgstr "ברוך בואך לטלפון האובונטו שלך."
738736
po/hi.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2014-01-15 01:49+0000\n"
1212"Last-Translator: Siddhanathan Shanmugam <Unknown>\n"
1313"Language-Team: Hindi <hi@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr ""
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr ""
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr ""
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
po/hr.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2013-06-27 04:14+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Croatian <hr@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
2020"X-Generator: Launchpad (build 17936)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -176,26 +176,26 @@ msgstr "Ponovno poveži odmah!"
176176msgid "Close all"
177177msgstr "Zatvori sve"
178178
179−#: qml/Dash/DashPageHeader.qml:266
179+#: qml/Dash/DashPageHeader.qml:270
180180msgctxt "Button: Open the Ubuntu Store"
181181msgid "Store"
182182msgstr "Trgovina"
183183
184−#: qml/Dash/DashPageHeader.qml:273
184+#: qml/Dash/DashPageHeader.qml:277
185185msgctxt "Button: Start a search in the current dash scope"
186186msgid "Search"
187187msgstr "Pretraži"
188188
189−#: qml/Dash/DashPageHeader.qml:283
189+#: qml/Dash/DashPageHeader.qml:287
190190msgctxt "Button: Show the current dash scope settings"
191191msgid "Settings"
192192msgstr "Postavke"
193193
194−#: qml/Dash/DashPageHeader.qml:290
194+#: qml/Dash/DashPageHeader.qml:294
195195msgid "Remove from Favorites"
196196msgstr "Ukloni iz omiljenih"
197197
198−#: qml/Dash/DashPageHeader.qml:290
198+#: qml/Dash/DashPageHeader.qml:294
199199msgid "Add to Favorites"
200200msgstr "Dodaj u omiljene"
201201
@@ -430,14 +430,6 @@ msgctxt "Button: Call back on phone"
430430msgid "Call back"
431431msgstr "Uzvrati poziv"
432432
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−
441433#: qml/Tutorial/TutorialBottom.qml:28
442434msgid "Open special menus"
443435msgstr "Otvori posebne izbornike"
@@ -702,6 +694,12 @@ msgstr "%1 〉"
702694#~ msgid "Search"
703695#~ msgstr "Pretraživanje"
704696
697+#~ msgid "Unlock SIM"
698+#~ msgstr "Otključaj SIM"
699+
700+#~ msgid "Roaming"
701+#~ msgstr "Roaming"
702+
705703#~ msgid "%a %l:%M %p"
706704#~ msgstr "%a %l:%M %p"
707705
po/hu.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2016-02-16 07:23+0000\n"
1212"Last-Translator: Richard Somlói <ricsipontaz@gmail.com>\n"
1313"Language-Team: Hungarian <hu@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -175,26 +175,26 @@ msgstr "Újracsatlakozás most!"
175175msgid "Close all"
176176msgstr "Minden bezárása"
177177
178−#: qml/Dash/DashPageHeader.qml:266
178+#: qml/Dash/DashPageHeader.qml:270
179179msgctxt "Button: Open the Ubuntu Store"
180180msgid "Store"
181181msgstr "Áruház"
182182
183−#: qml/Dash/DashPageHeader.qml:273
183+#: qml/Dash/DashPageHeader.qml:277
184184msgctxt "Button: Start a search in the current dash scope"
185185msgid "Search"
186186msgstr "Keresés"
187187
188−#: qml/Dash/DashPageHeader.qml:283
188+#: qml/Dash/DashPageHeader.qml:287
189189msgctxt "Button: Show the current dash scope settings"
190190msgid "Settings"
191191msgstr "Beállítások"
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Remove from Favorites"
195195msgstr "Eltávolítás a kedvencek közül"
196196
197−#: qml/Dash/DashPageHeader.qml:290
197+#: qml/Dash/DashPageHeader.qml:294
198198msgid "Add to Favorites"
199199msgstr "Hozzáadás a kedvencekhez"
200200
@@ -426,14 +426,6 @@ msgctxt "Button: Call back on phone"
426426msgid "Call back"
427427msgstr "Visszahívás"
428428
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−
437429#: qml/Tutorial/TutorialBottom.qml:28
438430msgid "Open special menus"
439431msgstr "Speciális menük elérése"
@@ -744,6 +736,12 @@ msgstr "%1 〉"
744736#~ msgid "All"
745737#~ msgstr "Összes"
746738
739+#~ msgid "Unlock SIM"
740+#~ msgstr "SIM feloldása"
741+
742+#~ msgid "Roaming"
743+#~ msgstr "Barangolás"
744+
747745#~ msgid "Favorites"
748746#~ msgstr "Kedvencek"
749747
po/hy.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2014-10-28 06:34+0000\n"
1212"Last-Translator: Vahan Harutyunyan <Unknown>\n"
1313"Language-Team: Armenian <hy@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -175,26 +175,26 @@ msgstr ""
175175msgid "Close all"
176176msgstr ""
177177
178−#: qml/Dash/DashPageHeader.qml:266
178+#: qml/Dash/DashPageHeader.qml:270
179179msgctxt "Button: Open the Ubuntu Store"
180180msgid "Store"
181181msgstr ""
182182
183−#: qml/Dash/DashPageHeader.qml:273
183+#: qml/Dash/DashPageHeader.qml:277
184184msgctxt "Button: Start a search in the current dash scope"
185185msgid "Search"
186186msgstr ""
187187
188−#: qml/Dash/DashPageHeader.qml:283
188+#: qml/Dash/DashPageHeader.qml:287
189189msgctxt "Button: Show the current dash scope settings"
190190msgid "Settings"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Remove from Favorites"
195195msgstr "Հեռացնել ընտրյալների ցուցակից"
196196
197−#: qml/Dash/DashPageHeader.qml:290
197+#: qml/Dash/DashPageHeader.qml:294
198198msgid "Add to Favorites"
199199msgstr "Ավելացնել ընտրյալների ցուցակում"
200200
@@ -420,14 +420,6 @@ msgctxt "Button: Call back on phone"
420420msgid "Call back"
421421msgstr ""
422422
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−
431423#: qml/Tutorial/TutorialBottom.qml:28
432424msgid "Open special menus"
433425msgstr ""
@@ -733,6 +725,12 @@ msgstr ""
733725#~ msgid "All"
734726#~ msgstr "Բոլորը"
735727
728+#~ msgid "Unlock SIM"
729+#~ msgstr "Ապաբլոկավորել SIM-ը"
730+
731+#~ msgid "Roaming"
732+#~ msgstr "Ռոումինգ"
733+
736734#~ msgid "Please re-enter"
737735#~ msgstr "Խնդրում ենք նորից մուտքագրել"
738736
po/ia.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-08-25 19:31+0000\n"
1212"Last-Translator: karm <melo@carmu.com>\n"
1313"Language-Team: Interlingua <ia@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -176,26 +176,26 @@ msgstr "Reconnecter nunc!"
176176msgid "Close all"
177177msgstr "Clauder toto"
178178
179−#: qml/Dash/DashPageHeader.qml:266
179+#: qml/Dash/DashPageHeader.qml:270
180180msgctxt "Button: Open the Ubuntu Store"
181181msgid "Store"
182182msgstr "Salva"
183183
184−#: qml/Dash/DashPageHeader.qml:273
184+#: qml/Dash/DashPageHeader.qml:277
185185msgctxt "Button: Start a search in the current dash scope"
186186msgid "Search"
187187msgstr "Cerca"
188188
189−#: qml/Dash/DashPageHeader.qml:283
189+#: qml/Dash/DashPageHeader.qml:287
190190msgctxt "Button: Show the current dash scope settings"
191191msgid "Settings"
192192msgstr "Configurationes"
193193
194−#: qml/Dash/DashPageHeader.qml:290
194+#: qml/Dash/DashPageHeader.qml:294
195195msgid "Remove from Favorites"
196196msgstr "Remover ex le Favoritos"
197197
198−#: qml/Dash/DashPageHeader.qml:290
198+#: qml/Dash/DashPageHeader.qml:294
199199msgid "Add to Favorites"
200200msgstr "Adder al Favoritos"
201201
@@ -425,14 +425,6 @@ msgctxt "Button: Call back on phone"
425425msgid "Call back"
426426msgstr "Appellar retro"
427427
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−
436428#: qml/Tutorial/TutorialBottom.qml:28
437429msgid "Open special menus"
438430msgstr "Aperi le menus special"
@@ -757,6 +749,12 @@ msgstr "%1 〉"
757749#~ msgid "Speaking..."
758750#~ msgstr "Parlante..."
759751
752+#~ msgid "Unlock SIM"
753+#~ msgstr "Liberar le SIM"
754+
755+#~ msgid "Roaming"
756+#~ msgstr "Roaming"
757+
760758#~ msgid "Please re-enter"
761759#~ msgstr "Per favor re-inserer"
762760
po/id.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2013-06-26 22:35+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Indonesian <id@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -174,26 +174,26 @@ msgstr ""
174174msgid "Close all"
175175msgstr ""
176176
177−#: qml/Dash/DashPageHeader.qml:266
177+#: qml/Dash/DashPageHeader.qml:270
178178msgctxt "Button: Open the Ubuntu Store"
179179msgid "Store"
180180msgstr ""
181181
182−#: qml/Dash/DashPageHeader.qml:273
182+#: qml/Dash/DashPageHeader.qml:277
183183msgctxt "Button: Start a search in the current dash scope"
184184msgid "Search"
185185msgstr ""
186186
187−#: qml/Dash/DashPageHeader.qml:283
187+#: qml/Dash/DashPageHeader.qml:287
188188msgctxt "Button: Show the current dash scope settings"
189189msgid "Settings"
190190msgstr ""
191191
192−#: qml/Dash/DashPageHeader.qml:290
192+#: qml/Dash/DashPageHeader.qml:294
193193msgid "Remove from Favorites"
194194msgstr "Hapus dari Favorit"
195195
196−#: qml/Dash/DashPageHeader.qml:290
196+#: qml/Dash/DashPageHeader.qml:294
197197msgid "Add to Favorites"
198198msgstr "Tambah ke Favorit"
199199
@@ -423,14 +423,6 @@ msgctxt "Button: Call back on phone"
423423msgid "Call back"
424424msgstr ""
425425
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−
434426#: qml/Tutorial/TutorialBottom.qml:28
435427msgid "Open special menus"
436428msgstr ""
@@ -745,6 +737,12 @@ msgstr ""
745737#~ msgid "Favorites"
746738#~ msgstr "Favorit"
747739
740+#~ msgid "Roaming"
741+#~ msgstr "Roaming"
742+
743+#~ msgid "Unlock SIM"
744+#~ msgstr "Buka Kunci SIM"
745+
748746#~ msgid "Manage Scopes"
749747#~ msgstr "Kelola Skup"
750748
po/is.po+13−15
@@ -9,7 +9,7 @@ msgid ""
99msgstr ""
1010"Project-Id-Version: po_unity8-is\n"
1111"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"
1313"PO-Revision-Date: 2014-11-13 09:32+0000\n"
1414"Last-Translator: Sveinn í Felli <sv1@fellsnet.is>\n"
1515"Language-Team: Icelandic <translation-team-is@lists.sourceforge.net>\n"
@@ -17,7 +17,7 @@ msgstr ""
1717"Content-Type: text/plain; charset=UTF-8\n"
1818"Content-Transfer-Encoding: 8bit\n"
1919"Plural-Forms: nplurals=2; plural=n != 1;\n"
20−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
20+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
2121"X-Generator: Launchpad (build 17936)\n"
2222"Language: is\n"
2323
@@ -180,26 +180,26 @@ msgstr ""
180180msgid "Close all"
181181msgstr ""
182182
183−#: qml/Dash/DashPageHeader.qml:266
183+#: qml/Dash/DashPageHeader.qml:270
184184msgctxt "Button: Open the Ubuntu Store"
185185msgid "Store"
186186msgstr ""
187187
188−#: qml/Dash/DashPageHeader.qml:273
188+#: qml/Dash/DashPageHeader.qml:277
189189msgctxt "Button: Start a search in the current dash scope"
190190msgid "Search"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:283
193+#: qml/Dash/DashPageHeader.qml:287
194194msgctxt "Button: Show the current dash scope settings"
195195msgid "Settings"
196196msgstr ""
197197
198−#: qml/Dash/DashPageHeader.qml:290
198+#: qml/Dash/DashPageHeader.qml:294
199199msgid "Remove from Favorites"
200200msgstr "Fjarlægja úr Eftirlæti"
201201
202−#: qml/Dash/DashPageHeader.qml:290
202+#: qml/Dash/DashPageHeader.qml:294
203203msgid "Add to Favorites"
204204msgstr "Bæta við Eftirlæti"
205205
@@ -429,14 +429,6 @@ msgctxt "Button: Call back on phone"
429429msgid "Call back"
430430msgstr ""
431431
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−
440432#: qml/Tutorial/TutorialBottom.qml:28
441433msgid "Open special menus"
442434msgstr ""
@@ -756,6 +748,9 @@ msgstr ""
756748#~ msgid "All"
757749#~ msgstr "Allt"
758750
751+#~ msgid "Unlock SIM"
752+#~ msgstr "Aflæsa SIM-korti"
753+
759754#~ msgid "Favorites"
760755#~ msgstr "Eftirlæti"
761756
@@ -765,6 +760,9 @@ msgstr ""
765760#~ msgid "Done"
766761#~ msgstr "Lokið"
767762
763+#~ msgid "Roaming"
764+#~ msgstr "Ráphamur"
765+
768766#~ msgid "Please re-enter"
769767#~ msgstr "Settu aftur inn"
770768
po/it.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-09-18 08:24+0000\n"
1212"Last-Translator: Claudio Arseni <claudio.arseni@gmail.com>\n"
1313"Language-Team: Italian <it@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -179,26 +179,26 @@ msgstr "Collegare ora."
179179msgid "Close all"
180180msgstr "Chiudi tutto"
181181
182−#: qml/Dash/DashPageHeader.qml:266
182+#: qml/Dash/DashPageHeader.qml:270
183183msgctxt "Button: Open the Ubuntu Store"
184184msgid "Store"
185185msgstr "Store"
186186
187−#: qml/Dash/DashPageHeader.qml:273
187+#: qml/Dash/DashPageHeader.qml:277
188188msgctxt "Button: Start a search in the current dash scope"
189189msgid "Search"
190190msgstr "Cerca"
191191
192−#: qml/Dash/DashPageHeader.qml:283
192+#: qml/Dash/DashPageHeader.qml:287
193193msgctxt "Button: Show the current dash scope settings"
194194msgid "Settings"
195195msgstr "Impostazioni"
196196
197−#: qml/Dash/DashPageHeader.qml:290
197+#: qml/Dash/DashPageHeader.qml:294
198198msgid "Remove from Favorites"
199199msgstr "Rimuovi dai preferiti"
200200
201−#: qml/Dash/DashPageHeader.qml:290
201+#: qml/Dash/DashPageHeader.qml:294
202202msgid "Add to Favorites"
203203msgstr "Aggiungi ai preferiti"
204204
@@ -428,14 +428,6 @@ msgctxt "Button: Call back on phone"
428428msgid "Call back"
429429msgstr "Richiama"
430430
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−
439431#: qml/Tutorial/TutorialBottom.qml:28
440432msgid "Open special menus"
441433msgstr "Apri menù speciali"
@@ -743,6 +735,9 @@ msgstr "%1 〉"
743735#~ msgid "All"
744736#~ msgstr "Tutto"
745737
738+#~ msgid "Unlock SIM"
739+#~ msgstr "Sblocca SIM"
740+
746741#~ msgid "Favorites"
747742#~ msgstr "Preferiti"
748743
@@ -755,6 +750,9 @@ msgstr "%1 〉"
755750#~ msgid "Done"
756751#~ msgstr "Fatto"
757752
753+#~ msgid "Roaming"
754+#~ msgstr "Roaming"
755+
758756#~ msgid "Log out"
759757#~ msgstr "Termina sessione"
760758
po/ja.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-10-05 10:05+0000\n"
1212"Last-Translator: Kentaro Kazuhama <Unknown>\n"
1313"Language-Team: Japanese <ja@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -170,26 +170,26 @@ msgstr ""
170170msgid "Close all"
171171msgstr ""
172172
173−#: qml/Dash/DashPageHeader.qml:266
173+#: qml/Dash/DashPageHeader.qml:270
174174msgctxt "Button: Open the Ubuntu Store"
175175msgid "Store"
176176msgstr ""
177177
178−#: qml/Dash/DashPageHeader.qml:273
178+#: qml/Dash/DashPageHeader.qml:277
179179msgctxt "Button: Start a search in the current dash scope"
180180msgid "Search"
181181msgstr ""
182182
183−#: qml/Dash/DashPageHeader.qml:283
183+#: qml/Dash/DashPageHeader.qml:287
184184msgctxt "Button: Show the current dash scope settings"
185185msgid "Settings"
186186msgstr ""
187187
188−#: qml/Dash/DashPageHeader.qml:290
188+#: qml/Dash/DashPageHeader.qml:294
189189msgid "Remove from Favorites"
190190msgstr "お気に入りから削除する"
191191
192−#: qml/Dash/DashPageHeader.qml:290
192+#: qml/Dash/DashPageHeader.qml:294
193193msgid "Add to Favorites"
194194msgstr "お気に入りに追加する"
195195
@@ -415,14 +415,6 @@ msgctxt "Button: Call back on phone"
415415msgid "Call back"
416416msgstr ""
417417
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−
426418#: qml/Tutorial/TutorialBottom.qml:28
427419msgid "Open special menus"
428420msgstr ""
@@ -722,6 +714,12 @@ msgstr ""
722714#~ msgid "Favorites"
723715#~ msgstr "お気に入り"
724716
717+#~ msgid "Unlock SIM"
718+#~ msgstr "SIMのアンロック"
719+
720+#~ msgid "Roaming"
721+#~ msgstr "ローミング"
722+
725723#~ msgid "Done"
726724#~ msgstr "完了"
727725
po/km.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2014-08-20 02:48+0000\n"
1212"Last-Translator: Sophea Sok <sksophea@gmail.com>\n"
1313"Language-Team: Khmer <km@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -173,26 +173,26 @@ msgstr ""
173173msgid "Close all"
174174msgstr ""
175175
176−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
177177msgctxt "Button: Open the Ubuntu Store"
178178msgid "Store"
179179msgstr "រក្សាទុក"
180180
181−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
182182msgctxt "Button: Start a search in the current dash scope"
183183msgid "Search"
184184msgstr "ស្វែងរក"
185185
186−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
187187msgctxt "Button: Show the current dash scope settings"
188188msgid "Settings"
189189msgstr "ការ​កំណត់"
190190
191−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
192192msgid "Remove from Favorites"
193193msgstr "យក​ចេញពី​សំណព្វ"
194194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196196msgid "Add to Favorites"
197197msgstr "បន្ថែម​ទៅ​សណព្វ"
198198
@@ -424,14 +424,6 @@ msgctxt "Button: Call back on phone"
424424msgid "Call back"
425425msgstr ""
426426
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−
435427#: qml/Tutorial/TutorialBottom.qml:28
436428msgid "Open special menus"
437429msgstr ""
@@ -731,6 +723,9 @@ msgstr "%1 〉"
731723#~ msgid "All"
732724#~ msgstr "ទាំងអស់"
733725
726+#~ msgid "Unlock SIM"
727+#~ msgstr "ដោះ​សោ​ស៊ីម"
728+
734729#~ msgid "Favorites"
735730#~ msgstr "និយម"
736731
@@ -743,6 +738,9 @@ msgstr "%1 〉"
743738#~ msgid "Done"
744739#~ msgstr "ធ្វើរួច"
745740
741+#~ msgid "Roaming"
742+#~ msgstr "រ៉ូមីង"
743+
746744#~ msgid "Power"
747745#~ msgstr "បីទ/បើក"
748746
po/kn.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2013-06-27 05:43+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Kannada <kn@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr ""
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr ""
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr ""
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
po/ko.po+16−18
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2014-08-19 13:02+0000\n"
1212"Last-Translator: MinSik CHO <Unknown>\n"
1313"Language-Team: Korean <ko@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -170,26 +170,26 @@ msgstr "지급 다시 접속!"
170170msgid "Close all"
171171msgstr "모두 닫기"
172172
173−#: qml/Dash/DashPageHeader.qml:266
173+#: qml/Dash/DashPageHeader.qml:270
174174msgctxt "Button: Open the Ubuntu Store"
175175msgid "Store"
176176msgstr "상점"
177177
178−#: qml/Dash/DashPageHeader.qml:273
178+#: qml/Dash/DashPageHeader.qml:277
179179msgctxt "Button: Start a search in the current dash scope"
180180msgid "Search"
181181msgstr "검색"
182182
183−#: qml/Dash/DashPageHeader.qml:283
183+#: qml/Dash/DashPageHeader.qml:287
184184msgctxt "Button: Show the current dash scope settings"
185185msgid "Settings"
186186msgstr "설정"
187187
188−#: qml/Dash/DashPageHeader.qml:290
188+#: qml/Dash/DashPageHeader.qml:294
189189msgid "Remove from Favorites"
190190msgstr "즐겨찾기에서 제거"
191191
192−#: qml/Dash/DashPageHeader.qml:290
192+#: qml/Dash/DashPageHeader.qml:294
193193msgid "Add to Favorites"
194194msgstr "즐겨찾기에 추가"
195195
@@ -412,14 +412,6 @@ msgctxt "Button: Call back on phone"
412412msgid "Call back"
413413msgstr "부재중 번호로 전화"
414414
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−
423415#: qml/Tutorial/TutorialBottom.qml:28
424416msgid "Open special menus"
425417msgstr "특별 메뉴 열기"
@@ -484,7 +476,7 @@ msgstr "안녕!"
484476
485477#: qml/Wizard/Pages/10-welcome.qml:44
486478msgid "Welcome to your Ubuntu device."
487−msgstr ""
479+msgstr "우분투를 사용해주셔서 감사합니다."
488480
489481#: qml/Wizard/Pages/10-welcome.qml:52
490482msgid "Let’s get started."
@@ -515,7 +507,7 @@ msgstr "보안 잠금"
515507
516508#: qml/Wizard/Pages/30-passwd-type.qml:79
517509msgid "Please select how you’d like to unlock your device."
518−msgstr ""
510+msgstr "장치의 잠금 해제 방법을 선택해주십시오."
519511
520512#: qml/Wizard/Pages/30-passwd-type.qml:102
521513msgctxt "Label: Type of security method"
@@ -616,7 +608,7 @@ msgstr "잘 하셨습니다!"
616608
617609#: qml/Wizard/Pages/80-finished.qml:46
618610msgid "Your device is now ready to use."
619−msgstr ""
611+msgstr "이제 장치를 사용할 수 있습니다."
620612
621613#: qml/Wizard/Pages/80-finished.qml:53
622614msgid "Finish"
@@ -695,6 +687,9 @@ msgstr "%1 〉"
695687#~ msgid "All"
696688#~ msgstr "모두"
697689
690+#~ msgid "Roaming"
691+#~ msgstr "로밍"
692+
698693#~ msgid "Favorites"
699694#~ msgstr "즐겨찾기"
700695
@@ -731,6 +726,9 @@ msgstr "%1 〉"
731726#~ msgid "Loading. Please Wait..."
732727#~ msgstr "불러오는 중 입니다. 짐시 기다려주십시오..."
733728
729+#~ msgid "Unlock SIM"
730+#~ msgstr "심 카드 잠금 해제"
731+
734732#~ msgid "Try swiping from the top edge to access the indicators"
735733#~ msgstr "위쪽 가장자리에서 쓸면 알림에 접근할 수 있습니다."
736734
po/ku.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2014-09-10 13:14+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Kurdish <ku@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -173,26 +173,26 @@ msgstr ""
173173msgid "Close all"
174174msgstr ""
175175
176−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
177177msgctxt "Button: Open the Ubuntu Store"
178178msgid "Store"
179179msgstr ""
180180
181−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
182182msgctxt "Button: Start a search in the current dash scope"
183183msgid "Search"
184184msgstr ""
185185
186−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
187187msgctxt "Button: Show the current dash scope settings"
188188msgid "Settings"
189189msgstr ""
190190
191−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
192192msgid "Remove from Favorites"
193193msgstr "Ji nav Bijareyan rake"
194194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196196msgid "Add to Favorites"
197197msgstr "Li Bijareyan zêde bike"
198198
@@ -422,14 +422,6 @@ msgctxt "Button: Call back on phone"
422422msgid "Call back"
423423msgstr ""
424424
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−
433425#: qml/Tutorial/TutorialBottom.qml:28
434426msgid "Open special menus"
435427msgstr ""
@@ -752,3 +744,9 @@ msgstr ""
752744
753745#~ msgid "Speaking..."
754746#~ 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 ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2013-06-27 06:17+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Kirghiz <ky@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr ""
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr ""
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr ""
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
po/lo.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2013-10-02 10:00+0000\n"
1212"Last-Translator: Anousak <anousak@gmail.com>\n"
1313"Language-Team: Lao <lo@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr ""
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr ""
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr ""
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
po/lt.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2014-05-19 17:15+0000\n"
1212"Last-Translator: Mantas Kriaučiūnas <mantas@akl.lt>\n"
1313"Language-Team: Lithuanian <lt@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"(n%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"
2020"X-Generator: Launchpad (build 17936)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -172,26 +172,26 @@ msgstr ""
172172msgid "Close all"
173173msgstr ""
174174
175−#: qml/Dash/DashPageHeader.qml:266
175+#: qml/Dash/DashPageHeader.qml:270
176176msgctxt "Button: Open the Ubuntu Store"
177177msgid "Store"
178178msgstr ""
179179
180−#: qml/Dash/DashPageHeader.qml:273
180+#: qml/Dash/DashPageHeader.qml:277
181181msgctxt "Button: Start a search in the current dash scope"
182182msgid "Search"
183183msgstr ""
184184
185−#: qml/Dash/DashPageHeader.qml:283
185+#: qml/Dash/DashPageHeader.qml:287
186186msgctxt "Button: Show the current dash scope settings"
187187msgid "Settings"
188188msgstr ""
189189
190−#: qml/Dash/DashPageHeader.qml:290
190+#: qml/Dash/DashPageHeader.qml:294
191191msgid "Remove from Favorites"
192192msgstr ""
193193
194−#: qml/Dash/DashPageHeader.qml:290
194+#: qml/Dash/DashPageHeader.qml:294
195195msgid "Add to Favorites"
196196msgstr ""
197197
@@ -417,14 +417,6 @@ msgctxt "Button: Call back on phone"
417417msgid "Call back"
418418msgstr ""
419419
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−
428420#: qml/Tutorial/TutorialBottom.qml:28
429421msgid "Open special menus"
430422msgstr ""
po/lv.po+13−15
@@ -8,7 +8,7 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity\n"
1010"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"
1212"PO-Revision-Date: 2015-11-22 19:13+0000\n"
1313"Last-Translator: Klavs Anson <anson.klavs@gmail.com>\n"
1414"Language-Team: Latvian <lata-l10n@googlegroups.com>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Type: text/plain; charset=UTF-8\n"
1717"Content-Transfer-Encoding: 8bit\n"
1818"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"
2020"X-Generator: Launchpad (build 17936)\n"
2121"Language: lv\n"
2222
@@ -176,26 +176,26 @@ msgstr ""
176176msgid "Close all"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:266
179+#: qml/Dash/DashPageHeader.qml:270
180180msgctxt "Button: Open the Ubuntu Store"
181181msgid "Store"
182182msgstr "Veikals"
183183
184−#: qml/Dash/DashPageHeader.qml:273
184+#: qml/Dash/DashPageHeader.qml:277
185185msgctxt "Button: Start a search in the current dash scope"
186186msgid "Search"
187187msgstr "Meklēt"
188188
189−#: qml/Dash/DashPageHeader.qml:283
189+#: qml/Dash/DashPageHeader.qml:287
190190msgctxt "Button: Show the current dash scope settings"
191191msgid "Settings"
192192msgstr "Iestatījumi"
193193
194−#: qml/Dash/DashPageHeader.qml:290
194+#: qml/Dash/DashPageHeader.qml:294
195195msgid "Remove from Favorites"
196196msgstr "Izņemt no izlases"
197197
198−#: qml/Dash/DashPageHeader.qml:290
198+#: qml/Dash/DashPageHeader.qml:294
199199msgid "Add to Favorites"
200200msgstr "Pievienot izlasei"
201201
@@ -428,14 +428,6 @@ msgctxt "Button: Call back on phone"
428428msgid "Call back"
429429msgstr "Atzvanīt"
430430
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−
439431#: qml/Tutorial/TutorialBottom.qml:28
440432msgid "Open special menus"
441433msgstr "Atvērt īpašas izvēlnes"
@@ -729,12 +721,18 @@ msgstr "%1 〉"
729721#~ msgid "All"
730722#~ msgstr "Visi"
731723
724+#~ msgid "Unlock SIM"
725+#~ msgstr "Atbloķēt SIM"
726+
732727#~ msgid "Favorites"
733728#~ msgstr "Iecienītās"
734729
735730#~ msgid "Done"
736731#~ msgstr "Pabeigts"
737732
733+#~ msgid "Roaming"
734+#~ msgstr "Viesabonēšana"
735+
738736#~ msgid "Store"
739737#~ msgstr "Veikals"
740738
po/ml.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2013-11-23 11:44+0000\n"
1212"Last-Translator: ST Alfas <Unknown>\n"
1313"Language-Team: Malayalam <ml@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr ""
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr ""
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr ""
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
po/mr.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2014-01-14 19:54+0000\n"
1212"Last-Translator: Rohan Deshmukh <Unknown>\n"
1313"Language-Team: Marathi <mr@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr "शोध"
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr ""
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr "आवड पासून काढूण टाका"
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr "आवड मध्ये जोडा"
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
po/ms.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2014-01-17 09:05+0000\n"
1212"Last-Translator: abuyop <Unknown>\n"
1313"Language-Team: Malay <ms@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -173,26 +173,26 @@ msgstr "Sambung semula sekarang!"
173173msgid "Close all"
174174msgstr "Tutup semua"
175175
176−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
177177msgctxt "Button: Open the Ubuntu Store"
178178msgid "Store"
179179msgstr "Kedai"
180180
181−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
182182msgctxt "Button: Start a search in the current dash scope"
183183msgid "Search"
184184msgstr "Gelintar"
185185
186−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
187187msgctxt "Button: Show the current dash scope settings"
188188msgid "Settings"
189189msgstr "Tetapan"
190190
191−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
192192msgid "Remove from Favorites"
193193msgstr "Buang dari Kegemaran"
194194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196196msgid "Add to Favorites"
197197msgstr "Tambah ke Kegemaran"
198198
@@ -422,14 +422,6 @@ msgctxt "Button: Call back on phone"
422422msgid "Call back"
423423msgstr "Panggilan semula"
424424
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−
433425#: qml/Tutorial/TutorialBottom.qml:28
434426msgid "Open special menus"
435427msgstr "Buka menu khas"
@@ -758,12 +750,18 @@ msgstr "%1 〉"
758750#~ msgid "Done"
759751#~ msgstr "Selesai"
760752
753+#~ msgid "Roaming"
754+#~ msgstr "Perayauan"
755+
761756#~ msgid "Please re-enter"
762757#~ msgstr "Sila masuk-semula"
763758
764759#~ msgid "Manage Scopes"
765760#~ msgstr "Urus Skop"
766761
762+#~ msgid "Unlock SIM"
763+#~ msgstr "Buka SIM"
764+
767765#~ msgid ""
768766#~ "You have now mastered the edge gestures and can start using the "
769767#~ "phone<br><br>Tap on the screen to start"
po/my.po+10−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2013-12-12 11:12+0000\n"
1212"Last-Translator: Pyae Sone <Unknown>\n"
1313"Language-Team: Burmese <my@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr "မှတ်သားပါ"
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr "ရှာဖွေရန်"
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr "ချိန်ညှိစရာများ"
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr "နှစ်သက်မှုအဖြစ်မှပယ်ဖျက်ပါ"
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr "နှစ်သက်မှုအဖြစ်ထည့်ပါ"
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
@@ -698,3 +690,6 @@ msgstr ""
698690
699691#~ msgid "Well done"
700692#~ msgstr "ကောင်းအောင်ပြုလုပ်ခဲ့သည်"
693+
694+#~ msgid "Roaming"
695+#~ msgstr "Roaming"
po/nb.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-07-05 19:44+0000\n"
1212"Last-Translator: Mathias Bynke <Unknown>\n"
1313"Language-Team: Norwegian Bokmal <nb@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -177,26 +177,26 @@ msgstr "Koble til nå!"
177177msgid "Close all"
178178msgstr "Lukk alle"
179179
180−#: qml/Dash/DashPageHeader.qml:266
180+#: qml/Dash/DashPageHeader.qml:270
181181msgctxt "Button: Open the Ubuntu Store"
182182msgid "Store"
183183msgstr "Butikk"
184184
185−#: qml/Dash/DashPageHeader.qml:273
185+#: qml/Dash/DashPageHeader.qml:277
186186msgctxt "Button: Start a search in the current dash scope"
187187msgid "Search"
188188msgstr "Søk"
189189
190−#: qml/Dash/DashPageHeader.qml:283
190+#: qml/Dash/DashPageHeader.qml:287
191191msgctxt "Button: Show the current dash scope settings"
192192msgid "Settings"
193193msgstr "Innstillinger"
194194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196196msgid "Remove from Favorites"
197197msgstr "Fjern fra favoritter"
198198
199−#: qml/Dash/DashPageHeader.qml:290
199+#: qml/Dash/DashPageHeader.qml:294
200200msgid "Add to Favorites"
201201msgstr "Legg til i favoritter"
202202
@@ -428,14 +428,6 @@ msgctxt "Button: Call back on phone"
428428msgid "Call back"
429429msgstr "Ring tilbake"
430430
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−
439431#: qml/Tutorial/TutorialBottom.qml:28
440432msgid "Open special menus"
441433msgstr "Åpne spesialmenyer"
@@ -733,6 +725,9 @@ msgstr "%1 〉"
733725#~ msgid "All"
734726#~ msgstr "Alt"
735727
728+#~ msgid "Unlock SIM"
729+#~ msgstr "Lås opp SIM"
730+
736731#~ msgid "Favorites"
737732#~ msgstr "Favoritter"
738733
@@ -745,6 +740,9 @@ msgstr "%1 〉"
745740#~ msgid "Done"
746741#~ msgstr "Ferdig"
747742
743+#~ msgid "Roaming"
744+#~ msgstr "Fremmednett"
745+
748746#~ msgid "Swipe from the left to reveal the launcher for quick access to apps"
749747#~ msgstr "Skyv fra venstre for å få tilgang til programoppstarteren"
750748
po/ne.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-12-06 15:11+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Nepali <ne@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr ""
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr ""
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr ""
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
po/nl.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-07-07 07:14+0000\n"
1212"Last-Translator: Hannie Dumoleyn <Unknown>\n"
1313"Language-Team: Dutch <nl@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -177,26 +177,26 @@ msgstr ""
177177msgid "Close all"
178178msgstr ""
179179
180−#: qml/Dash/DashPageHeader.qml:266
180+#: qml/Dash/DashPageHeader.qml:270
181181msgctxt "Button: Open the Ubuntu Store"
182182msgid "Store"
183183msgstr "Winkel"
184184
185−#: qml/Dash/DashPageHeader.qml:273
185+#: qml/Dash/DashPageHeader.qml:277
186186msgctxt "Button: Start a search in the current dash scope"
187187msgid "Search"
188188msgstr "Zoeken"
189189
190−#: qml/Dash/DashPageHeader.qml:283
190+#: qml/Dash/DashPageHeader.qml:287
191191msgctxt "Button: Show the current dash scope settings"
192192msgid "Settings"
193193msgstr "Instellingen"
194194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196196msgid "Remove from Favorites"
197197msgstr "Verwijderen uit favorieten"
198198
199−#: qml/Dash/DashPageHeader.qml:290
199+#: qml/Dash/DashPageHeader.qml:294
200200msgid "Add to Favorites"
201201msgstr "Toevoegen aan favorieten"
202202
@@ -426,14 +426,6 @@ msgctxt "Button: Call back on phone"
426426msgid "Call back"
427427msgstr ""
428428
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−
437429#: qml/Tutorial/TutorialBottom.qml:28
438430msgid "Open special menus"
439431msgstr "Speciale menu's openen"
@@ -746,6 +738,9 @@ msgstr "%1 〉"
746738#~ msgid "Store"
747739#~ msgstr "Winkel"
748740
741+#~ msgid "Roaming"
742+#~ msgstr "Roaming"
743+
749744#~ msgid "Done"
750745#~ msgstr "Klaar"
751746
@@ -767,6 +762,9 @@ msgstr "%1 〉"
767762#~ msgid "Power"
768763#~ msgstr "Energie"
769764
765+#~ msgid "Unlock SIM"
766+#~ msgstr "Simkaart deblokkeren"
767+
770768#~ msgid "Restart"
771769#~ msgstr "Herstarten"
772770
po/nn.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-05-12 11:32+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Norwegian Nynorsk <nn@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr ""
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr ""
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr ""
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
po/oc.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-02-05 20:35+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Occitan (post 1500) <oc@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr ""
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr ""
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr ""
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
po/or.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-03-21 05:28+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Oriya <or@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n!=1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr ""
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr ""
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr ""
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
po/pa.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-04-24 04:29+0000\n"
1212"Last-Translator: Gursharnjit_Singh <ubuntuser13@gmail.com>\n"
1313"Language-Team: Punjabi <pa@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -173,26 +173,26 @@ msgstr ""
173173msgid "Close all"
174174msgstr ""
175175
176−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
177177msgctxt "Button: Open the Ubuntu Store"
178178msgid "Store"
179179msgstr "ਸਟੋਰ"
180180
181−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
182182msgctxt "Button: Start a search in the current dash scope"
183183msgid "Search"
184184msgstr "ਖੋਜ"
185185
186−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
187187msgctxt "Button: Show the current dash scope settings"
188188msgid "Settings"
189189msgstr "ਸੈਟਿੰਗ"
190190
191−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
192192msgid "Remove from Favorites"
193193msgstr "ਪਸੰਦ ਵਿੱਚੋਂ ਹਟਾਓ"
194194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196196msgid "Add to Favorites"
197197msgstr "ਪਸੰਦ ਵਿੱਚ ਜੋੜੋ"
198198
@@ -422,14 +422,6 @@ msgctxt "Button: Call back on phone"
422422msgid "Call back"
423423msgstr ""
424424
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−
433425#: qml/Tutorial/TutorialBottom.qml:28
434426msgid "Open special menus"
435427msgstr "ਖਾਸ਼ ਮੀਨੂੰ ਖੋਲ੍ਹੋ"
@@ -714,6 +706,12 @@ msgstr "%1 〉"
714706#~ msgid "Please re-enter"
715707#~ msgstr "ਕਿਰਪਾ ਕਰਕੇ ਮੁੜ-ਦਰਜ ਕਰੋ"
716708
709+#~ msgid "Unlock SIM"
710+#~ msgstr "ਅਣਲਾਕ SIM"
711+
712+#~ msgid "Roaming"
713+#~ msgstr "ਰੋਮਿੰਗ"
714+
717715#~ msgid "Please select how you’d like to unlock your phone."
718716#~ msgstr ""
719717#~ "ਕਿਰਪਾ ਕਰਕੇ ਚੁਣੋ ਤੁਸੀਂ ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਕਿਸ ਤਰ੍ਹਾਂ ਅਣ-ਲਾਕ ਕਰਨਾ ਪਸੰਦ ਕਰੋਗੇ।"
po/pl.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-07-12 09:46+0000\n"
1212"Last-Translator: Seweryn Opyd <Unknown>\n"
1313"Language-Team: Polish <pl@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
1818"|| n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
2020"X-Generator: Launchpad (build 17936)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -175,26 +175,26 @@ msgstr "Ponownie połącz teraz!"
175175msgid "Close all"
176176msgstr "Zamknij wszystko"
177177
178−#: qml/Dash/DashPageHeader.qml:266
178+#: qml/Dash/DashPageHeader.qml:270
179179msgctxt "Button: Open the Ubuntu Store"
180180msgid "Store"
181181msgstr "Sklep"
182182
183−#: qml/Dash/DashPageHeader.qml:273
183+#: qml/Dash/DashPageHeader.qml:277
184184msgctxt "Button: Start a search in the current dash scope"
185185msgid "Search"
186186msgstr "Wyszukaj"
187187
188−#: qml/Dash/DashPageHeader.qml:283
188+#: qml/Dash/DashPageHeader.qml:287
189189msgctxt "Button: Show the current dash scope settings"
190190msgid "Settings"
191191msgstr "Ustawienia"
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Remove from Favorites"
195195msgstr "Usuń z ulubionych"
196196
197−#: qml/Dash/DashPageHeader.qml:290
197+#: qml/Dash/DashPageHeader.qml:294
198198msgid "Add to Favorites"
199199msgstr "Dodaj do ulubionych"
200200
@@ -429,14 +429,6 @@ msgctxt "Button: Call back on phone"
429429msgid "Call back"
430430msgstr "Oddzwoń"
431431
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−
440432#: qml/Tutorial/TutorialBottom.qml:28
441433msgid "Open special menus"
442434msgstr "Otwórz menu specjalne"
@@ -740,6 +732,9 @@ msgstr "%1 〉"
740732#~ "Wydawanie poleceń krawędzi zostało opanowane. Urządzenie gotowe do "
741733#~ "pracy.<br><br>Dotknij ekranu by rozpocząć"
742734
735+#~ msgid "Unlock SIM"
736+#~ msgstr "Odblokuj kartę SIM"
737+
743738#~ msgid "Log out"
744739#~ msgstr "Wyloguj"
745740
@@ -764,6 +759,9 @@ msgstr "%1 〉"
764759#~ msgid "Settings"
765760#~ msgstr "Ustawienia"
766761
762+#~ msgid "Roaming"
763+#~ msgstr "Roaming"
764+
767765#~ msgid "Please re-enter"
768766#~ msgstr "Proszę wprowadź ponownie"
769767
po/pt.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2016-02-18 01:11+0000\n"
1212"Last-Translator: Ivo Xavier <ivofernandes12@gmail.com>\n"
1313"Language-Team: Portuguese <pt@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -177,26 +177,26 @@ msgstr "Volte a ligar agora!"
177177msgid "Close all"
178178msgstr "Fechar tudo"
179179
180−#: qml/Dash/DashPageHeader.qml:266
180+#: qml/Dash/DashPageHeader.qml:270
181181msgctxt "Button: Open the Ubuntu Store"
182182msgid "Store"
183183msgstr "Store"
184184
185−#: qml/Dash/DashPageHeader.qml:273
185+#: qml/Dash/DashPageHeader.qml:277
186186msgctxt "Button: Start a search in the current dash scope"
187187msgid "Search"
188188msgstr "Procurar"
189189
190−#: qml/Dash/DashPageHeader.qml:283
190+#: qml/Dash/DashPageHeader.qml:287
191191msgctxt "Button: Show the current dash scope settings"
192192msgid "Settings"
193193msgstr "Definições"
194194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196196msgid "Remove from Favorites"
197197msgstr "Remover dos favoritos"
198198
199−#: qml/Dash/DashPageHeader.qml:290
199+#: qml/Dash/DashPageHeader.qml:294
200200msgid "Add to Favorites"
201201msgstr "Adicionar aos favoritos"
202202
@@ -428,14 +428,6 @@ msgctxt "Button: Call back on phone"
428428msgid "Call back"
429429msgstr "Ligar de volta"
430430
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−
439431#: qml/Tutorial/TutorialBottom.qml:28
440432msgid "Open special menus"
441433msgstr "Abrir menus especiais"
@@ -721,6 +713,9 @@ msgstr "%1 〉"
721713#~ msgid "All"
722714#~ msgstr "Todos"
723715
716+#~ msgid "Unlock SIM"
717+#~ msgstr "Desbloquear SIM"
718+
724719#~ msgid "Favorites"
725720#~ msgstr "Favoritos"
726721
@@ -730,6 +725,9 @@ msgstr "%1 〉"
730725#~ msgid "Done"
731726#~ msgstr "Concluído"
732727
728+#~ msgid "Roaming"
729+#~ msgstr "Roaming"
730+
733731#~ msgid "Log out"
734732#~ msgstr "Terminar sessão"
735733
po/pt_BR.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-08-05 04:40+0000\n"
1212"Last-Translator: Julio Alexander Sieg <julio.sieg@gmail.com>\n"
1313"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -175,26 +175,26 @@ msgstr ""
175175msgid "Close all"
176176msgstr ""
177177
178−#: qml/Dash/DashPageHeader.qml:266
178+#: qml/Dash/DashPageHeader.qml:270
179179msgctxt "Button: Open the Ubuntu Store"
180180msgid "Store"
181181msgstr "Loja"
182182
183−#: qml/Dash/DashPageHeader.qml:273
183+#: qml/Dash/DashPageHeader.qml:277
184184msgctxt "Button: Start a search in the current dash scope"
185185msgid "Search"
186186msgstr "Pesquisar"
187187
188−#: qml/Dash/DashPageHeader.qml:283
188+#: qml/Dash/DashPageHeader.qml:287
189189msgctxt "Button: Show the current dash scope settings"
190190msgid "Settings"
191191msgstr "Configurações"
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Remove from Favorites"
195195msgstr "Remover dos favoritos"
196196
197−#: qml/Dash/DashPageHeader.qml:290
197+#: qml/Dash/DashPageHeader.qml:294
198198msgid "Add to Favorites"
199199msgstr "Adicionar aos favoritos"
200200
@@ -424,14 +424,6 @@ msgctxt "Button: Call back on phone"
424424msgid "Call back"
425425msgstr ""
426426
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−
435427#: qml/Tutorial/TutorialBottom.qml:28
436428msgid "Open special menus"
437429msgstr "Abrir menus especiais"
@@ -737,6 +729,9 @@ msgstr "%1 〉"
737729#~ "Agora você já domina os gestos das bordas e pode começar a usar o "
738730#~ "telefone<br><br>Toque na tela para iniciar"
739731
732+#~ msgid "Unlock SIM"
733+#~ msgstr "Desbloquear SIM"
734+
740735#~ msgid "Store"
741736#~ msgstr "Loja"
742737
@@ -749,6 +744,9 @@ msgstr "%1 〉"
749744#~ msgid "Favorites"
750745#~ msgstr "Favoritos"
751746
747+#~ msgid "Roaming"
748+#~ msgstr "Roaming"
749+
752750#~ msgid "All"
753751#~ msgstr "Tudo"
754752
po/ro.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-07-06 17:47+0000\n"
1212"Last-Translator: Meriuță Cornel <meriutacornel@neacornel.eu>\n"
1313"Language-Team: Romanian <ro@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
1818"== 0) && (n != 0))) ? 2: 1));\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
2020"X-Generator: Launchpad (build 17936)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -178,26 +178,26 @@ msgstr ""
178178msgid "Close all"
179179msgstr ""
180180
181−#: qml/Dash/DashPageHeader.qml:266
181+#: qml/Dash/DashPageHeader.qml:270
182182msgctxt "Button: Open the Ubuntu Store"
183183msgid "Store"
184184msgstr "Magazin"
185185
186−#: qml/Dash/DashPageHeader.qml:273
186+#: qml/Dash/DashPageHeader.qml:277
187187msgctxt "Button: Start a search in the current dash scope"
188188msgid "Search"
189189msgstr "Căutare"
190190
191−#: qml/Dash/DashPageHeader.qml:283
191+#: qml/Dash/DashPageHeader.qml:287
192192msgctxt "Button: Show the current dash scope settings"
193193msgid "Settings"
194194msgstr "Configurări"
195195
196−#: qml/Dash/DashPageHeader.qml:290
196+#: qml/Dash/DashPageHeader.qml:294
197197msgid "Remove from Favorites"
198198msgstr "Șterge din favorite"
199199
200−#: qml/Dash/DashPageHeader.qml:290
200+#: qml/Dash/DashPageHeader.qml:294
201201msgid "Add to Favorites"
202202msgstr "Adaugă la favorite"
203203
@@ -432,14 +432,6 @@ msgctxt "Button: Call back on phone"
432432msgid "Call back"
433433msgstr ""
434434
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−
443435#: qml/Tutorial/TutorialBottom.qml:28
444436msgid "Open special menus"
445437msgstr "Deschide meniurile speciale"
@@ -751,6 +743,9 @@ msgstr "%1 〉"
751743#~ msgid "All"
752744#~ msgstr "Tot"
753745
746+#~ msgid "Unlock SIM"
747+#~ msgstr "Deblocare SIM"
748+
754749#~ msgid "Favorites"
755750#~ msgstr "Favorite"
756751
@@ -763,6 +758,9 @@ msgstr "%1 〉"
763758#~ msgid "Done"
764759#~ msgstr "Finalizat"
765760
761+#~ msgid "Roaming"
762+#~ msgstr "Roaming"
763+
766764#~ msgid "Log out"
767765#~ msgstr "Închide sesiunea"
768766
po/ru.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-07-06 05:33+0000\n"
1212"Last-Translator: ☠Jay ZDLin☠ <Unknown>\n"
1313"Language-Team: Russian <ru@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
2020"X-Generator: Launchpad (build 17936)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -179,26 +179,26 @@ msgstr "Переподключиться сейчас!"
179179msgid "Close all"
180180msgstr "Закрыть все"
181181
182−#: qml/Dash/DashPageHeader.qml:266
182+#: qml/Dash/DashPageHeader.qml:270
183183msgctxt "Button: Open the Ubuntu Store"
184184msgid "Store"
185185msgstr "Магазин"
186186
187−#: qml/Dash/DashPageHeader.qml:273
187+#: qml/Dash/DashPageHeader.qml:277
188188msgctxt "Button: Start a search in the current dash scope"
189189msgid "Search"
190190msgstr "Найти"
191191
192−#: qml/Dash/DashPageHeader.qml:283
192+#: qml/Dash/DashPageHeader.qml:287
193193msgctxt "Button: Show the current dash scope settings"
194194msgid "Settings"
195195msgstr "Настройки"
196196
197−#: qml/Dash/DashPageHeader.qml:290
197+#: qml/Dash/DashPageHeader.qml:294
198198msgid "Remove from Favorites"
199199msgstr "Удалить из избранного"
200200
201−#: qml/Dash/DashPageHeader.qml:290
201+#: qml/Dash/DashPageHeader.qml:294
202202msgid "Add to Favorites"
203203msgstr "Добавить в избранное"
204204
@@ -431,14 +431,6 @@ msgctxt "Button: Call back on phone"
431431msgid "Call back"
432432msgstr "Позвонить"
433433
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−
442434#: qml/Tutorial/TutorialBottom.qml:28
443435msgid "Open special menus"
444436msgstr "Открытие специальных меню"
@@ -747,12 +739,18 @@ msgstr "%1 〉"
747739#~ "Вы научились пользоваться Ubuntu и можете начать использовать свой "
748740#~ "телефон<br><br>Нажмите на экран"
749741
742+#~ msgid "Unlock SIM"
743+#~ msgstr "Разблокировать SIM-карту"
744+
750745#~ msgid "Power off"
751746#~ msgstr "Отключить"
752747
753748#~ msgid "All"
754749#~ msgstr "Все"
755750
751+#~ msgid "Roaming"
752+#~ msgstr "Роуминг"
753+
756754#~ msgid "Favorites"
757755#~ msgstr "Избранное"
758756
po/shn.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-11-10 12:09+0000\n"
1212"Last-Translator: Rockworld <sumoisrock@gmail.com>\n"
1313"Language-Team: Shan <shn@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=(n == 1) ? 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"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr ""
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr ""
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr ""
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
po/si.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2013-06-26 22:36+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Sinhalese <si@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -173,26 +173,26 @@ msgstr ""
173173msgid "Close all"
174174msgstr ""
175175
176−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
177177msgctxt "Button: Open the Ubuntu Store"
178178msgid "Store"
179179msgstr ""
180180
181−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
182182msgctxt "Button: Start a search in the current dash scope"
183183msgid "Search"
184184msgstr ""
185185
186−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
187187msgctxt "Button: Show the current dash scope settings"
188188msgid "Settings"
189189msgstr ""
190190
191−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
192192msgid "Remove from Favorites"
193193msgstr ""
194194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196196msgid "Add to Favorites"
197197msgstr ""
198198
@@ -418,14 +418,6 @@ msgctxt "Button: Call back on phone"
418418msgid "Call back"
419419msgstr ""
420420
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−
429421#: qml/Tutorial/TutorialBottom.qml:28
430422msgid "Open special menus"
431423msgstr ""
po/sk.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2016-03-02 01:54+0000\n"
1212"Last-Translator: P_E_T_O <Unknown>\n"
1313"Language-Team: Slovak <sk@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"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"
1919"X-Generator: Launchpad (build 17936)\n"
2020"Language: sk\n"
2121
@@ -180,26 +180,26 @@ msgstr "Znova pripojiť!"
180180msgid "Close all"
181181msgstr "Zavrieť všetko"
182182
183−#: qml/Dash/DashPageHeader.qml:266
183+#: qml/Dash/DashPageHeader.qml:270
184184msgctxt "Button: Open the Ubuntu Store"
185185msgid "Store"
186186msgstr "Obchod"
187187
188−#: qml/Dash/DashPageHeader.qml:273
188+#: qml/Dash/DashPageHeader.qml:277
189189msgctxt "Button: Start a search in the current dash scope"
190190msgid "Search"
191191msgstr "Hľadať"
192192
193−#: qml/Dash/DashPageHeader.qml:283
193+#: qml/Dash/DashPageHeader.qml:287
194194msgctxt "Button: Show the current dash scope settings"
195195msgid "Settings"
196196msgstr "Nastavenia"
197197
198−#: qml/Dash/DashPageHeader.qml:290
198+#: qml/Dash/DashPageHeader.qml:294
199199msgid "Remove from Favorites"
200200msgstr "Odstrániť z obľúbených"
201201
202−#: qml/Dash/DashPageHeader.qml:290
202+#: qml/Dash/DashPageHeader.qml:294
203203msgid "Add to Favorites"
204204msgstr "Pridať k obľúbeným"
205205
@@ -434,14 +434,6 @@ msgctxt "Button: Call back on phone"
434434msgid "Call back"
435435msgstr "Zavolať naspäť"
436436
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−
445437#: qml/Tutorial/TutorialBottom.qml:28
446438msgid "Open special menus"
447439msgstr "Otvoriť špeciálne menu"
@@ -686,3 +678,9 @@ msgstr "〈 %1"
686678#, qt-format
687679msgid "%1 〉"
688680msgstr "%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 ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2016-01-31 18:34+0000\n"
1212"Last-Translator: Bernard Banko <Unknown>\n"
1313"Language-Team: Slovenian <sl@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
1818"n%100==4 ? 3 : 0);\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
2020"X-Generator: Launchpad (build 17936)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -178,26 +178,26 @@ msgstr "Ponovno priključi sedaj!"
178178msgid "Close all"
179179msgstr "Zapri vse"
180180
181−#: qml/Dash/DashPageHeader.qml:266
181+#: qml/Dash/DashPageHeader.qml:270
182182msgctxt "Button: Open the Ubuntu Store"
183183msgid "Store"
184184msgstr "Trgovina"
185185
186−#: qml/Dash/DashPageHeader.qml:273
186+#: qml/Dash/DashPageHeader.qml:277
187187msgctxt "Button: Start a search in the current dash scope"
188188msgid "Search"
189189msgstr "Iskanje"
190190
191−#: qml/Dash/DashPageHeader.qml:283
191+#: qml/Dash/DashPageHeader.qml:287
192192msgctxt "Button: Show the current dash scope settings"
193193msgid "Settings"
194194msgstr "Nastavitve"
195195
196−#: qml/Dash/DashPageHeader.qml:290
196+#: qml/Dash/DashPageHeader.qml:294
197197msgid "Remove from Favorites"
198198msgstr "Odstrani iz priljubljenih"
199199
200−#: qml/Dash/DashPageHeader.qml:290
200+#: qml/Dash/DashPageHeader.qml:294
201201msgid "Add to Favorites"
202202msgstr "Dodaj med priljubljene"
203203
@@ -435,14 +435,6 @@ msgctxt "Button: Call back on phone"
435435msgid "Call back"
436436msgstr "Pokliči nazaj"
437437
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−
446438#: qml/Tutorial/TutorialBottom.qml:28
447439msgid "Open special menus"
448440msgstr "Odpri posebne menije"
@@ -759,6 +751,12 @@ msgstr "%1 〉"
759751#~ msgid "All"
760752#~ msgstr "Vse"
761753
754+#~ msgid "Unlock SIM"
755+#~ msgstr "Odkleni SIM"
756+
757+#~ msgid "Roaming"
758+#~ msgstr "Gostovanje"
759+
762760#~ msgid "Favorites"
763761#~ msgstr "Priljubljeni"
764762
po/sq.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-11-30 21:05+0000\n"
1212"Last-Translator: Indrit Bashkimi <indrit.bashkimi@gmail.com>\n"
1313"Language-Team: Albanian <sq@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:18+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr "Rilidhu tani!"
171171msgid "Close all"
172172msgstr "Mbylli të gjitha"
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr "Ruaje"
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr "Kërko"
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr "Parametrat"
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr "Hiq nga të preferuarit"
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr "Shto në të preferuarit"
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
@@ -682,11 +674,17 @@ msgstr "%1 〉"
682674#~ msgid "Right edge"
683675#~ msgstr "Cepi djathtas"
684676
677+#~ msgid "Unlock SIM"
678+#~ msgstr "Zhblloko SIM"
679+
685680#~ msgid "Welcome to your Ubuntu phone."
686681#~ msgstr "Mirëseerdhët në telefonin tuaj Ubuntu."
687682
688683#~ msgid "Your phone is now ready to use."
689684#~ msgstr "Telefoni juaj tani është gati për përdorim."
690685
686+#~ msgid "Roaming"
687+#~ msgstr "Roaming"
688+
691689#~ msgid "Please select how you’d like to unlock your phone."
692690#~ msgstr "Zgjidhni mënyrën e zhbllokimit të telefonit."
po/sr.po+15−17
@@ -8,8 +8,8 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity\n"
1010"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
11−"POT-Creation-Date: 2016-03-01 10:33+0000\n"
12−"PO-Revision-Date: 2016-02-10 21:21+0000\n"
11+"POT-Creation-Date: 2016-03-08 21:04+0000\n"
12+"PO-Revision-Date: 2016-03-09 21:47+0000\n"
1313"Last-Translator: Bojan Bogdanović <Unknown>\n"
1414"Language-Team: српски <xfce4@xfce4.org>\n"
1515"MIME-Version: 1.0\n"
@@ -17,7 +17,7 @@ msgstr ""
1717"Content-Transfer-Encoding: 8bit\n"
1818"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1919"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"
2121"X-Generator: Launchpad (build 17936)\n"
2222"Language: sr\n"
2323
@@ -178,26 +178,26 @@ msgstr "Поново се повежи!"
178178msgid "Close all"
179179msgstr "Затворите све"
180180
181−#: qml/Dash/DashPageHeader.qml:266
181+#: qml/Dash/DashPageHeader.qml:270
182182msgctxt "Button: Open the Ubuntu Store"
183183msgid "Store"
184184msgstr "Продавница"
185185
186−#: qml/Dash/DashPageHeader.qml:273
186+#: qml/Dash/DashPageHeader.qml:277
187187msgctxt "Button: Start a search in the current dash scope"
188188msgid "Search"
189189msgstr "Тражи"
190190
191−#: qml/Dash/DashPageHeader.qml:283
191+#: qml/Dash/DashPageHeader.qml:287
192192msgctxt "Button: Show the current dash scope settings"
193193msgid "Settings"
194194msgstr "Подешавања"
195195
196−#: qml/Dash/DashPageHeader.qml:290
196+#: qml/Dash/DashPageHeader.qml:294
197197msgid "Remove from Favorites"
198198msgstr "Уклони из омиљених"
199199
200−#: qml/Dash/DashPageHeader.qml:290
200+#: qml/Dash/DashPageHeader.qml:294
201201msgid "Add to Favorites"
202202msgstr "Додај у омиљене"
203203
@@ -398,7 +398,7 @@ msgstr "Заказано…"
398398
399399#: qml/Panel/Indicators/MenuItemFactory.qml:906
400400msgid "Downloading"
401−msgstr "Преузимам"
401+msgstr "Преузимање"
402402
403403#: qml/Panel/Indicators/MenuItemFactory.qml:908
404404msgid "Paused, tap to resume"
@@ -432,14 +432,6 @@ msgctxt "Button: Call back on phone"
432432msgid "Call back"
433433msgstr "Позови назад"
434434
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−
443435#: qml/Tutorial/TutorialBottom.qml:28
444436msgid "Open special menus"
445437msgstr "Отвори нарочите изборнике"
@@ -771,6 +763,12 @@ msgstr "%1 〉"
771763#~ msgid "Done"
772764#~ msgstr "Готово"
773765
766+#~ msgid "Unlock SIM"
767+#~ msgstr "Откључај СИМ картицу"
768+
769+#~ msgid "Roaming"
770+#~ msgstr "Роминг"
771+
774772#~ msgid "Restart"
775773#~ msgstr "Поново покрени"
776774
po/sv.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-07-12 22:17+0000\n"
1212"Last-Translator: Josef Andersson <Unknown>\n"
1313"Language-Team: Swedish\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020"Language: sv\n"
2121
@@ -175,26 +175,26 @@ msgstr "Återanslut nu!"
175175msgid "Close all"
176176msgstr "Stäng alla"
177177
178−#: qml/Dash/DashPageHeader.qml:266
178+#: qml/Dash/DashPageHeader.qml:270
179179msgctxt "Button: Open the Ubuntu Store"
180180msgid "Store"
181181msgstr "Förråd"
182182
183−#: qml/Dash/DashPageHeader.qml:273
183+#: qml/Dash/DashPageHeader.qml:277
184184msgctxt "Button: Start a search in the current dash scope"
185185msgid "Search"
186186msgstr "Sök"
187187
188−#: qml/Dash/DashPageHeader.qml:283
188+#: qml/Dash/DashPageHeader.qml:287
189189msgctxt "Button: Show the current dash scope settings"
190190msgid "Settings"
191191msgstr "Inställningar"
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Remove from Favorites"
195195msgstr "Ta bort från Favoriter"
196196
197−#: qml/Dash/DashPageHeader.qml:290
197+#: qml/Dash/DashPageHeader.qml:294
198198msgid "Add to Favorites"
199199msgstr "Lägg till Favoriter"
200200
@@ -426,14 +426,6 @@ msgctxt "Button: Call back on phone"
426426msgid "Call back"
427427msgstr "Ring upp"
428428
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−
437429#: qml/Tutorial/TutorialBottom.qml:28
438430msgid "Open special menus"
439431msgstr "Öppna specialmenyer"
@@ -736,6 +728,12 @@ msgstr "%1 〉"
736728#~ msgid "Speaking..."
737729#~ msgstr "Talar…"
738730
731+#~ msgid "Unlock SIM"
732+#~ msgstr "Lås upp SIM-kort"
733+
734+#~ msgid "Roaming"
735+#~ msgstr "Roaming"
736+
739737#~ msgid "Favorites"
740738#~ msgstr "Favoriter"
741739
po/sw.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-07-17 20:02+0000\n"
1212"Last-Translator: Valentine <mwangi_valentino@yahoo.com>\n"
1313"Language-Team: Swahili <sw@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -173,26 +173,26 @@ msgstr ""
173173msgid "Close all"
174174msgstr ""
175175
176−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
177177msgctxt "Button: Open the Ubuntu Store"
178178msgid "Store"
179179msgstr "Duka"
180180
181−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
182182msgctxt "Button: Start a search in the current dash scope"
183183msgid "Search"
184184msgstr "Tafuta"
185185
186−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
187187msgctxt "Button: Show the current dash scope settings"
188188msgid "Settings"
189189msgstr "Mipangilio"
190190
191−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
192192msgid "Remove from Favorites"
193193msgstr "Toa kutoka nilizopenda"
194194
195−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
196196msgid "Add to Favorites"
197197msgstr "Ongeza kwenye nilizopenda"
198198
@@ -422,14 +422,6 @@ msgctxt "Button: Call back on phone"
422422msgid "Call back"
423423msgstr ""
424424
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−
433425#: qml/Tutorial/TutorialBottom.qml:28
434426msgid "Open special menus"
435427msgstr "Fungua orodha maalum"
@@ -711,6 +703,12 @@ msgstr ""
711703#~ msgid "Please re-enter"
712704#~ msgstr "Tafadhali bonyeza tena"
713705
706+#~ msgid "Unlock SIM"
707+#~ msgstr "Fungua SIM"
708+
709+#~ msgid "Roaming"
710+#~ msgstr "Uzururaji"
711+
714712#~ msgid "Please select how you’d like to unlock your phone."
715713#~ msgstr "Tafadhali chagua vile ungependa kufunga simu."
716714
po/ta.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2013-10-24 11:36+0000\n"
1212"Last-Translator: Arun Kumar - அருண் குமார் <thangam.arunx@gmail.com>\n"
1313"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020"Language: ta\n"
2121
@@ -172,26 +172,26 @@ msgstr ""
172172msgid "Close all"
173173msgstr ""
174174
175−#: qml/Dash/DashPageHeader.qml:266
175+#: qml/Dash/DashPageHeader.qml:270
176176msgctxt "Button: Open the Ubuntu Store"
177177msgid "Store"
178178msgstr ""
179179
180−#: qml/Dash/DashPageHeader.qml:273
180+#: qml/Dash/DashPageHeader.qml:277
181181msgctxt "Button: Start a search in the current dash scope"
182182msgid "Search"
183183msgstr ""
184184
185−#: qml/Dash/DashPageHeader.qml:283
185+#: qml/Dash/DashPageHeader.qml:287
186186msgctxt "Button: Show the current dash scope settings"
187187msgid "Settings"
188188msgstr ""
189189
190−#: qml/Dash/DashPageHeader.qml:290
190+#: qml/Dash/DashPageHeader.qml:294
191191msgid "Remove from Favorites"
192192msgstr ""
193193
194−#: qml/Dash/DashPageHeader.qml:290
194+#: qml/Dash/DashPageHeader.qml:294
195195msgid "Add to Favorites"
196196msgstr ""
197197
@@ -417,14 +417,6 @@ msgctxt "Button: Call back on phone"
417417msgid "Call back"
418418msgstr ""
419419
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−
428420#: qml/Tutorial/TutorialBottom.qml:28
429421msgid "Open special menus"
430422msgstr ""
po/te.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2014-07-19 10:04+0000\n"
1212"Last-Translator: Praveen Illa <mail2ipn@gmail.com>\n"
1313"Language-Team: Telugu <te@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr ""
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr ""
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr ""
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
po/th.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2014-10-02 04:55+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Thai <th@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr ""
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr ""
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr ""
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
po/tr.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-03-22 15:56+0000\n"
1212"Last-Translator: Arda Ünlü <aarda.uunlu@gmail.com>\n"
1313"Language-Team: Turkish <tr@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr "Mağaza"
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr "Ara"
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr "Ayarlar"
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr "Sık kullanılanlardan kaldır"
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr "Yer İmlerine Ekle"
196196
@@ -420,14 +420,6 @@ msgctxt "Button: Call back on phone"
420420msgid "Call back"
421421msgstr ""
422422
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−
431423#: qml/Tutorial/TutorialBottom.qml:28
432424msgid "Open special menus"
433425msgstr "Özel menüleri aç"
@@ -739,6 +731,9 @@ msgstr "%1 〉"
739731#~ msgid "Store"
740732#~ msgstr "Mağaza"
741733
734+#~ msgid "Unlock SIM"
735+#~ msgstr "SIM kilidini aç"
736+
742737#~ msgid "Reboot"
743738#~ msgstr "Yeniden başlat"
744739
@@ -760,6 +755,9 @@ msgstr "%1 〉"
760755#~ msgid "Restart"
761756#~ msgstr "Yeniden başlat"
762757
758+#~ msgid "Roaming"
759+#~ msgstr "Dolaşım"
760+
763761#~ msgid "Please re-enter"
764762#~ msgstr "Lütfen yeniden girin"
765763
po/ug.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-12-01 07:37+0000\n"
1212"Last-Translator: Eltikin <eltikinuyghur@hotmail.com>\n"
1313"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -172,26 +172,26 @@ msgstr ""
172172msgid "Close all"
173173msgstr ""
174174
175−#: qml/Dash/DashPageHeader.qml:266
175+#: qml/Dash/DashPageHeader.qml:270
176176msgctxt "Button: Open the Ubuntu Store"
177177msgid "Store"
178178msgstr "ساقلا"
179179
180−#: qml/Dash/DashPageHeader.qml:273
180+#: qml/Dash/DashPageHeader.qml:277
181181msgctxt "Button: Start a search in the current dash scope"
182182msgid "Search"
183183msgstr "ئىزدە"
184184
185−#: qml/Dash/DashPageHeader.qml:283
185+#: qml/Dash/DashPageHeader.qml:287
186186msgctxt "Button: Show the current dash scope settings"
187187msgid "Settings"
188188msgstr "تەڭشەك"
189189
190−#: qml/Dash/DashPageHeader.qml:290
190+#: qml/Dash/DashPageHeader.qml:294
191191msgid "Remove from Favorites"
192192msgstr "يىغقۇچتىن چىقىرىۋەت"
193193
194−#: qml/Dash/DashPageHeader.qml:290
194+#: qml/Dash/DashPageHeader.qml:294
195195msgid "Add to Favorites"
196196msgstr "يىغقۇچقا قوش"
197197
@@ -418,14 +418,6 @@ msgctxt "Button: Call back on phone"
418418msgid "Call back"
419419msgstr "تىلفۇن ئۇرلىۋاتىدۇ"
420420
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−
429421#: qml/Tutorial/TutorialBottom.qml:28
430422msgid "Open special menus"
431423msgstr "تىزملىكنى ئاچ"
@@ -756,6 +748,12 @@ msgstr "%1 〉"
756748#~ msgid "All"
757749#~ msgstr "ھەممىسى"
758750
751+#~ msgid "Unlock SIM"
752+#~ msgstr "SIM نى قۇلۇپسىزلاش"
753+
754+#~ msgid "Roaming"
755+#~ msgstr "كەزمە"
756+
759757#~ msgid "Restart"
760758#~ msgstr "قايتا قوزغات"
761759
po/uk.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-07-04 05:53+0000\n"
1212"Last-Translator: Yuri Chornoivan <yurchor@gmail.com>\n"
1313"Language-Team: Ukrainian <uk@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
19+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
2020"X-Generator: Launchpad (build 17936)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -180,26 +180,26 @@ msgstr "Перепід’єднатися зараз!"
180180msgid "Close all"
181181msgstr "Закрити усе"
182182
183−#: qml/Dash/DashPageHeader.qml:266
183+#: qml/Dash/DashPageHeader.qml:270
184184msgctxt "Button: Open the Ubuntu Store"
185185msgid "Store"
186186msgstr "Крамниця"
187187
188−#: qml/Dash/DashPageHeader.qml:273
188+#: qml/Dash/DashPageHeader.qml:277
189189msgctxt "Button: Start a search in the current dash scope"
190190msgid "Search"
191191msgstr "Пошук"
192192
193−#: qml/Dash/DashPageHeader.qml:283
193+#: qml/Dash/DashPageHeader.qml:287
194194msgctxt "Button: Show the current dash scope settings"
195195msgid "Settings"
196196msgstr "Параметри"
197197
198−#: qml/Dash/DashPageHeader.qml:290
198+#: qml/Dash/DashPageHeader.qml:294
199199msgid "Remove from Favorites"
200200msgstr "Вилучити з вибраного"
201201
202−#: qml/Dash/DashPageHeader.qml:290
202+#: qml/Dash/DashPageHeader.qml:294
203203msgid "Add to Favorites"
204204msgstr "Додати до вибраного"
205205
@@ -434,14 +434,6 @@ msgctxt "Button: Call back on phone"
434434msgid "Call back"
435435msgstr "Зворотний виклик"
436436
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−
445437#: qml/Tutorial/TutorialBottom.qml:28
446438msgid "Open special menus"
447439msgstr "Відкрити спеціальні меню"
@@ -751,6 +743,9 @@ msgstr "%1 〉"
751743#~ msgid "All"
752744#~ msgstr "Все"
753745
746+#~ msgid "Unlock SIM"
747+#~ msgstr "Розблокувати SIM"
748+
754749#~ msgid "Favorites"
755750#~ msgstr "Улюблене"
756751
@@ -763,6 +758,9 @@ msgstr "%1 〉"
763758#~ msgid "Done"
764759#~ msgstr "Виконано"
765760
761+#~ msgid "Roaming"
762+#~ msgstr "Роумінг"
763+
766764#~ msgid "Log out"
767765#~ msgstr "Вийти"
768766
po/unity8.pot+34−40
@@ -8,7 +8,7 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity8\n"
1010"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"
1212"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1313"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1414"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -22,16 +22,16 @@ msgstr ""
2222msgid "Password: "
2323msgstr ""
2424
25−#: plugins/Unity/Launcher/launcheritem.cpp:47
26−#: plugins/Unity/Launcher/launcheritem.cpp:106
25+#: plugins/Unity/Launcher/launcheritem.cpp:48
26+#: plugins/Unity/Launcher/launcheritem.cpp:107
2727msgid "Pin shortcut"
2828msgstr ""
2929
30−#: plugins/Unity/Launcher/launcheritem.cpp:52
30+#: plugins/Unity/Launcher/launcheritem.cpp:53
3131msgid "Quit"
3232msgstr ""
3333
34−#: plugins/Unity/Launcher/launcheritem.cpp:106
34+#: plugins/Unity/Launcher/launcheritem.cpp:107
3535msgid "Unpin shortcut"
3636msgstr ""
3737
@@ -135,15 +135,15 @@ msgctxt "Button: Restart the system"
135135msgid "Restart"
136136msgstr ""
137137
138−#: qml/Components/Lockscreen.qml:245
138+#: qml/Components/Lockscreen.qml:231
139139msgid "Return to Call"
140140msgstr ""
141141
142−#: qml/Components/Lockscreen.qml:245
142+#: qml/Components/Lockscreen.qml:231
143143msgid "Emergency Call"
144144msgstr ""
145145
146−#: qml/Components/Lockscreen.qml:277
146+#: qml/Components/Lockscreen.qml:263
147147msgid "OK"
148148msgstr ""
149149
@@ -152,6 +152,8 @@ msgid "Apps may have unsaved data:"
152152msgstr ""
153153
154154#: qml/Components/ModeSwitchWarningDialog.qml:57
155+msgctxt ""
156+"Re-dock means connect the device again to an external screen/mouse/keyboard"
155157msgid "Re-dock, save your work and close these apps to continue."
156158msgstr ""
157159
@@ -171,38 +173,38 @@ msgstr ""
171173msgid "Close all"
172174msgstr ""
173175
174−#: qml/Dash/DashPageHeader.qml:266
176+#: qml/Dash/DashPageHeader.qml:270
175177msgctxt "Button: Open the Ubuntu Store"
176178msgid "Store"
177179msgstr ""
178180
179−#: qml/Dash/DashPageHeader.qml:273
181+#: qml/Dash/DashPageHeader.qml:277
180182msgctxt "Button: Start a search in the current dash scope"
181183msgid "Search"
182184msgstr ""
183185
184−#: qml/Dash/DashPageHeader.qml:283
186+#: qml/Dash/DashPageHeader.qml:287
185187msgctxt "Button: Show the current dash scope settings"
186188msgid "Settings"
187189msgstr ""
188190
189−#: qml/Dash/DashPageHeader.qml:290
191+#: qml/Dash/DashPageHeader.qml:294
190192msgid "Remove from Favorites"
191193msgstr ""
192194
193−#: qml/Dash/DashPageHeader.qml:290
195+#: qml/Dash/DashPageHeader.qml:294
194196msgid "Add to Favorites"
195197msgstr ""
196198
197−#: qml/Dash/GenericScopeView.qml:565 qml/Dash/GenericScopeView.qml:723
199+#: qml/Dash/GenericScopeView.qml:567 qml/Dash/GenericScopeView.qml:725
198200msgid "See less"
199201msgstr ""
200202
201−#: qml/Dash/GenericScopeView.qml:565
203+#: qml/Dash/GenericScopeView.qml:567
202204msgid "See all"
203205msgstr ""
204206
205−#: qml/Dash/GenericScopeView.qml:627
207+#: qml/Dash/GenericScopeView.qml:629
206208msgctxt "Label: Hint for dash search line edit"
207209msgid "Search"
208210msgstr ""
@@ -228,7 +230,7 @@ msgstr ""
228230msgid "Add a review"
229231msgstr ""
230232
231−#: qml/Dash/Previews/PreviewSharing.qml:50
233+#: qml/Dash/Previews/PreviewSharing.qml:66
232234msgid "Preview Share Item"
233235msgstr ""
234236
@@ -256,13 +258,13 @@ msgstr ""
256258msgid "Also installed"
257259msgstr ""
258260
259−#: qml/DisabledScreenNotice.qml:87
261+#: qml/DisabledScreenNotice.qml:104
260262msgid ""
261263"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."
263265msgstr ""
264266
265−#: qml/Greeter/CoverPage.qml:107
267+#: qml/Greeter/CoverPage.qml:118
266268msgid "Unlock"
267269msgstr ""
268270
@@ -341,62 +343,62 @@ msgstr ""
341343msgid "Conference"
342344msgstr ""
343345
344−#: qml/Panel/Indicators/MenuItemFactory.qml:753
346+#: qml/Panel/Indicators/MenuItemFactory.qml:752
345347msgid "Nothing is playing"
346348msgstr ""
347349
348−#: qml/Panel/Indicators/MenuItemFactory.qml:882
350+#: qml/Panel/Indicators/MenuItemFactory.qml:881
349351#, qt-format
350352msgid "%1 hour"
351353msgid_plural "%1 hours"
352354msgstr[0] ""
353355msgstr[1] ""
354356
355−#: qml/Panel/Indicators/MenuItemFactory.qml:886
357+#: qml/Panel/Indicators/MenuItemFactory.qml:885
356358#, qt-format
357359msgid "%1 minute"
358360msgid_plural "%1 minutes"
359361msgstr[0] ""
360362msgstr[1] ""
361363
362−#: qml/Panel/Indicators/MenuItemFactory.qml:891
364+#: qml/Panel/Indicators/MenuItemFactory.qml:890
363365#, qt-format
364366msgid "%1 second"
365367msgid_plural "%1 seconds"
366368msgstr[0] ""
367369msgstr[1] ""
368370
369−#: qml/Panel/Indicators/MenuItemFactory.qml:894
371+#: qml/Panel/Indicators/MenuItemFactory.qml:893
370372msgid "0 seconds"
371373msgstr ""
372374
373375#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
374−#: qml/Panel/Indicators/MenuItemFactory.qml:896
376+#: qml/Panel/Indicators/MenuItemFactory.qml:895
375377#, qt-format
376378msgid "%1 remaining"
377379msgstr ""
378380
379−#: qml/Panel/Indicators/MenuItemFactory.qml:902
381+#: qml/Panel/Indicators/MenuItemFactory.qml:901
380382msgid "In queue…"
381383msgstr ""
382384
383−#: qml/Panel/Indicators/MenuItemFactory.qml:906
385+#: qml/Panel/Indicators/MenuItemFactory.qml:905
384386msgid "Downloading"
385387msgstr ""
386388
387−#: qml/Panel/Indicators/MenuItemFactory.qml:908
389+#: qml/Panel/Indicators/MenuItemFactory.qml:907
388390msgid "Paused, tap to resume"
389391msgstr ""
390392
391−#: qml/Panel/Indicators/MenuItemFactory.qml:910
393+#: qml/Panel/Indicators/MenuItemFactory.qml:909
392394msgid "Canceled"
393395msgstr ""
394396
395−#: qml/Panel/Indicators/MenuItemFactory.qml:912
397+#: qml/Panel/Indicators/MenuItemFactory.qml:911
396398msgid "Finished"
397399msgstr ""
398400
399−#: qml/Panel/Indicators/MenuItemFactory.qml:914
401+#: qml/Panel/Indicators/MenuItemFactory.qml:913
400402msgid "Failed, tap to retry"
401403msgstr ""
402404
@@ -416,14 +418,6 @@ msgctxt "Button: Call back on phone"
416418msgid "Call back"
417419msgstr ""
418420
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−
427421#: qml/Tutorial/TutorialBottom.qml:28
428422msgid "Open special menus"
429423msgstr ""
po/ur.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-05-05 03:12+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Urdu <ur@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr ""
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr ""
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr ""
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
po/uz.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-07-04 16:03+0000\n"
1212"Last-Translator: Learner <muzaffar.habibullayev@yandex.ru>\n"
1313"Language-Team: Uzbek <uz@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr ""
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr ""
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr ""
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
po/vi.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2014-01-15 01:19+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Vietnamese <vi@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr ""
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr ""
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr ""
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
po/wo.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-10-29 11:16+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Wolof <wo@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr "Ja"
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr "Seet"
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr "Jekkal"
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr "Dindee ci Tànneef yi"
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr "Yokk ci Tànneef yi"
196196
@@ -420,14 +420,6 @@ msgctxt "Button: Call back on phone"
420420msgid "Call back"
421421msgstr ""
422422
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−
431423#: qml/Tutorial/TutorialBottom.qml:28
432424msgid "Open special menus"
433425msgstr "Open njëli jagleel"
@@ -755,6 +747,12 @@ msgstr "%1 〉"
755747#~ msgid "Confirm"
756748#~ msgstr "Dëggal"
757749
750+#~ msgid "Unlock SIM"
751+#~ msgstr "Tijji SIM"
752+
753+#~ msgid "Roaming"
754+#~ msgstr "Roaming"
755+
758756#~ msgid "Please re-enter"
759757#~ msgstr "Di la ñaan nga duggalaat"
760758
po/xh.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2013-09-28 13:20+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Xhosa <xh@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr ""
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr ""
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr ""
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
po/zh_CN.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-07-27 10:26+0000\n"
1212"Last-Translator: Ian Li <Unknown>\n"
1313"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -172,26 +172,26 @@ msgstr "即刻重新连接!"
172172msgid "Close all"
173173msgstr "关闭所有"
174174
175−#: qml/Dash/DashPageHeader.qml:266
175+#: qml/Dash/DashPageHeader.qml:270
176176msgctxt "Button: Open the Ubuntu Store"
177177msgid "Store"
178178msgstr "商店"
179179
180−#: qml/Dash/DashPageHeader.qml:273
180+#: qml/Dash/DashPageHeader.qml:277
181181msgctxt "Button: Start a search in the current dash scope"
182182msgid "Search"
183183msgstr "搜索"
184184
185−#: qml/Dash/DashPageHeader.qml:283
185+#: qml/Dash/DashPageHeader.qml:287
186186msgctxt "Button: Show the current dash scope settings"
187187msgid "Settings"
188188msgstr "设置"
189189
190−#: qml/Dash/DashPageHeader.qml:290
190+#: qml/Dash/DashPageHeader.qml:294
191191msgid "Remove from Favorites"
192192msgstr "从收藏夹中移除"
193193
194−#: qml/Dash/DashPageHeader.qml:290
194+#: qml/Dash/DashPageHeader.qml:294
195195msgid "Add to Favorites"
196196msgstr "添加到收藏夹"
197197
@@ -414,14 +414,6 @@ msgctxt "Button: Call back on phone"
414414msgid "Call back"
415415msgstr "回电"
416416
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−
425417#: qml/Tutorial/TutorialBottom.qml:28
426418msgid "Open special menus"
427419msgstr "打开专题菜单"
@@ -717,6 +709,9 @@ msgstr "%1 〉"
717709#~ msgid "All"
718710#~ msgstr "所有"
719711
712+#~ msgid "Unlock SIM"
713+#~ msgstr "解开 SIM"
714+
720715#~ msgid "Favorites"
721716#~ msgstr "收藏夹"
722717
@@ -729,6 +724,9 @@ msgstr "%1 〉"
729724#~ msgid "Done"
730725#~ msgstr "完成"
731726
727+#~ msgid "Roaming"
728+#~ msgstr "漫游"
729+
732730#~ msgid "Please re-enter"
733731#~ msgstr "请重新输入"
734732
po/zh_HK.po+7−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2014-08-10 11:45+0000\n"
1212"Last-Translator: Daniel Cheung <daniel.2345@hotmail.com>\n"
1313"Language-Team: Chinese (Hong Kong) <zh_HK@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr ""
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr ""
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr ""
196196
@@ -416,14 +416,6 @@ msgctxt "Button: Call back on phone"
416416msgid "Call back"
417417msgstr ""
418418
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−
427419#: qml/Tutorial/TutorialBottom.qml:28
428420msgid "Open special menus"
429421msgstr ""
po/zh_TW.po+13−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2016-02-24 04:40+0000\n"
1212"Last-Translator: Po-Hsu Lin <po-hsu.lin@canonical.com>\n"
1313"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-05 06:19+0000\n"
18+"X-Launchpad-Export-Date: 2016-03-10 05:58+0000\n"
1919"X-Generator: Launchpad (build 17936)\n"
2020"Language: zh_TW\n"
2121
@@ -171,26 +171,26 @@ msgstr "即刻重新連線!"
171171msgid "Close all"
172172msgstr "全部關閉"
173173
174−#: qml/Dash/DashPageHeader.qml:266
174+#: qml/Dash/DashPageHeader.qml:270
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr "商城"
178178
179−#: qml/Dash/DashPageHeader.qml:273
179+#: qml/Dash/DashPageHeader.qml:277
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr "搜尋"
183183
184−#: qml/Dash/DashPageHeader.qml:283
184+#: qml/Dash/DashPageHeader.qml:287
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr "設定"
188188
189−#: qml/Dash/DashPageHeader.qml:290
189+#: qml/Dash/DashPageHeader.qml:294
190190msgid "Remove from Favorites"
191191msgstr "自「最愛」移除"
192192
193−#: qml/Dash/DashPageHeader.qml:290
193+#: qml/Dash/DashPageHeader.qml:294
194194msgid "Add to Favorites"
195195msgstr "加入到「最愛」"
196196
@@ -413,14 +413,6 @@ msgctxt "Button: Call back on phone"
413413msgid "Call back"
414414msgstr "回撥"
415415
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−
424416#: qml/Tutorial/TutorialBottom.qml:28
425417msgid "Open special menus"
426418msgstr "開啟特殊選單"
@@ -743,12 +735,18 @@ msgstr "%1 〉"
743735#~ msgid "Done"
744736#~ msgstr "完成"
745737
738+#~ msgid "Roaming"
739+#~ msgstr "漫遊"
740+
746741#~ msgid "Restart"
747742#~ msgstr "重新啟動"
748743
749744#~ msgid "Please re-enter"
750745#~ msgstr "請再輸入"
751746
747+#~ msgid "Unlock SIM"
748+#~ msgstr "解鎖 SIM 卡"
749+
752750#~ msgid "Welcome to your Ubuntu phone."
753751#~ msgstr "歡迎使用您的 Ubuntu 手機。"
754752
qml/Components/EdgeBarrier.qml+1−1
@@ -105,7 +105,7 @@ Item {
105105 },
106106 Transition {
107107 from: "resisting"; to: "passed"
108− UbuntuNumberAnimation { target: materialContainer; property: "opacity" }
108+ UbuntuNumberAnimation { duration: UbuntuAnimation.BriskDuration; target: materialContainer; property: "opacity" }
109109 }
110110 ]
111111}
qml/Components/Header.qml+1
@@ -18,6 +18,7 @@ import Ubuntu.Components 1.3
1818import Ubuntu.Components.Themes.Ambiance 1.3
1919
2020PageHeadStyle {
21+ // FIXME: Don't use this but PageHeader from Ubuntu.Components 1.3.
2122 id: root
2223
2324 property var styledItem: root
qml/Components/InputMethod.qml+1−9
@@ -22,15 +22,6 @@ import Ubuntu.Gestures 0.1
2222Item {
2323 id: root
2424
25− Connections {
26− target: SurfaceManager
27− onSurfaceCreated: {
28− if (surface.type == Mir.InputMethodType) {
29− surfaceItem.surface = surface;
30− }
31− }
32− }
33−
3425 property int transitionDuration: UbuntuAnimation.FastDuration
3526
3627 MirSurfaceItem {
@@ -41,6 +32,7 @@ Item {
4132
4233 surfaceWidth: width
4334 surfaceHeight: height
35+ surface: SurfaceManager.inputMethodSurface
4436
4537 onLiveChanged: {
4638 if (surface !== null && !live) {
qml/Components/Lockscreen.qml+80−94
@@ -121,108 +121,94 @@ Showable {
121121 opacity: root.darkenBackground
122122 }
123123
124− MouseArea {
125− anchors.fill: root
126− onClicked: {
127− if (pinPadLoader.item)
128− pinPadLoader.item.forceActiveFocus()
129− }
130− }
131−
132− FocusScope {
133− id: loaderScope
124+ Loader {
125+ id: pinPadLoader
126+ objectName: "pinPadLoader"
134127 anchors.fill: parent
135−
136− Loader {
137− id: pinPadLoader
138− objectName: "pinPadLoader"
139− anchors.fill: parent
140− property bool resetting: false
141− property bool waiting: false
142− property bool showWrongText: false
143−
144− source: {
145− if (resetting || !root.required) {
146− return ""
147− } else if (root.delayMinutes > 0) {
148− return "DelayedLockscreen.qml"
149− } else if (root.alphaNumeric) {
150− return "PassphraseLockscreen.qml"
151− } else {
152− return "PinLockscreen.qml"
153− }
154− }
155− onSourceChanged: {
156− waiting = false
157− showWrongText = false
158− if (loaderScope.activeFocus && pinPadLoader.item)
159− pinPadLoader.item.forceActiveFocus()
128+ property bool resetting: false
129+ property bool waiting: false
130+ property bool showWrongText: false
131+ focus: true
132+
133+ source: {
134+ if (resetting || !root.required) {
135+ return ""
136+ } else if (root.delayMinutes > 0) {
137+ return "DelayedLockscreen.qml"
138+ } else if (root.alphaNumeric) {
139+ return "PassphraseLockscreen.qml"
140+ } else {
141+ return "PinLockscreen.qml"
160142 }
143+ }
144+ onSourceChanged: {
145+ waiting = false
146+ showWrongText = false
147+ }
161148
162− Connections {
163− target: pinPadLoader.item
164−
165− onEntered: {
166− pinPadLoader.waiting = true
167− root.entered(passphrase);
168− }
149+ Connections {
150+ target: pinPadLoader.item
169151
170− onCancel: {
171− root.cancel()
172− }
152+ onEntered: {
153+ pinPadLoader.waiting = true
154+ root.entered(passphrase);
173155 }
174156
175− Binding {
176− target: pinPadLoader.item
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
157+ onCancel: {
158+ root.cancel()
224159 }
225160 }
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+ }
226212 }
227213
228214 Item {
qml/Components/ModeSwitchWarningDialog.qml+1−1
@@ -54,7 +54,7 @@ ShellDialog {
5454 }
5555
5656 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.")
5858 wrapMode: Text.WordWrap
5959 color: "#888888"
6060 }
qml/Components/PassphraseLockscreen.qml+5−4
@@ -18,10 +18,11 @@ import QtQuick 2.4
1818import Ubuntu.Components 1.3
1919import "../Components"
2020
21−Item {
21+FocusScope {
2222 id: root
2323 y: units.gu(4)
2424 height: shakeContainer.height
25+ focus: true
2526
2627 property string infoText
2728 property string errorText
@@ -42,8 +43,6 @@ Item {
4243 }
4344 }
4445
45− onActiveFocusChanged: if (activeFocus) pinentryField.forceActiveFocus()
46−
4746 Column {
4847 id: shakeContainer
4948 anchors.horizontalCenter: parent.horizontalCenter
@@ -59,14 +58,16 @@ Item {
5958 text: root.infoText
6059 }
6160
62− Item {
61+ FocusScope {
6362 id: entryContainer
6463 anchors { left: parent.left; right: parent.right; margins: units.gu(2) }
6564 height: units.gu(4)
65+ focus: true
6666
6767 TextInput {
6868 id: pinentryField
6969 objectName: "pinentryField"
70+ focus: true
7071
7172 property bool incorrectOverride: false
7273
qml/Components/PhysicalKeysMapper.qml+24
@@ -42,12 +42,15 @@ Item {
4242 signal screenshotTriggered;
4343
4444 readonly property bool altTabPressed: d.altTabPressed
45+ readonly property bool superPressed: d.superPressed
46+ readonly property bool superTabPressed: d.superTabPressed
4547
4648 property int powerKeyLongPressTime: 2000
4749
4850 // For testing. If running windowed (e.g. tryShell), Alt+Tab is taken by the
4951 // running desktop, set this to true to use Ctrl+Tab instead.
5052 property bool controlInsteadOfAlt: false
53+ property bool controlInsteadOfSuper: false
5154
5255 QtObject {
5356 id: d
@@ -59,6 +62,9 @@ Item {
5962 property bool altPressed: false
6063 property bool altTabPressed: false
6164
65+ property bool superPressed: false
66+ property bool superTabPressed: false
67+
6268 property var powerButtonPressStart: 0
6369
6470 // 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 {
119125 event.accepted = true;
120126 d.altPressInjected = false;
121127 }
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;
122136 } else if (event.key == Qt.Key_Tab) {
123137 if (d.altPressed && !d.altTabPressed) {
124138 d.altTabPressed = true;
125139 event.accepted = true;
126140 }
141+ if (d.superPressed && !d.superTabPressed) {
142+ d.superTabPressed = true;
143+ event.accepted = true;
144+ }
127145 }
128146 }
129147
@@ -154,6 +172,12 @@ Item {
154172 if (d.altTabPressed) {
155173 event.accepted = true;
156174 }
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+ }
157181 }
158182 }
159183}
qml/Components/PinLockscreen.qml+22−1
@@ -19,8 +19,9 @@ import Ubuntu.Components 1.3
1919import Ubuntu.Components.ListItems 1.3
2020import "../Components"
2121
22−Item {
22+FocusScope {
2323 id: root
24+ focus: true
2425
2526 property string infoText
2627 property string retryText
@@ -45,6 +46,24 @@ Item {
4546 }
4647 }
4748
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+
4867 Column {
4968 anchors {
5069 left: parent.left;
@@ -204,6 +223,7 @@ Item {
204223 width: numbersGrid.buttonWidth
205224 }
206225 PinPadButton {
226+ id: closeButton
207227 iconName: "close"
208228 height: units.gu(5) // visual spec has this row a little closer in
209229 width: numbersGrid.buttonWidth
@@ -216,6 +236,7 @@ Item {
216236 width: numbersGrid.buttonWidth
217237 }
218238 PinPadButton {
239+ id: confirmButton
219240 iconName: "tick"
220241 objectName: "confirmButton"
221242 height: units.gu(5)
qml/Components/ShellDialog.qml+8
@@ -37,7 +37,15 @@ Dialog {
3737
3838 focus: true
3939
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+
4047 Component.onCompleted: {
48+ __foreground.theme = themeHack
4149 show();
4250 }
4351}
qml/Dash/CardCarousel.qml−1
@@ -66,7 +66,6 @@ DashRenderer {
6666 item.cardData = Qt.binding(function() { return model; });
6767 item.fontScale = Qt.binding(function() { return carousel.fontScale; });
6868 item.showHeader = Qt.binding(function() { return loader.explicitlyScaled; });
69− item.titleAlignment = Qt.binding(function() { return cardTool.titleAlignment; });
7069 item.artShapeStyle = "shadow";
7170 item.scopeStyle = cardCarousel.scopeStyle;
7271 }
qml/Dash/CardGrid.qml−1
@@ -70,7 +70,6 @@ DashRenderer {
7070 item.fixedHeaderHeight = Qt.binding(function() { return cardTool.headerHeight; });
7171 item.fixedArtShapeSize = Qt.binding(function() { return cardTool.artShapeSize; });
7272 item.cardData = Qt.binding(function() { return model; });
73− item.titleAlignment = Qt.binding(function() { return cardTool.titleAlignment; });
7473 item.scopeStyle = root.scopeStyle;
7574 item.artShapeStyle = root.artShapeStyle;
7675 item.backgroundShapeStyle = root.backgroundShapeStyle;
qml/Dash/CardHorizontalList.qml−1
@@ -53,7 +53,6 @@ DashRenderer {
5353 item.fixedArtShapeSize = Qt.binding(function() { return cardTool.artShapeSize; });
5454 item.fixedHeaderHeight = Qt.binding(function() { return cardTool.headerHeight; });
5555 item.cardData = Qt.binding(function() { return model; });
56− item.titleAlignment = Qt.binding(function() { return cardTool.titleAlignment; });
5756 item.scopeStyle = root.scopeStyle;
5857 }
5958 Connections {
qml/Dash/CardTool.qml+2−26
@@ -66,7 +66,7 @@ Item {
6666 return layout;
6767 }
6868
69− property var cardComponent: CardCreatorCache.getCardComponent(cardTool.template, cardTool.components);
69+ property var cardComponent: CardCreatorCache.getCardComponent(cardTool.template, cardTool.components, false);
7070
7171 // FIXME: Saviq
7272 // Only way for the card below to actually be laid out completely.
@@ -139,29 +139,6 @@ Item {
139139 readonly property int headerHeight: cardLoader.item ? cardLoader.item.headerHeight : 0
140140 property size artShapeSize: cardLoader.item ? cardLoader.item.artShapeSize : 0
141141
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−
165142 QtObject {
166143 id: carouselTool
167144
@@ -216,10 +193,9 @@ Item {
216193 "summary": "—\n—\n—\n—\n—",
217194 "attributes": attributesModel.model
218195 }
219− sourceComponent: cardTool.cardComponent
196+ sourceComponent: CardCreatorCache.getCardComponent(cardTool.template, cardTool.components, true);
220197 onLoaded: {
221198 item.objectName = "cardToolCard";
222− item.asynchronous = false;
223199 item.width = Qt.binding(function() { return cardTool.cardWidth !== -1 ? cardTool.cardWidth : item.implicitWidth; });
224200 item.height = Qt.binding(function() { return cardTool.cardHeight !== -1 ? cardTool.cardHeight : item.implicitHeight; });
225201 }
qml/Dash/CardVerticalJournal.qml−1
@@ -72,7 +72,6 @@ DashRenderer {
7272 item.fixedArtShapeSize = Qt.binding(function() { return cardTool.artShapeSize; });
7373 item.fixedHeaderHeight = Qt.binding(function() { return cardTool.headerHeight; });
7474 item.cardData = Qt.binding(function() { return model; });
75− item.titleAlignment = Qt.binding(function() { return cardTool.titleAlignment; });
7675 item.scopeStyle = root.scopeStyle;
7776 }
7877 Connections {
qml/Dash/Dash.qml+11−11
@@ -37,6 +37,7 @@ Showable {
3737 }
3838
3939 property bool windowActive: window.active
40+ property bool showOverlayScope: false
4041
4142 DashCommunicatorService {
4243 objectName: "dashCommunicatorService"
@@ -80,7 +81,7 @@ Showable {
8081 return
8182 }
8283
83− closeOverlayScope();
84+ dash.showOverlayScope = false;
8485
8586 dashContent.closePreview();
8687
@@ -93,12 +94,6 @@ Showable {
9394 dashContent.setCurrentScopeAtIndex(scopeIndex, animate, reset)
9495 }
9596
96− function closeOverlayScope() {
97− if (dashContent.x != 0) {
98− dashContent.x = 0;
99− }
100− }
101−
10297 Scopes {
10398 id: scopes
10499 }
@@ -133,12 +128,13 @@ Showable {
133128 height: dash.height
134129 scopes: scopes
135130 visible: x != -width
131+ x: dash.showOverlayScope ? -width : 0
136132 onGotoScope: {
137133 dash.setCurrentScope(scopeId, true, false);
138134 }
139135 onOpenScope: {
140136 scopeItem.scope = scope;
141− x = -width;
137+ dash.showOverlayScope = true;
142138 }
143139 Behavior on x {
144140 UbuntuNumberAnimation {
@@ -207,7 +203,7 @@ Showable {
207203 bottomEdgeController.enableAnimation = true;
208204 bottomEdgeController.progress = 0;
209205 scopeItem.scope = scope;
210− dashContent.x = -dashContent.width;
206+ dash.showOverlayScope = true;
211207 }
212208 onGotoScope: {
213209 bottomEdgeController.enableAnimation = true;
@@ -226,7 +222,7 @@ Showable {
226222 id: scopeItem
227223 objectName: "dashTempScopeItem"
228224
229− x: dashContent.x + width
225+ x: dash.showOverlayScope ? 0 : width
230226 y: dashContent.y
231227 width: parent.width
232228 height: parent.height
@@ -234,7 +230,7 @@ Showable {
234230 hasBackAction: true
235231 isCurrent: visible
236232 onBackClicked: {
237− closeOverlayScope();
233+ dash.showOverlayScope = false;
238234 closePreview();
239235 }
240236
@@ -250,6 +246,10 @@ Showable {
250246 scopes.closeScope(oldScope);
251247 }
252248 }
249+
250+ Behavior on x {
251+ UbuntuNumberAnimation { }
252+ }
253253 }
254254
255255 Rectangle {
qml/Dash/DashPageHeader.qml+4
@@ -170,6 +170,7 @@ Item {
170170 anchors { left: parent.left; right: parent.right }
171171
172172 PageHeadStyle {
173+ // FIXME: Replace PageHeadStyle from the Ambiance theme by the new PageHeader from Ubuntu.Components 1.3.
173174 id: searchHeader
174175 anchors { left: parent.left; right: parent.right }
175176 opacity: headerContainer.clip || headerContainer.showSearch ? 1 : 0 // setting visible false cause column to relayout
@@ -179,6 +180,7 @@ Item {
179180 property color dividerColor: "transparent" // Doesn't matter as we don't have PageHeadSections
180181 property color panelColor: background.topColor
181182 panelForegroundColor: config.foregroundColor
183+ backgroundColor: "transparent"
182184 config: PageHeadConfiguration {
183185 foregroundColor: root.scopeStyle ? root.scopeStyle.headerForeground : theme.palette.normal.baseText
184186 backAction: Action {
@@ -241,6 +243,7 @@ Item {
241243 }
242244
243245 PageHeadStyle {
246+ // FIXME: Replace PageHeadStyle from the Ambiance theme by the new PageHeader from Ubuntu.Components 1.3.
244247 id: header
245248 objectName: "innerPageHeader"
246249 anchors { left: parent.left; right: parent.right }
@@ -251,6 +254,7 @@ Item {
251254 property color dividerColor: "transparent" // Doesn't matter as we don't have PageHeadSections
252255 property color panelColor: background.topColor
253256 panelForegroundColor: config.foregroundColor
257+ backgroundColor: "transparent"
254258 config: PageHeadConfiguration {
255259 title: root.title
256260 foregroundColor: root.scopeStyle ? root.scopeStyle.headerForeground : theme.palette.normal.baseText
qml/Dash/GenericScopeView.qml+2
@@ -370,6 +370,8 @@ FocusScope {
370370 } else {
371371 cardTool.cardWidth = units.gu(10);
372372 }
373+ } else {
374+ cardTool.cardWidth = units.gu(12);
373375 }
374376 item.minimumHorizontalSpacing = item.defaultMinimumHorizontalSpacing;
375377 }
qml/Dash/Previews/PreviewHeader.qml+37−9
@@ -25,6 +25,7 @@ import "../"
2525 * The mascot fall back image comes in widgetData["fallback"]
2626 * The subtitle comes in widgetData["subtitle"]
2727 * The attributes comes in widgetData["attributes"]
28+ * The emblem comes in widgetData["emblem"]
2829 */
2930
3031PreviewWidget {
@@ -40,6 +41,7 @@ PreviewWidget {
4041 readonly property string title: root.widgetData["title"] || ""
4142 readonly property string subtitle: root.widgetData["subtitle"] || ""
4243 readonly property var attributes: root.widgetData["attributes"] || null
44+ readonly property url emblem: root.widgetData["emblem"] || ""
4345 readonly property color fontColor: root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText
4446
4547 // Rewire the source since we may have unwired it on onStatusChanged
@@ -98,16 +100,42 @@ PreviewWidget {
98100 spacing: units.dp(2)
99101 anchors.verticalCenter: parent.verticalCenter
100102
101− Label {
102− id: titleLabel
103− objectName: "titleLabel"
103+ Item {
104104 anchors { left: parent.left; right: parent.right }
105− elide: Text.ElideRight
106− font.weight: Font.Normal
107− fontSize: "large"
108− wrapMode: Text.Wrap
109− color: headerRoot.fontColor
110− text: headerRoot.title
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+ }
115+ elide: Text.ElideRight
116+ font.weight: Font.Normal
117+ fontSize: "large"
118+ wrapMode: Text.Wrap
119+ color: headerRoot.fontColor
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+ }
111139 }
112140
113141 Loader {
qml/Dash/Previews/PreviewOverlay.qml+1−1
@@ -158,7 +158,7 @@ Rectangle {
158158 anchors.centerIn: parent
159159 width: units.gu(2.5)
160160 height: width
161− color: theme.palette.normal.foregroundText
161+ color: "white"
162162 name: "close"
163163 }
164164 }
qml/Dash/Previews/PreviewPayments.qml+1−3
@@ -65,9 +65,7 @@ PreviewWidget {
6565 }
6666 onPurchaseCancelled: {
6767 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);
7169 }
7270 }
7371 }
qml/Dash/Previews/PreviewSharing.qml+17−7
@@ -44,6 +44,22 @@ Item {
4444 }
4545 }
4646
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+
4763 Component {
4864 id: exportItemComponent
4965 ContentItem {
@@ -76,13 +92,7 @@ Item {
7692 onPeerSelected: {
7793 var transfer = peer.request();
7894 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);
8696 transfer.state = ContentTransfer.Charged;
8797 }
8898 peerPicker.visible = false;
qml/Dash/ScopesListCategoryItem.qml+8−4
@@ -18,7 +18,7 @@ import QtQuick 2.4
1818import QtQuick.Layouts 1.1
1919import Ubuntu.Components 1.3
2020
21−MouseArea {
21+AbstractButton {
2222 id: root
2323
2424 signal requestFavorite(string scopeId, bool favorite)
@@ -84,15 +84,19 @@ MouseArea {
8484 visible: text != ""
8585 }
8686 }
87− MouseArea {
87+ AbstractButton {
8888 id: starArea
8989 objectName: "starArea"
9090 height: parent.height
9191 width: height
9292 anchors.right: parent.right
9393 onClicked: if (!editMode) root.requestFavorite(model.scopeId, !isFavorite);
94− onPressed: if (editMode) root.handlePressed(starArea);
95− onReleased: if (editMode) root.handleReleased(starArea);
94+ onPressedChanged: {
95+ if (editMode) {
96+ if (pressed) root.handlePressed(starArea.__mouseArea);
97+ else root.handleReleased(starArea.__mouseArea);
98+ }
99+ }
96100 visible: editMode || showStar
97101 Icon {
98102 id: star
qml/DeviceConfiguration.qml+54−16
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -15,6 +15,7 @@
1515 */
1616
1717import QtQuick 2.4
18+import Utils 0.1
1819
1920QtObject {
2021 id: root
@@ -34,57 +35,83 @@ QtObject {
3435
3536 readonly property alias category: priv.category
3637
38+ readonly property var deviceConfigParser: DeviceConfigParser {
39+ name: root.name
40+ }
41+
3742 readonly property var priv: StateGroup {
3843 id: priv
3944
40− property int primaryOrientation: root.useNativeOrientation
45+ property int primaryOrientation: deviceConfigParser.primaryOrientation == Qt.PrimaryOrientation ?
46+ root.useNativeOrientation : deviceConfigParser.primaryOrientation
4147
42− property int supportedOrientations: Qt.PortraitOrientation
43− | Qt.InvertedPortraitOrientation
44− | Qt.LandscapeOrientation
45− | Qt.InvertedLandscapeOrientation
48+ property int supportedOrientations: deviceConfigParser.supportedOrientations
4649
47− property int landscapeOrientation: Qt.LandscapeOrientation
48− property int invertedLandscapeOrientation: Qt.InvertedLandscapeOrientation
49− property int portraitOrientation: Qt.PortraitOrientation
50− property int invertedPortraitOrientation: Qt.InvertedPortraitOrientation
51−
52− // Supported values so far:
53− // "phone", "tablet" or "desktop"
54− property string category: "phone"
50+ property int landscapeOrientation: deviceConfigParser.landscapeOrientation
51+ property int invertedLandscapeOrientation: deviceConfigParser.invertedLandscapeOrientation
52+ property int portraitOrientation: deviceConfigParser.portraitOrientation
53+ property int invertedPortraitOrientation: deviceConfigParser.invertedPortraitOrientation
54+ property string category: deviceConfigParser.category
5555
5656 states: [
5757 State {
5858 name: "mako"
5959 PropertyChanges {
6060 target: priv
61+ primaryOrientation: root.useNativeOrientation
6162 supportedOrientations: Qt.PortraitOrientation
6263 | Qt.LandscapeOrientation
6364 | Qt.InvertedLandscapeOrientation
65+ landscapeOrientation: Qt.LandscapeOrientation
66+ invertedLandscapeOrientation: Qt.InvertedLandscapeOrientation
67+ portraitOrientation: Qt.PortraitOrientation
68+ invertedPortraitOrientation: Qt.InvertedPortraitOrientation
69+ category: "phone"
6470 }
6571 },
6672 State {
6773 name: "krillin"
6874 PropertyChanges {
6975 target: priv
76+ primaryOrientation: root.useNativeOrientation
7077 supportedOrientations: Qt.PortraitOrientation
7178 | Qt.LandscapeOrientation
7279 | Qt.InvertedLandscapeOrientation
80+ landscapeOrientation: Qt.LandscapeOrientation
81+ invertedLandscapeOrientation: Qt.InvertedLandscapeOrientation
82+ portraitOrientation: Qt.PortraitOrientation
83+ invertedPortraitOrientation: Qt.InvertedPortraitOrientation
84+ category: "phone"
7385 }
7486 },
7587 State {
7688 name: "arale"
7789 PropertyChanges {
7890 target: priv
91+ primaryOrientation: root.useNativeOrientation
7992 supportedOrientations: Qt.PortraitOrientation
8093 | Qt.LandscapeOrientation
8194 | Qt.InvertedLandscapeOrientation
95+ landscapeOrientation: Qt.LandscapeOrientation
96+ invertedLandscapeOrientation: Qt.InvertedLandscapeOrientation
97+ portraitOrientation: Qt.PortraitOrientation
98+ invertedPortraitOrientation: Qt.InvertedPortraitOrientation
99+ category: "phone"
82100 }
83101 },
84102 State {
85103 name: "manta"
86104 PropertyChanges {
87105 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
88115 category: "tablet"
89116 }
90117 },
@@ -92,9 +119,15 @@ QtObject {
92119 name: "flo"
93120 PropertyChanges {
94121 target: priv
122+ primaryOrientation: Qt.InvertedLandscapeOrientation
123+ supportedOrientations: Qt.PortraitOrientation
124+ | Qt.InvertedPortraitOrientation
125+ | Qt.LandscapeOrientation
126+ | Qt.InvertedLandscapeOrientation
95127 landscapeOrientation: Qt.InvertedLandscapeOrientation
96128 invertedLandscapeOrientation: Qt.LandscapeOrientation
97− primaryOrientation: Qt.InvertedLandscapeOrientation
129+ portraitOrientation: Qt.PortraitOrientation
130+ invertedPortraitOrientation: Qt.InvertedPortraitOrientation
98131 category: "tablet"
99132 }
100133 },
@@ -102,8 +135,13 @@ QtObject {
102135 name: "desktop"
103136 PropertyChanges {
104137 target: priv
105− category: "desktop"
138+ primaryOrientation: root.useNativeOrientation
106139 supportedOrientations: root.useNativeOrientation
140+ landscapeOrientation: Qt.LandscapeOrientation
141+ invertedLandscapeOrientation: Qt.InvertedLandscapeOrientation
142+ portraitOrientation: Qt.PortraitOrientation
143+ invertedPortraitOrientation: Qt.InvertedPortraitOrientation
144+ category: "desktop"
107145 }
108146 }
109147 ]
qml/DisabledScreenNotice.qml+44−20
@@ -17,6 +17,7 @@
1717import QtQuick 2.4
1818import QtQuick.Layouts 1.1
1919import Ubuntu.Components 1.3
20+import Unity.Session 0.1
2021import QtQuick.Window 2.2
2122import "Components"
2223
@@ -25,19 +26,36 @@ Item {
2526
2627 property bool infoNoteDisplayed: true
2728
28− WallpaperResolver {
29− width: root.width
30− id: wallpaperResolver
29+ // For testing
30+ property var screen: Screen
31+ property var orientationLock: OrientationLock
32+
33+ DeviceConfiguration {
34+ id: deviceConfiguration
35+ name: applicationArguments.deviceName
3136 }
3237
3338 Item {
3439 id: contentContainer
40+ objectName: "contentContainer"
3541 anchors.centerIn: parent
3642 height: rotation == 90 || rotation == 270 ? parent.width : parent.height
3743 width: rotation == 90 || rotation == 270 ? parent.height : parent.width
3844
45+ property int savedOrientation: deviceConfiguration.primaryOrientation == deviceConfiguration.useNativeOrientation
46+ ? (root.width > root.height ? Qt.LandscapeOrientation : Qt.PortraitOrientation)
47+ : deviceConfiguration.primaryOrientation
48+
3949 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) {
4159 case Qt.PortraitOrientation:
4260 return 0;
4361 case Qt.LandscapeOrientation:
@@ -47,6 +65,8 @@ Item {
4765 case Qt.InvertedLandscapeOrientation:
4866 return 90;
4967 }
68+
69+ return 0;
5070 }
5171 transformOrigin: Item.Center
5272
@@ -60,9 +80,9 @@ Item {
6080 }
6181 }
6282
63− Image {
83+ Rectangle {
6484 anchors.fill: parent
65− source: wallpaperResolver.background
85+ color: "#3b3b3b"
6686 }
6787
6888 Item {
@@ -74,22 +94,26 @@ Item {
7494 UbuntuNumberAnimation { }
7595 }
7696
77− Rectangle {
78− anchors.fill: parent
79− color: "black"
80− opacity: 0.4
81− }
82−
83− Label {
84− id: text
97+ Column {
8598 anchors.centerIn: parent
8699 width: parent.width - units.gu(8)
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.")
88− color: "white"
89− horizontalAlignment: Text.AlignHCenter
90− verticalAlignment: Text.AlignVCenter
91− fontSize: "x-large"
92− wrapMode: Text.Wrap
100+ spacing: units.gu(4)
101+
102+ Label {
103+ id: text
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.")
105+ color: "white"
106+ width: parent.width
107+ fontSize: "large"
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+ }
93117 }
94118 }
95119
qml/Greeter/CoverPage.qml+13−2
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013,2014,2015 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -34,6 +34,7 @@ Showable {
3434 readonly property real showProgress: MathUtils.clamp((width - Math.abs(x)) / width, 0, 1)
3535
3636 signal tease()
37+ signal clicked()
3738
3839 function hideRight() {
3940 d.forceRightOnNextHideAnimation = true;
@@ -55,7 +56,17 @@ Showable {
5556 // instead, we can get a little extra horizontal push by using transforms.
5657 transform: Translate { id: translation; x: root.draggable ? launcherOffset : 0 }
5758
58− MouseArea { anchors.fill: parent; }
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 {
66+ anchors.fill: parent
67+ mouseEnabled: false
68+ }
69+ }
5970
6071 Rectangle {
6172 // In case background fails to load
qml/Greeter/Infographics.qml+2−1
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -402,6 +402,7 @@ Item {
402402
403403 MouseArea {
404404 anchors.fill: dataCircle
405+ enabled: notification.text != ""
405406
406407 onDoubleClicked: {
407408 if (!d.animating) {
qml/Greeter/NarrowView.qml+14−1
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -125,6 +125,18 @@ FocusScope {
125125 onCancel: coverPage.show()
126126 onEmergencyCall: root.emergencyCall()
127127
128+ onEnabledChanged: {
129+ if (enabled) {
130+ lockscreen.forceActiveFocus();
131+ }
132+ }
133+
134+ onVisibleChanged: {
135+ if (visible) {
136+ lockscreen.forceActiveFocus();
137+ }
138+ }
139+
128140 function maybeShow() {
129141 if (root.locked && !shown) {
130142 showNow();
@@ -145,6 +157,7 @@ FocusScope {
145157 width: parent.width
146158 background: root.background
147159 onTease: root.tease()
160+ onClicked: hide()
148161
149162 onShowProgressChanged: {
150163 if (showProgress === 1) {
qml/Launcher/Launcher.qml+144−11
@@ -19,21 +19,26 @@ import "../Components"
1919import Ubuntu.Components 1.3
2020import Ubuntu.Gestures 0.1
2121import Unity.Launcher 0.1
22+import GlobalShortcut 1.0
2223
23−Item {
24+FocusScope {
2425 id: root
2526
2627 property bool autohideEnabled: false
28+ property bool lockedVisible: false
2729 property bool available: true // can be used to disable all interactions
2830 property alias inverted: panel.inverted
2931 property bool shadeBackground: true // can be used to disable background shade when launcher is visible
3032
31− property int panelWidth: units.gu(8)
33+ property int panelWidth: units.gu(10)
3234 property int dragAreaWidth: units.gu(1)
3335 property int minimizeDistance: units.gu(26)
3436 property real progress: dragArea.dragging && dragArea.touchX > panelWidth ?
3537 (width * (dragArea.touchX-panelWidth) / (width - panelWidth)) : 0
3638
39+ property bool superPressed: false
40+ property bool superTabPressed: false
41+
3742 readonly property bool dragging: dragArea.dragging
3843 readonly property real dragDistance: dragArea.dragging ? dragArea.touchX : 0
3944 readonly property real visibleWidth: panel.width + panel.x
@@ -57,12 +62,55 @@ Item {
5762 }
5863 }
5964
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+
60106 function hide() {
61107 switchToNextState("")
62108 }
63109
64110 function fadeOut() {
65− fadeOutAnimation.start();
111+ if (!root.lockedVisible) {
112+ fadeOutAnimation.start();
113+ }
66114 }
67115
68116 function switchToNextState(state) {
@@ -90,6 +138,77 @@ Item {
90138 }
91139 }
92140
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+
93212 Timer {
94213 id: teaseTimer
95214 interval: mode == "teasing" ? 200 : 300
@@ -106,6 +225,13 @@ Item {
106225 interval: 1
107226 property string nextState: ""
108227 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+
109235 // switching to an intermediate state here to make sure all the
110236 // values are restored, even if we were already in the target state
111237 root.state = "tmp"
@@ -151,7 +277,7 @@ Item {
151277
152278 MouseArea {
153279 id: launcherDragArea
154− enabled: root.available && (root.state == "visible" || root.state == "visibleTemporary")
280+ enabled: root.available && (root.state == "visible" || root.state == "visibleTemporary") && !root.lockedVisible
155281 anchors.fill: panel
156282 anchors.rightMargin: -units.gu(2)
157283 drag {
@@ -172,9 +298,10 @@ Item {
172298 InverseMouseArea {
173299 id: closeMouseArea
174300 anchors.fill: panel
175− enabled: root.shadeBackground && root.state == "visible"
301+ enabled: root.shadeBackground && root.state == "visible" && (!root.lockedVisible || panel.highlightIndex >= -1)
176302 visible: enabled
177303 onPressed: {
304+ panel.highlightIndex = -2
178305 root.hide();
179306 }
180307 }
@@ -183,7 +310,7 @@ Item {
183310 id: backgroundShade
184311 anchors.fill: parent
185312 color: "black"
186− opacity: root.shadeBackground && root.state == "visible" ? 0.6 : 0
313+ opacity: root.shadeBackground && root.state == "visible" && !root.lockedVisible ? 0.6 : 0
187314
188315 Behavior on opacity { NumberAnimation { duration: UbuntuAnimation.BriskDuration } }
189316 }
@@ -202,8 +329,8 @@ Item {
202329 rotation: -90
203330 anchors.centerIn: parent
204331 gradient: Gradient {
205− GradientStop { position: 0.0; color: panel.color}
206− GradientStop { position: 1.0; color: Qt.rgba(panel.r,panel.g,panel.b,0)}
332+ GradientStop { position: 0.0; color: Qt.rgba(panel.color.r, panel.color.g, panel.color.b, .5)}
333+ GradientStop { position: 1.0; color: Qt.rgba(panel.color.r,panel.color.g,panel.color.b,0)}
207334 }
208335 }
209336 }
@@ -227,7 +354,7 @@ Item {
227354 Connections {
228355 target: panel.dismissTimer
229356 onTriggered: {
230− if (root.autohideEnabled) {
357+ if (root.autohideEnabled && !root.lockedVisible) {
231358 if (!panel.preventHiding) {
232359 root.state = ""
233360 } else {
@@ -240,11 +367,11 @@ Item {
240367 property bool animate: true
241368
242369 onApplicationSelected: {
243− root.state = ""
370+ root.hide();
244371 launcherApplicationSelected(appId)
245372 }
246373 onShowDashHome: {
247− root.state = ""
374+ root.hide();
248375 root.showDashHome();
249376 }
250377
@@ -254,6 +381,12 @@ Item {
254381 }
255382 }
256383
384+ onKbdNavigationCancelled: {
385+ panel.highlightIndex = -2;
386+ root.hide();
387+ root.focus = false;
388+ }
389+
257390 Behavior on x {
258391 enabled: !dragArea.dragging && !launcherDragArea.drag.active && panel.animate;
259392 NumberAnimation {
qml/Launcher/LauncherDelegate.qml+55−20
@@ -20,6 +20,7 @@ import Ubuntu.Components 1.3
2020Item {
2121 id: root
2222
23+ property int itemIndex: 0
2324 property string iconName
2425 property int count: 0
2526 property bool countVisible: false
@@ -29,10 +30,12 @@ Item {
2930 property real maxAngle: 0
3031 property bool inverted: false
3132 property bool alerting: false
32− readonly property alias wiggling: wiggleAnim.running
33+ property bool highlighted: false
34+ property bool shortcutHintShown: false
3335
3436 readonly property int effectiveHeight: Math.cos(angle * Math.PI / 180) * itemHeight
3537 readonly property real foldedHeight: Math.cos(maxAngle * Math.PI / 180) * itemHeight
38+ readonly property alias wiggling: wiggleAnim.running
3639
3740 property int itemWidth
3841 property int itemHeight
@@ -121,20 +124,32 @@ Item {
121124
122125 Item {
123126 id: iconItem
124− width: parent.itemWidth + units.gu(1)
127+ width: root.width
125128 height: parent.itemHeight + units.gu(1)
126129 anchors.centerIn: parent
127130
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+
128142 ProportionalShape {
129143 id: iconShape
130144 anchors.centerIn: parent
131− width: parent.width - units.gu(2)
145+ width: root.itemWidth
132146 aspect: UbuntuShape.DropShadow
133147 source: Image {
134148 id: iconImage
135149 sourceSize.width: iconShape.width
136150 sourceSize.height: iconShape.height
137151 source: root.iconName
152+ cache: false // see lpbug#1543290 why no cache
138153 }
139154 }
140155
@@ -144,7 +159,8 @@ Item {
144159 anchors {
145160 right: parent.right
146161 bottom: parent.bottom
147− margins: units.dp(3)
162+ rightMargin: (iconItem.width - root.itemWidth) / 2 - units.dp(2)
163+ margins: units.dp(5)
148164 }
149165 width: Math.min(root.itemWidth, Math.max(units.gu(2), countLabel.implicitWidth + units.gu(1)))
150166 height: units.gu(2)
@@ -172,16 +188,11 @@ Item {
172188 id: progressOverlay
173189 objectName: "progressOverlay"
174190
175− anchors {
176− left: iconItem.left
177− right: iconItem.right
178− verticalCenter: parent.verticalCenter
179− leftMargin: units.gu(1.5)
180− rightMargin: units.gu(1.5)
181− }
191+ anchors.centerIn: parent
192+ width: root.itemWidth * .8
182193 height: units.gu(1)
183194 visible: root.progress > -1
184− color: UbuntuColors.darkGrey
195+ backgroundColor: UbuntuColors.darkGrey
185196 borderSource: "none"
186197
187198 Item {
@@ -199,32 +210,56 @@ Item {
199210 top: parent.top
200211 bottom: parent.bottom
201212 }
202− color: "white"
213+ backgroundColor: "white"
203214 borderSource: "none"
204215 width: progressOverlay.width
205216 }
206217 }
207218 }
208219
209− Image {
210− objectName: "runningHighlight"
220+ Column {
211221 anchors {
212222 left: parent.left
213223 verticalCenter: parent.verticalCenter
214224 }
215− visible: root.itemRunning
216− rotation: 180
217− source: "graphics/focused_app_arrow.png"
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"
233+ visible: root.itemRunning
234+ }
235+ }
218236 }
219237
220− Image {
238+ Rectangle {
221239 objectName: "focusedHighlight"
222240 anchors {
223241 right: parent.right
224242 verticalCenter: parent.verticalCenter
225243 }
244+ width: units.gu(0.25)
245+ height: units.gu(.5)
246+ color: "white"
226247 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+ }
228263 }
229264 }
230265
qml/Launcher/LauncherPanel.qml+122−51
@@ -19,12 +19,13 @@ import Ubuntu.Components 1.3
1919import Ubuntu.Components.ListItems 1.3 as ListItems
2020import Unity.Launcher 0.1
2121import Ubuntu.Components.Popups 1.3
22+import GlobalShortcut 1.0
2223import "../Components/ListItems"
2324import "../Components/"
2425
2526Rectangle {
2627 id: root
27− color: "#B2000000"
28+ color: "#E0292929"
2829
2930 rotation: inverted ? 180 : 0
3031
@@ -33,11 +34,13 @@ Rectangle {
3334 property bool dragging: false
3435 property bool moving: launcherListView.moving || launcherListView.flicking
3536 property bool preventHiding: moving || dndArea.draggedIndex >= 0 || quickList.state === "open" || dndArea.pressed
36− || mouseEventEater.containsMouse || dashItem.hovered
37− property int highlightIndex: -1
37+ || mouseEventEater.containsMouse || dashItem.hovered
38+ property int highlightIndex: -2
39+ property bool shortcutHintsShown: false
3840
3941 signal applicationSelected(string appId)
4042 signal showDashHome()
43+ signal kbdNavigationCancelled()
4144
4245 onXChanged: {
4346 if (quickList.state == "open") {
@@ -45,6 +48,26 @@ Rectangle {
4548 }
4649 }
4750
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+
4871 MouseArea {
4972 id: mouseEventEater
5073 anchors.fill: parent
@@ -57,24 +80,16 @@ Rectangle {
5780 fill: parent
5881 }
5982
60− Item {
83+ Rectangle {
6184 objectName: "buttonShowDashHome"
6285 width: parent.width
63− height: units.gu(7)
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
73− }
86+ height: width * .9
87+ color: UbuntuColors.orange
88+ readonly property bool highlighted: root.highlightIndex == -1;
7489
7590 Image {
7691 objectName: "dashItem"
77− width: units.gu(5)
92+ width: parent.width * .6
7893 height: width
7994 anchors.centerIn: parent
8095 source: "graphics/home.png"
@@ -85,6 +100,14 @@ Rectangle {
85100 anchors.fill: parent
86101 onClicked: root.showDashHome()
87102 }
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+ }
88111 }
89112
90113 Item {
@@ -102,10 +125,8 @@ Rectangle {
102125 objectName: "launcherListView"
103126 anchors {
104127 fill: parent
105− topMargin: -extensionSize + units.gu(0.5)
106− bottomMargin: -extensionSize + units.gu(1)
107− leftMargin: units.gu(0.5)
108− rightMargin: units.gu(0.5)
128+ topMargin: -extensionSize + width * .15
129+ bottomMargin: -extensionSize + width * .15
109130 }
110131 topMargin: extensionSize
111132 bottomMargin: extensionSize
@@ -140,11 +161,11 @@ Rectangle {
140161 }
141162
142163 // The height of the area where icons start getting folded
143− property int foldingStartHeight: units.gu(6.5)
164+ property int foldingStartHeight: itemHeight
144165 // The height of the area where the items reach the final folding angle
145166 property int foldingStopHeight: foldingStartHeight - itemHeight - spacing
146− property int itemWidth: units.gu(7)
147− property int itemHeight: units.gu(6.5)
167+ property int itemWidth: width * .75
168+ property int itemHeight: itemWidth * 15 / 16 + units.gu(1)
148169 property int clickFlickSpeed: units.gu(60)
149170 property int draggedIndex: dndArea.draggedIndex
150171 property real realContentY: contentY - originY + topMargin
@@ -172,12 +193,24 @@ Rectangle {
172193
173194 UbuntuNumberAnimation {
174195 id: moveAnimation
196+ objectName: "moveAnimation"
175197 target: launcherListView
176198 property: "contentY"
177199 function moveTo(contentY) {
178200 from = launcherListView.contentY;
179201 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);
181214 }
182215 }
183216
@@ -192,9 +225,10 @@ Rectangle {
192225 // the right app when running autopilot tests for
193226 // multiple apps.
194227 readonly property string appId: model.appId
228+ itemIndex: index
195229 itemHeight: launcherListView.itemHeight
196230 itemWidth: launcherListView.itemWidth
197− width: itemWidth
231+ width: parent.width
198232 height: itemHeight
199233 iconName: model.icon
200234 count: model.count
@@ -204,6 +238,8 @@ Rectangle {
204238 itemFocused: model.focused
205239 inverted: root.inverted
206240 alerting: model.alerting
241+ highlighted: root.highlightIndex == index
242+ shortcutHintShown: root.shortcutHintsShown && index <= 9
207243 z: -Math.abs(offset)
208244 maxAngle: 55
209245 property bool dragging: false
@@ -241,14 +277,7 @@ Rectangle {
241277 onAlertingChanged: {
242278 if(alerting) {
243279 if (!dragging && (launcherListView.peekingIndex === -1 || launcher.visibleWidth > 0)) {
244− var itemPosition = index * launcherListView.itemHeight;
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− }
280+ launcherListView.moveToIndex(index)
252281 if (!dragging && launcher.state !== "visible") {
253282 peekingAnimation.start()
254283 }
@@ -402,10 +431,7 @@ Rectangle {
402431
403432 if (mouse.button & Qt.RightButton) { // context menu
404433 // Opening QuickList
405− quickList.item = clickedItem;
406− quickList.model = launcherListView.model.get(index).quickList;
407− quickList.appId = launcherListView.model.get(index).appId;
408− quickList.state = "open";
434+ quickList.open(index);
409435 return;
410436 }
411437
@@ -413,10 +439,8 @@ Rectangle {
413439
414440 // First/last item do the scrolling at more than 12 degrees
415441 if (index == 0 || index == launcherListView.count - 1) {
416− if (clickedItem.angle > 12) {
417− launcherListView.flick(0, -launcherListView.clickFlickSpeed);
418− } else if (clickedItem.angle < -12) {
419− launcherListView.flick(0, launcherListView.clickFlickSpeed);
442+ if (clickedItem.angle > 12 || clickedItem.angle < -12) {
443+ launcherListView.moveToIndex(index);
420444 } else {
421445 root.applicationSelected(LauncherModel.get(index).appId);
422446 }
@@ -424,10 +448,8 @@ Rectangle {
424448 }
425449
426450 // the rest launches apps up to an angle of 30 degrees
427− if (clickedItem.angle > 30) {
428− launcherListView.flick(0, -launcherListView.clickFlickSpeed);
429− } else if (clickedItem.angle < -30) {
430− launcherListView.flick(0, launcherListView.clickFlickSpeed);
451+ if (clickedItem.angle > 30 || clickedItem.angle < -30) {
452+ launcherListView.moveToIndex(index);
431453 } else {
432454 root.applicationSelected(LauncherModel.get(index).appId);
433455 }
@@ -481,11 +503,7 @@ Rectangle {
481503
482504 draggedIndex = Math.floor((mouse.y + launcherListView.realContentY) / launcherListView.realItemHeight);
483505
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)
489507
490508 launcherListView.interactive = false
491509
@@ -644,7 +662,9 @@ Rectangle {
644662 enabled: quickList.state == "open" || pressed
645663
646664 onClicked: {
647− quickList.state = ""
665+ quickList.state = "";
666+ quickList.focus = false;
667+ root.kbdNavigationCancelled();
648668 }
649669
650670 // Forward for dragging to work when quickList is open
@@ -693,12 +713,60 @@ Rectangle {
693713 property var model
694714 property string appId
695715 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+ }
696755
697756 // internal
698757 property int itemCenter: item ? root.mapFromItem(quickList.item).y + (item.height / 2) + quickList.item.offset : units.gu(1)
699758 property int offset: itemCenter + (height/2) + units.gu(1) > parent.height ? -itemCenter - (height/2) - units.gu(1) + parent.height :
700759 itemCenter - (height/2) < units.gu(1) ? (height/2) - itemCenter + units.gu(1) : 0
701760
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+
702770 Column {
703771 id: quickListColumn
704772 width: parent.width
@@ -712,6 +780,7 @@ Rectangle {
712780 objectName: "quickListEntry" + index
713781 text: (model.clickable ? "" : "<b>") + model.label + (model.clickable ? "" : "</b>")
714782 highlightWhenPressed: model.clickable
783+ selected: index === quickList.selectedIndex
715784
716785 // FIXME: This is a workaround for the theme not being context sensitive. I.e. the
717786 // ListItems don't know that they are sitting in a themed Popover where the color
@@ -727,6 +796,8 @@ Rectangle {
727796 // Unsetting model to prevent showing changing entries during fading out
728797 // that may happen because of triggering an action.
729798 LauncherModel.quickListActionInvoked(quickList.appId, index);
799+ quickList.focus = false;
800+ root.kbdNavigationCancelled();
730801 quickList.model = undefined;
731802 }
732803 }
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
2323import Utils 0.1
2424import "../Components"
2525
26−Item {
26+StyledItem {
2727 id: notification
2828
2929 property alias iconSource: icon.fileSource
@@ -58,6 +58,10 @@ Item {
5858 color: (type === Notification.Confirmation && notificationList.useModal && !greeter.shown) || darkOnBright ? sdLightGrey : Qt.rgba(0.132, 0.117, 0.109, 0.97)
5959 opacity: 1 - (x / notification.width) // FIXME: non-zero initially because of LP: #1354406 workaround, we want this to start at 0 upon creation eventually
6060
61+ theme: ThemeSettings {
62+ name: "Ubuntu.Components.Themes.Ambiance"
63+ }
64+
6165 state: {
6266 var result = "";
6367
@@ -281,7 +285,7 @@ Item {
281285 }
282286 visible: type !== Notification.Confirmation
283287 fontSize: "medium"
284− color: darkOnBright ? sdFontColor : theme.palette.selected.backgroundText
288+ color: darkOnBright ? sdFontColor : theme.palette.normal.backgroundText
285289 elide: Text.ElideRight
286290 textFormat: Text.PlainText
287291 }
@@ -296,8 +300,8 @@ Item {
296300 }
297301 visible: body != "" && type !== Notification.Confirmation
298302 fontSize: "small"
299− color: darkOnBright ? sdFontColor : theme.palette.selected.backgroundText
300− wrapMode: Text.WordWrap
303+ color: darkOnBright ? sdFontColor : theme.palette.normal.backgroundText
304+ wrapMode: Text.Wrap
301305 maximumLineCount: type == Notification.SnapDecision ? 12 : 2
302306 elide: Text.ElideRight
303307 textFormat: Text.PlainText
@@ -337,7 +341,7 @@ Item {
337341 anchors.horizontalCenter: parent.horizontalCenter
338342 visible: type === Notification.Confirmation && body !== ""
339343 fontSize: "medium"
340− color: darkOnBright ? sdFontColor : theme.palette.selected.backgroundText
344+ color: darkOnBright ? sdFontColor : theme.palette.normal.backgroundText
341345 wrapMode: Text.WordWrap
342346 maximumLineCount: 1
343347 elide: Text.ElideRight
qml/OrientedShell.qml+26−1
@@ -19,6 +19,7 @@ import QtQuick.Window 2.2
1919import Unity.InputInfo 0.1
2020import Unity.Session 0.1
2121import Unity.Screens 0.1
22+import Utils 0.1
2223import GSettings 1.0
2324import "Components"
2425import "Rotation"
@@ -79,6 +80,8 @@ Rectangle {
7980 InputDeviceModel {
8081 id: keyboardsModel
8182 deviceFilter: InputInfo.Keyboard
83+ onDeviceAdded: forceOSKEnabled = autopilotDevicePresent();
84+ onDeviceRemoved: forceOSKEnabled = autopilotDevicePresent();
8285 }
8386
8487 InputDeviceModel {
@@ -109,6 +112,27 @@ Rectangle {
109112 touchPadModel.oldCount = touchPadModel.count;
110113 }
111114
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+
112136 Screens {
113137 id: screens
114138 }
@@ -220,7 +244,8 @@ Rectangle {
220244 // have multiple keyboards around. For now we only enable one keyboard at a time
221245 // thus hiding it here if there is a physical one around or if we have a second
222246 // 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
224249
225250 usageScenario: {
226251 if (root.unity8Settings.usageMode === "Windowed") {
qml/Panel/Handle.qml+2−2
@@ -19,7 +19,7 @@ import Ubuntu.Components 1.3
1919
2020Rectangle {
2121 id: handle
22− color: "#5d5d5d"
22+ color: theme.palette.normal.foreground
2323 height: units.gu(2)
2424 property bool active: false
2525
@@ -35,7 +35,7 @@ Rectangle {
3535 id: dot
3636 width: units.dp(3)
3737 height: width
38− color: handle.active ? UbuntuColors.orange : "#888888"
38+ color: handle.active ? theme.palette.highlighted.foreground : theme.palette.normal.raised
3939 radius: units.dp(1)
4040 }
4141 }
qml/Panel/IndicatorItem.qml+3−3
@@ -32,9 +32,9 @@ IndicatorDelegate {
3232 property bool selected: false
3333 property real iconHeight: units.gu(2)
3434 readonly property color color: {
35− if (!expanded) return "#ffffff";
36− if (!selected) return "#888888";
37− return "#ffffff";
35+ if (!expanded) return theme.palette.normal.backgroundText;
36+ if (!selected) return theme.palette.disabled.backgroundText;
37+ return theme.palette.normal.backgroundText;
3838 }
3939
4040 implicitWidth: mainItems.width
qml/Panel/Indicators/MenuItemFactory.qml+3−4
@@ -232,7 +232,6 @@ Item {
232232 text: menuData && menuData.label || ""
233233 iconSource: menuData && menuData.icon || ""
234234 value : menuData && menuData.actionState || 0.0
235− enabled: menuData && menuData.sensitive || false
236235 highlightWhenPressed: false
237236 }
238237 }
@@ -265,7 +264,7 @@ Item {
265264 name: "settings"
266265 height: units.gu(3)
267266 width: height
268− color: theme.palette.selected.backgroundText
267+ color: theme.palette.normal.backgroundText
269268 }
270269 }
271270 }
@@ -297,7 +296,7 @@ Item {
297296 source: menuData.icon
298297 height: units.gu(3)
299298 width: height
300− color: theme.palette.selected.backgroundText
299+ color: theme.palette.normal.backgroundText
301300 }
302301 }
303302 }
@@ -624,7 +623,7 @@ Item {
624623
625624 Component {
626625 id: modeminfoitem;
627− ModemInfoItem {
626+ Menus.ModemInfoItem {
628627 objectName: "modemInfoItem"
629628 property QtObject menuData: null
630629 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 {
2626 id: root
2727
2828 Component.onCompleted: {
29− theme.name = "Ubuntu.Components.Themes.SuruGradient"
29+ theme.name = "Ubuntu.Components.Themes.SuruDark"
3030 }
3131
3232 PageStack {
qml/Panel/IndicatorsMenu.qml+3−2
@@ -38,7 +38,7 @@ Showable {
3838 property bool enableHint: true
3939 property bool contentEnabled: true
4040 property bool showOnClick: true
41− property color panelColor: "#292929"
41+ property color panelColor: UbuntuColors.jet
4242
4343 signal showTapped(point position)
4444
@@ -76,6 +76,7 @@ Showable {
7676 MenuContent {
7777 id: content
7878 objectName: "menuContent"
79+ color: root.panelColor
7980
8081 anchors {
8182 left: parent.left
@@ -110,7 +111,7 @@ Showable {
110111 height: units.gu(0.5)
111112 gradient: Gradient {
112113 GradientStop { position: 0.0; color: "transparent" }
113− GradientStop { position: 1.0; color: "#292929" }
114+ GradientStop { position: 1.0; color: root.panelColor }
114115 }
115116 opacity: 0.3
116117 }
qml/Panel/MenuContent.qml+1−1
@@ -27,7 +27,7 @@ Rectangle {
2727
2828 property QtObject indicatorsModel: null
2929 property int currentMenuIndex: -1
30− color: "#292929" // FIXME not in palette yet
30+ color: theme.palette.normal.background
3131
3232 width: units.gu(40)
3333 height: units.gu(42)
qml/Panel/Panel.qml+5−1
@@ -89,7 +89,7 @@ Item {
8989
9090 Rectangle {
9191 id: indicatorAreaBackground
92− color: callHint.visible ? "green" : "#292929"
92+ color: callHint.visible ? UbuntuColors.green : indicators.panelColor
9393 anchors {
9494 top: parent.top
9595 left: parent.left
@@ -169,8 +169,10 @@ Item {
169169 objectName: "windowDecorationTitle"
170170 anchors {
171171 left: parent.left
172+ right: __indicators.left
172173 top: parent.top
173174 leftMargin: units.gu(1)
175+ rightMargin: units.gu(1)
174176 topMargin: units.gu(0.5)
175177 bottomMargin: units.gu(0.5)
176178 }
@@ -181,6 +183,8 @@ Item {
181183 fontSize: "medium"
182184 font.weight: Font.Normal
183185 text: PanelState.title
186+ elide: Text.ElideRight
187+ maximumLineCount: 1
184188 }
185189
186190 // TODO here would the Locally integrated menus come
qml/ScopeTool.qml−8
@@ -52,14 +52,6 @@ Rectangle {
5252 color: "#FCFCFC"
5353 }
5454
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−
6355 DashContent {
6456 id: dashContent
6557
qml/Shell.qml+52−2
@@ -25,6 +25,7 @@ import Ubuntu.Telephony 0.1 as Telephony
2525import Unity.Connectivity 0.1
2626import Unity.Launcher 0.1
2727import GlobalShortcut 1.0 // has to be before Utils, because of WindowKeysFilter
28+import GSettings 1.0
2829import Utils 0.1
2930import Powerd 0.1
3031import SessionBroadcast 0.1
@@ -139,7 +140,7 @@ Item {
139140 }
140141
141142 Component.onCompleted: {
142− theme.name = "Ubuntu.Components.Themes.SuruGradient"
143+ theme.name = "Ubuntu.Components.Themes.SuruDark"
143144 if (ApplicationManager.count > 0) {
144145 ApplicationManager.focusApplication(ApplicationManager.get(0).appId);
145146 }
@@ -187,6 +188,11 @@ Item {
187188 }
188189 }
189190
191+ GSettings {
192+ id: settings
193+ schema.id: "com.canonical.Unity8"
194+ }
195+
190196 Item {
191197 id: stages
192198 objectName: "stages"
@@ -343,6 +349,11 @@ Item {
343349 property: "altTabPressed"
344350 value: physicalKeysMapper.altTabPressed
345351 }
352+ Binding {
353+ target: applicationsDisplayLoader.item
354+ property: "leftMargin"
355+ value: shell.usageScenario == "desktop" && !settings.autohideLauncher ? launcher.panelWidth: 0
356+ }
346357 }
347358
348359 Tutorial {
@@ -373,7 +384,11 @@ Item {
373384 InputMethod {
374385 id: inputMethod
375386 objectName: "inputMethod"
376− anchors { fill: parent; topMargin: panel.panelHeight }
387+ anchors {
388+ fill: parent
389+ topMargin: panel.panelHeight
390+ leftMargin: launcher.lockedVisible ? launcher.panelWidth : 0
391+ }
377392 z: notifications.useModal || panel.indicators.shown || wizard.active ? overlay.z + 1 : overlay.z - 1
378393 }
379394
@@ -562,6 +577,10 @@ Item {
562577 && !greeter.hasLockedApp
563578 inverted: shell.usageScenario !== "desktop"
564579 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
565584
566585 onShowDashHome: showHome()
567586 onDash: showDash()
@@ -581,6 +600,37 @@ Item {
581600 panel.indicators.hide()
582601 }
583602 }
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+ }
584634 }
585635
586636 Wizard {
qml/Stages/AbstractStage.qml+3−1
@@ -21,7 +21,7 @@ import GSettings 1.0
2121Rectangle {
2222 id: root
2323
24− color: "#111111"
24+ color: "#060606"
2525
2626 // Controls to be set from outside
2727 property bool altTabPressed
@@ -39,6 +39,8 @@ Rectangle {
3939 property int shellOrientationAngle
4040 property bool spreadEnabled: true // If false, animations and right edge will be disabled
4141 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
4244
4345 // To be read from outside
4446 property var mainApp: null
qml/Stages/DesktopSpread.qml+64−17
@@ -19,6 +19,7 @@ import QtQuick.Layouts 1.1
1919import Ubuntu.Components 1.3
2020import Ubuntu.Gestures 0.1
2121import Unity.Application 0.1
22+import "../Components"
2223
2324FocusScope {
2425 id: root
@@ -26,8 +27,11 @@ FocusScope {
2627 property bool altTabPressed: false
2728 property Item workspace: null
2829
30+ readonly property alias ready: blurLayer.ready
2931 readonly property alias highlightedIndex: spreadRepeater.highlightedIndex
3032
33+ signal playFocusAnimation(int index)
34+
3135 function show() {
3236 spreadContainer.animateIn = true;
3337 root.state = "altTab";
@@ -91,6 +95,9 @@ FocusScope {
9195
9296 function focusSelected() {
9397 if (spreadRepeater.highlightedIndex != -1) {
98+ if (spreadContainer.visible) {
99+ root.playFocusAnimation(spreadRepeater.highlightedIndex)
100+ }
94101 var application = ApplicationManager.get(spreadRepeater.highlightedIndex);
95102 ApplicationManager.requestFocusApplication(application.appId);
96103 }
@@ -101,6 +108,31 @@ FocusScope {
101108 state = ""
102109 }
103110
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+
104136 Item {
105137 id: spreadContainer
106138 objectName: "spreadContainer"
@@ -226,13 +258,20 @@ FocusScope {
226258 Transition {
227259 from: ""
228260 to: "altTab"
229− PropertyAction { target: spreadDelegate; properties: "y,height,width,angle,z,itemScale,itemScaleOriginY,visible" }
230− PropertyAction { target: clippedSpreadDelegate; properties: "anchors.topMargin" }
231− PropertyAnimation {
232− target: spreadDelegate; properties: "x"
233− from: root.width
234− duration: spreadContainer.animateIn ? UbuntuAnimation.FastDuration :0
235− easing: UbuntuAnimation.StandardEasing
261+ SequentialAnimation {
262+ ParallelAnimation {
263+ PropertyAction { target: spreadDelegate; properties: "y,height,width,angle,z,itemScale,itemScaleOriginY,visible" }
264+ PropertyAction { target: clippedSpreadDelegate; properties: "anchors.topMargin" }
265+ PropertyAnimation {
266+ target: spreadDelegate; properties: "x"
267+ from: root.width
268+ duration: spreadContainer.animateIn ? UbuntuAnimation.FastDuration :0
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" }
236275 }
237276 }
238277 ]
@@ -240,7 +279,11 @@ FocusScope {
240279 MouseArea {
241280 id: tileInfo
242281 objectName: "tileInfo"
243− anchors { left: parent.left; top: clippedSpreadDelegate.bottom; topMargin: units.gu(5) }
282+ anchors {
283+ left: parent.left
284+ top: clippedSpreadDelegate.bottom
285+ topMargin: ((spreadMaths.sceneHeight - spreadDelegate.y) - clippedSpreadDelegate.height) * 0.2
286+ }
244287 property int nextItemX: spreadRepeater.count > index + 1 ? spreadRepeater.itemAt(index + 1).x : spreadDelegate.x + units.gu(30)
245288 width: Math.min(units.gu(30), nextItemX - spreadDelegate.x)
246289 height: titleInfoColumn.height
@@ -262,12 +305,20 @@ FocusScope {
262305 anchors { left: parent.left; top: parent.top; right: parent.right }
263306 spacing: units.gu(1)
264307
265− UbuntuShape {
308+ UbuntuShapeForItem {
266309 Layout.preferredHeight: Math.min(units.gu(6), root.height * .05)
267310 Layout.preferredWidth: height * 8 / 7.6
268311 image: Image {
269312 anchors.fill: parent
270313 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+ }
271322 }
272323 }
273324 Label {
@@ -420,7 +471,7 @@ FocusScope {
420471
421472 property var source: ShaderEffectSource {
422473 id: shaderEffectSource
423− sourceItem: appContainer
474+ sourceItem: root.workspace
424475 }
425476
426477 fragmentShader: "
@@ -494,20 +545,17 @@ FocusScope {
494545 from: "*"
495546 to: "altTab"
496547 SequentialAnimation {
497− PropertyAction { target: hoverMouseArea; property: "progressiveScrollingEnabled"; value: false }
498548 PropertyAction { target: spreadRepeater; property: "highlightedIndex"; value: Math.min(ApplicationManager.count - 1, 1) }
499− PauseAnimation { duration: 140 }
549+ PauseAnimation { duration: spreadContainer.animateIn ? 0 : 140 }
500550 PropertyAction { target: workspaceSelector; property: "visible" }
501551 PropertyAction { target: spreadContainer; property: "visible" }
502552 ParallelAnimation {
503− UbuntuNumberAnimation {
504− target: blurLayer; properties: "saturation,blurRadius";
505− duration: spreadContainer.animateIn ? UbuntuAnimation.FastDuration : 0
506− }
553+ UbuntuNumberAnimation { target: blurLayer; properties: "saturation,blurRadius"; duration: UbuntuAnimation.SnapDuration }
507554 PropertyAction { target: spreadFlickable; property: "visible" }
508555 PropertyAction { targets: [currentSelectedLabel,spreadBackground]; property: "visible" }
509556 PropertyAction { target: spreadFlickable; property: "contentX"; value: 0 }
510557 }
558+ PropertyAction { target: hoverMouseArea; properties: "enabled,progressiveScrollingEnabled"; value: false }
511559 }
512560 },
513561 Transition {
@@ -518,6 +566,5 @@ FocusScope {
518566 PropertyAction { target: spreadRepeater; property: "highlightedIndex"; value: -1 }
519567 PropertyAction { target: spreadContainer; property: "animateIn"; value: false }
520568 }
521−
522569 ]
523570}
qml/Stages/DesktopSpreadDelegate.qml+15−1
@@ -56,6 +56,11 @@ Item {
5656 }
5757 ]
5858
59+ scale: highlightShown ? 1.025 : 1
60+ Behavior on scale {
61+ UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration }
62+ }
63+
5964 BorderImage {
6065 anchors {
6166 fill: root
@@ -70,7 +75,7 @@ Item {
7075 anchors.fill: parent
7176 anchors.margins: -units.gu(1)
7277 color: "white"
73− opacity: highlightShown ? 0.15 : 0
78+ opacity: highlightShown ? 0.55 : 0
7479 antialiasing: true
7580 }
7681
@@ -108,4 +113,13 @@ Item {
108113 ]
109114 }
110115 }
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+ }
111125}
qml/Stages/DesktopStage.qml+34−34
@@ -224,6 +224,7 @@ AbstractStage {
224224 PanelState.dropShadow = false;
225225 }
226226
227+
227228 FocusScope {
228229 id: appContainer
229230 objectName: "appContainer"
@@ -274,6 +275,7 @@ AbstractStage {
274275 readonly property alias maximizedLeft: appDelegatePrivate.maximizedLeft
275276 readonly property alias maximizedRight: appDelegatePrivate.maximizedRight
276277 readonly property alias minimized: appDelegatePrivate.minimized
278+ readonly property alias fullscreen: decoratedWindow.fullscreen
277279
278280 readonly property string appId: model.appId
279281 property bool animationsEnabled: true
@@ -293,6 +295,7 @@ AbstractStage {
293295 visible: !visuallyMinimized &&
294296 !greeter.fullyShown &&
295297 (priv.foregroundMaximizedAppZ === -1 || priv.foregroundMaximizedAppZ <= z) ||
298+ decoratedWindow.fullscreen ||
296299 (spread.state == "altTab" && index === spread.highlightedIndex)
297300
298301 Binding {
@@ -348,13 +351,26 @@ AbstractStage {
348351 ApplicationManager.focusApplication(appId);
349352 }
350353
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+
351367 states: [
352368 State {
353369 name: "fullscreen"; when: decoratedWindow.fullscreen
354− extend: "maximized"
355370 PropertyChanges {
356371 target: appDelegate;
357− y: -PanelState.panelHeight
372+ x: 0; y: -PanelState.panelHeight
373+ requestedWidth: appContainer.width; requestedHeight: appContainer.height;
358374 }
359375 },
360376 State {
@@ -371,21 +387,21 @@ AbstractStage {
371387 name: "maximized"; when: appDelegate.maximized && !appDelegate.minimized
372388 PropertyChanges {
373389 target: appDelegate;
374− x: 0; y: 0;
375− requestedWidth: root.width; requestedHeight: root.height;
390+ x: root.leftMargin; y: 0;
391+ requestedWidth: appContainer.width - root.leftMargin; requestedHeight: appContainer.height;
376392 visuallyMinimized: false;
377393 visuallyMaximized: true
378394 }
379395 },
380396 State {
381397 name: "maximizedLeft"; when: appDelegate.maximizedLeft && !appDelegate.minimized
382− PropertyChanges { target: appDelegate; x: 0; y: PanelState.panelHeight;
383− requestedWidth: root.width/2; requestedHeight: root.height - PanelState.panelHeight }
398+ PropertyChanges { target: appDelegate; x: root.leftMargin; y: PanelState.panelHeight;
399+ requestedWidth: (appContainer.width - root.leftMargin)/2; requestedHeight: appContainer.height - PanelState.panelHeight }
384400 },
385401 State {
386402 name: "maximizedRight"; when: appDelegate.maximizedRight && !appDelegate.minimized
387− PropertyChanges { target: appDelegate; x: root.width/2; y: PanelState.panelHeight;
388− requestedWidth: root.width/2; requestedHeight: root.height - PanelState.panelHeight }
403+ PropertyChanges { target: appDelegate; x: (appContainer.width + root.leftMargin)/2; y: PanelState.panelHeight;
404+ requestedWidth: (appContainer.width - root.leftMargin)/2; requestedHeight: appContainer.height - PanelState.panelHeight }
389405 },
390406 State {
391407 name: "minimized"; when: appDelegate.minimized
@@ -438,7 +454,7 @@ AbstractStage {
438454 target: appDelegate
439455 property: "z"
440456 value: ApplicationManager.count + 1
441− when: index == spread.highlightedIndex && blurLayer.ready
457+ when: index == spread.highlightedIndex && spread.ready
442458 }
443459
444460 WindowResizeArea {
@@ -448,8 +464,9 @@ AbstractStage {
448464 minHeight: units.gu(10)
449465 borderThickness: units.gu(2)
450466 windowId: model.appId // FIXME: Change this to point to windowId once we have such a thing
451− screenWidth: root.width
452− screenHeight: root.height
467+ screenWidth: appContainer.width
468+ screenHeight: appContainer.height
469+ leftMargin: root.leftMargin
453470
454471 onPressed: { ApplicationManager.focusApplication(model.appId) }
455472 }
@@ -473,27 +490,6 @@ AbstractStage {
473490 }
474491 }
475492
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−
497493 EdgeBarrier {
498494 id: edgeBarrier
499495
@@ -509,7 +505,7 @@ AbstractStage {
509505 rotation: 90
510506 anchors.centerIn: parent
511507 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)}
513509 GradientStop { position: 1.0; color: Qt.rgba(0.16,0.16,0.16,0)}
514510 }
515511 }
@@ -527,9 +523,13 @@ AbstractStage {
527523 DesktopSpread {
528524 id: spread
529525 objectName: "spread"
530− anchors.fill: parent
526+ anchors.fill: appContainer
531527 workspace: appContainer
532528 focus: state == "altTab"
533529 altTabPressed: root.altTabPressed
530+
531+ onPlayFocusAnimation: {
532+ appRepeater.itemAt(index).playFocusAnimation();
533+ }
534534 }
535535}
qml/Stages/PhoneStage.qml+77−3
@@ -44,6 +44,33 @@ AbstractStage {
4444 }
4545 }
4646
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+
4774 // Functions to be called from outside
4875 function updateFocusedAppOrientation() {
4976 if (spreadRepeater.count > 0) {
@@ -74,6 +101,12 @@ AbstractStage {
74101 }
75102 }
76103
104+ function pushRightEdge(amount) {
105+ if (spreadView.contentX == -spreadView.shift) {
106+ edgeBarrier.push(amount);
107+ }
108+ }
109+
77110 mainApp: applicationManager.focusedApplicationId
78111 ? applicationManager.findApplication(applicationManager.focusedApplicationId)
79112 : null
@@ -180,6 +213,7 @@ AbstractStage {
180213
181214 property real oldInverseProgress: 0
182215 property bool animateX: false
216+ property int highlightIndex: 0
183217
184218 onFocusedAppDelegateChanged: {
185219 if (focusedAppDelegate) {
@@ -214,6 +248,10 @@ AbstractStage {
214248 spreadView.phase = 0;
215249 spreadView.contentX = -spreadView.shift;
216250 }
251+
252+ onHighlightIndexChanged: {
253+ spreadView.contentX = highlightIndex * spreadView.contentWidth / (spreadRepeater.count + 2)
254+ }
217255 }
218256 Timer {
219257 id: fullyShowingFocusedAppUpdateTimer
@@ -281,6 +319,11 @@ AbstractStage {
281319 }
282320 }
283321
322+ Behavior on contentX {
323+ enabled: root.altTabPressed
324+ UbuntuNumberAnimation {}
325+ }
326+
284327 onShiftedContentXChanged: {
285328 if (root.beingResized) {
286329 // Flickabe.contentX wiggles during resizes. Don't react to it.
@@ -319,12 +362,17 @@ AbstractStage {
319362 } else if (shiftedContentX < positionMarker3 * width) {
320363 snapTo(1);
321364 } else if (phase < 2){
322− // Add 1 pixel to make sure we definitely hit positionMarker4 even with rounding errors of the animation.
323− snapAnimation.targetContentX = width * positionMarker4 + 1 - shift;
324− snapAnimation.start();
365+ snapToSpread();
325366 root.opened();
326367 }
327368 }
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+
328376 function snapTo(index) {
329377 if (!root.altTabEnabled) {
330378 // Reset to start instead
@@ -427,6 +475,7 @@ AbstractStage {
427475 maximizedAppTopMargin: root.maximizedAppTopMargin
428476 dropShadow: spreadView.active || priv.focusedAppDelegateIsDislocated
429477 focusFirstApp: root.focusFirstApp
478+ highlightShown: root.altTabPressed && index === priv.highlightIndex
430479
431480 readonly property bool isDash: model.appId == "unity8-dash"
432481
@@ -651,4 +700,29 @@ AbstractStage {
651700 }
652701 }
653702 }
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+ }
654728}
qml/Stages/Splash.qml+4−2
@@ -76,6 +76,7 @@ Item {
7676 }
7777
7878 Ambiance.PageHeadStyle {
79+ // FIXME: Replace PageHeadStyle by PageHeader from Ubuntu.Components 1.3.
7980 id: header
8081 anchors {
8182 left: parent.left;
@@ -86,9 +87,10 @@ Item {
8687 property color dividerColor: Qt.darker(styledItem.backgroundColor, 1.1)
8788 property color panelColor: Qt.lighter(styledItem.backgroundColor, 1.1)
8889 panelForegroundColor: config.foregroundColor
90+ backgroundColor: "transparent"
8991 config: PageHeadConfiguration {
9092 id: headerConfig
91− foregroundColor: styledItem.fakeTheme.palette.selected.backgroundText
93+ foregroundColor: styledItem.fakeTheme.palette.normal.backgroundText
9294 }
9395
9496 property var contents: null
@@ -134,7 +136,7 @@ Item {
134136 anchors.topMargin: units.gu(2)
135137 fontSize: "large"
136138
137− color: styledItem.fakeTheme.palette.selected.backgroundText
139+ color: styledItem.fakeTheme.palette.normal.backgroundText
138140 visible: d.showIcon
139141 }
140142
qml/Stages/SpreadDelegate.qml+20
@@ -43,6 +43,7 @@ FocusScope {
4343 property int shellOrientationAngle
4444 property int shellOrientation
4545 property QtObject orientations
46+ property bool highlightShown: false
4647
4748 function matchShellOrientation() {
4849 if (!root.application)
@@ -261,6 +262,25 @@ FocusScope {
261262 Behavior on opacity { UbuntuNumberAnimation {} }
262263 }
263264
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+
264284 ApplicationWindow {
265285 id: appWindow
266286 objectName: application ? "appWindow_" + application.appId : "appWindow_null"
qml/Stages/TabletStage.qml+83−3
@@ -70,6 +70,12 @@ AbstractStage {
7070 }
7171 }
7272
73+ function pushRightEdge(amount) {
74+ if (spreadView.contentX == -spreadView.shift) {
75+ edgeBarrier.push(amount);
76+ }
77+ }
78+
7379 orientationChangesEnabled: priv.mainAppOrientationChangesEnabled
7480
7581 supportedOrientations: mainApp ? mainApp.supportedOrientations
@@ -102,6 +108,38 @@ AbstractStage {
102108 priv.oldInverseProgress = inverseProgress;
103109 }
104110
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+
105143 QtObject {
106144 id: priv
107145 objectName: "stagesPriv"
@@ -130,6 +168,8 @@ AbstractStage {
130168
131169 property int oldInverseProgress: 0
132170
171+ property int highlightIndex: 0
172+
133173 onFocusedAppIdChanged: {
134174 if (priv.focusedAppId.length > 0) {
135175 var focusedApp = ApplicationManager.findApplication(focusedAppId);
@@ -185,6 +225,10 @@ AbstractStage {
185225 }
186226 return oneWayFlick;
187227 }
228+
229+ onHighlightIndexChanged: {
230+ spreadView.contentX = highlightIndex * spreadView.contentWidth / (spreadRepeater.count + 2)
231+ }
188232 }
189233
190234 Connections {
@@ -391,11 +435,16 @@ AbstractStage {
391435 } else if (shiftedContentX < phase1Width) {
392436 snapTo(1);
393437 } else {
394− // Add 1 pixel to make sure we definitely hit positionMarker4 even with rounding errors of the animation.
395− snapAnimation.targetContentX = spreadView.width * spreadView.positionMarker4 + 1 - shift;
396− snapAnimation.start();
438+ snapToSpread();
397439 }
398440 }
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+
399448 function snapTo(index) {
400449 spreadView.selectedIndex = index;
401450 snapAnimation.targetContentX = -shift;
@@ -481,6 +530,11 @@ AbstractStage {
481530 }
482531 }
483532
533+ Behavior on contentX {
534+ enabled: root.altTabPressed
535+ UbuntuNumberAnimation {}
536+ }
537+
484538 MouseArea {
485539 id: spreadRow
486540 x: spreadView.contentX
@@ -611,6 +665,7 @@ AbstractStage {
611665 dragOffset: !isDash && model.appId == priv.mainStageAppId && root.inverseProgress > 0 && spreadView.phase === 0 ? root.inverseProgress : 0
612666 application: ApplicationManager.get(index)
613667 closeable: !isDash
668+ highlightShown: root.altTabPressed && priv.highlightIndex == zIndex
614669
615670 readonly property bool wantsMainStage: model.stage == ApplicationInfoInterface.MainStage
616671
@@ -805,4 +860,29 @@ AbstractStage {
805860 }
806861 }
807862 }
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+ }
808888}
qml/Stages/WindowResizeArea.qml+8−5
@@ -40,6 +40,7 @@ MouseArea {
4040 property int defaultHeight: units.gu(50)
4141 property int screenWidth: 0
4242 property int screenHeight: 0
43+ property int leftMargin: 0
4344
4445 QtObject {
4546 id: priv
@@ -72,10 +73,12 @@ MouseArea {
7273 var windowGeometry = windowStateStorage.getGeometry(root.windowId,
7374 Qt.rect(target.x, target.y, defaultWidth, defaultHeight));
7475
75− target.requestedWidth = Math.min(Math.max(windowGeometry.width, d.minimumWidth), screenWidth);
76− target.requestedHeight = Math.min(Math.max(windowGeometry.height, d.minimumHeight), root.screenHeight - PanelState.panelHeight);
77− target.x = Math.max(Math.min(windowGeometry.x, root.screenWidth - target.requestedWidth), 0)
78− target.y = Math.max(Math.min(windowGeometry.y, root.screenHeight - target.requestedHeight), PanelState.panelHeight)
76+ target.requestedWidth = Qt.binding(function() { return Math.min(Math.max(windowGeometry.width, d.minimumWidth), screenWidth - root.leftMargin); });
77+ target.requestedHeight = Qt.binding(function() { return Math.min(Math.max(windowGeometry.height, d.minimumHeight),
78+ root.screenHeight - (target.fullscreen ? 0 : PanelState.panelHeight)); });
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)); });
81+ target.y = Qt.binding(function() { return Math.max(Math.min(windowGeometry.y, root.screenHeight - target.requestedHeight), PanelState.panelHeight); });
7982
8083 var windowState = windowStateStorage.getState(root.windowId, WindowStateStorage.WindowStateNormal)
8184 if (windowState === WindowStateStorage.WindowStateMaximized) {
@@ -298,7 +301,7 @@ MouseArea {
298301 }
299302
300303 if (d.topBorder) {
301− var newTargetY = d.startY + deltaY;
304+ var newTargetY = Math.max(d.startY + deltaY, PanelState.panelHeight); // disallow resizing up past Panel
302305 var bottomBorderY = target.y + target.height;
303306 if (bottomBorderY > newTargetY + d.minimumHeight) {
304307 if (bottomBorderY < newTargetY + d.maximumHeight) {
qml/Wizard/StackButton.qml+1−1
@@ -32,7 +32,7 @@ AbstractButton {
3232 anchors.verticalCenter: parent.verticalCenter
3333 anchors.left: parent.left
3434 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)
3636 text: {
3737 if (backArrow) {
3838 // Translators: This is the arrow for "Back" buttons
src/CMakeLists.txt+1−1
@@ -33,7 +33,7 @@ endif()
3333
3434pkg_check_modules(ANDROID_PROPERTIES REQUIRED libandroid-properties)
3535add_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)
3737
3838if (NOT "${ANDROID_PROPERTIES_INCLUDE_DIRS}" STREQUAL "")
3939 set_target_properties(${SHELL_APP} PROPERTIES INCLUDE_DIRECTORIES ${ANDROID_PROPERTIES_INCLUDE_DIRS})
src/CachingNetworkManagerFactory.cpp+2−2
@@ -24,12 +24,12 @@
2424CachingNetworkAccessManager::CachingNetworkAccessManager(QObject *parent)
2525 : QNetworkAccessManager(parent)
2626{
27− m_networkingStatus = new ubuntu::connectivity::NetworkingStatus(this);
27+ m_networkingStatus = new connectivityqt::Connectivity(QDBusConnection::sessionBus(), this);
2828}
2929
3030QNetworkReply* CachingNetworkAccessManager::createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData)
3131{
32− if (m_networkingStatus->status() != ubuntu::connectivity::NetworkingStatus::Status::Online) {
32+ if (m_networkingStatus->status() != connectivityqt::Connectivity::Status::Online) {
3333 qDebug() << "Not connected to the internet. Request for" << request.url().toString() << "will be served only from the cache.";
3434 QNetworkRequest req(request);
3535 req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysCache);
src/CachingNetworkManagerFactory.h+3−2
@@ -21,10 +21,11 @@
2121#include <QQmlNetworkAccessManagerFactory>
2222#include <QNetworkAccessManager>
2323
24−#include <ubuntu/connectivity/networking-status.h>
24+#include <connectivityqt/connectivity.h>
2525
2626class CachingNetworkAccessManager : public QNetworkAccessManager
2727{
28+Q_OBJECT
2829public:
2930 CachingNetworkAccessManager(QObject *parent = 0);
3031
@@ -32,7 +33,7 @@ protected:
3233 QNetworkReply* createRequest(Operation op, const QNetworkRequest &req, QIODevice *outgoingData = 0) override;
3334
3435private:
35− ubuntu::connectivity::NetworkingStatus* m_networkingStatus;
36+ connectivityqt::Connectivity* m_networkingStatus;
3637};
3738
3839class CachingNetworkManagerFactory : public QQmlNetworkAccessManagerFactory
src/Dash/CMakeLists.txt+1−1
@@ -9,7 +9,7 @@ endif()
99
1010add_executable(unity8-dash ${DASH_SRCS})
1111
12−qt5_use_modules(unity8-dash Gui Qml Quick Test)
12+qt5_use_modules(unity8-dash DBus Gui Qml Quick Test)
1313
1414# For it to find libUbuntuGestures.so, needed by Ubuntu.Gestures QML module.
1515set_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):
211211 self.get_root_instance().select_single(
212212 objectName='processingIndicator').visible.wait_for(False)
213213 return preview_list.select_single(
214− Preview, objectName='preview{}'.format(
215− preview_list.initialIndex))
214+ Preview, objectName='preview')
216215
217216 @autopilot_logging.log_action(logger.debug)
218217 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):
117117 def test_open_preview(self):
118118 preview = self.generic_scope.open_preview('0', 'Title.0.0')
119119 self.assertIsInstance(preview, dash_helpers.Preview)
120− self.assertTrue(preview.isCurrent)
121120
122121 def test_open_preview_of_non_visible_item(self):
123122 """Open an item that requires swiping to make it visible."""
124123 preview = self.generic_scope.open_preview('2', 'Title.2.0')
125124 self.assertIsInstance(preview, dash_helpers.Preview)
126− self.assertTrue(preview.isCurrent)
127125
128126
129127class DashAppsHelperTestCase(tests.DashBaseTestCase):
tests/mocks/GSettings.1.0/fake_gsettings.cpp+64
@@ -22,6 +22,8 @@ GSettingsControllerQml* GSettingsControllerQml::s_controllerInstance = 0;
2222
2323GSettingsControllerQml::GSettingsControllerQml()
2424 : m_usageMode("Staged")
25+ , m_autohideLauncher(false)
26+ , m_launcherWidth(8)
2527{
2628}
2729
@@ -88,6 +90,32 @@ void GSettingsControllerQml::setLifecycleExemptAppids(const QStringList &appIds)
8890 }
8991}
9092
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+
91119GSettingsSchemaQml::GSettingsSchemaQml(QObject *parent): QObject(parent) {
92120}
93121
@@ -129,6 +157,10 @@ GSettingsQml::GSettingsQml(QObject *parent)
129157 this, &GSettingsQml::lockedOutTimeChanged);
130158 connect(GSettingsControllerQml::instance(), &GSettingsControllerQml::lifecycleExemptAppidsChanged,
131159 this, &GSettingsQml::lifecycleExemptAppidsChanged);
160+ connect(GSettingsControllerQml::instance(), &GSettingsControllerQml::autohideLauncherChanged,
161+ this, &GSettingsQml::autohideLauncherChanged);
162+ connect(GSettingsControllerQml::instance(), &GSettingsControllerQml::launcherWidthChanged,
163+ this, &GSettingsQml::launcherWidthChanged);
132164}
133165
134166GSettingsSchemaQml * GSettingsQml::schema() const {
@@ -192,9 +224,41 @@ QStringList GSettingsQml::lifecycleExemptAppids() const
192224 }
193225}
194226
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+
195245void GSettingsQml::setLifecycleExemptAppids(const QStringList &appIds)
196246{
197247 if (m_schema->id() == "com.canonical.qtmir") {
198248 GSettingsControllerQml::instance()->setLifecycleExemptAppids(appIds);
199249 }
200250}
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
5050 Q_PROPERTY(QString usageMode READ usageMode WRITE setUsageMode NOTIFY usageModeChanged)
5151 Q_PROPERTY(qint64 lockedOutTime READ lockedOutTime WRITE setLockedOutTime NOTIFY lockedOutTimeChanged)
5252 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)
5355
5456public:
5557 GSettingsQml(QObject *parent = nullptr);
@@ -59,11 +61,15 @@ public:
5961 QString usageMode() const;
6062 qint64 lockedOutTime() const;
6163 QStringList lifecycleExemptAppids() const;
64+ bool autohideLauncher() const;
65+ int launcherWidth() const;
6266
6367 void setPictureUri(const QString &str);
6468 void setUsageMode(const QString &usageMode);
6569 void setLockedOutTime(qint64 timestamp);
6670 void setLifecycleExemptAppids(const QStringList &appIds);
71+ void setAutohideLauncher(bool autohideLauncher);
72+ void setLauncherWidth(int launcherWidth);
6773
6874Q_SIGNALS:
6975 void schemaChanged();
@@ -71,6 +77,8 @@ Q_SIGNALS:
7177 void usageModeChanged(const QString&);
7278 void lockedOutTimeChanged(qint64);
7379 void lifecycleExemptAppidsChanged(const QStringList &);
80+ void autohideLauncherChanged(bool);
81+ void launcherWidthChanged(int launcherWidth);
7482
7583private:
7684 GSettingsSchemaQml* m_schema;
@@ -98,11 +106,19 @@ public:
98106 QStringList lifecycleExemptAppids() const;
99107 Q_INVOKABLE void setLifecycleExemptAppids(const QStringList &appIds);
100108
109+ bool autohideLauncher() const;
110+ Q_INVOKABLE void setAutohideLauncher(bool autohideLauncher);
111+
112+ int launcherWidth() const;
113+ Q_INVOKABLE void setLauncherWidth(int launcherWidth);
114+
101115Q_SIGNALS:
102116 void pictureUriChanged(const QString&);
103117 void usageModeChanged(const QString&);
104118 void lockedOutTimeChanged(qint64 timestamp);
105119 void lifecycleExemptAppidsChanged(const QStringList&);
120+ void autohideLauncherChanged(bool autohideLauncher);
121+ void launcherWidthChanged(int launcherWidth);
106122
107123private:
108124 GSettingsControllerQml();
@@ -111,6 +127,8 @@ private:
111127 QString m_usageMode;
112128 qint64 m_lockedOutTime;
113129 QStringList m_lifecycleExemptAppids;
130+ bool m_autohideLauncher;
131+ int m_launcherWidth;
114132
115133 static GSettingsControllerQml* s_controllerInstance;
116134 QList<GSettingsQml *> m_registeredGSettings;
tests/mocks/IntegratedLightDM/liblightdm/UsersModel.cpp−14
@@ -47,20 +47,6 @@ UsersModel::UsersModel(QObject *parent) :
4747 roles[HasMessagesRole] = "hasMessages";
4848 roles[ImagePathRole] = "imagePath";
4949 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− }
6450}
6551
6652UsersModel::~UsersModel()
tests/mocks/Unity/Application/MirSurface.cpp+6−2
@@ -17,13 +17,15 @@
1717#include "MirSurface.h"
1818
1919#include <QDebug>
20+#include <QQmlEngine>
2021
2122MirSurface::MirSurface(const QString& name,
2223 Mir::Type type,
2324 Mir::State state,
2425 const QUrl& screenshot,
25− const QUrl &qmlFilePath)
26− : unity::shell::application::MirSurfaceInterface(nullptr)
26+ const QUrl &qmlFilePath,
27+ QObject *parent)
28+ : unity::shell::application::MirSurfaceInterface(parent)
2729 , m_name(name)
2830 , m_type(type)
2931 , m_state(state)
@@ -38,6 +40,8 @@ MirSurface::MirSurface(const QString& name,
3840 , m_slowToResize(false)
3941{
4042// qDebug() << "MirSurface::MirSurface() " << name;
43+ QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
44+
4145 m_delayedResizeTimer.setInterval(600);
4246 m_delayedResizeTimer.setSingleShot(true);
4347 connect(&m_delayedResizeTimer, &QTimer::timeout, this, &MirSurface::applyDelayedResize);
tests/mocks/Unity/Application/MirSurface.h+2−1
@@ -41,7 +41,8 @@ public:
4141 Mir::Type type,
4242 Mir::State state,
4343 const QUrl& screenshot,
44− const QUrl &qmlFilePath = QUrl());
44+ const QUrl &qmlFilePath = QUrl(),
45+ QObject *parent = nullptr);
4546 virtual ~MirSurface();
4647
4748 ////
tests/mocks/Unity/Application/SurfaceManager.cpp+8−9
@@ -34,6 +34,13 @@ SurfaceManager::SurfaceManager(QObject *parent) :
3434 QObject(parent)
3535 , m_virtualKeyboard(nullptr)
3636{
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+ });
3744}
3845
3946MirSurface *SurfaceManager::createSurface(const QString& name,
@@ -58,16 +65,8 @@ MirSurface *SurfaceManager::createSurface(const QString& name,
5865 return surface;
5966}
6067
61−MirSurface *SurfaceManager::inputMethodSurface()
68+MirSurface *SurfaceManager::inputMethodSurface() const
6269{
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− }
7170 return m_virtualKeyboard;
7271}
7372
tests/mocks/Unity/Application/SurfaceManager.h+3−3
@@ -25,7 +25,7 @@
2525class SurfaceManager : public QObject
2626{
2727 Q_OBJECT
28−
28+ Q_PROPERTY(MirSurface* inputMethodSurface READ inputMethodSurface NOTIFY inputMethodSurfaceChanged)
2929 Q_PROPERTY(int newSurfaceMinimumWidth READ newSurfaceMinimumWidth WRITE setNewSurfaceMinimumWidth NOTIFY newSurfaceMinimumWidthChanged)
3030 Q_PROPERTY(int newSurfaceMaximumWidth READ newSurfaceMaximumWidth WRITE setNewSurfaceMaximumWidth NOTIFY newSurfaceMaximumWidthChanged)
3131 Q_PROPERTY(int newSurfaceMinimumHeight READ newSurfaceMinimumHeight WRITE setNewSurfaceMinimumHeight NOTIFY newSurfaceMinimumHeightChanged)
@@ -43,8 +43,7 @@ public:
4343 Mir::State state,
4444 const QUrl& screenshot);
4545
46− // To be used in the tests
47− Q_INVOKABLE MirSurface* inputMethodSurface();
46+ MirSurface* inputMethodSurface() const;
4847
4948 int newSurfaceMinimumWidth() const { return m_newSurfaceMinimumWidth; }
5049 void setNewSurfaceMinimumWidth(int value);
@@ -65,6 +64,7 @@ public:
6564 void setNewSurfaceHeightIncrement(int);
6665
6766Q_SIGNALS:
67+ void inputMethodSurfaceChanged();
6868 void countChanged();
6969 void surfaceCreated(MirSurface *surface);
7070 void surfaceDestroyed(MirSurface*surface);
tests/mocks/Unity/Application/VirtualKeyboard.cpp+3−2
@@ -22,12 +22,13 @@
2222
2323#include <QDebug>
2424
25−VirtualKeyboard::VirtualKeyboard()
25+VirtualKeyboard::VirtualKeyboard(QObject *parent)
2626 : MirSurface("input-method",
2727 Mir::InputMethodType,
2828 Mir::MinimizedState,
2929 QUrl("qrc:///Unity/Application/vkb_portrait.png"),
30− QUrl("qrc:///Unity/Application/VirtualKeyboard.qml"))
30+ QUrl("qrc:///Unity/Application/VirtualKeyboard.qml"),
31+ parent)
3132{
3233}
3334
tests/mocks/Unity/Application/VirtualKeyboard.h+1−1
@@ -25,7 +25,7 @@ class VirtualKeyboard : public MirSurface
2525{
2626 Q_OBJECT
2727public:
28− explicit VirtualKeyboard();
28+ explicit VirtualKeyboard(QObject *parent = nullptr);
2929 ~VirtualKeyboard();
3030};
3131
tests/mocks/Unity/Application/plugin.cpp+2−1
@@ -78,8 +78,9 @@ void FakeUnityApplicationQmlPlugin::registerTypes(const char *uri)
7878 qmlRegisterUncreatableType<unity::shell::application::ApplicationInfoInterface>(uri, 0, 1, "ApplicationInfoInterface", "Abstract interface. Cannot be created in QML");
7979 qmlRegisterUncreatableType<Session>(uri, 0, 1, "Session", "Session can't be instantiated from QML");
8080 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");
8183 qmlRegisterType<MirSurfaceItem>(uri, 0, 1, "MirSurfaceItem");
82−
8384 qmlRegisterType<ApplicationInfo>(uri, 0, 1, "ApplicationInfo");
8485
8586 qmlRegisterSingletonType<ApplicationManager>(uri, 0, 1, "ApplicationManager", applicationManagerSingleton);
tests/mocks/Unity/Launcher/MockLauncherModel.cpp+2
@@ -25,6 +25,7 @@ MockLauncherModel::MockLauncherModel(QObject* parent): LauncherModelInterface(pa
2525 MockLauncherItem *item = new MockLauncherItem("dialer-app", "/usr/share/applications/dialer-app.desktop", "Dialer", "dialer-app", this);
2626 item->setProgress(0);
2727 item->setPinned(true);
28+ item->setRunning(true);
2829 item->setFocused(true);
2930 m_list.append(item);
3031 item = new MockLauncherItem("camera-app", "/usr/share/applications/camera-app.desktop", "Camera", "camera", this);
@@ -34,6 +35,7 @@ MockLauncherModel::MockLauncherModel(QObject* parent): LauncherModelInterface(pa
3435 item = new MockLauncherItem("gallery-app", "/usr/share/applications/gallery-app.desktop", "Gallery", "gallery", this);
3536 item->setProgress(50);
3637 item->setCountVisible(true);
38+ item->setRunning(true);
3739 item->setAlerting(false);
3840 m_list.append(item);
3941 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
1818 ${CMAKE_SOURCE_DIR}/plugins/Utils/inputwatcher.cpp
1919 ${CMAKE_SOURCE_DIR}/plugins/Utils/applicationsfiltermodel.cpp
2020 ${CMAKE_SOURCE_DIR}/plugins/Utils/inputeventgenerator.cpp
21+ ${CMAKE_SOURCE_DIR}/plugins/Utils/deviceconfigparser.cpp
2122 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
2223 constants.cpp
2324 plugin.cpp
tests/mocks/Utils/plugin.cpp+2
@@ -37,6 +37,7 @@
3737#include <easingcurve.h>
3838#include <applicationsfiltermodel.h>
3939#include <inputeventgenerator.h>
40+#include <deviceconfigparser.h>
4041
4142static QObject *createWindowStateStorage(QQmlEngine *engine, QJSEngine *scriptEngine)
4243{
@@ -67,6 +68,7 @@ void FakeUtilsPlugin::registerTypes(const char *uri)
6768 qmlRegisterType<ActiveFocusLogger>(uri, 0, 1, "ActiveFocusLogger");
6869 qmlRegisterType<ApplicationsFilterModel>(uri, 0, 1, "ApplicationsFilterModel");
6970 qmlRegisterType<InputEventGenerator>(uri, 0, 1, "InputEventGenerator");
71+ qmlRegisterType<DeviceConfigParser>(uri, 0, 1, "DeviceConfigParser");
7072}
7173
7274void FakeUtilsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
tests/plugins/AccountsService/CMakeLists.txt+5
@@ -10,11 +10,13 @@ macro(make_dbus_class NAME INTERFACE)
1010endmacro(make_dbus_class)
1111
1212make_dbus_class(Accounts org.freedesktop.Accounts)
13+make_dbus_class(Input com.ubuntu.AccountsService.Input)
1314make_dbus_class(Properties org.freedesktop.DBus.Properties)
1415make_dbus_class(SecurityPrivacy com.ubuntu.touch.AccountsService.SecurityPrivacy)
1516make_dbus_class(Location com.ubuntu.location.providers.here.AccountsService)
1617make_dbus_class(AccountsUser org.freedesktop.Accounts.User)
1718make_dbus_class(AccountsPrivate com.canonical.unity.AccountsService.Private)
19+make_dbus_class(UscInput com.canonical.Unity.Input)
1820
1921include_directories(
2022 ${CMAKE_CURRENT_BINARY_DIR}
@@ -27,12 +29,15 @@ add_executable(mock-server
2729 ${CMAKE_CURRENT_BINARY_DIR}/AccountsAdaptor.cpp
2830 ${CMAKE_CURRENT_BINARY_DIR}/AccountsPrivateAdaptor.cpp
2931 ${CMAKE_CURRENT_BINARY_DIR}/AccountsUserAdaptor.cpp
32+ ${CMAKE_CURRENT_BINARY_DIR}/InputAdaptor.cpp
3033 ${CMAKE_CURRENT_BINARY_DIR}/PropertiesAdaptor.cpp
3134 ${CMAKE_CURRENT_BINARY_DIR}/LocationAdaptor.cpp
3235 ${CMAKE_CURRENT_BINARY_DIR}/SecurityPrivacyAdaptor.cpp
36+ ${CMAKE_CURRENT_BINARY_DIR}/UscInputAdaptor.cpp
3337 server.cpp
3438 AccountsServer.cpp
3539 PropertiesServer.cpp
40+ UscServer.cpp
3641 )
3742qt5_use_modules(mock-server Core DBus)
3843
tests/plugins/AccountsService/PropertiesServer.cpp+16−4
@@ -32,9 +32,9 @@ PropertiesServer::PropertiesServer(QObject *parent)
3232 Reset();
3333}
3434
35−QDBusVariant PropertiesServer::Get(const QString &interface, const QString &property)
35+QDBusVariant PropertiesServer::Get(const QString &interface, const QString &property) const
3636{
37− if (m_properties[interface].contains(property)) {
37+ if (m_properties.contains(interface) && m_properties[interface].contains(property)) {
3838 return QDBusVariant(m_properties[interface][property]);
3939 } else {
4040 sendErrorReply(QDBusError::InvalidArgs, "Bad interface or property");
@@ -42,6 +42,16 @@ QDBusVariant PropertiesServer::Get(const QString &interface, const QString &prop
4242 }
4343}
4444
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+
4555void PropertiesServer::Set(const QString &interface, const QString &property, const QDBusVariant &variant)
4656{
4757 QVariant newValue = variant.variant();
@@ -57,8 +67,8 @@ void PropertiesServer::Set(const QString &interface, const QString &property, co
5767
5868 oldValue = newValue;
5969
60− // Special case for Background file.
61− if (interface == "org.freedesktop.Accounts.User" && property == "BackgroundFile") {
70+ // Special case for user properties.
71+ if (interface == "org.freedesktop.Accounts.User") {
6272 Q_EMIT Changed();
6373 } else {
6474 QVariantMap propertyChanges;
@@ -82,10 +92,12 @@ void PropertiesServer::Reset()
8292 m_properties["com.canonical.unity.AccountsService"]["LauncherItems"] = QVariant::fromValue(QList<QVariantMap>());
8393 m_properties["com.canonical.unity.AccountsService.Private"]["FailedLogins"] = 0;
8494 m_properties["com.ubuntu.touch.AccountsService.SecurityPrivacy"]["StatsWelcomeScreen"] = true;
95+ m_properties["com.ubuntu.AccountsService.Input"]["MousePrimaryButton"] = "right";
8596 m_properties["com.ubuntu.AccountsService.SecurityPrivacy"]["EnableLauncherWhileLocked"] = true;
8697 m_properties["com.ubuntu.AccountsService.SecurityPrivacy"]["EnableIndicatorsWhileLocked"] = true;
8798 m_properties["com.ubuntu.AccountsService.SecurityPrivacy"]["PasswordDisplayHint"] = AccountsService::Keyboard;
8899 m_properties["com.ubuntu.location.providers.here.AccountsService"]["LicenseAccepted"] = false;
89100 m_properties["com.ubuntu.location.providers.here.AccountsService"]["LicenseBasePath"] = "";
90101 m_properties["org.freedesktop.Accounts.User"]["BackgroundFile"] = "";
102+ m_properties["org.freedesktop.Accounts.User"]["RealName"] = "";
91103}
tests/plugins/AccountsService/PropertiesServer.h+2−1
@@ -34,7 +34,8 @@ public:
3434 explicit PropertiesServer(QObject *parent = 0);
3535
3636public 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;
3839 void Set(const QString &interface, const QString &property, const QDBusVariant &variant);
3940
4041 // 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:
4242 : QObject(parent)
4343 , m_userInterface(nullptr)
4444 , m_spy(this, &AccountsServiceTest::propertiesChanged)
45+ , m_mousePrimaryButtonSpy(this, &AccountsServiceTest::setMousePrimaryButtonCalled)
4546 {
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)));
4655 }
4756
4857private Q_SLOTS:
@@ -71,6 +80,7 @@ private Q_SLOTS:
7180
7281 delete m_userInterface;
7382 m_spy.clear();
83+ m_mousePrimaryButtonSpy.clear();
7484 }
7585
7686 void testInvalids()
@@ -107,7 +117,7 @@ private Q_SLOTS:
107117 QCOMPARE(session.hereEnabled(), true);
108118 }
109119
110− void testAsynchornousChangeForDemoEdges()
120+ void testAsynchronousChangeForDemoEdges()
111121 {
112122 AccountsService session(this, QTest::currentTestFunction());
113123
@@ -119,7 +129,7 @@ private Q_SLOTS:
119129 QTRY_COMPARE(session.demoEdges(), true);
120130 }
121131
122− void testAsynchornousChangeForFailedLogins()
132+ void testAsynchronousChangeForFailedLogins()
123133 {
124134 AccountsService session(this, QTest::currentTestFunction());
125135
@@ -131,7 +141,7 @@ private Q_SLOTS:
131141 QTRY_COMPARE(session.failedLogins(), (uint)5);
132142 }
133143
134− void testAsynchornousChangeForStatsWelcomeScreen()
144+ void testAsynchronousChangeForStatsWelcomeScreen()
135145 {
136146 AccountsService session(this, QTest::currentTestFunction());
137147
@@ -143,7 +153,7 @@ private Q_SLOTS:
143153 QTRY_COMPARE(session.statsWelcomeScreen(), false);
144154 }
145155
146− void testAsynchornousChangeForStatsEnableLauncherWhileLocked()
156+ void testAsynchronousChangeForEnableLauncherWhileLocked()
147157 {
148158 AccountsService session(this, QTest::currentTestFunction());
149159
@@ -155,7 +165,7 @@ private Q_SLOTS:
155165 QTRY_COMPARE(session.enableLauncherWhileLocked(), false);
156166 }
157167
158− void testAsynchornousChangeForStatsEnableIndicatorsWhileLocked()
168+ void testAsynchronousChangeForEnableIndicatorsWhileLocked()
159169 {
160170 AccountsService session(this, QTest::currentTestFunction());
161171
@@ -167,7 +177,7 @@ private Q_SLOTS:
167177 QTRY_COMPARE(session.enableIndicatorsWhileLocked(), false);
168178 }
169179
170− void testAsynchornousChangeForStatsPasswordDisplayHint()
180+ void testAsynchronousChangeForPasswordDisplayHint()
171181 {
172182 AccountsService session(this, QTest::currentTestFunction());
173183
@@ -179,7 +189,7 @@ private Q_SLOTS:
179189 QTRY_COMPARE(session.passwordDisplayHint(), AccountsService::Numeric);
180190 }
181191
182− void testAsynchornousChangeForStatsLicenseAccepted()
192+ void testAsynchronousChangeForLicenseAccepted()
183193 {
184194 AccountsService session(this, QTest::currentTestFunction());
185195
@@ -191,7 +201,7 @@ private Q_SLOTS:
191201 QTRY_COMPARE(session.hereEnabled(), true);
192202 }
193203
194− void testAsynchornousChangeForLicenseBasePath()
204+ void testAsynchronousChangeForLicenseBasePath()
195205 {
196206 AccountsService session(this, QTest::currentTestFunction());
197207
@@ -203,7 +213,7 @@ private Q_SLOTS:
203213 QTRY_COMPARE(session.hereLicensePath(), QString("/"));
204214 }
205215
206− void testAsynchornousChangeForStatsBackgroundFile()
216+ void testAsynchronousChangeForBackgroundFile()
207217 {
208218 AccountsService session(this, QTest::currentTestFunction());
209219
@@ -215,12 +225,56 @@ private Q_SLOTS:
215225 QTRY_COMPARE(session.backgroundFile(), QString("/test/BackgroundFile"));
216226 }
217227
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+
218269Q_SIGNALS:
219270 void propertiesChanged(const QString &interface, const QVariantMap &changed, const QStringList &invalid);
271+ void setMousePrimaryButtonCalled(int button);
220272
221273private:
274+ QDBusInterface* m_uscInputInterface;
222275 QDBusInterface* m_userInterface;
223276 QSignalSpy m_spy;
277+ QSignalSpy m_mousePrimaryButtonSpy;
224278};
225279
226280QTEST_MAIN(AccountsServiceTest)
tests/plugins/AccountsService/interfaces.xml+16
@@ -5,6 +5,11 @@
55 <arg name="property" type="s" direction="in" />
66 <arg name="value" type="v" direction="out" />
77 </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>
813 <method name="Set">
914 <arg name="interface" type="s" direction="in" />
1015 <arg name="property" type="s" direction="in" />
@@ -32,10 +37,21 @@
3237 <arg name="success" type="b" direction="out" />
3338 </method>
3439 </interface>
40+ <interface name="com.ubuntu.AccountsService.Input" />
3541 <interface name="com.ubuntu.touch.AccountsService.SecurityPrivacy" />
3642 <interface name="com.ubuntu.location.providers.here.AccountsService" />
3743 <interface name="org.freedesktop.Accounts.User">
3844 <signal name="Changed" />
3945 </interface>
4046 <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>
4157</node>
tests/plugins/AccountsService/server.cpp+12
@@ -19,10 +19,13 @@
1919
2020#include "AccountsAdaptor.h"
2121#include "AccountsServer.h"
22+#include "InputAdaptor.h"
2223#include "PropertiesServer.h"
2324#include "SecurityPrivacyAdaptor.h"
2425#include "LocationAdaptor.h"
2526#include "AccountsPrivateAdaptor.h"
27+#include "UscInputAdaptor.h"
28+#include "UscServer.h"
2629#include <QCoreApplication>
2730
2831int main(int argc, char *argv[])
@@ -31,11 +34,20 @@ int main(int argc, char *argv[])
3134
3235 auto accounts = new AccountsServer(&a);
3336 new AccountsAdaptor(accounts);
37+ new InputAdaptor(accounts);
3438 new SecurityPrivacyAdaptor(accounts);
3539 new LocationAdaptor(accounts);
3640 new AccountsPrivateAdaptor(accounts);
41+
42+ auto usc = new UscServer(&a);
43+ new UscInputAdaptor(usc);
44+
3745 // We use the session bus for testing. The real plugin uses the system bus
3846 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;
3951 if (!connection.registerObject("/org/freedesktop/Accounts", accounts))
4052 return 1;
4153 if (!connection.registerService("org.freedesktop.Accounts"))
tests/plugins/Dash/cardcreator/1.res+4−6
@@ -5,12 +5,10 @@ AbstractButton {
55 property string backgroundShapeStyle: "inset";
66 property real fontScale: 1.0;
77 property var scopeStyle: null;
8− property int titleAlignment: Text.AlignLeft;
98 property int fixedHeaderHeight: -1;
109 property size fixedArtShapeSize: Qt.size(-1, -1);
1110 readonly property string title: cardData && cardData["title"] || "";
12− property bool asynchronous: true;
13− property bool showHeader: true;
11+ property bool showHeader: true;
1412 implicitWidth: childrenRect.width;
1513 enabled: true;
1614
@@ -25,7 +23,7 @@ Item {
2523 objectName: "artShapeLoader";
2624 readonly property string cardArt: cardData && cardData["art"] || "";
2725 active: cardArt != "";
28− asynchronous: root.asynchronous;
26+ asynchronous: true;
2927 visible: status == Loader.Ready;
3028 sourceComponent: Item {
3129 id: artShape;
@@ -82,7 +80,7 @@ Item {
8280 id: artImage;
8381 objectName: "artImage";
8482 source: artShapeLoader.cardArt;
85− asynchronous: root.asynchronous;
83+ asynchronous: true;
8684 width: root.width;
8785 height: width / artShape.aspect;
8886 }
@@ -108,7 +106,7 @@ Label {
108106 width: undefined;
109107 text: root.title;
110108 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
111− horizontalAlignment: root.titleAlignment;
109+ horizontalAlignment: Text.AlignHCenter;
112110 }
113111UbuntuShape {
114112 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 {
55 property string backgroundShapeStyle: "inset";
66 property real fontScale: 1.0;
77 property var scopeStyle: null;
8− property int titleAlignment: Text.AlignLeft;
98 property int fixedHeaderHeight: -1;
109 property size fixedArtShapeSize: Qt.size(-1, -1);
1110 readonly property string title: cardData && cardData["title"] || "";
12− property bool asynchronous: true;
1311 property bool showHeader: true;
1412 implicitWidth: childrenRect.width;
1513 enabled: true;
@@ -18,7 +16,7 @@ Loader {
1816 id: backgroundLoader;
1917 objectName: "backgroundLoader";
2018 anchors.fill: parent;
21− asynchronous: root.asynchronous;
19+ asynchronous: true;
2220 visible: status == Loader.Ready;
2321 sourceComponent: UbuntuShape {
2422 objectName: "background";
@@ -59,7 +57,7 @@ Row {
5957 objectName: "outerRow";
6058 property real margins: units.gu(1);
6159 spacing: margins;
62− height: root.fixedHeaderHeight != -1 ? root.fixedHeaderHeight : implicitHeight;
60+ height: root.fixedHeaderHeight;
6361 anchors { top: parent.top;
6462 topMargin: units.gu(1);
6563left: parent.left;
@@ -103,7 +101,7 @@ left: parent.left;
103101 width: undefined;
104102 text: root.title;
105103 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
106− horizontalAlignment: root.titleAlignment;
104+ horizontalAlignment: Text.AlignLeft;
107105 }
108106,Label {
109107 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 {
55 property string backgroundShapeStyle: "inset";
66 property real fontScale: 1.0;
77 property var scopeStyle: null;
8− property int titleAlignment: Text.AlignLeft;
98 property int fixedHeaderHeight: -1;
109 property size fixedArtShapeSize: Qt.size(-1, -1);
1110 readonly property string title: cardData && cardData["title"] || "";
12− property bool asynchronous: true;
1311 property bool showHeader: true;
1412 implicitWidth: childrenRect.width;
1513 enabled: true;
@@ -18,7 +16,7 @@ Loader {
1816 id: backgroundLoader;
1917 objectName: "backgroundLoader";
2018 anchors.fill: parent;
21− asynchronous: root.asynchronous;
19+ asynchronous: true;
2220 visible: status == Loader.Ready;
2321 sourceComponent: UbuntuShape {
2422 objectName: "background";
@@ -63,7 +61,7 @@ Item {
6361 objectName: "artShapeLoader";
6462 readonly property string cardArt: cardData && cardData["art"] || decodeURI("%5C");
6563 active: cardArt != "";
66− asynchronous: root.asynchronous;
64+ asynchronous: true;
6765 visible: status == Loader.Ready;
6866 sourceComponent: Item {
6967 id: artShape;
@@ -120,7 +118,7 @@ Item {
120118 id: artImage;
121119 objectName: "artImage";
122120 source: artShapeLoader.cardArt;
123− asynchronous: root.asynchronous;
121+ asynchronous: true;
124122 width: root.width;
125123 height: width / artShape.aspect;
126124 onStatusChanged: if (status === Image.Error) source = decodeURI("%5C");
@@ -134,7 +132,7 @@ Row {
134132 objectName: "outerRow";
135133 property real margins: units.gu(1);
136134 spacing: margins;
137− height: root.fixedHeaderHeight != -1 ? root.fixedHeaderHeight : implicitHeight;
135+ height: root.fixedHeaderHeight;
138136 anchors { top: artShapeHolder.bottom;
139137 topMargin: units.gu(1);
140138left: parent.left;
@@ -178,7 +176,7 @@ left: parent.left;
178176 width: undefined;
179177 text: root.title;
180178 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
181− horizontalAlignment: root.titleAlignment;
179+ horizontalAlignment: Text.AlignLeft;
182180 }
183181,Label {
184182 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 {
55 property string backgroundShapeStyle: "inset";
66 property real fontScale: 1.0;
77 property var scopeStyle: null;
8− property int titleAlignment: Text.AlignLeft;
98 property int fixedHeaderHeight: -1;
109 property size fixedArtShapeSize: Qt.size(-1, -1);
1110 readonly property string title: cardData && cardData["title"] || "";
12− property bool asynchronous: true;
1311 property bool showHeader: true;
1412 implicitWidth: childrenRect.width;
1513 enabled: true;
@@ -18,7 +16,7 @@ Loader {
1816 id: backgroundLoader;
1917 objectName: "backgroundLoader";
2018 anchors.fill: parent;
21− asynchronous: root.asynchronous;
19+ asynchronous: true;
2220 visible: status == Loader.Ready;
2321 sourceComponent: UbuntuShape {
2422 objectName: "background";
@@ -59,7 +57,7 @@ Row {
5957 objectName: "outerRow";
6058 property real margins: units.gu(1);
6159 spacing: margins;
62− height: root.fixedHeaderHeight != -1 ? root.fixedHeaderHeight : implicitHeight;
60+ height: root.fixedHeaderHeight;
6361 anchors { top: parent.top;
6462 topMargin: units.gu(1);
6563 left: parent.left;
@@ -102,7 +100,7 @@ CroppedImageMinimumSourceSize {
102100 width: undefined;
103101 text: root.title;
104102 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
105− horizontalAlignment: root.titleAlignment;
103+ horizontalAlignment: Text.AlignLeft;
106104 }
107105 ,Label {
108106 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 {
55 property string backgroundShapeStyle: "inset";
66 property real fontScale: 1.0;
77 property var scopeStyle: null;
8− property int titleAlignment: Text.AlignLeft;
98 property int fixedHeaderHeight: -1;
109 property size fixedArtShapeSize: Qt.size(-1, -1);
1110 readonly property string title: cardData && cardData["title"] || "";
12− property bool asynchronous: true;
1311 property bool showHeader: true;
1412 implicitWidth: childrenRect.width;
1513 enabled: true;
@@ -25,7 +23,7 @@ Item {
2523 objectName: "artShapeLoader";
2624 readonly property string cardArt: cardData && cardData["art"] || decodeURI("IHAVE%5C%22ESCAPED%5C%22QUOTES%5C%22");
2725 active: cardArt != "";
28− asynchronous: root.asynchronous;
26+ asynchronous: true;
2927 visible: status == Loader.Ready;
3028 sourceComponent: Item {
3129 id: artShape;
@@ -82,7 +80,7 @@ Item {
8280 id: artImage;
8381 objectName: "artImage";
8482 source: artShapeLoader.cardArt;
85− asynchronous: root.asynchronous;
83+ asynchronous: true;
8684 width: root.width;
8785 height: width / artShape.aspect;
8886 onStatusChanged: if (status === Image.Error) source = decodeURI("IHAVE%5C%22ESCAPED%5C%22QUOTES%5C%22");
@@ -109,7 +107,7 @@ Label {
109107 width: undefined;
110108 text: root.title;
111109 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
112− horizontalAlignment: root.titleAlignment;
110+ horizontalAlignment: Text.AlignLeft;
113111 }
114112Label {
115113 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 {
55 property string backgroundShapeStyle: "inset";
66 property real fontScale: 1.0;
77 property var scopeStyle: null;
8− property int titleAlignment: Text.AlignLeft;
98 property int fixedHeaderHeight: -1;
109 property size fixedArtShapeSize: Qt.size(-1, -1);
1110 readonly property string title: cardData && cardData["title"] || "";
12− property bool asynchronous: true;
1311 property bool showHeader: true;
1412 implicitWidth: childrenRect.width;
1513 enabled: true;
@@ -21,7 +19,7 @@ Row {
2119 objectName: "outerRow";
2220 property real margins: units.gu(1);
2321 spacing: margins;
24− height: root.fixedHeaderHeight != -1 ? root.fixedHeaderHeight : implicitHeight;
22+ height: root.fixedHeaderHeight;
2523 anchors { top: parent.top;
2624 topMargin: units.gu(1);
2725 left: parent.left;
@@ -33,7 +31,7 @@ data: [
3331Loader {
3432 id: mascotShapeLoader;
3533 objectName: "mascotShapeLoader";
36− asynchronous: root.asynchronous;
34+ asynchronous: true;
3735 active: mascotImage.status === Image.Ready;
3836 visible: showHeader && active && status == Loader.Ready;
3937 width: units.gu(6);
@@ -77,7 +75,7 @@ Label {
7775 width: undefined;
7876 text: root.title;
7977 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
80− horizontalAlignment: root.titleAlignment;
78+ horizontalAlignment: Text.AlignLeft;
8179 }
8280,Label {
8381 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 {
55 property string backgroundShapeStyle: "inset";
66 property real fontScale: 1.0;
77 property var scopeStyle: null;
8− property int titleAlignment: Text.AlignLeft;
98 property int fixedHeaderHeight: -1;
109 property size fixedArtShapeSize: Qt.size(-1, -1);
1110 readonly property string title: cardData && cardData["title"] || "";
12− property bool asynchronous: true;
1311 property bool showHeader: true;
1412 implicitWidth: childrenRect.width;
1513 enabled: false;
@@ -25,7 +23,7 @@ Item {
2523 objectName: "artShapeLoader";
2624 readonly property string cardArt: cardData && cardData["art"] || "";
2725 active: cardArt != "";
28− asynchronous: root.asynchronous;
26+ asynchronous: true;
2927 visible: status == Loader.Ready;
3028 sourceComponent: Item {
3129 id: artShape;
@@ -82,7 +80,7 @@ Item {
8280 id: artImage;
8381 objectName: "artImage";
8482 source: artShapeLoader.cardArt;
85− asynchronous: root.asynchronous;
83+ asynchronous: true;
8684 width: root.width;
8785 height: width / artShape.aspect;
8886 }
@@ -91,10 +89,10 @@ Item {
9189 }
9290Loader {
9391 id: overlayLoader;
94− readonly property real overlayHeight: (fixedHeaderHeight > 0 ? fixedHeaderHeight : headerHeight) + units.gu(2);
92+ readonly property real overlayHeight: root.fixedHeaderHeight + units.gu(2);
9593 anchors.fill: artShapeHolder;
9694 active: artShapeLoader.active && artShapeLoader.item && artShapeLoader.item.image.status === Image.Ready || false;
97− asynchronous: root.asynchronous;
95+ asynchronous: true;
9896 visible: showHeader && status == Loader.Ready;
9997 sourceComponent: UbuntuShapeOverlay {
10098 id: overlay;
@@ -126,7 +124,7 @@ Label {
126124 width: undefined;
127125 text: root.title;
128126 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
129− horizontalAlignment: root.titleAlignment;
127+ horizontalAlignment: Text.AlignLeft;
130128 }
131129Label {
132130 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 {
55 property string backgroundShapeStyle: "inset";
66 property real fontScale: 1.0;
77 property var scopeStyle: null;
8− property int titleAlignment: Text.AlignLeft;
98 property int fixedHeaderHeight: -1;
109 property size fixedArtShapeSize: Qt.size(-1, -1);
1110 readonly property string title: cardData && cardData["title"] || "";
12− property bool asynchronous: true;
1311 property bool showHeader: true;
1412 implicitWidth: childrenRect.width;
1513 enabled: true;
@@ -18,7 +16,7 @@ Loader {
1816 id: backgroundLoader;
1917 objectName: "backgroundLoader";
2018 anchors.fill: parent;
21− asynchronous: root.asynchronous;
19+ asynchronous: true;
2220 visible: status == Loader.Ready;
2321 sourceComponent: UbuntuShape {
2422 objectName: "background";
@@ -81,7 +79,7 @@ Item {
8179 width: undefined;
8280 text: root.title;
8381 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
84− horizontalAlignment: root.titleAlignment;
82+ horizontalAlignment: Text.AlignLeft;
8583 }
8684,Label {
8785 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 {
55 property string backgroundShapeStyle: "inset";
66 property real fontScale: 1.0;
77 property var scopeStyle: null;
8− property int titleAlignment: Text.AlignLeft;
98 property int fixedHeaderHeight: -1;
109 property size fixedArtShapeSize: Qt.size(-1, -1);
1110 readonly property string title: cardData && cardData["title"] || "";
12− property bool asynchronous: true;
1311 property bool showHeader: true;
1412 implicitWidth: childrenRect.width;
1513 enabled: true;
@@ -18,7 +16,7 @@ Loader {
1816 id: backgroundLoader;
1917 objectName: "backgroundLoader";
2018 anchors.fill: parent;
21− asynchronous: root.asynchronous;
19+ asynchronous: true;
2220 visible: status == Loader.Ready;
2321 sourceComponent: UbuntuShape {
2422 objectName: "background";
@@ -59,7 +57,7 @@ Row {
5957 objectName: "outerRow";
6058 property real margins: units.gu(1);
6159 spacing: margins;
62− height: root.fixedHeaderHeight != -1 ? root.fixedHeaderHeight : implicitHeight;
60+ height: root.fixedHeaderHeight;
6361 anchors { top: parent.top;
6462 topMargin: units.gu(1);
6563 left: parent.left;
@@ -103,7 +101,7 @@ CroppedImageMinimumSourceSize {
103101 width: undefined;
104102 text: root.title;
105103 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
106− horizontalAlignment: root.titleAlignment;
104+ horizontalAlignment: Text.AlignLeft;
107105 }
108106,Label {
109107 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 {
55 property string backgroundShapeStyle: "inset";
66 property real fontScale: 1.0;
77 property var scopeStyle: null;
8− property int titleAlignment: Text.AlignLeft;
98 property int fixedHeaderHeight: -1;
109 property size fixedArtShapeSize: Qt.size(-1, -1);
1110 readonly property string title: cardData && cardData["title"] || "";
12− property bool asynchronous: true;
1311 property bool showHeader: true;
1412 implicitWidth: childrenRect.width;
1513 enabled: true;
@@ -18,7 +16,7 @@ Loader {
1816 id: backgroundLoader;
1917 objectName: "backgroundLoader";
2018 anchors.fill: parent;
21− asynchronous: root.asynchronous;
19+ asynchronous: true;
2220 visible: status == Loader.Ready;
2321 sourceComponent: UbuntuShape {
2422 objectName: "background";
@@ -59,7 +57,7 @@ Row {
5957 objectName: "outerRow";
6058 property real margins: units.gu(1);
6159 spacing: margins;
62− height: root.fixedHeaderHeight != -1 ? root.fixedHeaderHeight : implicitHeight;
60+ height: root.fixedHeaderHeight;
6361 anchors { top: parent.top;
6462 topMargin: units.gu(1);
6563left: parent.left;
@@ -94,7 +92,7 @@ left: parent.left;
9492 width: parent.width - x;
9593 text: root.title;
9694 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
97− horizontalAlignment: root.titleAlignment;
95+ horizontalAlignment: Text.AlignLeft;
9896 }
9997
10098 ]
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 {
55 property string backgroundShapeStyle: "inset";
66 property real fontScale: 1.0;
77 property var scopeStyle: null;
8− property int titleAlignment: Text.AlignLeft;
98 property int fixedHeaderHeight: -1;
109 property size fixedArtShapeSize: Qt.size(-1, -1);
1110 readonly property string title: cardData && cardData["title"] || "";
12− property bool asynchronous: true;
1311 property bool showHeader: true;
1412 implicitWidth: childrenRect.width;
1513 enabled: true;
@@ -36,7 +34,7 @@ top: parent.top;
3634 width: undefined;
3735 text: root.title;
3836 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
39− horizontalAlignment: root.titleAlignment;
37+ horizontalAlignment: Text.AlignLeft;
4038 }
4139Label {
4240 id: subtitleLabel;
@@ -72,7 +70,7 @@ CardAudioProgress {
7270 id: audioButton;
7371 anchors.fill: undefined;
7472 width: height;
75− height: (root.fixedHeaderHeight > 0 ? root.fixedHeaderHeight : headerHeight) + 2 * units.gu(1);
73+ height: root.fixedHeaderHeight + 2 * units.gu(1);
7674 readonly property url source: (cardData["quickPreviewData"] && cardData["quickPreviewData"]["uri"]) || "";
7775 UbuntuShape {
7876 anchors.fill: parent;
@@ -93,7 +91,8 @@ CardAudioProgress {
9391 opacity: 0.9;
9492 name: DashAudioPlayer.playing && AudioUrlComparer.compare(parent.source, DashAudioPlayer.currentSource) ? "media-playback-pause" : "media-playback-start";
9593 color: "white";
96− }
94+ asynchronous: true;
95+ }
9796 onClicked: {
9897 if (AudioUrlComparer.compare(source, DashAudioPlayer.currentSource)) {
9998 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:
4545 delete view;
4646 }
4747
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+
4872 void testKnownCases()
4973 {
5074 const QString templateString("template: ");
@@ -68,33 +92,19 @@ private Q_SLOTS:
6892 const QString templateJSON = lines[0].mid(templateString.length());
6993 const QString componentsJSON = lines[1].mid(componentsString.length());
7094 const QString resultFileName = lines[2].mid(resultString.length());
71−
7295 QVariant cardStringResult;
73− QMetaObject::invokeMethod(view->rootObject(), "cardString", Q_RETURN_ARG(QVariant, cardStringResult), Q_ARG(QVariant, templateJSON), Q_ARG(QVariant, componentsJSON));
74−
75− QFile testResultFile(testDirPath + resultFileName);
76− QVERIFY(testResultFile.open(QIODevice::ReadOnly));
77− QTextStream ts2(&testResultFile);
96+ QVariant createCardComponentResult;
7897
79− // Record failed results to /tmp
80− const QString executedResult = cardStringResult.toString();
81− QTemporaryFile tmpFile(QDir::tempPath() + QDir::separator() + "testCardCreatorFailedResultXXXXXX");
82− tmpFile.open();
83− tmpFile.setAutoRemove(false);
84− tmpFile.write(executedResult.toUtf8().constData());
98+ QMetaObject::invokeMethod(view->rootObject(), "cardString", Q_RETURN_ARG(QVariant, cardStringResult), Q_ARG(QVariant, templateJSON), Q_ARG(QVariant, componentsJSON), Q_ARG(QVariant, false));
99+ compareFileContents(testDirPath + resultFileName, cardStringResult.toString());
85100
86− // Line by line comparison
87− const QStringList expectedLines = ts2.readAll().trimmed().replace(QRegExp("\n\\s*\n"),"\n").split("\n");
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− }
101+ QMetaObject::invokeMethod(view->rootObject(), "cardString", Q_RETURN_ARG(QVariant, cardStringResult), Q_ARG(QVariant, templateJSON), Q_ARG(QVariant, componentsJSON), Q_ARG(QVariant, true));
102+ compareFileContents(testDirPath + resultFileName + ".cardcreator", cardStringResult.toString());
92103
93− // Remove the result if it passed
94− tmpFile.setAutoRemove(true);
104+ QMetaObject::invokeMethod(view->rootObject(), "createCardComponent", Q_RETURN_ARG(QVariant, createCardComponentResult), Q_ARG(QVariant, templateJSON), Q_ARG(QVariant, componentsJSON), Q_ARG(QVariant, false));
105+ QVERIFY(createCardComponentResult.toBool());
95106
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));
98108 QVERIFY(createCardComponentResult.toBool());
99109 }
100110 }
tests/plugins/Dash/cardcreatortest.qml+4−4
@@ -19,11 +19,11 @@ import "../../../plugins/Dash/CardCreator.js" as CardCreator
1919
2020Item {
2121 id: root
22− function cardString(template, components) {
23− return CardCreator.cardString(JSON.parse(template), JSON.parse(components));
22+ function cardString(template, components, isCardCreator) {
23+ return CardCreator.cardString(JSON.parse(template), JSON.parse(components), isCardCreator);
2424 }
2525
26− function createCardComponent(template, components) {
27− return CardCreator.createCardComponent(root, JSON.parse(template), JSON.parse(components)) !== null;
26+ function createCardComponent(template, components, isCardCreator) {
27+ return CardCreator.createCardComponent(root, JSON.parse(template), JSON.parse(components), isCardCreator) !== null;
2828 }
2929}
tests/plugins/IntegratedLightDM/CMakeLists.txt+25
@@ -65,3 +65,28 @@ add_unity8_uitest(GreeterUsers GreeterUsersModelTestExec
6565 DEPENDS MockLightDM
6666 LIGHTDM
6767 )
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(
44 ${CMAKE_CURRENT_BINARY_DIR}
55 )
66
7+add_definitions(-DCONFIG_TESTING)
8+
79foreach(util_test
810 QLimitProxyModel
911 UnitySortFilterProxyModel
1012 WindowInputMonitor
13+ DeviceConfigParser
1114)
1215 add_executable(${util_test}TestExec ${util_test}Test.cpp ModelTest.cpp)
1316 qt5_use_modules(${util_test}TestExec Test Core Qml)
1417 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+
1622endforeach()
1723
1824# 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)
55add_unity8_qmltest(. DisabledScreenNotice)
66add_unity8_qmltest(. Shell LIGHTDM)
77add_unity8_qmltest(. ShellWithPin LIGHTDM)
8+add_unity8_qmltest(. DeviceConfiguration)
89add_unity8_qmltest(Components Background)
910add_unity8_qmltest(Components Carousel)
1011add_unity8_qmltest(Components Dialogs LIGHTDM)
tests/qmltests/Components/tst_Lockscreen.qml+14−7
@@ -235,11 +235,14 @@ Rectangle {
235235
236236 function test_unlock_data() {
237237 return [
238− {tag: "numeric", alphanumeric: false, password: "1234", minPinLength: 4, maxPinLength: 4},
239− {tag: "alphanumeric", alphanumeric: true, password: "password", minPinLength: -1, maxPinLength: -1},
240− {tag: "numeric (wrong)", alphanumeric: false, password: "4321", minPinLength: 4, maxPinLength: 4},
241− {tag: "alphanumeric (wrong)", alphanumeric: true, password: "drowssap", minPinLength: -1, maxPinLength: -1},
242− {tag: "flexible length", alphanumeric: false, password: "1234", minPinLength: -1, maxPinLength: -1},
238+ {tag: "numeric", alphanumeric: false, password: "1234", minPinLength: 4, maxPinLength: 4, keyboard: false},
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, keyboard: false},
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, 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}
243246 ]
244247 }
245248
@@ -259,8 +262,12 @@ Rectangle {
259262 } else {
260263 for (var i = 0; i < data.password.length; ++i) {
261264 var character = data.password.charAt(i)
262− var button = findChild(lockscreen, "pinPadButton" + character)
263− mouseClick(button, units.gu(1), units.gu(1))
265+ if (data.keyboard) {
266+ typeString(character)
267+ } else {
268+ var button = findChild(lockscreen, "pinPadButton" + character)
269+ mouseClick(button, units.gu(1), units.gu(1))
270+ }
264271 }
265272 var confirmButton = findChild(lockscreen, "confirmButton");
266273 mouseClick(confirmButton, units.gu(1), units.gu(1));
tests/qmltests/Dash/Previews/tst_PreviewHeader.qml+18−1
@@ -38,6 +38,14 @@ Rectangle {
3838 "attributes": [{"value":"text1","icon":"image://theme/ok"},{"value":"text2","icon":"image://theme/cancel"}]
3939 }
4040
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+
4149 property var brokenheaderjson: {
4250 "title": "THE TITLE",
4351 "subtitle": "Something catchy",
@@ -64,7 +72,7 @@ Rectangle {
6472
6573 PreviewHeader {
6674 id: previewHeader
67− widgetData: headerjson
75+ widgetData: emblemheaderjson
6876 width: units.gu(30)
6977
7078 Rectangle {
@@ -136,6 +144,15 @@ Rectangle {
136144 }
137145 }
138146
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+
139156 function test_json() {
140157 headerjson = origHeaderjson;
141158 previewHeader.widgetData = headerjson;
tests/qmltests/Dash/Previews/tst_PreviewSharing.qml+17−3
@@ -28,13 +28,18 @@ Rectangle {
2828
2929 property var shareData: {
3030 "uri": [
31− "Text here",
32− "text here 2",
33− "text here 3"
31+ "file:///this/is/an/url",
32+ "file:///this/is/an/url/2",
33+ "file:///this/is/an/url/3"
3434 ],
3535 "content-type": "text"
3636 }
3737
38+ property var shareDataString: {
39+ "uri": "file:///this/is/an/url",
40+ "content-type": "text"
41+ }
42+
3843 PreviewSharing {
3944 id: previewSharing
4045 anchors { left: parent.left; bottom: parent.bottom; }
@@ -55,5 +60,14 @@ Rectangle {
5560 mouseClick(previewSharing);
5661 compare(peerPicker.visible, true);
5762 }
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+ }
5872 }
5973}
tests/qmltests/Dash/tst_CardTool.qml+4−4
@@ -339,22 +339,22 @@ Rectangle {
339339 function test_card_title_alignment(data) {
340340 selector.selectedIndex = data.index;
341341
342− tryCompare(cardTool, "titleAlignment", Text.AlignLeft);
342+ tryCompareFunction(function() { return findChild(internalCard, "titleLabel").horizontalAlignment == Text.AlignLeft; }, true);
343343
344344 cardTool.components['title'] = { "field": "title", "align": "center" };
345345 cardTool.componentsChanged();
346346
347− tryCompare(cardTool, "titleAlignment", data.value);
347+ tryCompareFunction(function() { return findChild(internalCard, "titleLabel").horizontalAlignment == data.value; }, true);
348348
349349 cardTool.components['title'] = { "field": "title" };
350350 cardTool.componentsChanged();
351351
352− tryCompare(cardTool, "titleAlignment", data.value);
352+ tryCompareFunction(function() { return findChild(internalCard, "titleLabel").horizontalAlignment == data.value; }, true);
353353
354354 cardTool.components['title'] = { "field": "title", "align": "left" };
355355 cardTool.componentsChanged();
356356
357− tryCompare(cardTool, "titleAlignment", Text.AlignLeft);
357+ tryCompareFunction(function() { return findChild(internalCard, "titleLabel").horizontalAlignment == Text.AlignLeft; }, true);
358358 }
359359
360360 function test_categoryLayout_data() {
tests/qmltests/Dash/tst_Dash.qml+89
@@ -70,6 +70,42 @@ Item {
7070 waitForRendering(findChild(dash, "scopeLoader0").item);
7171 }
7272
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+
73109 function test_manage_dash_clickscope_unfavoritable() {
74110 // Show the manage dash
75111 touchFlick(dash, dash.width / 2, dash.height - 1, dash.width / 2, units.gu(2));
@@ -565,5 +601,58 @@ Item {
565601 tryCompare(dashTempScopeItem, "x", dashTempScopeItem.width);
566602 tryCompare(dashTempScopeItem, "visible", false);
567603 }
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+ }
568657 }
569658}
tests/qmltests/Greeter/tst_NarrowView.qml+9
@@ -518,5 +518,14 @@ Item {
518518 tryCompare(coverPage, "shown", false);
519519 tryCompare(coverPage, "showProgress", 0);
520520 }
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+ }
521530 }
522531}
tests/qmltests/Launcher/tst_Launcher.qml+254−18
@@ -28,12 +28,13 @@ import Utils 0.1 // For EdgeBarrierSettings
2828 launcher. */
2929Item {
3030 id: root
31− width: units.gu(50)
32− height: units.gu(55)
31+ width: units.gu(140)
32+ height: units.gu(70)
3333
3434 Loader {
3535 id: launcherLoader
3636 anchors.fill: parent
37+ focus: true
3738 property bool itemDestroyed: false
3839 sourceComponent: Component {
3940 Launcher {
@@ -68,6 +69,7 @@ Item {
6869
6970 Component.onCompleted: {
7071 launcherLoader.itemDestroyed = false;
72+ launcherLoader.focus = true
7173 edgeBarrierControls.target = testCase.findChild(this, "edgeBarrierController");
7274 }
7375 Component.onDestruction: {
@@ -77,11 +79,40 @@ Item {
7779 }
7880 }
7981
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+
8093 ColumnLayout {
8194 anchors { bottom: parent.bottom; right: parent.right; margins: units.gu(1) }
8295 spacing: units.gu(1)
8396 width: childrenRect.width
8497
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+
85116 MouseTouchEmulationCheckbox {}
86117
87118 EdgeBarrierControls {
@@ -102,6 +133,15 @@ Item {
102133 Layout.fillWidth: true
103134 }
104135
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+
105145 Row {
106146 spacing: units.gu(1)
107147
@@ -206,10 +246,6 @@ Item {
206246 // growing while populating it with icons etc.
207247 tryCompare(listView, "flicking", false);
208248
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−
213249 compare(listView.contentY, -listView.topMargin, "Launcher did not start up with first item unfolded");
214250
215251 // Now do check that snapping is in fact enabled
@@ -266,13 +302,39 @@ Item {
266302
267303 function positionLauncherListAtBeginning() {
268304 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);
270311 }
271312 function positionLauncherListAtEnd() {
272313 var listView = testCase.findChild(launcherLoader.item, "launcherListView");
273− if ((listView.contentHeight + listView.topMargin + listView.bottomMargin) > listView.height) {
274− listView.contentY = listView.topMargin + listView.contentHeight
275− - listView.height;
314+ var moveAnimation = findInvisibleChild(listView, "moveAnimation")
315+
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+ }
276338 }
277339 }
278340
@@ -290,10 +352,10 @@ Item {
290352 dragLauncherIntoView()
291353
292354 // 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)
294356
295357 // should eventually get fully retracted (hidden)
296− tryCompare(panel, "x", -launcher.panelWidth, 1000)
358+ tryCompare(panel, "x", -launcher.panelWidth, 2000)
297359 }
298360
299361 /* If I click on the icon of an application on the launcher
@@ -377,6 +439,7 @@ Item {
377439 wait(100)
378440 compare(launcher.maxPanelX, -launcher.panelWidth, "Launcher moved even if it shouldn't")
379441 }
442+
380443 waitUntilLauncherDisappears();
381444 launcher.available = true;
382445 }
@@ -400,6 +463,8 @@ Item {
400463 dragLauncherIntoView();
401464 var launcherListView = findChild(launcher, "launcherListView");
402465 for (var i = 0; i < launcherListView.count; ++i) {
466+ launcherListView.moveToIndex(i);
467+ waitForRendering(launcherListView);
403468 var delegate = findChild(launcherListView, "launcherDelegate" + i)
404469 compare(findChild(delegate, "countEmblem").visible, LauncherModel.get(i).countVisible)
405470 // Intentionally allow type coercion (string/number)
@@ -421,7 +486,7 @@ Item {
421486 var launcherListView = findChild(launcher, "launcherListView");
422487 for (var i = 0; i < launcherListView.count; ++i) {
423488 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)
425490 }
426491 }
427492
@@ -460,6 +525,7 @@ Item {
460525 launcher.lastSelectedApplication = "";
461526 dragLauncherIntoView();
462527 var listView = findChild(launcher, "launcherListView");
528+ var moveAnimation = findInvisibleChild(listView, "moveAnimation")
463529
464530 // flicking is unreliable. sometimes it works, sometimes the
465531 // list view moves just a tiny bit or not at all, making tests fail.
@@ -470,12 +536,14 @@ Item {
470536 } else {
471537 positionLauncherListAtEnd();
472538 }
473− tryCompare(listView, "flicking", false);
474−
475539 var oldY = listView.contentY;
476540
477541 mouseClick(listView, listView.width / 2, data.clickY);
478− tryCompare(listView, "flicking", false);
542+
543+ if (data.expectFlick) {
544+ tryCompare(moveAnimation, "running", true);
545+ }
546+ tryCompare(moveAnimation, "running", false);
479547
480548 if (data.expectFlick) {
481549 verify(listView.contentY != oldY);
@@ -764,14 +832,15 @@ Item {
764832 function test_launcher_dismiss() {
765833 dragLauncherIntoView();
766834 verify(launcher.state == "visible");
767− mouseClick(root);
835+
836+ mouseClick(root, root.width / 2, units.gu(1));
768837 waitUntilLauncherDisappears();
769838 verify(launcher.state == "");
770839
771840 // and repeat, as a test for regression in lpbug#1531339
772841 dragLauncherIntoView();
773842 verify(launcher.state == "visible");
774− mouseClick(root);
843+ mouseClick(root, root.width / 2, units.gu(1));
775844 waitUntilLauncherDisappears();
776845 verify(launcher.state == "");
777846 }
@@ -1044,5 +1113,172 @@ Item {
10441113 LauncherModel.setCountVisible(LauncherModel.get(1).appId, 0)
10451114 LauncherModel.setCount(LauncherModel.get(1).appId, oldCount)
10461115 }
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+ }
10471283 }
10481284}
tests/qmltests/Notifications/tst_OptionToggle.qml+1−1
@@ -225,7 +225,7 @@ Row {
225225 }
226226
227227 // test input does not fall through
228− mouseClick(notification)
228+ mouseClick(notification, units.gu(2), units.gu(2))
229229 if(data.type == Notification.Interactive) {
230230 actionSpy.wait()
231231 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 {
226226
227227 // remove top-most and verify one of the remaining ones is still getting expanded
228228
229+ waitForRendering(notifications);
229230 // make first snap-decision expand
230231 mouseClick(snap_decision[0]);
231232
tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+2−4
@@ -274,15 +274,14 @@ Item {
274274
275275 function test_create_progressMenu_data() {
276276 return [
277− {label: "testLabel1", enabled: true, value: 10 },
278− {label: "testLabel2", enabled: false, value: 55 },
277+ {label: "testLabel1", value: 10 },
278+ {label: "testLabel2", value: 55 },
279279 ];
280280 }
281281
282282 function test_create_progressMenu(data) {
283283 menuData.type = "com.canonical.indicator.progress"
284284 menuData.label = data.label;
285− menuData.sensitive = data.enabled;
286285 menuData.actionState = data.value;
287286
288287 loader.data = menuData;
@@ -292,7 +291,6 @@ Item {
292291
293292 compare(loader.item.text, data.label, "Label does not match data");
294293 compare(loader.item.value, data.value, "Value does not match data");
295− compare(loader.item.enabled, data.enabled, "Enabled does not match data");
296294 }
297295
298296 function test_create_standardMenu_data() {
tests/qmltests/Panel/tst_IndicatorItem.qml+16−14
@@ -24,7 +24,9 @@ import "../../../qml/Panel"
2424Rectangle {
2525 width: units.gu(80)
2626 height: units.gu(30)
27− color: "white"
27+ color: theme.palette.normal.background
28+
29+ Component.onCompleted: theme.name = "Ubuntu.Components.Themes.SuruDark"
2830
2931 RowLayout {
3032 anchors.fill: parent
@@ -37,7 +39,7 @@ Rectangle {
3739 Layout.fillHeight: true
3840
3941 Rectangle {
40− color: "black"
42+ color: theme.palette.normal.background
4143 anchors.fill: indicatorItem
4244 }
4345
@@ -181,25 +183,25 @@ Rectangle {
181183 }
182184
183185 function test_select() {
184− tryCompare(findChild(indicatorItem, "icon0"), "color", "#ffffff");
186+ tryCompare(findChild(indicatorItem, "icon0"), "color", theme.palette.normal.backgroundText);
185187 tryCompare(findChild(indicatorItem, "icon0"), "opacity", 1.0);
186− tryCompare(findChild(indicatorItem, "leftLabel"), "color", "#ffffff");
187− tryCompare(findChild(indicatorItem, "rightLabel"), "color", "#ffffff");
188− tryCompare(findChild(indicatorItem, "indicatorName"), "color", "#ffffff");
188+ tryCompare(findChild(indicatorItem, "leftLabel"), "color", theme.palette.normal.backgroundText);
189+ tryCompare(findChild(indicatorItem, "rightLabel"), "color", theme.palette.normal.backgroundText);
190+ tryCompare(findChild(indicatorItem, "indicatorName"), "color", theme.palette.normal.backgroundText);
189191
190192 indicatorItem.expanded = true;
191− tryCompare(findChild(indicatorItem, "icon0"), "color", "#888888");
193+ tryCompare(findChild(indicatorItem, "icon0"), "color", theme.palette.disabled.backgroundText);
192194 tryCompare(findChild(indicatorItem, "icon0"), "opacity", 0.6);
193− tryCompare(findChild(indicatorItem, "leftLabel"), "color", "#888888");
194− tryCompare(findChild(indicatorItem, "rightLabel"), "color", "#888888");
195− tryCompare(findChild(indicatorItem, "indicatorName"), "color", "#888888");
195+ tryCompare(findChild(indicatorItem, "leftLabel"), "color", theme.palette.disabled.backgroundText);
196+ tryCompare(findChild(indicatorItem, "rightLabel"), "color", theme.palette.disabled.backgroundText);
197+ tryCompare(findChild(indicatorItem, "indicatorName"), "color", theme.palette.disabled.backgroundText);
196198
197199 indicatorItem.selected = true;
198− tryCompare(findChild(indicatorItem, "icon0"), "color", "#ffffff");
200+ tryCompare(findChild(indicatorItem, "icon0"), "color", theme.palette.normal.backgroundText);
199201 tryCompare(findChild(indicatorItem, "icon0"), "opacity", 1.0);
200− tryCompare(findChild(indicatorItem, "leftLabel"), "color", "#ffffff");
201− tryCompare(findChild(indicatorItem, "rightLabel"), "color", "#ffffff");
202− tryCompare(findChild(indicatorItem, "indicatorName"), "color", "#ffffff");
202+ tryCompare(findChild(indicatorItem, "leftLabel"), "color", theme.palette.normal.backgroundText);
203+ tryCompare(findChild(indicatorItem, "rightLabel"), "color", theme.palette.normal.backgroundText);
204+ tryCompare(findChild(indicatorItem, "indicatorName"), "color", theme.palette.normal.backgroundText);
203205 }
204206 }
205207}
tests/qmltests/Panel/tst_Panel.qml+2
@@ -31,6 +31,8 @@ IndicatorTest {
3131 height: units.gu(71)
3232 color: "white"
3333
34+ Component.onCompleted: theme.name = "Ubuntu.Components.Themes.SuruDark"
35+
3436 Binding {
3537 target: mouseEmulation
3638 property: "checked"
tests/qmltests/Stages/tst_DesktopStage.qml+2−1
@@ -65,8 +65,9 @@ Item {
6565 property bool itemDestroyed: false
6666 sourceComponent: Component {
6767 DesktopStage {
68− color: "darkblue"
68+ color: "white"
6969 anchors.fill: parent
70+ background: "../../../qml/graphics/tablet_background.jpg"
7071
7172 Component.onCompleted: {
7273 edgeBarrierControls.target = testCase.findChild(this, "edgeBarrierController");
tests/qmltests/Stages/tst_PhoneStage.qml+19−6
@@ -40,12 +40,6 @@ Item {
4040 orientations: Orientations {}
4141 }
4242
43− Binding {
44− target: ApplicationManager
45− property: "rightMargin"
46− value: phoneStage.anchors.rightMargin
47− }
48−
4943 Rectangle {
5044 anchors { fill: parent; leftMargin: phoneStage.width }
5145
@@ -77,6 +71,15 @@ Item {
7771 ApplicationManager.get(appList.selectedAppIndex).setState(ApplicationInfoInterface.Stopped);
7872 }
7973 }
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+ }
8083 }
8184 ListView {
8285 id: appList
@@ -463,5 +466,15 @@ Item {
463466
464467 tryCompare(delegate.application, "requestedState", ApplicationInfoInterface.RequestedRunning);
465468 }
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+ }
466479 }
467480}
tests/qmltests/Stages/tst_SpreadDelegate.qml+7
@@ -308,5 +308,12 @@ Rectangle {
308308 tryCompare(closeAnimation, "running", false);
309309 }
310310
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+ }
311318 }
312319}
tests/qmltests/Stages/tst_TabletStage.qml+19−1
@@ -21,6 +21,7 @@ import Ubuntu.Components.ListItems 1.3 as ListItem
2121import Unity.Application 0.1
2222import Unity.Test 0.1
2323
24+import ".."
2425import "../../../qml/Stages"
2526import "../../../qml/Components"
2627
@@ -77,6 +78,15 @@ Rectangle {
7778 Column {
7879 anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
7980 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+ }
8090 ApplicationCheckBox {
8191 id: webbrowserCheckBox
8292 appId: "webbrowser-app"
@@ -365,6 +375,14 @@ Rectangle {
365375 tryCompare(webbrowserApp, "requestedState", ApplicationInfoInterface.RequestedRunning);
366376 tryCompare(dialerApp, "requestedState", ApplicationInfoInterface.RequestedRunning);
367377 }
368− }
369378
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+ }
370388}
tests/qmltests/Wizard/tst_Wizard.qml+1−1
@@ -96,7 +96,7 @@ Item {
9696 }
9797
9898 Component.onCompleted: {
99− theme.name = "Ubuntu.Components.Themes.SuruGradient";
99+ theme.name = "Ubuntu.Components.Themes.SuruDark";
100100 setup();
101101 }
102102
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 @@
1515 */
1616
1717import QtQuick 2.4
18+import QtQuick.Layouts 1.1
1819import QtTest 1.0
1920import Unity.Test 0.1
21+import Ubuntu.Components 1.3
22+import Ubuntu.Components.ListItems 1.3
2023import "../../qml"
2124
2225Item {
2326 id: root
24− width: units.gu(40)
27+ width: units.gu(80)
2528 height: units.gu(70)
2629
2730 DisabledScreenNotice {
2831 id: touchScreenPad
2932 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+ }
3074 }
3175
3276 UnityTestCase {
@@ -36,10 +80,40 @@ Item {
3680
3781 function test_mouseAreaHidesOnFirstTap() {
3882 var noticeArea = findChild(touchScreenPad, "infoNoticeArea")
39− print("noticeArea", noticeArea.visible)
4083 compare(noticeArea.visible, true)
4184 tap(root)
4285 tryCompare(noticeArea, "visible", false)
4386 }
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+ }
44118 }
45119}
tests/qmltests/tst_OrientedShell.qml+71−5
@@ -47,6 +47,10 @@ Rectangle {
4747 QtObject {
4848 id: mockUnity8Settings
4949 property string usageMode: usageModeSelector.model[usageModeSelector.selectedIndex]
50+ onUsageModeChanged: {
51+print("usage mode changed", usageMode);
52+ usageModeSelector.selectedIndex = usageModeSelector.model.indexOf(usageMode)
53+ }
5054 }
5155
5256 QtObject{
@@ -295,6 +299,10 @@ Rectangle {
295299 function selectStaged() {selectedIndex = 0;}
296300 function selectWindowed() {selectedIndex = 1;}
297301 function selectAutomatic() {selectedIndex = 2;}
302+ onSelectedIndexChanged: {
303+ print("usageModeSelector index changed", selectedIndex)
304+ mockUnity8Settings.usageMode = usageModeSelector.model[usageModeSelector.selectedIndex]
305+ }
298306 }
299307 MouseTouchEmulationCheckbox {
300308 checked: true
@@ -314,7 +322,7 @@ Rectangle {
314322 checked: false
315323 activeFocusOnPress: false
316324 onCheckedChanged: {
317− var surface = SurfaceManager.inputMethodSurface();
325+ var surface = SurfaceManager.inputMethodSurface;
318326 if (checked) {
319327 surface.setState(Mir.RestoredState);
320328 } else {
@@ -1011,7 +1019,7 @@ Rectangle {
10111019 { tag: "big screen, mouse", screenWidth: units.gu(200), mouse: true, kbd: false, expectedMode: "desktop", oskExpected: true },
10121020 { tag: "small screen, kbd", screenWidth: units.gu(50), mouse: false, kbd: true, expectedMode: "phone", oskExpected: false },
10131021 { 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 },
10151023 { tag: "small screen, mouse & kbd", screenWidth: units.gu(50), mouse: true, kbd: true, expectedMode: "phone", oskExpected: false },
10161024 { tag: "medium screen, mouse & kbd", screenWidth: units.gu(100), mouse: true, kbd: true, expectedMode: "desktop", oskExpected: false },
10171025 { tag: "big screen, mouse & kbd", screenWidth: units.gu(200), mouse: true, kbd: true, expectedMode: "desktop", oskExpected: false },
@@ -1019,9 +1027,6 @@ Rectangle {
10191027 }
10201028
10211029 function test_attachRemoveInputDevices(data) {
1022− usageModeSelector.selectAutomatic();
1023− tryCompare(mockUnity8Settings, "usageMode", "Automatic")
1024−
10251030 loadShell("mako")
10261031 var shell = findChild(orientedShell, "shell");
10271032 var inputMethod = findChild(shell, "inputMethod");
@@ -1055,6 +1060,67 @@ Rectangle {
10551060 orientedShellLoader.width = oldWidth;
10561061 }
10571062
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+
10581124 /*
10591125 Regression test for https://bugs.launchpad.net/ubuntu/+source/unity8/+bug/1471609
10601126
tests/qmltests/tst_Shell.qml+241−59
@@ -26,6 +26,7 @@ import Unity.Application 0.1
2626import Unity.Connectivity 0.1
2727import Unity.Indicators 0.1
2828import Unity.Notifications 1.0
29+import Unity.Launcher 0.1
2930import Unity.Test 0.1
3031import Powerd 0.1
3132import Wizard 0.1 as Wizard
@@ -49,11 +50,6 @@ Rectangle {
4950 shellLoader.active = true;
5051 }
5152
52− MouseArea {
53− id: clickThroughCatcher
54− anchors.fill: shellContainer
55− }
56−
5753 Item {
5854 id: shellContainer
5955 anchors.left: root.left
@@ -121,10 +117,6 @@ Rectangle {
121117 Component.onDestruction: {
122118 shellLoader.itemDestroyed = true;
123119 }
124− Component.onCompleted: {
125− var keyMapper = testCase.findChild(__shell, "physicalKeysMapper");
126− keyMapper.controlInsteadOfAlt = true;
127− }
128120 }
129121 }
130122 }
@@ -213,6 +205,31 @@ Rectangle {
213205 checked: true
214206 color: "white"
215207 }
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+ }
216233
217234 Label { text: "Applications"; font.bold: true }
218235
@@ -296,12 +313,6 @@ Rectangle {
296313 signalName: "applicationRemoved"
297314 }
298315
299− SignalSpy {
300− id: clickThroughSpy
301− target: clickThroughCatcher
302− signalName: "clicked"
303− }
304−
305316 Telephony.CallEntry {
306317 id: phoneCall
307318 phoneNumber: "+447812221111"
@@ -670,6 +681,7 @@ Rectangle {
670681 function swipeAwayGreeter() {
671682 var greeter = findChild(shell, "greeter");
672683 tryCompare(greeter, "fullyShown", true);
684+ waitForGreeterToStabilize();
673685 removeTimeConstraintsFromDirectionalDragAreas(greeter);
674686
675687 var touchX = shell.width - (shell.edgeSize / 2);
@@ -773,7 +785,7 @@ Rectangle {
773785 loadShell("phone");
774786 swipeAwayGreeter();
775787 var item = findChild(shell, "inputMethod");
776− var surface = SurfaceManager.inputMethodSurface();
788+ var surface = SurfaceManager.inputMethodSurface;
777789
778790 surface.setState(Mir.MinimizedState);
779791 tryCompare(item, "visible", false);
@@ -844,7 +856,6 @@ Rectangle {
844856 function test_launchedAppHasActiveFocus(data) {
845857 loadShell(data.formFactor);
846858 shell.usageScenario = data.usageScenario;
847− waitForGreeterToStabilize();
848859 swipeAwayGreeter();
849860
850861 var webApp = ApplicationManager.startApplication("webbrowser-app");
@@ -912,6 +923,7 @@ Rectangle {
912923 function dragLauncherIntoView() {
913924 var launcher = findChild(shell, "launcher");
914925 var launcherPanel = findChild(launcher, "launcherPanel");
926+ waitForRendering(launcher);
915927 verify(launcherPanel.x = - launcherPanel.width);
916928
917929 var touchStartX = 2;
@@ -1424,9 +1436,17 @@ Rectangle {
14241436 tryCompare(galleryApp, "requestedState", ApplicationInfoInterface.RequestedRunning);
14251437 }
14261438
1427− function test_altTabSwitchesFocus() {
1428− loadShell("desktop");
1429− shell.usageScenario = "desktop"
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+
1447+ function test_altTabSwitchesFocus(data) {
1448+ loadShell(data.shellType);
1449+ shell.usageScenario = data.shellType;
14301450 waitForRendering(root)
14311451
14321452 var desktopStage = findChild(shell, "stage");
@@ -1441,21 +1461,13 @@ Rectangle {
14411461
14421462 // Do a quick alt-tab and see if focus changes
14431463 tryCompare(app3.session.lastSurface, "activeFocus", true)
1444− keyClick(Qt.Key_Tab, Qt.ControlModifier)
1464+ keyClick(Qt.Key_Tab, Qt.AltModifier)
14451465 tryCompare(app2.session.lastSurface, "activeFocus", true)
14461466
1447− var desktopSpread = findChild(shell, "spread")
1448−
1449− tryCompare(desktopSpread, "state", "")
1450−
1451− // Just press Alt, make sure the spread comes up
1452− keyPress(Qt.Key_Control);
1467+ // Press Alt+Tab
1468+ keyPress(Qt.Key_Alt);
14531469 keyClick(Qt.Key_Tab);
1454− tryCompare(desktopSpread, "state", "altTab")
1455−
1456− // Release control, check if spread disappears
1457− keyRelease(Qt.Key_Control)
1458− tryCompare(desktopSpread, "state", "")
1470+ keyRelease(Qt.Key_Alt)
14591471
14601472 // Focus should have switched back now
14611473 tryCompare(app3.session.lastSurface, "activeFocus", true)
@@ -1482,7 +1494,7 @@ Rectangle {
14821494 tryCompare(desktopSpread, "state", "")
14831495
14841496 // Just press Alt, make sure the spread comes up
1485− keyPress(Qt.Key_Control);
1497+ keyPress(Qt.Key_Alt);
14861498 keyClick(Qt.Key_Tab);
14871499 tryCompare(desktopSpread, "state", "altTab")
14881500 tryCompare(spreadRepeater, "highlightedIndex", 1)
@@ -1503,7 +1515,7 @@ Rectangle {
15031515 tryCompare(spreadRepeater, "highlightedIndex", 0)
15041516
15051517 // Release control, check if spread disappears
1506− keyRelease(Qt.Key_Control)
1518+ keyRelease(Qt.Key_Alt)
15071519 tryCompare(desktopSpread, "state", "")
15081520
15091521 // Make sure that after wrapping around once, we have the same one focused as at the beginning
@@ -1516,7 +1528,7 @@ Rectangle {
15161528 var spreadRepeater = findInvisibleChild(shell, "spreadRepeater");
15171529 verify(spreadRepeater !== null);
15181530
1519− keyPress(Qt.Key_Control)
1531+ keyPress(Qt.Key_Alt)
15201532 keyClick(Qt.Key_Tab);
15211533 tryCompare(spreadRepeater, "highlightedIndex", 1);
15221534
@@ -1538,7 +1550,7 @@ Rectangle {
15381550 keyClick(Qt.Key_Backtab);
15391551 tryCompare(spreadRepeater, "highlightedIndex", 1);
15401552
1541− keyRelease(Qt.Key_Control);
1553+ keyRelease(Qt.Key_Alt);
15421554 }
15431555
15441556 function test_highlightFollowsMouse() {
@@ -1547,7 +1559,7 @@ Rectangle {
15471559 var spreadRepeater = findInvisibleChild(shell, "spreadRepeater");
15481560 verify(spreadRepeater !== null);
15491561
1550− keyPress(Qt.Key_Control)
1562+ keyPress(Qt.Key_Alt)
15511563 keyClick(Qt.Key_Tab);
15521564
15531565 tryCompare(spreadRepeater, "highlightedIndex", 1);
@@ -1566,7 +1578,7 @@ Rectangle {
15661578
15671579 verify(y < 4000);
15681580
1569− keyRelease(Qt.Key_Control);
1581+ keyRelease(Qt.Key_Alt);
15701582 }
15711583
15721584 function test_closeFromSpread() {
@@ -1575,7 +1587,7 @@ Rectangle {
15751587 var spreadRepeater = findInvisibleChild(shell, "spreadRepeater");
15761588 verify(spreadRepeater !== null);
15771589
1578− keyPress(Qt.Key_Control)
1590+ keyPress(Qt.Key_Alt)
15791591 keyClick(Qt.Key_Tab);
15801592
15811593 appRemovedSpy.clear();
@@ -1602,7 +1614,7 @@ Rectangle {
16021614 tryCompare(appRemovedSpy, "count", 1)
16031615 compare(appRemovedSpy.signalArguments[0][0], closedAppId);
16041616
1605− keyRelease(Qt.Key_Control);
1617+ keyRelease(Qt.Key_Alt);
16061618 }
16071619
16081620 function test_selectFromSpreadWithMouse_data() {
@@ -1622,7 +1634,7 @@ Rectangle {
16221634 var spreadRepeater = findInvisibleChild(shell, "spreadRepeater");
16231635 verify(spreadRepeater !== null);
16241636
1625− keyPress(Qt.Key_Control)
1637+ keyPress(Qt.Key_Alt)
16261638 keyClick(Qt.Key_Tab);
16271639
16281640 var focusAppId = ApplicationManager.get(2).appId;
@@ -1649,7 +1661,7 @@ Rectangle {
16491661 tryCompare(stage, "state", "");
16501662 tryCompare(ApplicationManager, "focusedApplicationId", focusAppId);
16511663
1652− keyRelease(Qt.Key_Control);
1664+ keyRelease(Qt.Key_Alt);
16531665 }
16541666
16551667 function test_progressiveAutoScrolling() {
@@ -1658,7 +1670,7 @@ Rectangle {
16581670 var appRepeater = findInvisibleChild(shell, "appRepeater");
16591671 verify(appRepeater !== null);
16601672
1661− keyPress(Qt.Key_Control)
1673+ keyPress(Qt.Key_Alt)
16621674 keyClick(Qt.Key_Tab);
16631675
16641676 var spreadFlickable = findChild(shell, "spreadFlickable")
@@ -1669,7 +1681,7 @@ Rectangle {
16691681 var x = 0;
16701682 var y = shell.height * .5
16711683 mouseMove(shell, x, y)
1672− while (x <= spreadFlickable.width) {
1684+ while (x <= shell.width) {
16731685 x+=10;
16741686 mouseMove(shell, x, y)
16751687 wait(0); // spin the loop so bindings get evaluated
@@ -1684,7 +1696,7 @@ Rectangle {
16841696 }
16851697 tryCompare(spreadFlickable, "contentX", 0);
16861698
1687− keyRelease(Qt.Key_Control);
1699+ keyRelease(Qt.Key_Alt);
16881700 }
16891701
16901702 // This makes sure the hoverMouseArea is set to invisible AND disabled
@@ -1696,13 +1708,13 @@ Rectangle {
16961708 tryCompare(hoverMouseArea, "enabled", false)
16971709 tryCompare(hoverMouseArea, "visible", false)
16981710
1699− keyPress(Qt.Key_Control)
1711+ keyPress(Qt.Key_Alt)
17001712 keyClick(Qt.Key_Tab);
17011713
17021714 tryCompare(hoverMouseArea, "enabled", true)
17031715 tryCompare(hoverMouseArea, "visible", true)
17041716
1705− keyRelease(Qt.Key_Control)
1717+ keyRelease(Qt.Key_Alt)
17061718
17071719 tryCompare(hoverMouseArea, "enabled", false)
17081720 tryCompare(hoverMouseArea, "visible", false)
@@ -1719,7 +1731,7 @@ Rectangle {
17191731 var appRepeater = findInvisibleChild(shell, "appRepeater");
17201732 verify(appRepeater !== null);
17211733
1722− keyPress(Qt.Key_Control)
1734+ keyPress(Qt.Key_Alt)
17231735 keyClick(Qt.Key_Tab);
17241736
17251737 tryCompare(spreadRepeater, "highlightedIndex", 1);
@@ -1740,33 +1752,46 @@ Rectangle {
17401752
17411753 verify(y < 4000);
17421754
1743− keyRelease(Qt.Key_Control);
1755+ keyRelease(Qt.Key_Alt);
17441756 }
17451757
1746− function test_focusAppFromLauncherExitsSpread() {
1747− loadDesktopShellWithApps()
1758+ function test_focusAppFromLauncherExitsSpread_data() {
1759+ return [
1760+ {tag: "autohide launcher", launcherLocked: false },
1761+ {tag: "locked launcher", launcherLocked: true }
1762+ ]
1763+ }
17481764
1749− var desktopSpread = findChild(shell, "spread");
1765+ function test_focusAppFromLauncherExitsSpread(data) {
1766+ loadDesktopShellWithApps()
17501767 var launcher = findChild(shell, "launcher");
1768+ var desktopSpread = findChild(shell, "spread");
17511769 var bfb = findChild(launcher, "buttonShowDashHome");
17521770
1753− keyPress(Qt.Key_Control)
1771+ GSettingsController.setAutohideLauncher(!data.launcherLocked);
1772+ waitForRendering(shell);
1773+
1774+ keyPress(Qt.Key_Alt)
17541775 keyClick(Qt.Key_Tab);
17551776
17561777 tryCompare(desktopSpread, "state", "altTab")
17571778
1758− revealLauncherByEdgePushWithMouse();
1759− tryCompare(launcher, "x", 0);
1760− mouseMove(bfb, bfb.width / 2, bfb.height / 2)
1761− waitForRendering(shell)
1779+ if (!data.launcherLocked) {
1780+ revealLauncherByEdgePushWithMouse();
1781+ tryCompare(launcher, "x", 0);
1782+ mouseMove(bfb, bfb.width / 2, bfb.height / 2)
1783+ waitForRendering(shell)
1784+ }
17621785
17631786 mouseClick(bfb, bfb.width / 2, bfb.height / 2)
1764− tryCompare(launcher, "state", "")
1787+ if (!data.launcherLocked) {
1788+ tryCompare(launcher, "state", "")
1789+ }
17651790 tryCompare(desktopSpread, "state", "")
17661791
17671792 tryCompare(ApplicationManager, "focusedApplicationId", "unity8-dash")
17681793
1769− keyRelease(Qt.Key_Control);
1794+ keyRelease(Qt.Key_Alt);
17701795 }
17711796
17721797 // regression test for http://pad.lv/1443319
@@ -1854,6 +1879,31 @@ Rectangle {
18541879 compare(appDelegate.y >= PanelState.panelHeight, true);
18551880 }
18561881
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+
18571907 function test_restoreWindowStateFixesIfUnderPanel() {
18581908 loadDesktopShellWithApps();
18591909 var appRepeater = findChild(shell, "appRepeater")
@@ -1989,6 +2039,138 @@ Rectangle {
19892039 }
19902040 }
19912041
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+
19922174 function test_inputEventsOnEdgesEndUpInAppSurface_data() {
19932175 return [
19942176 { tag: "phone", repeaterName: "spreadRepeater" },