on xenial help sign in
merge
commit2a02f6d94cd959ece2a664723aa43fefdd7f290c authorMichael Zanetti <michael.zanetti@canonical.com> dateTue 13 May 2014, 12:43 (12 years ago) parent3d564494ab3b3b
195 files changed+3298−2910
CMakeLists.txt+5−5 CODING+11−15 build → build.sh+1−2 cmake/modules/QmlTest.cmake+16−3 data/CMakeLists.txt+1−2 data/unity-scope-tool.desktop.in−8 data/unity8.conf+10−1 debian/changelog+209−3 debian/control+41−33 debian/rules+1−2 debian/unity-scope-tool.install−1 debian/unity8-autopilot.install+1 debian/unity8-common.install+5 debian/unity8-fake-env.install+1−1 debian/unity8-private.install+1−1 debian/unity8.install+1−7 plugins/DashViews/abstractdashview.cpp−34 plugins/DashViews/abstractdashview.h−17 plugins/DashViews/horizontaljournal.cpp−12 plugins/DashViews/horizontaljournal.h−4 plugins/DashViews/listviewwithpageheader.cpp−50 plugins/DashViews/listviewwithpageheader.h−20 plugins/DashViews/organicgrid.cpp−8 plugins/DashViews/organicgrid.h−4 plugins/DashViews/verticaljournal.cpp−8 plugins/DashViews/verticaljournal.h−4 plugins/Unity/Indicators/CMakeLists.txt−3 plugins/Unity/Indicators/indicatorsmanager.cpp−33 plugins/Unity/Indicators/indicatorsmanager.h−2 plugins/Unity/Indicators/qml/MenuItemFactory.qml+1−1 plugins/Unity/Launcher/backend/launcherbackend.cpp+265−15 plugins/Unity/Launcher/backend/launcherbackend.h+52−4 plugins/Utils/CMakeLists.txt−1 plugins/Utils/bottombarvisibilitycommunicatorshell.cpp−49 plugins/Utils/bottombarvisibilitycommunicatorshell.h−59 plugins/Utils/plugin.cpp−10 po/am.po+9−13 po/ar.po+9−27 po/ast.po+9−5 po/az.po+9−22 po/bg.po+9−5 po/br.po+168 po/bs.po+9−7 po/ca.po+9−22 po/ckb.po+9−22 po/cs.po+9−23 po/da.po+9−6 po/de.po+9−22 po/el.po+9−22 po/en_AU.po+9−22 po/en_GB.po+9−22 po/eo.po+9−6 po/es.po+9−5 po/eu.po+9−5 po/fa.po+9−6 po/fi.po+9−5 po/fo.po+9−6 po/fr.po+30−34 po/gd.po+9−25 po/gl.po+10−6 po/he.po+9−22 po/hi.po+9−9 po/hr.po+9−7 po/hu.po+9−22 po/hy.po+9−6 po/id.po+9−6 po/is.po+9−22 po/it.po+9−22 po/ja.po+9−13 po/km.po+9−21 po/kn.po+9−6 po/ko.po+9−6 po/ky.po+9−6 po/lo.po+9−13 po/lt.po+9−24 po/lv.po+27−24 po/ml.po+10−23 po/mr.po+9−6 po/ms.po+9−22 po/my.po+9−13 po/nb.po+9−6 po/nl.po+9−22 po/pl.po+9−24 po/pt.po+9−6 po/pt_BR.po+9−22 po/ro.po+9−7 po/ru.po+9−5 po/shn.po+9−6 po/si.po+9−6 po/sl.po+9−25 po/sq.po+9−16 po/sr.po+9−7 po/sv.po+9−6 po/sw.po+9−9 po/ta.po+10−23 po/te.po+9−6 po/tr.po+9−22 po/ug.po+15−27 po/uk.po+9−24 po/unity8.pot+7−3 po/vi.po+9−6 po/xh.po+9−6 po/zh_CN.po+9−6 po/zh_HK.po+9−21 po/zh_TW.po+9−21 qml/Bottombar/Bottombar.qml−227 qml/Bottombar/HudButton.qml−64 qml/Bottombar/graphics/hud@20.png qml/Bottombar/graphics/hud_invoke_button_active@20.png qml/CMakeLists.txt−1 qml/Components/AnimationControllerWithSignals.qml−64 qml/Components/Carousel.qml+13−19 qml/Components/FilterGrid.qml+38−24 qml/Components/LazyImage.qml+1 qml/Components/ResponsiveGridView.qml+1 qml/Components/ZoomableImage.qml+153 qml/Dash/Card.qml+99−79 qml/Dash/CardCarousel.qml+1−1 qml/Dash/CardFilterGrid.qml+7−10 qml/Dash/CardHeader.qml+41−31 qml/Dash/DashContent.qml+5−10 qml/Dash/DashRenderer.qml+5−3 qml/Dash/GenericScopeView.qml+29−30 qml/Dash/Previews/PreviewProgress.qml+3−2 qml/Dash/Previews/PreviewRatingDisplay.qml+4−2 qml/Dash/Previews/PreviewRatingInput.qml+6−4 qml/Dash/Previews/PreviewZoomableImage.qml+4−7 qml/Dash/ScopeDelegateMapper.qml−30 qml/Greeter/Clock.qml+3−6 qml/Greeter/Greeter.qml+115−42 qml/Greeter/GreeterContent.qml+1−10 qml/Greeter/Infographics.qml+3 qml/Hud/Hud.qml+1−1 qml/Notifications/NotificationMenuItemFactory.qml+2−1 qml/Notifications/Notifications.qml+11 qml/Shell.qml+84−104 qml/graphics/dropshadow_left@20.png qml/Hud/graphics/dropshadow_right@20.png → qml/graphics/dropshadow_right@20.png qml/graphics/phone_background.jpg qml/graphics/tablet_background.jpg run → run.sh+15−1 run_on_device → run_on_device.sh+2−2 tests/autopilot/unity8/application_lifecycle/tests/__init__.py+49 tests/autopilot/unity8/application_lifecycle/tests/test_application_lifecycle.py+56−72 tests/autopilot/unity8/application_lifecycle/tests/test_url_dispatcher.py+8−39 tests/autopilot/unity8/indicators/tests/__init__.py+17 tests/autopilot/unity8/indicators/tests/test_indicators.py+69−13 tests/autopilot/unity8/process_helpers.py+16 tests/autopilot/unity8/shell/__init__.py+50−1 tests/autopilot/unity8/shell/emulators/__init__.py+2−6 tests/autopilot/unity8/shell/emulators/dash.py+25−5 tests/autopilot/unity8/shell/emulators/main_window.py+32−2 tests/autopilot/unity8/shell/tests/test_emulators.py+20−12 tests/autopilot/unity8/shell/tests/test_notifications.py+100−61 tests/autopilot/unity8/shell/tests/test_system_integration.py+1−1 tests/autopilot/unity8/shell/tests/test_upstart.py+2−2 tests/plugins/DashViews/CMakeLists.txt+23−35 tests/plugins/DashViews/listviewwithpageheadertestsectionexternalmodel.cpp → tests/plugins/DashViews/listviewwithpageheadersectionexternalmodeltest.cpp+1−5 tests/plugins/DashViews/listviewwithpageheadertestsection.cpp → tests/plugins/DashViews/listviewwithpageheadersectiontest.cpp+1−13 tests/plugins/DashViews/listviewwithpageheadertest.cpp−15 tests/plugins/DashViews/tst_listviewwithpageheaderqml.qml → tests/plugins/DashViews/tst_ListViewWithPageHeaderQML.qml tests/plugins/Ubuntu/Gestures/CMakeLists.txt+1 tests/plugins/Unity/Launcher/CMakeLists.txt+3−3 tests/plugins/Unity/Launcher/launcherbackendtest.cpp+167 tests/plugins/Utils/CMakeLists.txt+2−1 tests/qmltests/CMakeLists.txt+3−2 tests/qmltests/Components/CMakeLists.txt+1 tests/qmltests/Components/tst_AnimationControllerWithSignals.qml−142 tests/qmltests/Components/tst_Carousel.qml+34−7 tests/qmltests/Components/tst_FilterGrid.qml+1−1 tests/qmltests/Components/tst_ZoomableImage.qml+192 tests/qmltests/Dash/Previews/tst_PreviewRatingInput.qml+21−2 tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml+6−3 tests/qmltests/Dash/qml/FakeScopeView.qml−45 tests/qmltests/Dash/qml/fake_generic_scopeView.qml−24 tests/qmltests/Dash/qml/fake_scopeView1.qml−24 tests/qmltests/Dash/qml/fake_scopeView2.qml−24 tests/qmltests/Dash/qml/fake_scopeView3.qml−24 tests/qmltests/Dash/qml/fake_scopeView4.qml−24 tests/qmltests/Dash/tst_Card.qml+12−10 tests/qmltests/Dash/tst_CardBenchmark.qml+94 tests/qmltests/Dash/tst_CardHeader.qml+1−1 tests/qmltests/Dash/tst_Dash.qml−11 tests/qmltests/Dash/tst_DashContent.qml+27−51 tests/qmltests/Dash/tst_GenericScopeView.qml+4−4 tests/qmltests/Greeter/tst_Clock.qml+3−3 tests/qmltests/Greeter/tst_Phone.qml+10−50 tests/qmltests/Greeter/tst_Tablet.qml+36−8 tests/qmltests/Launcher/tst_Launcher.qml+1 tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+30−4 tests/qmltests/Panel/Indicators/tst_MessageMenuItemFactory.qml+1 tests/qmltests/tst_Shell.qml+11 tests/utils/modules/Unity/Test/UnityTestCase.qml+26 tools/CMakeLists.txt+2 tools/unlock-device+42
CMakeLists.txt+5−5
@@ -48,11 +48,11 @@ add_custom_target(cppcheck COMMAND cppcheck --enable=all -q --error-exitcode=2
4848 ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/tests)
4949
5050include(FindPkgConfig)
51−find_package(Qt5Core)
52−find_package(Qt5Qml)
53−find_package(Qt5Quick)
54−find_package(Qt5Gui)
55−find_package(Qt5DBus)
51+find_package(Qt5Core 5.2 REQUIRED)
52+find_package(Qt5Qml 5.2 REQUIRED)
53+find_package(Qt5Quick 5.2 REQUIRED)
54+find_package(Qt5Gui 5.2 REQUIRED)
55+find_package(Qt5DBus 5.2 REQUIRED)
5656
5757# Standard install paths
5858include(GNUInstallDirs)
CODING+11−15
@@ -20,7 +20,7 @@ install dependencies
2020If its your first time, install build dependencies
2121
2222$ cd ~/unity8/trunk
23−$ ./build --setup
23+$ ./build.sh --setup
2424
2525 this will:
2626 - install the required dependencies to build, as well as run on the desktop
@@ -31,7 +31,7 @@ build Unity 8
3131-------------
3232
3333$ cd ~/unity8/trunk
34−$ ./build
34+$ ./build.sh
3535
3636You may also rebuild with the -c for clean, which just deletes the build
3737directory.
@@ -43,10 +43,10 @@ Running Unity 8 on your desktop
4343run the Unity 8 shell
4444---------------------
4545$ cd ~/unity8/trunk
46−$ ./run
46+$ ./run.sh
4747
4848Options can be passed to test the lock screen
49−$ ./run -p OR -k
49+$ ./run.sh -p OR -k
5050
5151-p is for pin lock, for which the default prompt answer is "1234"
5252-k is for keylock passphrase, for which the default prompt answer is "password"
@@ -78,19 +78,19 @@ Running Unity 8 on devices
7878 on the device yourself)
7979
8080$ cd ~/unity/trunk
81−$ ./run_on_device --setup
81+$ ./run_on_device.sh --setup
8282 this will:
8383 - install your public SSH key on the device
8484 - install the needed dependencies
8585
86−$ ./run_on_device
86+$ ./run_on_device.sh
8787 this will:
8888 - rsync the code to the device
8989 - build on the device
9090 - replace the running shell
9191
9292Options can be passed to test the lock screen
93−$ ./run_on_device -p OR -k
93+$ ./run_on_device.sh -p OR -k
9494
9595-p is for pin lock, for which the default prompt answer is "1234"
9696-k is for keylock passphrase, for which the default prompt answer is "password"
@@ -107,9 +107,9 @@ Notes
107107- exporting ANDROID_SERIAL=$your_device_serial or
108108 ANDROID_SERIAL=$your_device_ip:5555 will make adb not complain about
109109 multiple devices
110−- you can export TARGET_IP=$your_device_ip TARGET_SSH_PORT=22 for run_on_device
110+- you can export TARGET_IP=$your_device_ip TARGET_SSH_PORT=22 for run_on_device.sh
111111 to not use adb forwarding - useful if you use multiple devices
112−- using Ninja (package ninja-build - run_on_device -s installs this now)
112+- using Ninja (package ninja-build - run_on_device.sh -s installs this now)
113113 will improve build times (especially in the nothing-to-build case)
114114
115115
@@ -131,7 +131,7 @@ Running tests
131131=============
132132
133133Tests are run from the build directory (which will be ./builddir if you used
134−the ./build script).
134+the ./build.sh script).
135135
136136To run the tests that do not require any graphical capability and therefore
137137are pretty fast run:
@@ -167,15 +167,11 @@ NB: Manual test or interation doesn't make sense for all components or classes,
167167particularly the non-graphical ones. In such cases no "tryFoo" make target is
168168provided.
169169
170−NB: The tests expect the locale to be the C locale, they may fail if run
171−under a different locale, if you get failures others can not reproduce
172−prepend 'LC_ALL=C' to the 'make test' command
173−
174170Running autopilot tests
175171=======================
176172
177173Autopilot tests are run from the build directory (which will be ./builddir if you used
178−the ./build script).
174+the ./build.sh script).
179175
180176$ make autopilot
181177
build → build.shrenamed+1−2
@@ -43,13 +43,12 @@ install_dependencies() {
4343 gsettings-desktop-schemas \
4444 gsettings-ubuntu-schemas \
4545 qmenumodel-qml \
46− qtdeclarative5-dee-plugin \
46+ qml-module-qtquick-xmllistmodel \
4747 qtdeclarative5-gsettings1.0 \
4848 qtdeclarative5-ubuntu-ui-toolkit-plugin \
4949 qtdeclarative5-ubuntu-settings-components \
5050 qtdeclarative5-ubuntu-thumbnailer0.1 \
5151 unity-notifications-impl \
52− qtdeclarative5-xmllistmodel-plugin \
5352 ubuntu-mobile-icons \
5453 unity-scope-home \
5554 unity-lens-applications \
cmake/modules/QmlTest.cmake+16−3
@@ -58,7 +58,15 @@ macro(add_manual_qml_test SUBPATH COMPONENT_NAME)
5858
5959endmacro(add_manual_qml_test)
6060
61+macro(add_qml_benchmark SUBPATH COMPONENT_NAME ITERATIONS)
62+ add_qml_test_internal(${SUBPATH} ${COMPONENT_NAME} ${ITERATIONS} ${ARGN})
63+endmacro(add_qml_benchmark)
64+
6165macro(add_qml_test SUBPATH COMPONENT_NAME)
66+ add_qml_test_internal(${SUBPATH} ${COMPONENT_NAME} 0 ${ARGN})
67+endmacro(add_qml_test)
68+
69+macro(add_qml_test_internal SUBPATH COMPONENT_NAME ITERATIONS)
6270 set(options NO_ADD_TEST NO_TARGETS)
6371 set(multi_value_keywords IMPORT_PATHS TARGETS PROPERTIES ENVIRONMENT)
6472
@@ -88,10 +96,17 @@ macro(add_qml_test SUBPATH COMPONENT_NAME)
8896 set(function_ARGS "")
8997 endif()
9098
99+ if (${ITERATIONS} GREATER 0)
100+ set(ITERATIONS_STRING "-iterations" ${ITERATIONS})
101+ else()
102+ set(ITERATIONS_STRING "")
103+ endif()
104+
91105 set(qmltest_command
92106 env ${qmltest_ENVIRONMENT}
93107 ${qmltestrunner_exe} -input ${CMAKE_CURRENT_SOURCE_DIR}/${qmltest_FILE}.qml
94108 ${qmltestrunner_imports}
109+ ${ITERATIONS_STRING}
95110 -o ${CMAKE_BINARY_DIR}/${qmltest_TARGET}.xml,xunitxml
96111 -o -,txt
97112 ${function_ARGS}
@@ -114,7 +129,7 @@ macro(add_qml_test SUBPATH COMPONENT_NAME)
114129 add_qmltest_target(${qmltest_TARGET} "${qmltest_command}" TRUE ${qmltest_NO_ADD_TEST})
115130 add_qmltest_target(${qmltest_xvfb_TARGET} "${qmltest_xvfb_command}" ${qmltest_NO_TARGETS} TRUE)
116131 add_manual_qml_test(${SUBPATH} ${COMPONENT_NAME} ${ARGN})
117−endmacro(add_qml_test)
132+endmacro(add_qml_test_internal)
118133
119134macro(add_binary_qml_test CLASS_NAME LD_PATH DEPS)
120135 set(testCommand
@@ -141,8 +156,6 @@ macro(add_binary_qml_test CLASS_NAME LD_PATH DEPS)
141156
142157 add_qmltest_target(xvfbtest${CLASS_NAME} "${xvfbtestCommand}" FALSE TRUE)
143158 add_dependencies(qmluitests xvfbtest${CLASS_NAME})
144−
145− add_manual_qml_test(. ${CLASS_NAME} IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
146159endmacro(add_binary_qml_test)
147160
148161macro(add_qmltest_target qmltest_TARGET qmltest_command qmltest_NO_TARGETS qmltest_NO_ADD_TEST)
data/CMakeLists.txt+1−2
@@ -1,8 +1,7 @@
11# generate desktop file
22configure_file(${SHELL_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop @ONLY)
3−configure_file(${SCOPE_TOOL}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${SCOPE_TOOL}.desktop @ONLY)
43
54# install desktop files
6−install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop ${CMAKE_CURRENT_BINARY_DIR}/${SCOPE_TOOL}.desktop
5+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop
76 DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
87 )
data/unity-scope-tool.desktop.indeleted−8
@@ -1,8 +0,0 @@
1−[Desktop Entry]
2−Type=Application
3−Name=Unity Scope Tool
4−Comment=Developer tool for Unity scopes.
5−Exec=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@/unity-scope-tool
6−Terminal=false
7−Icon=unity-scope-tool
8−X-Ubuntu-Touch=true
data/unity8.conf+10−1
@@ -1,7 +1,7 @@
11description "Unity Shell v8"
22author "Ricardo Mendoza <ricmm@ubuntu.com>"
33
4−emits scope-ui-starting
4+emits scope-ui-starting indicator-services-start
55
66start on ((xsession SESSION=ubuntu-touch) or (xsession SESSION=ubuntu-touch-surfaceflinger)) and started dbus
77stop on desktop-end
@@ -12,6 +12,9 @@ respawn
1212expect stop
1313
1414pre-start script
15+ # Tell unity-mir to raise SIGSTOP after we start
16+ initctl set-env UNITY_MIR_EMITS_SIGSTOP=1
17+
1518 if [ -n "$MIR_SOCKET" ]; then
1619 if [ -z "$UNITY_MIR_SOCKET" ]; then
1720 # Save original value of MIR_SOCKET in case we are restarted,
@@ -42,6 +45,12 @@ pre-start script
4245 fi
4346
4447 initctl emit scope-ui-starting
48+ initctl emit --no-wait indicator-services-start
4549end script
4650
4751exec ${BINARY:-unity8} $ARGS
52+
53+post-stop script
54+ initctl set-env --global MIR_SOCKET=$UNITY_MIR_SOCKET
55+ initctl unset-env --global UNITY_MIR_SOCKET
56+end script
debian/changelog+209−3
@@ -1,8 +1,214 @@
1−unity8 (7.86) trusty; urgency=medium
1+unity8 (7.86+14.10.20140507.3-0ubuntu1) utopic; urgency=low
22
3− * humppaaa
3+ [ Michał Sawicz ]
4+ * Remove HUD from the bottom edge. Again.
5+
6+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 07 May 2014 11:14:30 +0000
7+
8+unity8 (7.86+14.10.20140505-0ubuntu1) utopic; urgency=low
9+
10+ [ Ted Gould ]
11+ * Provide a dbus interface for setting the count and countVisible
12+ properties. (LP: #1301400)
13+
14+ [ Michał Sawicz ]
15+ * Pass env variables to initctl start.
16+ * Suffix .sh to our scripts and clean up debian/rules.
17+ * Adapt to Debian Qt package renames and drop unneeded Dee plugin
18+ dependency.
19+
20+ [ Ying-Chun Liu ]
21+ * Add Zoomable Image for Preview widgets.
22+
23+ [ Albert Astals ]
24+ * Remove support for Qt <= 5.2.1
25+
26+ [ Mirco Müller ]
27+ * Implemented feature-request from Design for modal snap-decision
28+ notifications on the phone. See LP #1285712 (LP: #1285712)
29+
30+ [ Andrea Cimitan ]
31+ * Make progressbas in preview widget big as the button
32+
33+ [ CI bot ]
34+ * Resync trunk
35+
36+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 05 May 2014 12:09:43 +0000
37+
38+unity8 (7.86+14.10.20140502.6-0ubuntu1) utopic; urgency=low
39+
40+ [ tpeeters ]
41+ * Adapt to new TabBar
42+
43+ [ Tim Peeters ]
44+ * Adapt to new TabBar
45+
46+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 02 May 2014 16:44:52 +0000
47+
48+unity8 (7.86+14.10.20140429.2-0ubuntu1) utopic; urgency=medium
49+
50+ [ Andrea Cimitan ]
51+ * Update upstart job to reflect latest unity-mir changes
52+ * Fix locale in qml tests and fixtimeformattertest (LP: #1301038)
53+ * Fix 1309135 (LP: #1309135)
54+
55+ [ Michał Sawicz ]
56+ * Split out unity8-common package
57+ * Don't wait for indicator services to start, and drop Scope Tool's
58+ .desktop file. (LP: #1310172)
59+
60+ [ Michael Terry ]
61+ * Stop clock from hiding when the 'show dash' button is pressed in
62+ greeter. (LP: #1308139)
63+ * Make swipe teases in the greeter more helpful and obvious (LP:
64+ #1267623)
65+
66+ [ Nick Dedekind ]
67+ * Fixed datetime indicator appointment colour (LP: #1307048)
68+
69+ [ Albert Astals ]
70+ * Improve Card creation time by adding loaders that make sure only
71+ what's needed is loaded (LP: #1297197)
72+ * CategoryDelegateRange: Fix condition for detecting overshooting
73+ * Make xvfbtests work in the DashView plugins
74+ * Fix binding loop in FilterGrid height
75+
76+ [ Victor R. Ruiz ]
77+ * Move autopilot notification code to a helper method.
78+
79+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 29 Apr 2014 15:21:33 +0000
80+
81+unity8 (7.85+14.04.20140416-0ubuntu1) trusty; urgency=low
82+
83+ [ Albert Astals ]
84+ * Fix last item X position Fixes clicking on the last item sometimes
85+ not working (LP: #1301871)
86+ * Use upstart in ./run Makes it so that you can use the lock button on
87+ the device without getting that nasty hwc crash
88+ * Remove AnimationControllerWithSignals.
89+ * Use the correct delegate base item for the Carousel test
90+ * Some simplification in DashContent Kill the ScopeDelegateMapper in
91+ favour of a simple if (that will eventually go away). Removal of all
92+ the fake scopes in the tests that added nothing of value to the
93+ tests. Removal of movementEnded signal that was unused. Removal of
94+ movementStarted and positionedAtBeginning signals that were being
95+ used as function calls. Rework DashContent tests so they what the
96+ function does what it is supposed to do instead of just making sure
97+ QML signals work .
98+ * Improve Card creation time by adding loaders that make sure only
99+ what's needed is loaded In my computer it goes from RESULT :
100+ qmltestrunner::benchmark_time:"cardTitleArtSubtitleMascotSummaryMode
101+ l": 3.217 msecs per iteration (total: 3,218, iterations: 1000)
102+ RESULT :
103+ qmltestrunner::benchmark_time:"cardTitleArtSubtitleMascotModel":
104+ 1.647 msecs per iteration (total: 1,648, iterations: 1000) RESULT :
105+ qmltestrunner::benchmark_time:"cardTitleArtSubtitleModel": 1.514
106+ msecs per iteration (total: 1,515, iterations: 1000) RESULT :
107+ qmltestrunner::benchmark_time:"cardTitleArtModel": 1.471 msecs per
108+ iteration (total: 1,471, iterations: 1000) RESULT :
109+ qmltestrunner::benchmark_time:"cardArtModel": 1.447 msecs per
110+ iteration (total: 1,448, iterations: 1000) RESULT :
111+ qmltestrunner::benchmark_time:"cardTitleModel": 1.276 msecs per
112+ iteration (total: 1,276, iterations: 1000) to RESULT :
113+ qmltestrunner::benchmark_time:"cardTitleArtSubtitleMascotSummaryMode
114+ l": 2.916 msecs per iteration (total: 2,917, iterations: 1000)
115+ RESULT :
116+ qmltestrunner::benchmark_time:"cardTitleArtSubtitleMascotModel":
117+ 1.504 msecs per iteration (total: 1,504, iterations: 1000) RESULT :
118+ qmltestrunner::benchmark_time:"cardTitleArtSubtitleModel": 1.060
119+ msecs per iteration (total: 1,061, iterations: 1000) RESULT :
120+ qmltestrunner::benchmark_time:"cardTitleArtModel": 1.052 msecs per
121+ iteration (total: 1,053, iterations: 1000) RESULT :
122+ qmltestrunner::benchmark_time:"cardArtModel": 0.727 msecs per
123+ iteration (total: 728, iterations: 1000) RESULT :
124+ qmltestrunner::benchmark_time:"cardTitleModel": 0.817 msecs per
125+ iteration (total: 818, iterations: 1000) (LP: #1297197)
126+
127+ [ Allan LeSage ]
128+ * DashApps emulator get_applications should return a list ordered by
129+ visible y, x.
130+
131+ [ Andrea Cimitan ]
132+ * Workaround for lp1301309 until fixes for palette in ui toolkit (LP:
133+ #1301309)
134+
135+ [ Leo Arias ]
136+ * Reverted the change that returns application cards instead of
137+ titles.
138+
139+ [ Nick Dedekind ]
140+ * Indicator services started by unity8 upstart configuration rather
141+ than manual emmision from indicator manager.
142+
143+ [ Mirco Müller ]
144+ * Fix notification ap-test assertions.
145+
146+ [ Michael Terry ]
147+ * Use new tablet and phone backgrounds from Design.
148+
149+ [ Michael Zanetti ]
150+ * workaround the QTestLogger assertion issue with make tryXyz and our
151+ custom uqmlscene
152+
153+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 16 Apr 2014 13:45:01 +0000
154+
155+unity8 (7.85+14.04.20140415.2-0ubuntu1) trusty; urgency=low
156+
157+ [ Michael Terry ]
158+ * When an application requests focus, handle it in Shell.qml by hiding
159+ the greeter and stopping any edge demo. (LP: #1227753)
160+
161+ [ Leo Arias ]
162+ * Use subprocess.check_call when caling url-dispatcher, so an error
163+ will be raised if it fails.
164+ * Test application life cycle with fake apps, instead of messaging and
165+ address book.
166+
167+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 15 Apr 2014 12:47:11 +0000
168+
169+unity8 (7.85+14.04.20140410.1-0ubuntu1) trusty; urgency=medium
170+
171+ [ Didier Roche ]
172+ * Resync trunk with previous revert upload
173+
174+ [ Michał Sawicz ]
175+ * Set the Qt.ImhNoPredictiveText flag on wifi password field, fixes
176+ lp:1291575 (LP: #1291575)
177+
178+ [ Albert Astals ]
179+ * Take into account the originY when specifying the delegate ranges
180+ Fixes bug #1300302 (LP: #1300302)
181+
182+ [ CI bot ]
183+ * Resync trunk
184+
185+ [ Allan LeSage ]
186+ * Swiping open an indicator must show its correct title--protect
187+ against lp:1253804 . (LP: #1253804)
188+
189+ [ Alexander Sack ]
190+ * Fix TypeError: issue seen in system_integration autopilot test on
191+ image 279. (LP: #1303685)
192+
193+ [ Bill Filler ]
194+ * Set the Qt.ImhNoPredictiveText flag on wifi password field, fixes
195+ lp:1291575 (LP: #1291575)
196+
197+ [ Leo Arias ]
198+ * Added a search autopilot helper.
199+
200+ [ Michael Terry ]
201+ * Provide a all-in-one script for getting a device to an unlocked
202+ state.
203+
204+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 10 Apr 2014 10:03:31 +0000
205+
206+unity8 (7.85+14.04.20140404.is.7.85+14.04.20140403.1-0ubuntu1) trusty; urgency=medium
207+
208+ * Revert to previous version as it's linked to latest sdk change which
209+ is making gallery-app AP tests failing on the CI dashboard
4210
5− -- Michael Zanetti <michael.zanetti@canonical.com> Thu, 10 Apr 2014 15:19:28 +0200
211+ -- Didier Roche <didrocks@ubuntu.com> Tue, 08 Apr 2014 13:53:47 +0200
6212
7213unity8 (7.85+14.04.20140404-0ubuntu1) trusty; urgency=low
8214
debian/control+41−33
@@ -11,37 +11,34 @@ Build-Depends: cmake,
1111 libgl1-mesa-dev[!armhf] | libgl-dev[!armhf],
1212 libgl1-mesa-dri,
1313 libgles2-mesa-dev[armhf],
14+ libglib2.0-dev,
1415 libgsettings-qt-dev,
1516 libhud-client2-dev,
16− libnih-dbus-dev,
17− libnih-dev,
1817 libpulse-dev,
1918 libqmenumodel-dev (>= 0.2.7),
19+ libqt5xmlpatterns5-dev,
2020 libunity-api-dev (>= 7.80.6),
2121 libunity-mir-dev,
22− libupstart-dev,
2322 libusermetricsoutput1-dev,
2423 libxcb1-dev,
25− libglib2.0-dev,
2624 pkg-config,
27− python:any (>= 2.7),
2825 python-setuptools,
2926 python3-all:any,
3027 python3-setuptools,
28+ python:any (>= 2.7),
29+ qml-module-qtquick-xmllistmodel,
30+ qml-module-qtquick2,
31+ qml-module-qttest,
3132 qt5-default,
32− qtbase5-dev,
33+ qtbase5-dev (>= 5.2.1),
3334 qtbase5-dev-tools,
34− qtbase5-private-dev,
35− qtdeclarative5-dev,
35+ qtbase5-private-dev (>= 5.2.1),
36+ qtdeclarative5-dev (>= 5.2.1),
3637 qtdeclarative5-dev-tools,
38+ qtdeclarative5-private-dev (>= 5.2.1),
3739 qtdeclarative5-qtmultimedia-plugin,
38− qtdeclarative5-private-dev,
39− qtdeclarative5-qtquick2-plugin,
40− qtdeclarative5-test-plugin,
4140 qtdeclarative5-ubuntu-settings-components,
4241 qtdeclarative5-ubuntu-ui-toolkit-plugin,
43− qtdeclarative5-xmllistmodel-plugin,
44− libqt5xmlpatterns5-dev,
4542 ttf-ubuntu-font-family,
4643Standards-Version: 3.9.4
4744Homepage: http://launchpad.net/unity
@@ -63,7 +60,8 @@ Description: Indicators client test application
6360
6461Package: unity-scope-tool
6562Architecture: any
66−Depends: unity8 (= ${binary:Version}),
63+Depends: unity8-common (= ${source:Version}),
64+ unity8-private (= ${binary:Version}),
6765 ${misc:Depends},
6866 ${shlibs:Depends},
6967Description: Development tool for Unity scopes
@@ -74,27 +72,17 @@ Package: unity8
7472Architecture: any
7573Provides: indicator-renderer,
7674Depends: gsettings-desktop-schemas,
75+ libcap2-bin,
7776 libglib2.0-bin,
78− libunity-mir1,
77+ libunity-mir1 (>= 0.4),
7978 qmenumodel-qml (>= 0.2.7),
80− qtdeclarative5-dee-plugin,
79+ qml-module-qtquick-xmllistmodel,
8180 qtdeclarative5-gsettings1.0,
8281 qtdeclarative5-ubuntu-settings-components,
83− qtdeclarative5-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
84− ubuntu-thumbnailer-impl-0,
85− qtdeclarative5-ubuntu-ui-toolkit-plugin,
86− qtdeclarative5-unity-notifications-plugin | unity-notifications-impl,
87− qtdeclarative5-xmllistmodel-plugin,
88− unity-application-impl-2,
8982 unity-launcher-impl-3,
90− unity-notifications-impl-2,
91− unity8-fake-env | unity-application-impl,
83+ unity8-common (= ${source:Version}),
9284 unity8-private (= ${binary:Version}),
9385 unity8-private | unity-launcher-impl,
94− unity-plugin-scopes | unity-scopes-impl,
95− unity-scopes-impl-0,
96−# for setcap:
97− libcap2-bin,
9886 ${misc:Depends},
9987 ${shlibs:Depends},
10088Recommends: unity-scope-click,
@@ -102,10 +90,30 @@ Recommends: unity-scope-click,
10290 unity-scope-scopes,
10391Breaks: indicator-network (<< 0.5.1),
10492 ubuntu-touch-session (<< 0.107),
105−Replaces: ubuntu-touch-session (<< 0.82~)
93+Replaces: ubuntu-touch-session (<< 0.82~),
10694Description: Unity 8 shell
10795 The Unity 8 shell is the primary user interface for Ubuntu devices.
10896
97+Package: unity8-common
98+Architecture: all
99+Depends: qtdeclarative5-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
100+ qtdeclarative5-ubuntu-ui-toolkit-plugin,
101+ qtdeclarative5-unity-notifications-plugin | unity-notifications-impl,
102+ ubuntu-thumbnailer-impl-0,
103+ unity-application-impl-2,
104+ unity-notifications-impl-3,
105+ unity-plugin-scopes | unity-scopes-impl,
106+ unity-scopes-impl-0,
107+ unity8-fake-env | unity-application-impl,
108+ ${misc:Depends},
109+Breaks: unity8 (<< 7.86),
110+Replaces: unity8 (<< 7.86),
111+Description: Unity 8 shell (common files)
112+ The Unity 8 shell is the primary user interface for Ubuntu devices.
113+ .
114+ This package contains the QML, graphics and locale files shared between
115+ unity8 and unity-scope-tool.
116+
109117Package: unity8-autopilot
110118Architecture: all
111119Depends: gir1.2-glib-2.0,
@@ -122,12 +130,12 @@ Depends: gir1.2-glib-2.0,
122130 python3-fixtures,
123131 python3-gi,
124132 ubuntu-ui-toolkit-autopilot,
125− unity8 (>= ${source:Version}),
126− unity8-fake-env (>= ${source:Version}),
133+ unity8 (= ${source:Version}),
134+ unity8-fake-env (= ${source:Version}),
127135 url-dispatcher-tools,
128136 ${misc:Depends},
129− ${python:Depends},
130137 ${python3:Depends},
138+ ${python:Depends},
131139 ${shlibs:Depends},
132140Description: Test package for Unity 8 shell
133141 Autopilot tests for the unity8 package
@@ -149,9 +157,9 @@ Architecture: any
149157Multi-Arch: same
150158Pre-Depends: ${misc:Pre-Depends},
151159Depends: gsettings-ubuntu-schemas,
160+ libunity-core-6.0-9,
152161 ${misc:Depends},
153162 ${shlibs:Depends},
154− libunity-core-6.0-9,
155163Provides: unity-launcher-impl,
156164 unity-launcher-impl-3,
157165Description: Unity 8 private libs
debian/rules+1−2
@@ -6,8 +6,7 @@
66export DPKG_GENSYMBOLS_CHECK_LEVEL=4
77export NO_PNG_PKG_MANGLE=1
88
9−.PHONY: build
10−build %:
9+%:
1110 dh $@ --parallel --fail-missing --with python2,python3
1211
1312override_dh_auto_clean:
debian/unity-scope-tool.install−1
@@ -1,3 +1,2 @@
11usr/bin/unity-scope-tool
2−usr/share/applications/unity-scope-tool.desktop
32usr/share/unity8/ScopeTool.qml
debian/unity8-autopilot.install+1
@@ -1 +1,2 @@
11usr/lib/python*/*/unity*
2+usr/share/unity8/unlock-device
debian/unity8-common.installnew file+5
@@ -0,0 +1,5 @@
1+usr/share/locale
2+usr/share/unity8/Components
3+usr/share/unity8/Dash
4+usr/share/unity8/Notifications
5+usr/share/unity8/graphics
debian/unity8-fake-env.install+1−1
@@ -1,4 +1,4 @@
1−usr/lib/*/unity8/qml/nonmirplugins
21usr/lib/*/unity8/qml/mocks
2+usr/lib/*/unity8/qml/nonmirplugins
33usr/lib/*/unity8/qml/scopefakes
44usr/share/unity8/mocks
debian/unity8-private.install+1−1
@@ -1,7 +1,7 @@
11usr/lib/*/unity8/qml/AccountsService
2+usr/lib/*/unity8/qml/DashViews
23usr/lib/*/unity8/qml/HudClient
34usr/lib/*/unity8/qml/LightDM
4−usr/lib/*/unity8/qml/DashViews
55usr/lib/*/unity8/qml/Powerd
66usr/lib/*/unity8/qml/SessionBroadcast
77usr/lib/*/unity8/qml/Ubuntu
debian/unity8.install+1−7
@@ -1,15 +1,9 @@
1+data/unity8.conf usr/share/upstart/sessions/
12usr/bin/unity8
23usr/share/applications/unity8.desktop
3−usr/share/locale
4−usr/share/unity8/Bottombar
5−usr/share/unity8/Components
6−usr/share/unity8/Dash
74usr/share/unity8/Greeter
85usr/share/unity8/Hud
96usr/share/unity8/Launcher
10−usr/share/unity8/Notifications
117usr/share/unity8/Panel
128usr/share/unity8/Shell.qml
139usr/share/unity8/Stages
14−usr/share/unity8/graphics
15−data/unity8.conf usr/share/upstart/sessions/
plugins/DashViews/abstractdashview.cpp−34
@@ -46,17 +46,10 @@ void AbstractDashView::setModel(QAbstractItemModel *model)
4646 if (!m_delegateModel) {
4747 createDelegateModel();
4848 } else {
49−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
50− disconnect(m_delegateModel, SIGNAL(modelUpdated(QQuickChangeSet,bool)), this, SLOT(onModelUpdated(QQuickChangeSet,bool)));
51− }
52− m_delegateModel->setModel(QVariant::fromValue<QAbstractItemModel *>(model));
53− connect(m_delegateModel, SIGNAL(modelUpdated(QQuickChangeSet,bool)), this, SLOT(onModelUpdated(QQuickChangeSet,bool)));
54−#else
5549 disconnect(m_delegateModel, SIGNAL(modelUpdated(QQmlChangeSet,bool)), this, SLOT(onModelUpdated(QQmlChangeSet,bool)));
5650 }
5751 m_delegateModel->setModel(QVariant::fromValue<QAbstractItemModel *>(model));
5852 connect(m_delegateModel, SIGNAL(modelUpdated(QQmlChangeSet,bool)), this, SLOT(onModelUpdated(QQmlChangeSet,bool)));
59−#endif
6053
6154 cleanupExistingItems();
6255
@@ -181,13 +174,8 @@ void AbstractDashView::resetDelegateCreationEnd()
181174
182175void AbstractDashView::createDelegateModel()
183176{
184−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
185− m_delegateModel = new QQuickVisualDataModel(qmlContext(this), this);
186− connect(m_delegateModel, SIGNAL(createdItem(int,QQuickItem*)), this, SLOT(itemCreated(int,QQuickItem*)));
187−#else
188177 m_delegateModel = new QQmlDelegateModel(qmlContext(this), this);
189178 connect(m_delegateModel, SIGNAL(createdItem(int,QObject*)), this, SLOT(itemCreated(int,QObject*)));
190−#endif
191179 if (isComponentComplete())
192180 m_delegateModel->componentComplete();
193181}
@@ -253,16 +241,9 @@ QQuickItem *AbstractDashView::createItem(int modelIndex, bool asynchronous)
253241 return nullptr;
254242
255243 m_asyncRequestedIndex = -1;
256−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
257− QQuickItem *item = m_delegateModel->item(modelIndex, asynchronous);
258−#else
259244 QObject* object = m_delegateModel->object(modelIndex, asynchronous);
260245 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
261−#endif
262246 if (!item) {
263−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
264− m_asyncRequestedIndex = modelIndex;
265−#else
266247 if (object) {
267248 m_delegateModel->release(object);
268249 if (!m_delegateValidated) {
@@ -273,7 +254,6 @@ QQuickItem *AbstractDashView::createItem(int modelIndex, bool asynchronous)
273254 } else {
274255 m_asyncRequestedIndex = modelIndex;
275256 }
276−#endif
277257 return nullptr;
278258 } else {
279259 addItemToView(modelIndex, item);
@@ -283,13 +263,8 @@ QQuickItem *AbstractDashView::createItem(int modelIndex, bool asynchronous)
283263
284264void AbstractDashView::releaseItem(QQuickItem *item)
285265{
286−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
287− QQuickVisualModel::ReleaseFlags flags = m_delegateModel->release(item);
288− if (flags & QQuickVisualModel::Destroyed) {
289−#else
290266 QQmlDelegateModel::ReleaseFlags flags = m_delegateModel->release(item);
291267 if (flags & QQmlDelegateModel::Destroyed) {
292−#endif
293268 item->setParentItem(nullptr);
294269 }
295270}
@@ -299,10 +274,6 @@ void AbstractDashView::setImplicitHeightDirty()
299274 m_implicitHeightDirty = true;
300275}
301276
302−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
303−void AbstractDashView::itemCreated(int modelIndex, QQuickItem *item)
304−{
305−#else
306277void AbstractDashView::itemCreated(int modelIndex, QObject *object)
307278{
308279 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
@@ -310,7 +281,6 @@ void AbstractDashView::itemCreated(int modelIndex, QObject *object)
310281 qWarning() << "AbstractDashView::itemCreated got a non item for index" << modelIndex;
311282 return;
312283 }
313−#endif
314284 item->setParentItem(this);
315285
316286 // We only need to call createItem if we are here because of an asynchronous generation
@@ -325,11 +295,7 @@ void AbstractDashView::itemCreated(int modelIndex, QObject *object)
325295 }
326296}
327297
328−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
329−void AbstractDashView::onModelUpdated(const QQuickChangeSet &changeSet, bool reset)
330−#else
331298void AbstractDashView::onModelUpdated(const QQmlChangeSet &changeSet, bool reset)
332−#endif
333299{
334300 if (reset) {
335301 cleanupExistingItems();
plugins/DashViews/abstractdashview.h−17
@@ -23,12 +23,8 @@ class QAbstractItemModel;
2323class QQmlComponent;
2424#pragma GCC diagnostic push
2525#pragma GCC diagnostic ignored "-pedantic"
26−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
27−#include <private/qquickvisualdatamodel_p.h>
28−#else
2926#include <private/qqmldelegatemodel_p.h>
3027#include <qqmlinfo.h>
31−#endif
3228#pragma GCC diagnostic pop
3329
3430class AbstractDashView : public QQuickItem
@@ -94,13 +90,8 @@ protected:
9490 void setImplicitHeightDirty();
9591
9692private Q_SLOTS:
97−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
98− void itemCreated(int modelIndex, QQuickItem *item);
99− void onModelUpdated(const QQuickChangeSet &changeSet, bool reset);
100−#else
10193 void itemCreated(int modelIndex, QObject *object);
10294 void onModelUpdated(const QQmlChangeSet &changeSet, bool reset);
103−#endif
10495 void onHeightChanged();
10596
10697private:
@@ -117,17 +108,9 @@ private:
117108 virtual void doRelayout() = 0;
118109 virtual void updateItemCulling(qreal visibleFromY, qreal visibleToY) = 0;
119110 virtual void calculateImplicitHeight() = 0;
120−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
121− virtual void processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes) = 0;
122−#else
123111 virtual void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) = 0;
124−#endif
125112
126−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
127− QQuickVisualDataModel *m_delegateModel;
128−#else
129113 QQmlDelegateModel *m_delegateModel;
130−#endif
131114
132115 // Index we are waiting because we requested it asynchronously
133116 int m_asyncRequestedIndex;
plugins/DashViews/horizontaljournal.cpp−12
@@ -28,12 +28,8 @@
2828#include <qqmlengine.h>
2929#pragma GCC diagnostic push
3030#pragma GCC diagnostic ignored "-pedantic"
31−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
32−#include <private/qquickvisualdatamodel_p.h>
33−#else
3431#include <private/qqmldelegatemodel_p.h>
3532#include <qqmlinfo.h>
36−#endif
3733#include <private/qquickitem_p.h>
3834#pragma GCC diagnostic pop
3935
@@ -188,17 +184,9 @@ void HorizontalJournal::calculateImplicitHeight()
188184 }
189185}
190186
191−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
192−void HorizontalJournal::processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes)
193−#else
194187void HorizontalJournal::processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes)
195−#endif
196188{
197−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
198− Q_FOREACH(const QQuickChangeSet::Remove &remove, removes) {
199−#else
200189 Q_FOREACH(const QQmlChangeSet::Remove &remove, removes) {
201−#endif
202190 for (int i = remove.count - 1; i >= 0; --i) {
203191 const int indexToRemove = remove.index + i;
204192 // We only support removing from the end so
plugins/DashViews/horizontaljournal.h−4
@@ -52,11 +52,7 @@ private:
5252 void calculateImplicitHeight() override;
5353 void doRelayout() override;
5454 void updateItemCulling(qreal visibleFromY, qreal visibleToY) override;
55−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
56− void processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes) override;
57−#else
5855 void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) override;
59−#endif
6056
6157 int m_firstVisibleIndex;
6258 QList<QQuickItem*> m_visibleItems;
plugins/DashViews/listviewwithpageheader.cpp−50
@@ -97,11 +97,7 @@
9797#include <qqmlengine.h>
9898#pragma GCC diagnostic push
9999#pragma GCC diagnostic ignored "-pedantic"
100−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
101−#include <private/qquickvisualdatamodel_p.h>
102−#else
103100#include <private/qqmldelegatemodel_p.h>
104−#endif
105101#include <private/qqmlglobal_p.h>
106102#include <private/qquickitem_p.h>
107103#include <private/qquickanimation_p.h>
@@ -191,17 +187,10 @@ void ListViewWithPageHeader::setModel(QAbstractItemModel *model)
191187 if (!m_delegateModel) {
192188 createDelegateModel();
193189 } else {
194−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
195− disconnect(m_delegateModel, SIGNAL(modelUpdated(QQuickChangeSet,bool)), this, SLOT(onModelUpdated(QQuickChangeSet,bool)));
196− }
197− m_delegateModel->setModel(QVariant::fromValue<QAbstractItemModel *>(model));
198− connect(m_delegateModel, SIGNAL(modelUpdated(QQuickChangeSet,bool)), this, SLOT(onModelUpdated(QQuickChangeSet,bool)));
199−#else
200190 disconnect(m_delegateModel, SIGNAL(modelUpdated(QQmlChangeSet,bool)), this, SLOT(onModelUpdated(QQmlChangeSet,bool)));
201191 }
202192 m_delegateModel->setModel(QVariant::fromValue<QAbstractItemModel *>(model));
203193 connect(m_delegateModel, SIGNAL(modelUpdated(QQmlChangeSet,bool)), this, SLOT(onModelUpdated(QQmlChangeSet,bool)));
204−#endif
205194 Q_EMIT modelChanged();
206195 polish();
207196 // TODO?
@@ -570,13 +559,8 @@ void ListViewWithPageHeader::viewportMoved(Qt::Orientations orient)
570559
571560void ListViewWithPageHeader::createDelegateModel()
572561{
573−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
574− m_delegateModel = new QQuickVisualDataModel(qmlContext(this), this);
575− connect(m_delegateModel, SIGNAL(createdItem(int,QQuickItem*)), this, SLOT(itemCreated(int,QQuickItem*)));
576−#else
577562 m_delegateModel = new QQmlDelegateModel(qmlContext(this), this);
578563 connect(m_delegateModel, SIGNAL(createdItem(int,QObject*)), this, SLOT(itemCreated(int,QObject*)));
579−#endif
580564 if (isComponentComplete())
581565 m_delegateModel->componentComplete();
582566 updateWatchedRoles();
@@ -657,13 +641,8 @@ bool ListViewWithPageHeader::addVisibleItems(qreal fillFrom, qreal fillTo, bool
657641void ListViewWithPageHeader::reallyReleaseItem(ListItem *listItem)
658642{
659643 QQuickItem *item = listItem->m_item;
660−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
661− QQuickVisualModel::ReleaseFlags flags = m_delegateModel->release(item);
662− if (flags & QQuickVisualModel::Destroyed) {
663−#else
664644 QQmlDelegateModel::ReleaseFlags flags = m_delegateModel->release(item);
665645 if (flags & QQmlDelegateModel::Destroyed) {
666−#endif
667646 item->setParentItem(nullptr);
668647 }
669648 delete listItem->m_sectionItem;
@@ -796,16 +775,9 @@ ListViewWithPageHeader::ListItem *ListViewWithPageHeader::createItem(int modelIn
796775 return nullptr;
797776
798777 m_asyncRequestedIndex = -1;
799−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
800− QQuickItem *item = m_delegateModel->item(modelIndex, asynchronous);
801−#else
802778 QObject* object = m_delegateModel->object(modelIndex, asynchronous);
803779 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
804−#endif
805780 if (!item) {
806−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
807− m_asyncRequestedIndex = modelIndex;
808−#else
809781 if (object) {
810782 m_delegateModel->release(object);
811783 if (!m_delegateValidated) {
@@ -816,7 +788,6 @@ ListViewWithPageHeader::ListItem *ListViewWithPageHeader::createItem(int modelIn
816788 } else {
817789 m_asyncRequestedIndex = modelIndex;
818790 }
819−#endif
820791 return 0;
821792 } else {
822793// qDebug() << "ListViewWithPageHeader::createItem::We have the item" << modelIndex << item;
@@ -872,10 +843,6 @@ ListViewWithPageHeader::ListItem *ListViewWithPageHeader::createItem(int modelIn
872843 }
873844}
874845
875−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
876−void ListViewWithPageHeader::itemCreated(int modelIndex, QQuickItem *item)
877−{
878−#else
879846void ListViewWithPageHeader::itemCreated(int modelIndex, QObject *object)
880847{
881848 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
@@ -883,7 +850,6 @@ void ListViewWithPageHeader::itemCreated(int modelIndex, QObject *object)
883850 qWarning() << "ListViewWithPageHeader::itemCreated got a non item for index" << modelIndex;
884851 return;
885852 }
886−#endif
887853// qDebug() << "ListViewWithPageHeader::itemCreated" << modelIndex << item;
888854 // Check we are not being taken down and don't paint anything
889855 // TODO Check if we still need this in 5.2
@@ -924,21 +890,13 @@ void ListViewWithPageHeader::onHeightChanged()
924890}
925891
926892
927−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
928−void ListViewWithPageHeader::onModelUpdated(const QQuickChangeSet &changeSet, bool /*reset*/)
929−#else
930893void ListViewWithPageHeader::onModelUpdated(const QQmlChangeSet &changeSet, bool /*reset*/)
931−#endif
932894{
933895 // TODO Do something with reset
934896// qDebug() << "ListViewWithPageHeader::onModelUpdated" << changeSet << reset;
935897 const auto oldFirstVisibleIndex = m_firstVisibleIndex;
936898
937−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
938− Q_FOREACH(const QQuickChangeSet::Remove &remove, changeSet.removes()) {
939−#else
940899 Q_FOREACH(const QQmlChangeSet::Remove &remove, changeSet.removes()) {
941−#endif
942900// qDebug() << "ListViewWithPageHeader::onModelUpdated Remove" << remove.index << remove.count;
943901 if (remove.index + remove.count > m_firstVisibleIndex && remove.index < m_firstVisibleIndex + m_visibleItems.count()) {
944902 const qreal oldFirstValidIndexPos = m_visibleItems.first()->y();
@@ -992,11 +950,7 @@ void ListViewWithPageHeader::onModelUpdated(const QQmlChangeSet &changeSet, bool
992950 }
993951 }
994952
995−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
996− Q_FOREACH(const QQuickChangeSet::Insert &insert, changeSet.inserts()) {
997−#else
998953 Q_FOREACH(const QQmlChangeSet::Insert &insert, changeSet.inserts()) {
999−#endif
1000954// qDebug() << "ListViewWithPageHeader::onModelUpdated Insert" << insert.index << insert.count;
1001955 const bool insertingInValidIndexes = insert.index > m_firstVisibleIndex && insert.index < m_firstVisibleIndex + m_visibleItems.count();
1002956 const bool firstItemWithViewOnTop = insert.index == 0 && m_firstVisibleIndex == 0 && m_visibleItems.first()->y() + m_clipItem->y() > contentY();
@@ -1054,11 +1008,7 @@ void ListViewWithPageHeader::onModelUpdated(const QQmlChangeSet &changeSet, bool
10541008 }
10551009 }
10561010
1057−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
1058− Q_FOREACH(const QQuickChangeSet::Change &change, changeSet.changes()) {
1059−#else
10601011 Q_FOREACH(const QQmlChangeSet::Change &change, changeSet.changes()) {
1061−#endif
10621012// qDebug() << "ListViewWithPageHeader::onModelUpdated Change" << change.index << change.count;
10631013 for (int i = change.index; i < change.count; ++i) {
10641014 ListItem *item = itemAtIndex(i);
plugins/DashViews/listviewwithpageheader.h−20
@@ -17,21 +17,13 @@
1717#ifndef LISTVIEWWITHPAGEHEADER_H
1818#define LISTVIEWWITHPAGEHEADER_H
1919
20−#pragma GCC diagnostic push
21−#pragma GCC diagnostic ignored "-pedantic"
2220#include <private/qquickitemchangelistener_p.h>
2321#include <private/qquickflickable_p.h>
24−#pragma GCC diagnostic pop
2522
2623class QAbstractItemModel;
2724class QQuickNumberAnimation;
28−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
29−class QQuickChangeSet;
30−class QQuickVisualDataModel;
31−#else
3225class QQmlChangeSet;
3326class QQmlDelegateModel;
34−#endif
3527
3628
3729/**
@@ -117,19 +109,11 @@ protected:
117109 void updatePolish();
118110
119111private Q_SLOTS:
120−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
121− void itemCreated(int modelIndex, QQuickItem *item);
122−#else
123112 void itemCreated(int modelIndex, QObject *object);
124−#endif
125113 void onContentHeightChanged();
126114 void onContentWidthChanged();
127115 void onHeightChanged();
128−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
129− void onModelUpdated(const QQuickChangeSet &changeSet, bool reset);
130−#else
131116 void onModelUpdated(const QQmlChangeSet &changeSet, bool reset);
132−#endif
133117 void onShowHeaderAnimationFinished();
134118
135119private:
@@ -168,11 +152,7 @@ private:
168152 QQuickItem *getSectionItem(int modelIndex, bool alreadyInserted);
169153 QQuickItem *getSectionItem(const QString &sectionText);
170154
171−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
172− QQuickVisualDataModel *m_delegateModel;
173−#else
174155 QQmlDelegateModel *m_delegateModel;
175−#endif
176156
177157 // Index we are waiting because we requested it asynchronously
178158 int m_asyncRequestedIndex;
plugins/DashViews/organicgrid.cpp−8
@@ -237,17 +237,9 @@ void OrganicGrid::calculateImplicitHeight()
237237 }
238238}
239239
240−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
241−void OrganicGrid::processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes)
242−#else
243240void OrganicGrid::processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes)
244−#endif
245241{
246−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
247− Q_FOREACH(const QQuickChangeSet::Remove &remove, removes) {
248−#else
249242 Q_FOREACH(const QQmlChangeSet::Remove &remove, removes) {
250−#endif
251243 for (int i = remove.count - 1; i >= 0; --i) {
252244 const int indexToRemove = remove.index + i;
253245 // We only support removing from the end
plugins/DashViews/organicgrid.h−4
@@ -79,11 +79,7 @@ private:
7979 void doRelayout() override;
8080 void updateItemCulling(qreal visibleFromY, qreal visibleToY) override;
8181 void calculateImplicitHeight() override;
82−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
83− void processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes) override;
84−#else
8582 void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) override;
86−#endif
8783
8884 QSizeF m_smallDelegateSize;
8985 QSizeF m_bigDelegateSize;
plugins/DashViews/verticaljournal.cpp−8
@@ -239,17 +239,9 @@ void VerticalJournal::updateItemCulling(qreal visibleFromY, qreal visibleToY)
239239 }
240240}
241241
242−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
243−void VerticalJournal::processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes)
244−#else
245242void VerticalJournal::processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes)
246−#endif
247243{
248−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
249− Q_FOREACH(const QQuickChangeSet::Remove &remove, removes) {
250−#else
251244 Q_FOREACH(const QQmlChangeSet::Remove &remove, removes) {
252−#endif
253245 for (int i = remove.count - 1; i >= 0; --i) {
254246 const int indexToRemove = remove.index + i;
255247 // Since we only support removing from the end, indexToRemove
plugins/DashViews/verticaljournal.h−4
@@ -90,11 +90,7 @@ private:
9090 void calculateImplicitHeight() override;
9191 void doRelayout() override;
9292 void updateItemCulling(qreal visibleFromY, qreal visibleToY) override;
93−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
94− void processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes) override;
95−#else
9693 void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) override;
97−#endif
9894
9995 QVector<QList<ViewItem>> m_columnVisibleItems;
10096 QHash<int, int> m_indexColumnMap;
plugins/Unity/Indicators/CMakeLists.txt−3
@@ -6,7 +6,6 @@ project(IndicatorsQml)
66pkg_check_modules(GLIB REQUIRED glib-2.0>=2.32)
77pkg_check_modules(GIO REQUIRED gio-2.0>=2.32)
88pkg_check_modules(QMENUMODEL REQUIRED qmenumodel)
9−pkg_check_modules(LIBUPSTART REQUIRED libupstart libnih libnih-dbus dbus-1)
109
1110find_package(Qt5Core REQUIRED)
1211find_package(Qt5Quick REQUIRED)
@@ -19,7 +18,6 @@ include_directories(
1918 ${GLIB_INCLUDE_DIRS}
2019 ${GIO_INCLUDE_DIRS}
2120 ${QMENUMODEL_INCLUDE_DIRS}
22− ${LIBUPSTART_INCLUDE_DIRS}
2321)
2422
2523set(IndicatorsQML_SOURCES
@@ -54,7 +52,6 @@ target_link_libraries(IndicatorsQml
5452 ${GLIB_LIBRARIES}
5553 ${GIO_LIBRARIES}
5654 ${QMENUMODEL_LDFLAGS}
57− ${LIBUPSTART_LIBRARIES}
5855)
5956
6057qt5_use_modules(IndicatorsQml Core Qml Quick)
plugins/Unity/Indicators/indicatorsmanager.cpp−33
@@ -21,9 +21,6 @@
2121#include <QSettings>
2222#include <QDebug>
2323
24−#include <upstart.h>
25−#include <nih/alloc.h>
26−
2724#include <paths.h>
2825
2926
@@ -216,36 +213,6 @@ void IndicatorsManager::setLoaded(bool loaded)
216213 {
217214 m_loaded = loaded;
218215 Q_EMIT loadedChanged(m_loaded);
219−
220− auto upstartsession = qgetenv("UPSTART_SESSION");
221− NihDBusProxy * upstart = NULL;
222−
223− if (!upstartsession.isNull()) {
224− DBusConnection * conn = NULL;
225− conn = dbus_connection_open(upstartsession.constData(), NULL);
226− if (conn != NULL) {
227− upstart = nih_dbus_proxy_new(NULL, conn,
228− NULL,
229− DBUS_PATH_UPSTART,
230− NULL, NULL);
231− dbus_connection_unref(conn);
232− }
233− }
234−
235− if (upstart != NULL) {
236− int event_sent = 0;
237− if (m_loaded) {
238− event_sent = upstart_emit_event_sync(NULL, upstart, "indicator-services-start", NULL, 0);
239− } else {
240− event_sent = upstart_emit_event_sync(NULL, upstart, "indicator-services-end", NULL, 0);
241− }
242−
243− if (event_sent != 0) {
244− qWarning() << "Unable to send indicator event to Upstart";
245− }
246− nih_unref(upstart, NULL);
247− upstart = NULL;
248− }
249216 }
250217}
251218
plugins/Unity/Indicators/indicatorsmanager.h−2
@@ -28,8 +28,6 @@
2828#include <QHash>
2929#include <QSharedPointer>
3030
31−typedef struct nih_dbus_proxy NihDBusProxy;
32−
3331class UNITYINDICATORS_EXPORT IndicatorsManager : public QObject
3432{
3533 Q_OBJECT
plugins/Unity/Indicators/qml/MenuItemFactory.qml+1−1
@@ -273,7 +273,7 @@ Item {
273273 text: menuData && menuData.label || ""
274274 iconSource: menuData && menuData.icon || "image://theme/calendar"
275275 time: timeFormatter.timeString
276− eventColor: menu && menu.ext.hasOwnProperty("xCanonicalColor") ? menu.ext.xCanonicalColor : Qt.rgba(0.0, 0.0, 0.0, 0.0)
276+ eventColor: getExtendedProperty(extendedData, "xCanonicalColor", Qt.rgba(0.0, 0.0, 0.0, 0.0))
277277 enabled: menuData && menuData.sensitive || false
278278
279279 onMenuModelChanged: {
plugins/Unity/Launcher/backend/launcherbackend.cpp+265−15
@@ -33,10 +33,12 @@ class LauncherBackendItem
3333public:
3434 QString displayName;
3535 QString icon;
36+ int count;
37+ bool countVisible;
3638};
3739
3840LauncherBackend::LauncherBackend(QObject *parent):
39− QObject(parent),
41+ QDBusVirtualObject(parent),
4042 m_accounts(nullptr)
4143{
4244#ifndef LAUNCHER_TESTING
@@ -44,10 +46,25 @@ LauncherBackend::LauncherBackend(QObject *parent):
4446#endif
4547 m_user = qgetenv("USER");
4648 syncFromAccounts();
49+
50+ /* Set up ourselves on DBus */
51+ QDBusConnection con = QDBusConnection::sessionBus();
52+ if (!con.registerService("com.canonical.Unity.Launcher")) {
53+ qDebug() << "Unable to register launcher name";
54+ }
55+ if (!con.registerVirtualObject("/com/canonical/Unity/Launcher", this, QDBusConnection::VirtualObjectRegisterOption::SubPath)) {
56+ qDebug() << "Unable to register launcher object";
57+ }
4758}
4859
4960LauncherBackend::~LauncherBackend()
5061{
62+ /* Remove oursevles from DBus */
63+ QDBusConnection con = QDBusConnection::sessionBus();
64+ con.unregisterService("com.canonical.Unity.Launcher");
65+ con.unregisterObject("/com/canonical/Unity/Launcher");
66+
67+ /* Clear data */
5168 m_storedApps.clear();
5269
5370 Q_FOREACH(LauncherBackendItem *item, m_itemCache) {
@@ -94,7 +111,7 @@ QString LauncherBackend::desktopFile(const QString &appId) const
94111
95112QString LauncherBackend::displayName(const QString &appId) const
96113{
97− LauncherBackendItem *item = m_itemCache.value(appId);
114+ LauncherBackendItem *item = m_itemCache.value(appId, nullptr);
98115 if (item) {
99116 return item->displayName;
100117 }
@@ -112,16 +129,9 @@ QString LauncherBackend::displayName(const QString &appId) const
112129QString LauncherBackend::icon(const QString &appId) const
113130{
114131 QString iconName;
115− LauncherBackendItem *item = m_itemCache.value(appId);
132+ LauncherBackendItem *item = getItem(appId);
116133 if (item) {
117134 iconName = item->icon;
118− } else {
119− QString df = findDesktopFile(appId);
120− if (!df.isEmpty()) {
121− LauncherBackendItem *item = parseDesktopFile(df);
122− m_itemCache.insert(appId, item);
123− iconName = item->icon;
124− }
125135 }
126136
127137 return iconName;
@@ -147,10 +157,70 @@ int LauncherBackend::progress(const QString &appId) const
147157
148158int LauncherBackend::count(const QString &appId) const
149159{
150− // TODO: Return value for count emblem.
151− // TODO: emit countChanged() when this value changes.
152− Q_UNUSED(appId)
153− return 0;
160+ int count = -1;
161+ LauncherBackendItem *item = getItem(appId);
162+
163+ if (item) {
164+ if (item->countVisible) {
165+ count = item->count;
166+ }
167+ }
168+
169+ return count;
170+}
171+
172+void LauncherBackend::setCount(const QString &appId, int count) const
173+{
174+ LauncherBackendItem *item = getItem(appId);
175+
176+ bool emitchange = false;
177+ if (item) {
178+ emitchange = (item->count != count);
179+ item->count = count;
180+ }
181+
182+ if (emitchange) {
183+ /* TODO: This needs to use the accessor to handle the visibility
184+ correctly, but when we have the two properties we can just use
185+ the local value */
186+ Q_EMIT countChanged(appId, this->count(appId));
187+ QVariant vcount(item->count);
188+ emitPropChangedDbus(appId, "count", vcount);
189+ }
190+}
191+
192+bool LauncherBackend::countVisible(const QString &appId) const
193+{
194+ bool visible = false;
195+ LauncherBackendItem *item = getItem(appId);
196+
197+ if (item) {
198+ visible = item->countVisible;
199+ }
200+
201+ return visible;
202+}
203+
204+void LauncherBackend::setCountVisible(const QString &appId, bool visible) const
205+{
206+ LauncherBackendItem *item = getItem(appId);
207+
208+ bool emitchange = false;
209+ if (item) {
210+ emitchange = (item->countVisible != visible);
211+ item->countVisible = visible;
212+ } else {
213+ qDebug() << "Unable to find:" << appId;
214+ }
215+
216+ if (emitchange) {
217+ /* TODO: Because we're using visible in determining the
218+ count we need to emit a count changed as well */
219+ Q_EMIT countChanged(appId, this->count(appId));
220+ Q_EMIT countVisibleChanged(appId, item->countVisible);
221+ QVariant vCountVisible(item->countVisible);
222+ emitPropChangedDbus(appId, "countVisible", vCountVisible);
223+ }
154224}
155225
156226void LauncherBackend::setUser(const QString &username)
@@ -294,6 +364,35 @@ LauncherBackendItem* LauncherBackend::parseDesktopFile(const QString &desktopFil
294364 } else {
295365 item->icon = "image://theme/" + iconString;
296366 }
367+
368+ /* TODO: These should be looked up in a cache somewhere */
369+ item->count = 0;
370+ item->countVisible = false;
371+
372+ return item;
373+}
374+
375+/* Gets an item, and tries to create a new one if we need it to */
376+LauncherBackendItem* LauncherBackend::getItem(const QString &appId) const
377+{
378+ LauncherBackendItem *item = m_itemCache.value(appId, nullptr);
379+ if (!item) {
380+ QString df = findDesktopFile(appId);
381+ if (!df.isEmpty()) {
382+ item = parseDesktopFile(df);
383+ if (item) {
384+ m_itemCache[appId] = item;
385+ } else {
386+ qWarning() << "Unable to parse desktop file for" << appId << "path" << df;
387+ }
388+ } else {
389+ qDebug() << "Unable to find desktop file for:" << appId;
390+ }
391+ }
392+
393+ if (!item)
394+ qWarning() << "Unable to find item for: " << appId;
395+
297396 return item;
298397}
299398
@@ -304,7 +403,7 @@ void LauncherBackend::loadFromVariant(const QVariantMap &details)
304403 }
305404 QString appId = details.value("id").toString();
306405
307− LauncherBackendItem *item = m_itemCache.value(appId);
406+ LauncherBackendItem *item = m_itemCache.value(appId, nullptr);
308407 if (item) {
309408 delete item;
310409 }
@@ -313,6 +412,8 @@ void LauncherBackend::loadFromVariant(const QVariantMap &details)
313412
314413 item->displayName = details.value("name").toString();
315414 item->icon = details.value("icon").toString();
415+ item->count = details.value("count").toInt();
416+ item->countVisible = details.value("countVisible").toBool();
316417
317418 m_itemCache.insert(appId, item);
318419 m_storedApps.append(appId);
@@ -325,6 +426,8 @@ QVariantMap LauncherBackend::itemToVariant(const QString &appId) const
325426 details.insert("id", appId);
326427 details.insert("name", item->displayName);
327428 details.insert("icon", item->icon);
429+ details.insert("count", item->count);
430+ details.insert("countVisible", item->countVisible);
328431 return details;
329432}
330433
@@ -335,3 +438,150 @@ bool LauncherBackend::isDefaultsItem(const QList<QVariantMap> &apps) const
335438 // list of one item with the 'defaults' field set to true.
336439 return (apps.size() == 1 && apps[0].value("defaults").toBool());
337440}
441+
442+bool LauncherBackend::handleMessage(const QDBusMessage& message, const QDBusConnection& connection)
443+{
444+ /* Check to make sure we're getting properties on our interface */
445+ if (message.type() != QDBusMessage::MessageType::MethodCallMessage) {
446+ return false;
447+ }
448+ if (message.interface() != "org.freedesktop.DBus.Properties") {
449+ return false;
450+ }
451+ if (message.arguments()[0].toString() != "com.canonical.Unity.Launcher.Item") {
452+ return false;
453+ }
454+
455+ /* Break down the path to just the app id */
456+ QString pathtemp = message.path();
457+ if (!pathtemp.startsWith("/com/canonical/Unity/Launcher/")) {
458+ return false;
459+ }
460+ pathtemp.remove("/com/canonical/Unity/Launcher/");
461+ if (pathtemp.indexOf('/') >= 0) {
462+ return false;
463+ }
464+
465+ /* Find ourselves an appid */
466+ QString appid = decodeAppId(pathtemp);
467+ QVariantList retval;
468+
469+ if (message.member() == "Get") {
470+ if (message.arguments()[1].toString() == "count") {
471+ retval.append(QVariant::fromValue(QDBusVariant(this->count(appid))));
472+ } else if (message.arguments()[1].toString() == "countVisible") {
473+ retval.append(QVariant::fromValue(QDBusVariant(this->countVisible(appid))));
474+ }
475+ } else if (message.member() == "Set") {
476+ if (message.arguments()[1].toString() == "count") {
477+ this->setCount(appid, message.arguments()[2].value<QDBusVariant>().variant().toInt());
478+ } else if (message.arguments()[1].toString() == "countVisible") {
479+ this->setCountVisible(appid, message.arguments()[2].value<QDBusVariant>().variant().toBool());
480+ }
481+ } else if (message.member() == "GetAll") {
482+ retval.append(this->itemToVariant(appid));
483+ } else {
484+ return false;
485+ }
486+
487+ QDBusMessage reply = message.createReply(retval);
488+ return connection.send(reply);
489+}
490+
491+QString LauncherBackend::introspect(const QString &path) const
492+{
493+ /* This case we should just list the nodes */
494+ if (path == "/com/canonical/Unity/Launcher/" || path == "/com/canonical/Unity/Launcher") {
495+ QString nodes;
496+
497+ Q_FOREACH(const QString &appId, m_itemCache.keys()) {
498+ nodes.append("<node name=\"");
499+ nodes.append(encodeAppId(appId));
500+ nodes.append("\"/>\n");
501+ }
502+
503+ return nodes;
504+ }
505+
506+ /* Should not happen, but let's handle it */
507+ if (!path.startsWith("/com/canonical/Unity/Launcher")) {
508+ return "";
509+ }
510+
511+ /* Now we should be looking at a node */
512+ QString nodeiface =
513+ "<interface name=\"com.canonical.Unity.Launcher.Item\">"
514+ "<property name=\"count\" type=\"i\" access=\"readwrite\" />"
515+ "<property name=\"countVisible\" type=\"b\" access=\"readwrite\" />"
516+ "</interface>";
517+ return nodeiface;
518+}
519+
520+QString LauncherBackend::decodeAppId(const QString& path)
521+{
522+ QByteArray bytes = path.toUtf8();
523+ QByteArray decoded;
524+
525+ for (int i = 0; i < bytes.size(); ++i) {
526+ char chr = bytes.at(i);
527+
528+ if (chr == '_') {
529+ QString number;
530+ number.append(bytes.at(i+1));
531+ number.append(bytes.at(i+2));
532+
533+ bool okay;
534+ char newchar = number.toUInt(&okay, 16);
535+ if (okay)
536+ decoded.append(newchar);
537+
538+ i += 2;
539+ } else {
540+ decoded.append(chr);
541+ }
542+ }
543+
544+ return QString::fromUtf8(decoded);
545+}
546+
547+QString LauncherBackend::encodeAppId(const QString& appId)
548+{
549+ QByteArray bytes = appId.toUtf8();
550+ QString encoded;
551+
552+ for (int i = 0; i < bytes.size(); ++i) {
553+ uchar chr = bytes.at(i);
554+
555+ if ((chr >= 'a' && chr <= 'z') ||
556+ (chr >= 'A' && chr <= 'Z') ||
557+ (chr >= '0' && chr <= '9'&& i != 0)) {
558+ encoded.append(chr);
559+ } else {
560+ QString hexval = QString("_%1").arg(chr, 2, 16, QChar('0'));
561+ encoded.append(hexval.toUpper());
562+ }
563+ }
564+
565+ return encoded;
566+}
567+
568+void LauncherBackend::emitPropChangedDbus(const QString& appId, const QString& property, QVariant &value) const
569+{
570+ QString path("/com/canonical/Unity/Launcher/");
571+ path.append(encodeAppId(appId));
572+
573+ QDBusMessage message = QDBusMessage::createSignal(path, "org.freedesktop.DBus.Properties", "PropertiesChanged");
574+
575+ QList<QVariant> arguments;
576+ QVariantHash changedprops;
577+ changedprops[property] = QVariant::fromValue(QDBusVariant(value));
578+ QVariantList deletedprops;
579+
580+ arguments.append(changedprops);
581+ arguments.append(deletedprops);
582+
583+ message.setArguments(arguments);
584+
585+ QDBusConnection con = QDBusConnection::sessionBus();
586+ con.send(message);
587+}
plugins/Unity/Launcher/backend/launcherbackend.h+52−4
@@ -24,6 +24,7 @@
2424#include <QObject>
2525#include <QSettings>
2626#include <QStringList>
27+#include <QDBusVirtualObject>
2728
2829class AccountsServiceDBusAdaptor;
2930
@@ -32,11 +33,13 @@ class AccountsServiceDBusAdaptor;
3233 */
3334
3435class LauncherBackendItem;
36+class LauncherBackendTest;
3537
36−class LauncherBackend : public QObject
38+class LauncherBackend : public QDBusVirtualObject
3739{
3840 Q_OBJECT
3941
42+ friend LauncherBackendTest;
4043
4144public:
4245 LauncherBackend(QObject *parent = 0);
@@ -116,16 +119,53 @@ public:
116119 */
117120 int count(const QString &appId) const;
118121
122+ /**
123+ * @brief Set the count on an item
124+ * @param appId The ID of the application
125+ * @param count Count to show on the application
126+ */
127+ void setCount(const QString &appId, int count) const;
128+
129+ /**
130+ * @brief Get whether the count should be visible
131+ * @param appId The ID of the application.
132+ * @returns Whether to show a count on the launcher
133+ */
134+ bool countVisible(const QString &appId) const;
135+
136+ /**
137+ * @brief Set the visibility of the count item
138+ * @param appId The ID of the application
139+ * @param visible Whether the count should be visible
140+ */
141+ void setCountVisible(const QString &appId, bool visible) const;
142+
119143 /**
120144 * @brief Sets the username for which to look up launcher items.
121145 * @param username The username to use.
122146 */
123147 void setUser(const QString &username);
124148
149+ /**
150+ * @brief Handle a message to an application node
151+ * @param message DBus message to handle
152+ * @param connection DBus connection that we're using
153+ * @returns whether the message was handled
154+ */
155+ virtual bool handleMessage(const QDBusMessage& message, const QDBusConnection& connection);
156+
157+ /**
158+ * @brief Get introspection information on the objects we're exporting
159+ * @param path the dbus path containing the appid
160+ * @returns Introspection information for that node in the tree
161+ */
162+ virtual QString introspect (const QString &path) const;
163+
125164Q_SIGNALS:
126− void quickListChanged(const QString &appId, const QList<QuickListEntry> &quickList);
127− void progressChanged(const QString &appId, int progress);
128− void countChanged(const QString &appId, int count);
165+ void quickListChanged(const QString &appId, const QList<QuickListEntry> &quickList) const;
166+ void progressChanged(const QString &appId, int progress) const;
167+ void countChanged(const QString &appId, int count) const;
168+ void countVisibleChanged(const QString &appId, bool visible) const;
129169
130170private:
131171 QString findDesktopFile(const QString &appId) const;
@@ -143,6 +183,14 @@ private:
143183
144184 AccountsServiceDBusAdaptor *m_accounts;
145185 QString m_user;
186+
187+ void emitPropChangedDbus(const QString& appId, const QString& property, QVariant &value) const;
188+
189+protected: /* Protected to allow testing */
190+ LauncherBackendItem* getItem(const QString& appId) const;
191+
192+ static QString decodeAppId(const QString& path);
193+ static QString encodeAppId(const QString& appId);
146194};
147195
148196#endif // LAUNCHERBACKEND_H
plugins/Utils/CMakeLists.txt−1
@@ -11,7 +11,6 @@ include_directories(
1111)
1212
1313set(QMLPLUGIN_SRC
14− bottombarvisibilitycommunicatorshell.cpp
1514 qlimitproxymodelqml.cpp
1615 qsortfilterproxymodelqml.cpp
1716 timeformatter.cpp
plugins/Utils/bottombarvisibilitycommunicatorshell.cppdeleted−49
@@ -1,49 +0,0 @@
1−/*
2− * Copyright (C) 2012 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 "bottombarvisibilitycommunicatorshell.h"
18−
19−BottomBarVisibilityCommunicatorShell::BottomBarVisibilityCommunicatorShell()
20− : m_forceHidden(false),
21− m_position(0)
22−{
23−}
24−
25−bool BottomBarVisibilityCommunicatorShell::forceHidden() const
26−{
27− return m_forceHidden;
28−}
29−
30−double BottomBarVisibilityCommunicatorShell::position() const
31−{
32− return m_position;
33−}
34−
35−void BottomBarVisibilityCommunicatorShell::setForceHidden(bool forceHidden)
36−{
37− if (forceHidden != m_forceHidden) {
38− m_forceHidden = forceHidden;
39− Q_EMIT forceHiddenChanged(forceHidden);
40− }
41−}
42−
43−void BottomBarVisibilityCommunicatorShell::setPosition(double position)
44−{
45− if (position != m_position) {
46− m_position = position;
47− Q_EMIT positionChanged(position);
48− }
49−}
plugins/Utils/bottombarvisibilitycommunicatorshell.hdeleted−59
@@ -1,59 +0,0 @@
1−/*
2− * Copyright (C) 2012 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef BOTTOMBARVISIBILITYCOMMUNICATORSHELL_H
18−#define BOTTOMBARVISIBILITYCOMMUNICATORSHELL_H
19−
20−#include <QObject>
21−
22−class QDBusInterface;
23−
24−/** This is an internal class used to talk with the bottom bar used by either
25− * applications or the SDK.
26− * There is a method to force the bottom bar to be hidden or otherwise behave as usual
27− */
28−
29−class BottomBarVisibilityCommunicatorShell : public QObject
30−{
31− Q_OBJECT
32− Q_PROPERTY(bool forceHidden READ forceHidden WRITE setForceHidden NOTIFY forceHiddenChanged)
33− Q_PROPERTY(double position READ position WRITE setPosition NOTIFY positionChanged)
34−
35− Q_CLASSINFO("D-Bus Interface", "com.canonical.Shell.BottomBarVisibilityCommunicator")
36−public:
37− static BottomBarVisibilityCommunicatorShell& instance() {
38− static BottomBarVisibilityCommunicatorShell instance;
39− return instance;
40− }
41−
42− bool forceHidden() const;
43− void setForceHidden(bool forceHidden);
44−
45− double position() const;
46− void setPosition(double position);
47−
48−Q_SIGNALS:
49− void forceHiddenChanged(bool forceHidden);
50− void positionChanged(double position);
51−
52−private:
53− BottomBarVisibilityCommunicatorShell();
54−
55− bool m_forceHidden;
56− double m_position;
57−};
58−
59−#endif
plugins/Utils/plugin.cpp−10
@@ -26,16 +26,12 @@
2626#include "plugin.h"
2727
2828// local
29−#include "bottombarvisibilitycommunicatorshell.h"
3029#include "qlimitproxymodelqml.h"
3130#include "qsortfilterproxymodelqml.h"
3231#include "timeformatter.h"
3332#include "unitymenumodelpaths.h"
3433#include "easingcurve.h"
3534
36−static const char* BOTTOM_BAR_VISIBILITY_COMMUNICATOR_DBUS_PATH = "/BottomBarVisibilityCommunicator";
37−static const char* DBUS_SERVICE = "com.canonical.Shell.BottomBarVisibilityCommunicator";
38−
3935void UtilsPlugin::registerTypes(const char *uri)
4036{
4137 Q_ASSERT(uri == QLatin1String("Utils"));
@@ -45,16 +41,10 @@ void UtilsPlugin::registerTypes(const char *uri)
4541 qmlRegisterType<UnityMenuModelPaths>(uri, 0, 1, "UnityMenuModelPaths");
4642 qmlRegisterType<TimeFormatter>(uri, 0, 1, "TimeFormatter");
4743 qmlRegisterType<GDateTimeFormatter>(uri, 0, 1, "GDateTimeFormatter");
48− qmlRegisterUncreatableType<BottomBarVisibilityCommunicatorShell>(uri, 0, 1, "BottomBarVisibilityCommunicatorShell", "Can't create BottomBarVisibilityCommunicatorShell");
4944 qmlRegisterType<EasingCurve>(uri, 0, 1, "EasingCurve");
5045}
5146
5247void UtilsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
5348{
5449 QQmlExtensionPlugin::initializeEngine(engine, uri);
55−
56− QDBusConnection::sessionBus().registerService(DBUS_SERVICE);
57− BottomBarVisibilityCommunicatorShell *bottomBarVisibilityCommunicator = &BottomBarVisibilityCommunicatorShell::instance();
58− QDBusConnection::sessionBus().registerObject(BOTTOM_BAR_VISIBILITY_COMMUNICATOR_DBUS_PATH, bottomBarVisibilityCommunicator, QDBusConnection::ExportAllContents);
59− engine->rootContext()->setContextProperty("bottomBarVisibilityCommunicatorShell", bottomBarVisibilityCommunicator);
6050}
po/am.po+9−13
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-01-18 19:28+0000\n"
1212"Last-Translator: samson <Unknown>\n"
1313"Language-Team: Amharic <am@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr ""
114113msgid "Send"
115114msgstr "መላኪያ"
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr ""
@@ -159,14 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr "መፈለጊያ"
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr "እባክዎን ያስገቡ %1"
166−
167−#~ msgid "Comments:"
168−#~ msgstr "አስተያየቶች:"
169−
170−#, qt-format
171−#~ msgid "(%1)"
172−#~ msgstr "(%1)"
po/ar.po+9−27
@@ -7,17 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-02-21 11:19+0000\n"
1212"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
1313"Language-Team: Arabic <ar@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
18−"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
19−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
20−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2119
2220#: plugins/Unity/Launcher/launcheritem.cpp:43
2321#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -89,7 +87,7 @@ msgstr "شاهد المزيد"
8987msgid "See less"
9088msgstr "شاهد أقل"
9189
92−#: qml/Dash/DashApps.qml:38
90+#: qml/Dash/DashApps.qml:37
9391msgid "Recent"
9492msgstr ""
9593
@@ -118,6 +116,10 @@ msgstr "أضف تعليق"
118116msgid "Send"
119117msgstr "أرسل"
120118
119+#: qml/Greeter/Greeter.qml:151
120+msgid "Swipe to unlock"
121+msgstr ""
122+
121123#: qml/Greeter/Lockscreen.qml:149
122124msgid "Emergency Call"
123125msgstr "مكالمة طوارئ"
@@ -163,27 +165,7 @@ msgstr "من فضلك أدخِل رقم التعريف الشخصي لبطاقة
163165msgid "Search"
164166msgstr "ابحث"
165167
166−#: qml/Shell.qml:417
168+#: qml/Shell.qml:348
167169#, qt-format
168170msgid "Please enter %1"
169171msgstr "من فضلك أدخِل %1"
170−
171−#~ msgid "Review"
172−#~ msgstr "التعليق"
173−
174−#, qt-format
175−#~ msgid "(%1)"
176−#~ msgstr "(%1)"
177−
178−#~ msgid "Comments:"
179−#~ msgstr "التعليقات:"
180−
181−#, qt-format
182−#~ msgid "%1 review"
183−#~ msgid_plural "%1 reviews"
184−#~ msgstr[0] "لا تعليقات (%1)"
185−#~ msgstr[1] "تعليق واحد (%1)"
186−#~ msgstr[2] "تعليقان (%1)"
187−#~ msgstr[3] "%1 تعليقات"
188−#~ msgstr[4] "%1 تعليقا"
189−#~ msgstr[5] "%1 تعليق"
po/ast.po+9−5
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-04-04 02:16+0000\n"
1212"Last-Translator: Xuacu Saturio <xuacusk8@gmail.com>\n"
1313"Language-Team: Asturian <ast@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-04-08 07:13+0000\n"
18−"X-Generator: Launchpad (build 16976)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -88,7 +88,7 @@ msgstr "Ver más"
8888msgid "See less"
8989msgstr "Ver menos"
9090
91−#: qml/Dash/DashApps.qml:38
91+#: qml/Dash/DashApps.qml:37
9292msgid "Recent"
9393msgstr "Reciente"
9494
@@ -117,6 +117,10 @@ msgstr "Amestar una reseña"
117117msgid "Send"
118118msgstr "Unviar"
119119
120+#: qml/Greeter/Greeter.qml:151
121+msgid "Swipe to unlock"
122+msgstr ""
123+
120124#: qml/Greeter/Lockscreen.qml:149
121125msgid "Emergency Call"
122126msgstr "Llamada d'emerxencia"
@@ -162,7 +166,7 @@ msgstr "Escriba'l PIN de la SIM"
162166msgid "Search"
163167msgstr "Guetar"
164168
165−#: qml/Shell.qml:417
169+#: qml/Shell.qml:348
166170#, qt-format
167171msgid "Please enter %1"
168172msgstr "Introduz %1"
po/az.po+9−22
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-01-15 09:50+0000\n"
1212"Last-Translator: Turan Mahmudov <turan.mahmudov@gmail.com>\n"
1313"Language-Team: Azerbaijani <az@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -86,7 +85,7 @@ msgstr ""
8685msgid "See less"
8786msgstr ""
8887
89−#: qml/Dash/DashApps.qml:38
88+#: qml/Dash/DashApps.qml:37
9089msgid "Recent"
9190msgstr ""
9291
@@ -115,6 +114,10 @@ msgstr "Rəy yaz"
115114msgid "Send"
116115msgstr "Göndər"
117116
117+#: qml/Greeter/Greeter.qml:151
118+msgid "Swipe to unlock"
119+msgstr ""
120+
118121#: qml/Greeter/Lockscreen.qml:149
119122msgid "Emergency Call"
120123msgstr "Zərurət zəngi"
@@ -160,23 +163,7 @@ msgstr ""
160163msgid "Search"
161164msgstr "Axtar"
162165
163−#: qml/Shell.qml:417
166+#: qml/Shell.qml:348
164167#, qt-format
165168msgid "Please enter %1"
166169msgstr "Xahiş edirik daxil edin: %1"
167−
168−#~ msgid "Comments:"
169−#~ msgstr "Şərhlər:"
170−
171−#~ msgid "Review"
172−#~ msgstr "Rəy"
173−
174−#, qt-format
175−#~ msgid "%1 review"
176−#~ msgid_plural "%1 reviews"
177−#~ msgstr[0] "%1 rəy"
178−#~ msgstr[1] "%1 rəy"
179−
180−#, qt-format
181−#~ msgid "(%1)"
182−#~ msgstr "(%1)"
po/bg.po+9−5
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-04-01 14:08+0000\n"
1212"Last-Translator: Atanas Kovachki <Unknown>\n"
1313"Language-Team: Bulgarian <bg@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-04-03 06:06+0000\n"
18−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -91,7 +91,7 @@ msgstr ""
9191msgid "See less"
9292msgstr ""
9393
94−#: qml/Dash/DashApps.qml:38
94+#: qml/Dash/DashApps.qml:37
9595msgid "Recent"
9696msgstr "Последни"
9797
@@ -120,6 +120,10 @@ msgstr "Добави отзив"
120120msgid "Send"
121121msgstr "Изпрати"
122122
123+#: qml/Greeter/Greeter.qml:151
124+msgid "Swipe to unlock"
125+msgstr ""
126+
123127#: qml/Greeter/Lockscreen.qml:149
124128msgid "Emergency Call"
125129msgstr "Спешно повикване"
@@ -165,7 +169,7 @@ msgstr ""
165169msgid "Search"
166170msgstr "Търсене"
167171
168−#: qml/Shell.qml:417
172+#: qml/Shell.qml:348
169173#, qt-format
170174msgid "Please enter %1"
171175msgstr "Моля, въведете %1"
po/br.ponew file+168
@@ -0,0 +1,168 @@
1+# Breton translation for unity8
2+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11+"PO-Revision-Date: 2014-04-15 18:15+0000\n"
12+"Last-Translator: Rouxel <vincent.rouxel@mailoo.org>\n"
13+"Language-Team: Breton <br@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
19+
20+#: plugins/Unity/Launcher/launcheritem.cpp:43
21+#: plugins/Unity/Launcher/launcheritem.cpp:73
22+msgid "Lock to Launcher"
23+msgstr ""
24+
25+#: plugins/Unity/Launcher/launcheritem.cpp:73
26+msgid "Unlock from Launcher"
27+msgstr ""
28+
29+#: qml/Components/EdgeDemoOverlay.qml:151
30+msgid "Skip intro"
31+msgstr ""
32+
33+#: qml/Components/EdgeDemo.qml:113
34+msgid "Right edge"
35+msgstr ""
36+
37+#: qml/Components/EdgeDemo.qml:114
38+msgid "Try swiping from the right edge to unlock the phone"
39+msgstr ""
40+
41+#: qml/Components/EdgeDemo.qml:145
42+msgid "Top edge"
43+msgstr ""
44+
45+#: qml/Components/EdgeDemo.qml:146
46+msgid "Try swiping from the top edge to access the indicators"
47+msgstr ""
48+
49+#: qml/Components/EdgeDemo.qml:171
50+msgid "Close"
51+msgstr "Serriñ"
52+
53+#: qml/Components/EdgeDemo.qml:172
54+msgid "Swipe up again to close the settings screen"
55+msgstr ""
56+
57+#: qml/Components/EdgeDemo.qml:199
58+msgid "Left edge"
59+msgstr ""
60+
61+#: qml/Components/EdgeDemo.qml:200
62+msgid "Swipe from the left to reveal the launcher for quick access to apps"
63+msgstr ""
64+
65+#: qml/Components/EdgeDemo.qml:227
66+msgid "Well done"
67+msgstr ""
68+
69+#: qml/Components/EdgeDemo.qml:228
70+msgid ""
71+"You have now mastered the edge gestures and can start using the "
72+"phone<br><br>Tap on the screen to start"
73+msgstr ""
74+
75+#: qml/Components/PageHeader.qml:365
76+msgid "Recent searches"
77+msgstr ""
78+
79+#: qml/Components/SeeMore.qml:35
80+msgid "See more"
81+msgstr ""
82+
83+#: qml/Components/SeeMore.qml:58
84+msgid "See less"
85+msgstr ""
86+
87+#: qml/Dash/DashApps.qml:37
88+msgid "Recent"
89+msgstr ""
90+
91+#: qml/Dash/PreviewListView.qml:52
92+#, qt-format
93+msgid "%1 Preview"
94+msgstr ""
95+
96+#: qml/Dash/Previews/PreviewActionCombo.qml:34
97+msgid "More..."
98+msgstr ""
99+
100+#: qml/Dash/Previews/PreviewActionCombo.qml:34
101+msgid "Less..."
102+msgstr ""
103+
104+#: qml/Dash/Previews/PreviewRatingInput.qml:81
105+msgid "Rate this"
106+msgstr ""
107+
108+#: qml/Dash/Previews/PreviewRatingInput.qml:126
109+msgid "Add a review"
110+msgstr ""
111+
112+#: qml/Dash/Previews/PreviewRatingInput.qml:166
113+msgid "Send"
114+msgstr ""
115+
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
120+#: qml/Greeter/Lockscreen.qml:149
121+msgid "Emergency Call"
122+msgstr ""
123+
124+#: qml/Greeter/PassphraseLockscreen.qml:59
125+#, qt-format
126+msgid "Hello %1"
127+msgstr ""
128+
129+#: qml/Greeter/PassphraseLockscreen.qml:59
130+msgid "Hello"
131+msgstr ""
132+
133+#: qml/Hud/HudParametrizedActionsPage.qml:132
134+msgid "Confirm"
135+msgstr ""
136+
137+#: qml/Hud/Hud.qml:61 qml/Hud/Hud.qml:99 qml/Hud/Hud.qml:372
138+msgid "Type or say a command"
139+msgstr ""
140+
141+#: qml/Hud/Hud.qml:84
142+msgid "Loading. Please Wait..."
143+msgstr ""
144+
145+#: qml/Hud/Hud.qml:89
146+msgid "Speak Now..."
147+msgstr ""
148+
149+#: qml/Hud/Hud.qml:94
150+msgid "Speaking..."
151+msgstr ""
152+
153+#: qml/Notifications/NotificationMenuItemFactory.qml:91
154+msgid "Show password"
155+msgstr ""
156+
157+#: qml/Notifications/NotificationMenuItemFactory.qml:103
158+msgid "Please enter SIM PIN"
159+msgstr ""
160+
161+#: qml/Panel/SearchIndicator.qml:27
162+msgid "Search"
163+msgstr ""
164+
165+#: qml/Shell.qml:348
166+#, qt-format
167+msgid "Please enter %1"
168+msgstr ""
po/bs.po+9−7
@@ -7,17 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-01-16 22:33+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Bosnian <bs@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18−"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
20−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2119
2220#: plugins/Unity/Launcher/launcheritem.cpp:43
2321#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -86,7 +84,7 @@ msgstr ""
8684msgid "See less"
8785msgstr ""
8886
89−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
9088msgid "Recent"
9189msgstr ""
9290
@@ -115,6 +113,10 @@ msgstr ""
115113msgid "Send"
116114msgstr ""
117115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
118120#: qml/Greeter/Lockscreen.qml:149
119121msgid "Emergency Call"
120122msgstr ""
@@ -160,7 +162,7 @@ msgstr ""
160162msgid "Search"
161163msgstr ""
162164
163−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
164166#, qt-format
165167msgid "Please enter %1"
166168msgstr ""
po/ca.po+9−22
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-01-10 07:45+0000\n"
1212"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
1313"Language-Team: Catalan <ca@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -91,7 +90,7 @@ msgstr ""
9190msgid "See less"
9291msgstr ""
9392
94−#: qml/Dash/DashApps.qml:38
93+#: qml/Dash/DashApps.qml:37
9594msgid "Recent"
9695msgstr ""
9796
@@ -120,6 +119,10 @@ msgstr "Afegiu una ressenya"
120119msgid "Send"
121120msgstr "Envia"
122121
122+#: qml/Greeter/Greeter.qml:151
123+msgid "Swipe to unlock"
124+msgstr ""
125+
123126#: qml/Greeter/Lockscreen.qml:149
124127msgid "Emergency Call"
125128msgstr "Trucada d'emergència"
@@ -165,23 +168,7 @@ msgstr ""
165168msgid "Search"
166169msgstr "Cerca"
167170
168−#: qml/Shell.qml:417
171+#: qml/Shell.qml:348
169172#, qt-format
170173msgid "Please enter %1"
171174msgstr "Introduïu %1"
172−
173−#, qt-format
174−#~ msgid "(%1)"
175−#~ msgstr "(%1)"
176−
177−#~ msgid "Comments:"
178−#~ msgstr "Comentaris:"
179−
180−#~ msgid "Review"
181−#~ msgstr "Ressenya"
182−
183−#, qt-format
184−#~ msgid "%1 review"
185−#~ msgid_plural "%1 reviews"
186−#~ msgstr[0] "%1 ressenya"
187−#~ msgstr[1] "%1 ressenyes"
po/ckb.po+9−22
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\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"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr "پێداچوونەوە زۆر بکە"
114113msgid "Send"
115114msgstr "ناردن"
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr "هێڵی فریاگوزاری"
@@ -159,23 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr "گەڕان"
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr "تکایە %1 بنووسە"
166−
167−#, qt-format
168−#~ msgid "(%1)"
169−#~ msgstr "(%1)"
170−
171−#~ msgid "Comments:"
172−#~ msgstr "لێدوانەکان:"
173−
174−#, qt-format
175−#~ msgid "%1 review"
176−#~ msgid_plural "%1 reviews"
177−#~ msgstr[0] "%1 پێداچوونەوە"
178−#~ msgstr[1] "%1 پێداچوونەوەکان"
179−
180−#~ msgid "Review"
181−#~ msgstr "پێداچوونەوە"
po/cs.po+9−23
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-01-08 10:11+0000\n"
1212"Last-Translator: Tadeáš Pařík <tadeas.parik@gmail.com>\n"
1313"Language-Team: Czech <cs@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr "Přidat recenzi"
114113msgid "Send"
115114msgstr "Odeslat"
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr "Tísňové volání"
@@ -159,24 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr "Hledat"
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr "Zadejte prosím %1"
166−
167−#~ msgid "Comments:"
168−#~ msgstr "Komentáře:"
169−
170−#, qt-format
171−#~ msgid "(%1)"
172−#~ msgstr "(%1)"
173−
174−#~ msgid "Review"
175−#~ msgstr "Recenze"
176−
177−#, qt-format
178−#~ msgid "%1 review"
179−#~ msgid_plural "%1 reviews"
180−#~ msgstr[0] "%1 recenze"
181−#~ msgstr[1] "%1 recenze"
182−#~ msgstr[2] "%1 recenzí"
po/da.po+9−6
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-01-14 20:16+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Danish <da@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr ""
114113msgid "Send"
115114msgstr ""
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr ""
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr ""
po/de.po+9−22
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-01-15 11:01+0000\n"
1212"Last-Translator: Dennis Baudys <Unknown>\n"
1313"Language-Team: German <de@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -87,7 +86,7 @@ msgstr ""
8786msgid "See less"
8887msgstr ""
8988
90−#: qml/Dash/DashApps.qml:38
89+#: qml/Dash/DashApps.qml:37
9190msgid "Recent"
9291msgstr ""
9392
@@ -116,6 +115,10 @@ msgstr "Bewertung hinzufügen"
116115msgid "Send"
117116msgstr "Senden"
118117
118+#: qml/Greeter/Greeter.qml:151
119+msgid "Swipe to unlock"
120+msgstr ""
121+
119122#: qml/Greeter/Lockscreen.qml:149
120123msgid "Emergency Call"
121124msgstr "Notruf"
@@ -161,23 +164,7 @@ msgstr ""
161164msgid "Search"
162165msgstr "Suchen"
163166
164−#: qml/Shell.qml:417
167+#: qml/Shell.qml:348
165168#, qt-format
166169msgid "Please enter %1"
167170msgstr "Bitte geben Sie %1 ein"
168−
169−#~ msgid "Comments:"
170−#~ msgstr "Kommentare:"
171−
172−#, qt-format
173−#~ msgid "(%1)"
174−#~ msgstr "(%1)"
175−
176−#~ msgid "Review"
177−#~ msgstr "Bewertung"
178−
179−#, qt-format
180−#~ msgid "%1 review"
181−#~ msgid_plural "%1 reviews"
182−#~ msgstr[0] "%1 Bewertung"
183−#~ msgstr[1] "%1 Bewertungen"
po/el.po+9−22
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-02-26 09:58+0000\n"
1212"Last-Translator: j3lc <x_nikos@yahoo.gr>\n"
1313"Language-Team: Greek <el@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -89,7 +88,7 @@ msgstr "Περρισότερα"
8988msgid "See less"
9089msgstr "Λιγότερα"
9190
92−#: qml/Dash/DashApps.qml:38
91+#: qml/Dash/DashApps.qml:37
9392msgid "Recent"
9493msgstr ""
9594
@@ -118,6 +117,10 @@ msgstr "Προσθέστε την αξιολόγησή σας"
118117msgid "Send"
119118msgstr "Αποστολή"
120119
120+#: qml/Greeter/Greeter.qml:151
121+msgid "Swipe to unlock"
122+msgstr ""
123+
121124#: qml/Greeter/Lockscreen.qml:149
122125msgid "Emergency Call"
123126msgstr "Κλήση έκτακτης ανάγκης"
@@ -163,23 +166,7 @@ msgstr "Παρακαλώ εισάγετε το PIN της κάρτας SIM"
163166msgid "Search"
164167msgstr "Αναζήτηση"
165168
166−#: qml/Shell.qml:417
169+#: qml/Shell.qml:348
167170#, qt-format
168171msgid "Please enter %1"
169172msgstr "Πληκτρολογήστε %1"
170−
171−#, qt-format
172−#~ msgid "%1 review"
173−#~ msgid_plural "%1 reviews"
174−#~ msgstr[0] "%1 αξιολόγηση"
175−#~ msgstr[1] "%1 αξιολογήσεις"
176−
177−#, qt-format
178−#~ msgid "(%1)"
179−#~ msgstr "(%1)"
180−
181−#~ msgid "Comments:"
182−#~ msgstr "Σχόλια:"
183−
184−#~ msgid "Review"
185−#~ msgstr "Αξιολόγηση"
po/en_AU.po+9−22
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2013-09-28 07:46+0000\n"
1212"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
1313"Language-Team: English (Australia) <en_AU@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr "Add a review"
114113msgid "Send"
115114msgstr "Send"
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr "Emergency Call"
@@ -159,23 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr "Search"
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr "Please enter %1"
166−
167−#~ msgid "Comments:"
168−#~ msgstr "Comments:"
169−
170−#~ msgid "Review"
171−#~ msgstr "Review"
172−
173−#, qt-format
174−#~ msgid "%1 review"
175−#~ msgid_plural "%1 reviews"
176−#~ msgstr[0] "%1 review"
177−#~ msgstr[1] "%1 reviews"
178−
179−#, qt-format
180−#~ msgid "(%1)"
181−#~ msgstr "(%1)"
po/en_GB.po+9−22
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-03-07 13:27+0000\n"
1212"Last-Translator: Andi Chandler <Unknown>\n"
1313"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -87,7 +86,7 @@ msgstr "See more"
8786msgid "See less"
8887msgstr "See less"
8988
90−#: qml/Dash/DashApps.qml:38
89+#: qml/Dash/DashApps.qml:37
9190msgid "Recent"
9291msgstr ""
9392
@@ -116,6 +115,10 @@ msgstr "Add a review"
116115msgid "Send"
117116msgstr "Send"
118117
118+#: qml/Greeter/Greeter.qml:151
119+msgid "Swipe to unlock"
120+msgstr ""
121+
119122#: qml/Greeter/Lockscreen.qml:149
120123msgid "Emergency Call"
121124msgstr "Emergency Call"
@@ -161,23 +164,7 @@ msgstr "Please enter SIM PIN"
161164msgid "Search"
162165msgstr "Search"
163166
164−#: qml/Shell.qml:417
167+#: qml/Shell.qml:348
165168#, qt-format
166169msgid "Please enter %1"
167170msgstr "Please enter %1"
168−
169−#~ msgid "Comments:"
170−#~ msgstr "Comments:"
171−
172−#~ msgid "Review"
173−#~ msgstr "Review"
174−
175−#, qt-format
176−#~ msgid "%1 review"
177−#~ msgid_plural "%1 reviews"
178−#~ msgstr[0] "%1 review"
179−#~ msgstr[1] "%1 reviews"
180−
181−#, qt-format
182−#~ msgid "(%1)"
183−#~ msgstr "(%1)"
po/eo.po+9−6
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2013-06-26 22:35+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Esperanto <eo@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr ""
114113msgid "Send"
115114msgstr ""
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr ""
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr ""
po/es.po+9−5
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-03-28 22:37+0000\n"
1212"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
1313"Language-Team: Spanish <es@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-03-29 07:34+0000\n"
18−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -89,7 +89,7 @@ msgstr "Ver más"
8989msgid "See less"
9090msgstr "Ver menos"
9191
92−#: qml/Dash/DashApps.qml:38
92+#: qml/Dash/DashApps.qml:37
9393msgid "Recent"
9494msgstr "Recientes"
9595
@@ -118,6 +118,10 @@ msgstr "Añadir una reseña"
118118msgid "Send"
119119msgstr "Enviar"
120120
121+#: qml/Greeter/Greeter.qml:151
122+msgid "Swipe to unlock"
123+msgstr ""
124+
121125#: qml/Greeter/Lockscreen.qml:149
122126msgid "Emergency Call"
123127msgstr "Llamada de emergencia"
@@ -163,7 +167,7 @@ msgstr "Escriba el PIN de la SIM"
163167msgid "Search"
164168msgstr "Buscar"
165169
166−#: qml/Shell.qml:417
170+#: qml/Shell.qml:348
167171#, qt-format
168172msgid "Please enter %1"
169173msgstr "Introduzca %1"
po/eu.po+9−5
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-03-30 12:44+0000\n"
1212"Last-Translator: Ibai Oihanguren Sala <Unknown>\n"
1313"Language-Team: Basque <eu@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-03-31 06:44+0000\n"
18−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -88,7 +88,7 @@ msgstr "Ikusi gehiago"
8888msgid "See less"
8989msgstr "Ikusi gutxiago"
9090
91−#: qml/Dash/DashApps.qml:38
91+#: qml/Dash/DashApps.qml:37
9292msgid "Recent"
9393msgstr "Azkenak"
9494
@@ -117,6 +117,10 @@ msgstr "Gehitu kritika"
117117msgid "Send"
118118msgstr "Bidali"
119119
120+#: qml/Greeter/Greeter.qml:151
121+msgid "Swipe to unlock"
122+msgstr ""
123+
120124#: qml/Greeter/Lockscreen.qml:149
121125msgid "Emergency Call"
122126msgstr "Larrialdi-deia"
@@ -162,7 +166,7 @@ msgstr "Sartu SIMaren PINa"
162166msgid "Search"
163167msgstr "Bilatu"
164168
165−#: qml/Shell.qml:417
169+#: qml/Shell.qml:348
166170#, qt-format
167171msgid "Please enter %1"
168172msgstr "Sartu %1"
po/fa.po+9−6
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2013-10-31 19:02+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Persian <fa@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr ""
114113msgid "Send"
115114msgstr ""
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr ""
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr ""
po/fi.po+9−5
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-04-05 09:57+0000\n"
1212"Last-Translator: Jiri Grönroos <Unknown>\n"
1313"Language-Team: Finnish <fi@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-04-08 07:13+0000\n"
18−"X-Generator: Launchpad (build 16976)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -86,7 +86,7 @@ msgstr "Näytä lisää"
8686msgid "See less"
8787msgstr "Näytä vähemmän"
8888
89−#: qml/Dash/DashApps.qml:38
89+#: qml/Dash/DashApps.qml:37
9090msgid "Recent"
9191msgstr "Viimeisimmät"
9292
@@ -115,6 +115,10 @@ msgstr "Lisää arvostelu"
115115msgid "Send"
116116msgstr "Lähetä"
117117
118+#: qml/Greeter/Greeter.qml:151
119+msgid "Swipe to unlock"
120+msgstr ""
121+
118122#: qml/Greeter/Lockscreen.qml:149
119123msgid "Emergency Call"
120124msgstr "Hätäpuhelu"
@@ -160,7 +164,7 @@ msgstr "Anna SIM-kortin PIN-koodi"
160164msgid "Search"
161165msgstr "Hae"
162166
163−#: qml/Shell.qml:417
167+#: qml/Shell.qml:348
164168#, qt-format
165169msgid "Please enter %1"
166170msgstr "Kirjoita %1"
po/fo.po+9−6
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\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"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr ""
114113msgid "Send"
115114msgstr ""
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr "Leita"
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr ""
po/fr.po+30−34
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11−"PO-Revision-Date: 2014-01-28 00:34+0000\n"
12−"Last-Translator: Pierre <Unknown>\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11+"PO-Revision-Date: 2014-05-08 17:29+0000\n"
12+"Last-Translator: Sébastien Maes <nautilussebastien@gmail.com>\n"
1313"Language-Team: French <fr@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-10 08:01+0000\n"
18+"X-Generator: Launchpad (build 16996)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -25,7 +24,7 @@ msgstr "Conserver dans le lanceur"
2524
2625#: plugins/Unity/Launcher/launcheritem.cpp:73
2726msgid "Unlock from Launcher"
28−msgstr ""
27+msgstr "Retirer du lanceur"
2928
3029#: qml/Components/EdgeDemoOverlay.qml:151
3130msgid "Skip intro"
@@ -38,6 +37,7 @@ msgstr "Bord droit"
3837#: qml/Components/EdgeDemo.qml:114
3938msgid "Try swiping from the right edge to unlock the phone"
4039msgstr ""
40+"Faites glisser votre doigt à partir du bord droit pour déverrouiller."
4141
4242#: qml/Components/EdgeDemo.qml:145
4343msgid "Top edge"
@@ -46,6 +46,8 @@ msgstr "Bord supérieur"
4646#: qml/Components/EdgeDemo.qml:146
4747msgid "Try swiping from the top edge to access the indicators"
4848msgstr ""
49+"Faites glisser votre doigt à partir du bord supérieur pour accéder aux "
50+"indicateurs."
4951
5052#: qml/Components/EdgeDemo.qml:171
5153msgid "Close"
@@ -54,6 +56,8 @@ msgstr "Fermer"
5456#: qml/Components/EdgeDemo.qml:172
5557msgid "Swipe up again to close the settings screen"
5658msgstr ""
59+"Faites glisser à nouveau votre doigt vers le bord supérieur pour fermer "
60+"l'écran des paramètres"
5761
5862#: qml/Components/EdgeDemo.qml:199
5963msgid "Left edge"
@@ -62,16 +66,20 @@ msgstr "Bord gauche"
6266#: qml/Components/EdgeDemo.qml:200
6367msgid "Swipe from the left to reveal the launcher for quick access to apps"
6468msgstr ""
69+"Faites glisser votre doigt à partir du bord gauche pour afficher le lanceur "
70+"d'applications."
6571
6672#: qml/Components/EdgeDemo.qml:227
6773msgid "Well done"
68−msgstr ""
74+msgstr "Félicitations"
6975
7076#: qml/Components/EdgeDemo.qml:228
7177msgid ""
7278"You have now mastered the edge gestures and can start using the "
7379"phone<br><br>Tap on the screen to start"
7480msgstr ""
81+"Vous maîtrisez maintenant les différents gestes et pouvez commencer à "
82+"utiliser le téléphone<br><br>Appuyez sur l'écran pour commencer"
7583
7684#: qml/Components/PageHeader.qml:365
7785msgid "Recent searches"
@@ -79,28 +87,28 @@ msgstr "Recherches récentes"
7987
8088#: qml/Components/SeeMore.qml:35
8189msgid "See more"
82−msgstr ""
90+msgstr "Voir plus"
8391
8492#: qml/Components/SeeMore.qml:58
8593msgid "See less"
86−msgstr ""
94+msgstr "Voir moins"
8795
88−#: qml/Dash/DashApps.qml:38
96+#: qml/Dash/DashApps.qml:37
8997msgid "Recent"
90−msgstr ""
98+msgstr "Récent"
9199
92100#: qml/Dash/PreviewListView.qml:52
93101#, qt-format
94102msgid "%1 Preview"
95−msgstr ""
103+msgstr "%1 Aperçu"
96104
97105#: qml/Dash/Previews/PreviewActionCombo.qml:34
98106msgid "More..."
99−msgstr ""
107+msgstr "Plus..."
100108
101109#: qml/Dash/Previews/PreviewActionCombo.qml:34
102110msgid "Less..."
103−msgstr ""
111+msgstr "Moins..."
104112
105113#: qml/Dash/Previews/PreviewRatingInput.qml:81
106114msgid "Rate this"
@@ -114,6 +122,10 @@ msgstr "Ajouter un avis"
114122msgid "Send"
115123msgstr "Envoyer"
116124
125+#: qml/Greeter/Greeter.qml:151
126+msgid "Swipe to unlock"
127+msgstr "Faites glisser pour déverrouiller"
128+
117129#: qml/Greeter/Lockscreen.qml:149
118130msgid "Emergency Call"
119131msgstr "Appel d'urgence"
@@ -145,7 +157,7 @@ msgstr "Parlez maintenant…"
145157
146158#: qml/Hud/Hud.qml:94
147159msgid "Speaking..."
148−msgstr ""
160+msgstr "En cours d'écoute..."
149161
150162#: qml/Notifications/NotificationMenuItemFactory.qml:91
151163msgid "Show password"
@@ -153,29 +165,13 @@ msgstr "Afficher le mot de passe"
153165
154166#: qml/Notifications/NotificationMenuItemFactory.qml:103
155167msgid "Please enter SIM PIN"
156−msgstr ""
168+msgstr "Veuillez entrer le code PIN de votre carte SIM"
157169
158170#: qml/Panel/SearchIndicator.qml:27
159171msgid "Search"
160172msgstr "Rechercher"
161173
162−#: qml/Shell.qml:417
174+#: qml/Shell.qml:348
163175#, qt-format
164176msgid "Please enter %1"
165177msgstr "Veuillez saisir %1"
166−
167−#~ msgid "Review"
168−#~ msgstr "Avis"
169−
170−#, qt-format
171−#~ msgid "%1 review"
172−#~ msgid_plural "%1 reviews"
173−#~ msgstr[0] "%1 avis"
174−#~ msgstr[1] "%1 avis"
175−
176−#~ msgid "Comments:"
177−#~ msgstr "Commentaires :"
178−
179−#, qt-format
180−#~ msgid "(%1)"
181−#~ msgstr "(%1)"
po/gd.po+9−25
@@ -7,17 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2013-09-30 10:34+0000\n"
1212"Last-Translator: Akerbeltz <fios@akerbeltz.org>\n"
1313"Language-Team: Gaelic; Scottish <gd@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
18−"(n > 2 && n < 20) ? 2 : 3;\n"
19−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
20−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2119
2220#: plugins/Unity/Launcher/launcheritem.cpp:43
2321#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -92,7 +90,7 @@ msgstr ""
9290msgid "See less"
9391msgstr ""
9492
95−#: qml/Dash/DashApps.qml:38
93+#: qml/Dash/DashApps.qml:37
9694msgid "Recent"
9795msgstr ""
9896
@@ -121,6 +119,10 @@ msgstr "Cuir lèirmheas ris"
121119msgid "Send"
122120msgstr "Cuir"
123121
122+#: qml/Greeter/Greeter.qml:151
123+msgid "Swipe to unlock"
124+msgstr ""
125+
124126#: qml/Greeter/Lockscreen.qml:149
125127msgid "Emergency Call"
126128msgstr "Gairm èiginn"
@@ -166,25 +168,7 @@ msgstr ""
166168msgid "Search"
167169msgstr "Lorg"
168170
169−#: qml/Shell.qml:417
171+#: qml/Shell.qml:348
170172#, qt-format
171173msgid "Please enter %1"
172174msgstr "Cuir a-steach %1"
173−
174−#, qt-format
175−#~ msgid "(%1)"
176−#~ msgstr "(%1)"
177−
178−#~ msgid "Comments:"
179−#~ msgstr "Beachdan"
180−
181−#~ msgid "Review"
182−#~ msgstr "Lèirmheas"
183−
184−#, qt-format
185−#~ msgid "%1 review"
186−#~ msgid_plural "%1 reviews"
187−#~ msgstr[0] "%1 lèirmheas"
188−#~ msgstr[1] "%1 lèirmheas"
189−#~ msgstr[2] "%1 lèirmheasan"
190−#~ msgstr[3] "%1 lèirmheas"
po/gl.po+10−6
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11−"PO-Revision-Date: 2014-04-08 07:04+0000\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11+"PO-Revision-Date: 2014-05-03 07:31+0000\n"
1212"Last-Translator: Marcos Lans <Unknown>\n"
1313"Language-Team: Galician <gl@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-04-09 07:31+0000\n"
18−"X-Generator: Launchpad (build 16976)\n"
17+"X-Launchpad-Export-Date: 2014-05-06 07:34+0000\n"
18+"X-Generator: Launchpad (build 16996)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -86,7 +86,7 @@ msgstr "Ver máis"
8686msgid "See less"
8787msgstr "Ver menos"
8888
89−#: qml/Dash/DashApps.qml:38
89+#: qml/Dash/DashApps.qml:37
9090msgid "Recent"
9191msgstr "Recentes"
9292
@@ -115,6 +115,10 @@ msgstr "Engadir unha opinión"
115115msgid "Send"
116116msgstr "Enviar"
117117
118+#: qml/Greeter/Greeter.qml:151
119+msgid "Swipe to unlock"
120+msgstr "Esvare para desbloquear"
121+
118122#: qml/Greeter/Lockscreen.qml:149
119123msgid "Emergency Call"
120124msgstr "Chamada de emerxencia"
@@ -160,7 +164,7 @@ msgstr "Introduza o PIN da SIM"
160164msgid "Search"
161165msgstr "Buscar"
162166
163−#: qml/Shell.qml:417
167+#: qml/Shell.qml:348
164168#, qt-format
165169msgid "Please enter %1"
166170msgstr "Introduza %1"
po/he.po+9−22
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2013-11-20 08:30+0000\n"
1212"Last-Translator: Yaron <sh.yaron@gmail.com>\n"
1313"Language-Team: Hebrew <he@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr "הוספת סקירה"
114113msgid "Send"
115114msgstr "שליחה"
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr "שיחת חירום"
@@ -159,23 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr "חיפוש"
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr "נא להזין %1"
166−
167−#, qt-format
168−#~ msgid "(%1)"
169−#~ msgstr "(%1)"
170−
171−#~ msgid "Comments:"
172−#~ msgstr "הערות:"
173−
174−#~ msgid "Review"
175−#~ msgstr "סקירה"
176−
177−#, qt-format
178−#~ msgid "%1 review"
179−#~ msgid_plural "%1 reviews"
180−#~ msgstr[0] "סקירה %1"
181−#~ msgstr[1] "%1 סקירות"
po/hi.po+9−9
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-01-15 01:49+0000\n"
1212"Last-Translator: Siddhanathan S. <Unknown>\n"
1313"Language-Team: Hindi <hi@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr "समीक्षा दे"
114113msgid "Send"
115114msgstr "भेजें"
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr "आपातकालीन कॉल"
@@ -159,10 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr "खोजें"
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr ""
166−
167−#~ msgid "Review"
168−#~ msgstr "समीक्षा"
po/hr.po+9−7
@@ -7,17 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\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"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18−"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2119
2220#: plugins/Unity/Launcher/launcheritem.cpp:43
2321#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -86,7 +84,7 @@ msgstr ""
8684msgid "See less"
8785msgstr ""
8886
89−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
9088msgid "Recent"
9189msgstr ""
9290
@@ -115,6 +113,10 @@ msgstr ""
115113msgid "Send"
116114msgstr ""
117115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
118120#: qml/Greeter/Lockscreen.qml:149
119121msgid "Emergency Call"
120122msgstr ""
@@ -160,7 +162,7 @@ msgstr ""
160162msgid "Search"
161163msgstr "Pretraživanje"
162164
163−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
164166#, qt-format
165167msgid "Please enter %1"
166168msgstr ""
po/hu.po+9−22
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-01-14 23:02+0000\n"
1212"Last-Translator: Kristóf Kiszel <Unknown>\n"
1313"Language-Team: Hungarian <hu@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -87,7 +86,7 @@ msgstr ""
8786msgid "See less"
8887msgstr ""
8988
90−#: qml/Dash/DashApps.qml:38
89+#: qml/Dash/DashApps.qml:37
9190msgid "Recent"
9291msgstr ""
9392
@@ -116,6 +115,10 @@ msgstr "Értékelés hozzáadása"
116115msgid "Send"
117116msgstr "Küldés"
118117
118+#: qml/Greeter/Greeter.qml:151
119+msgid "Swipe to unlock"
120+msgstr ""
121+
119122#: qml/Greeter/Lockscreen.qml:149
120123msgid "Emergency Call"
121124msgstr "Vészhívás"
@@ -161,23 +164,7 @@ msgstr ""
161164msgid "Search"
162165msgstr "Keresés"
163166
164−#: qml/Shell.qml:417
167+#: qml/Shell.qml:348
165168#, qt-format
166169msgid "Please enter %1"
167170msgstr "Adja meg a következőt: %1"
168−
169−#, qt-format
170−#~ msgid "%1 review"
171−#~ msgid_plural "%1 reviews"
172−#~ msgstr[0] "%1 értékelés"
173−#~ msgstr[1] "%1 értékelés"
174−
175−#, qt-format
176−#~ msgid "(%1)"
177−#~ msgstr "(%1)"
178−
179−#~ msgid "Comments:"
180−#~ msgstr "Hozzászólások:"
181−
182−#~ msgid "Review"
183−#~ msgstr "Értékelés"
po/hy.po+9−6
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2013-06-27 04:43+0000\n"
1212"Last-Translator: iAbaS <sosabazyan@yandex.ru>\n"
1313"Language-Team: Armenian <hy@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr ""
114113msgid "Send"
115114msgstr ""
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr "Որոնում"
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr ""
po/id.po+9−6
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\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"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr ""
114113msgid "Send"
115114msgstr ""
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr ""
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr ""
po/is.po+9−22
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2013-09-18 16:22+0000\n"
1212"Last-Translator: Andri Thorlacius <Unknown>\n"
1313"Language-Team: Icelandic <is@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -86,7 +85,7 @@ msgstr ""
8685msgid "See less"
8786msgstr ""
8887
89−#: qml/Dash/DashApps.qml:38
88+#: qml/Dash/DashApps.qml:37
9089msgid "Recent"
9190msgstr ""
9291
@@ -115,6 +114,10 @@ msgstr "Gefa umsögn"
115114msgid "Send"
116115msgstr "Senda"
117116
117+#: qml/Greeter/Greeter.qml:151
118+msgid "Swipe to unlock"
119+msgstr ""
120+
118121#: qml/Greeter/Lockscreen.qml:149
119122msgid "Emergency Call"
120123msgstr "Neyðarsímtal"
@@ -160,23 +163,7 @@ msgstr ""
160163msgid "Search"
161164msgstr "Leita"
162165
163−#: qml/Shell.qml:417
166+#: qml/Shell.qml:348
164167#, qt-format
165168msgid "Please enter %1"
166169msgstr ""
167−
168−#, qt-format
169−#~ msgid "(%1)"
170−#~ msgstr "(%1)"
171−
172−#~ msgid "Comments:"
173−#~ msgstr "Athugasemdir:"
174−
175−#~ msgid "Review"
176−#~ msgstr "Umsögn"
177−
178−#, qt-format
179−#~ msgid "%1 review"
180−#~ msgid_plural "%1 reviews"
181−#~ msgstr[0] "%1 ummæli"
182−#~ msgstr[1] "%1 ummæli"
po/it.po+9−22
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-01-22 09:15+0000\n"
1212"Last-Translator: Domenico <domenico.verde125@live.it>\n"
1313"Language-Team: Italian <it@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -90,7 +89,7 @@ msgstr ""
9089msgid "See less"
9190msgstr ""
9291
93−#: qml/Dash/DashApps.qml:38
92+#: qml/Dash/DashApps.qml:37
9493msgid "Recent"
9594msgstr ""
9695
@@ -119,6 +118,10 @@ msgstr "Aggiungi una recensione"
119118msgid "Send"
120119msgstr "Invia"
121120
121+#: qml/Greeter/Greeter.qml:151
122+msgid "Swipe to unlock"
123+msgstr ""
124+
122125#: qml/Greeter/Lockscreen.qml:149
123126msgid "Emergency Call"
124127msgstr "Chiamata di emergenza"
@@ -164,23 +167,7 @@ msgstr ""
164167msgid "Search"
165168msgstr "Cerca"
166169
167−#: qml/Shell.qml:417
170+#: qml/Shell.qml:348
168171#, qt-format
169172msgid "Please enter %1"
170173msgstr "Inserire %1"
171−
172−#, qt-format
173−#~ msgid "(%1)"
174−#~ msgstr "(%1)"
175−
176−#, qt-format
177−#~ msgid "%1 review"
178−#~ msgid_plural "%1 reviews"
179−#~ msgstr[0] "%1 recensione"
180−#~ msgstr[1] "%1 recensioni"
181−
182−#~ msgid "Comments:"
183−#~ msgstr "Commenti:"
184−
185−#~ msgid "Review"
186−#~ msgstr "Recensisci"
po/ja.po+9−13
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-01-18 07:01+0000\n"
1212"Last-Translator: Shushi Kurose <md81bird@hitaki.net>\n"
1313"Language-Team: Japanese <ja@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr ""
114113msgid "Send"
115114msgstr "送信"
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr ""
@@ -159,14 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr "検索"
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr ""
166−
167−#~ msgid "Comments:"
168−#~ msgstr "コメント:"
169−
170−#, qt-format
171−#~ msgid "(%1)"
172−#~ msgstr "(%1)"
po/km.po+9−21
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-03-04 02:32+0000\n"
1212"Last-Translator: Khoem Sokhem <khoemsokhem@khmeros.info>\n"
1313"Language-Team: Khmer <km@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -89,7 +88,7 @@ msgstr "មើល​ច្រើន​ទៀត"
8988msgid "See less"
9089msgstr "មើល​តិច​ជាង"
9190
92−#: qml/Dash/DashApps.qml:38
91+#: qml/Dash/DashApps.qml:37
9392msgid "Recent"
9493msgstr ""
9594
@@ -118,6 +117,10 @@ msgstr "បន្ថែម​ការ​ពិនិត្យ"
118117msgid "Send"
119118msgstr "ផ្ញើ"
120119
120+#: qml/Greeter/Greeter.qml:151
121+msgid "Swipe to unlock"
122+msgstr ""
123+
121124#: qml/Greeter/Lockscreen.qml:149
122125msgid "Emergency Call"
123126msgstr "ការ​ហៅ​ពេល​អាសន្ន"
@@ -163,22 +166,7 @@ msgstr "បញ្ចូល​កូដ PIN របស់​ស៊ីមកាត"
163166msgid "Search"
164167msgstr "ស្វែង​រក"
165168
166−#: qml/Shell.qml:417
169+#: qml/Shell.qml:348
167170#, qt-format
168171msgid "Please enter %1"
169172msgstr "សូម​បញ្ចូល %1"
170−
171−#, qt-format
172−#~ msgid "(%1)"
173−#~ msgstr "(%1)"
174−
175−#, qt-format
176−#~ msgid "%1 review"
177−#~ msgid_plural "%1 reviews"
178−#~ msgstr[0] "ពិនិត្យ​មើល %1"
179−
180−#~ msgid "Comments:"
181−#~ msgstr "មតិយោបល់៖"
182−
183−#~ msgid "Review"
184−#~ msgstr "ការ​ពិនិត្យ"
po/kn.po+9−6
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\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"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr ""
114113msgid "Send"
115114msgstr ""
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr "ಹುಡುಕು"
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr ""
po/ko.po+9−6
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2013-10-10 07:04+0000\n"
1212"Last-Translator: Kim Boram <boramism@gmail.com>\n"
1313"Language-Team: Korean <ko@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr ""
114113msgid "Send"
115114msgstr ""
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr "검색"
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr ""
po/ky.po+9−6
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\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"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr ""
114113msgid "Send"
115114msgstr ""
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr "Издөө"
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr ""
po/lo.po+9−13
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\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"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr ""
114113msgid "Send"
115114msgstr "ສົ່ງ"
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr ""
@@ -159,14 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr "ຊອກຫາ"
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr "ກະລູນາປ້ອນ %1"
166−
167−#, qt-format
168−#~ msgid "(%1)"
169−#~ msgstr "(%1)"
170−
171−#~ msgid "Comments:"
172−#~ msgstr "ຄໍ່ເຫັນ"
po/lt.po+9−24
@@ -7,17 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-01-15 12:42+0000\n"
1212"Last-Translator: Gediminas Paulauskas <menesis@pov.lt>\n"
1313"Language-Team: Lithuanian <lt@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18−"(n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2119
2220#: plugins/Unity/Launcher/launcheritem.cpp:43
2321#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -89,7 +87,7 @@ msgstr ""
8987msgid "See less"
9088msgstr ""
9189
92−#: qml/Dash/DashApps.qml:38
90+#: qml/Dash/DashApps.qml:37
9391msgid "Recent"
9492msgstr ""
9593
@@ -118,6 +116,10 @@ msgstr "Pridėkite apžvalgą"
118116msgid "Send"
119117msgstr "Siųsti"
120118
119+#: qml/Greeter/Greeter.qml:151
120+msgid "Swipe to unlock"
121+msgstr ""
122+
121123#: qml/Greeter/Lockscreen.qml:149
122124msgid "Emergency Call"
123125msgstr "Pagalbos skambutis"
@@ -163,24 +165,7 @@ msgstr ""
163165msgid "Search"
164166msgstr "Paieška"
165167
166−#: qml/Shell.qml:417
168+#: qml/Shell.qml:348
167169#, qt-format
168170msgid "Please enter %1"
169171msgstr "Prašom įvesti %1"
170−
171−#~ msgid "Comments:"
172−#~ msgstr "Komentarai:"
173−
174−#~ msgid "Review"
175−#~ msgstr "Apžvalga"
176−
177−#, qt-format
178−#~ msgid "%1 review"
179−#~ msgid_plural "%1 reviews"
180−#~ msgstr[0] "%1 apžvalga"
181−#~ msgstr[1] "%1 apžvalgos"
182−#~ msgstr[2] "%1 apžvalgų"
183−
184−#, qt-format
185−#~ msgid "(%1)"
186−#~ msgstr "(%1)"
po/lv.po+27−24
@@ -7,29 +7,28 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11−"PO-Revision-Date: 2014-01-11 16:48+0000\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11+"PO-Revision-Date: 2014-05-07 18:17+0000\n"
1212"Last-Translator: Jānis-Marks Gailis <jeanmarc.gailis@gmail.com>\n"
1313"Language-Team: Latvian <lv@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-10 08:01+0000\n"
18+"X-Generator: Launchpad (build 16996)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
2322msgid "Lock to Launcher"
24−msgstr ""
23+msgstr "Pieslēgt palaidējam"
2524
2625#: plugins/Unity/Launcher/launcheritem.cpp:73
2726msgid "Unlock from Launcher"
28−msgstr ""
27+msgstr "Atslēgt no palaidēja"
2928
3029#: qml/Components/EdgeDemoOverlay.qml:151
3130msgid "Skip intro"
32−msgstr ""
31+msgstr "Izlaist Intro"
3332
3433#: qml/Components/EdgeDemo.qml:113
3534msgid "Right edge"
@@ -37,7 +36,7 @@ msgstr "Labā mala"
3736
3837#: qml/Components/EdgeDemo.qml:114
3938msgid "Try swiping from the right edge to unlock the phone"
40−msgstr ""
39+msgstr "Mēģiniet iesvelt no labās malas, lai atbloķētu tālruni"
4140
4241#: qml/Components/EdgeDemo.qml:145
4342msgid "Top edge"
@@ -45,7 +44,7 @@ msgstr "Augšējā mala"
4544
4645#: qml/Components/EdgeDemo.qml:146
4746msgid "Try swiping from the top edge to access the indicators"
48−msgstr ""
47+msgstr "Mēģiniet iesvelt no augšējās malas, lai piekļūt pie indikatoriem"
4948
5049#: qml/Components/EdgeDemo.qml:171
5150msgid "Close"
@@ -79,15 +78,15 @@ msgstr "Nesen veiktās meklēšanas"
7978
8079#: qml/Components/SeeMore.qml:35
8180msgid "See more"
82−msgstr ""
81+msgstr "Redzēt vairāk"
8382
8483#: qml/Components/SeeMore.qml:58
8584msgid "See less"
86−msgstr ""
85+msgstr "Redzēt mazāk"
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
90−msgstr ""
89+msgstr "Nesens"
9190
9291#: qml/Dash/PreviewListView.qml:52
9392#, qt-format
@@ -96,36 +95,40 @@ msgstr ""
9695
9796#: qml/Dash/Previews/PreviewActionCombo.qml:34
9897msgid "More..."
99−msgstr ""
98+msgstr "Vairāk..."
10099
101100#: qml/Dash/Previews/PreviewActionCombo.qml:34
102101msgid "Less..."
103−msgstr ""
102+msgstr "Mazāk..."
104103
105104#: qml/Dash/Previews/PreviewRatingInput.qml:81
106105msgid "Rate this"
107−msgstr ""
106+msgstr "Novērtēt šo"
108107
109108#: qml/Dash/Previews/PreviewRatingInput.qml:126
110109msgid "Add a review"
111−msgstr ""
110+msgstr "Komentēt"
112111
113112#: qml/Dash/Previews/PreviewRatingInput.qml:166
114113msgid "Send"
114+msgstr "Sūtīt"
115+
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
115118msgstr ""
116119
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119−msgstr ""
122+msgstr "Neatliekamās Palīdzības zvans"
120123
121124#: qml/Greeter/PassphraseLockscreen.qml:59
122125#, qt-format
123126msgid "Hello %1"
124−msgstr ""
127+msgstr "Sveiki, %1"
125128
126129#: qml/Greeter/PassphraseLockscreen.qml:59
127130msgid "Hello"
128−msgstr ""
131+msgstr "Sveiki"
129132
130133#: qml/Hud/HudParametrizedActionsPage.qml:132
131134msgid "Confirm"
@@ -149,7 +152,7 @@ msgstr "Runa..."
149152
150153#: qml/Notifications/NotificationMenuItemFactory.qml:91
151154msgid "Show password"
152−msgstr ""
155+msgstr "Rādīt paroli"
153156
154157#: qml/Notifications/NotificationMenuItemFactory.qml:103
155158msgid "Please enter SIM PIN"
@@ -159,7 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr "Meklēt"
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165−msgstr ""
168+msgstr "Lūdzu ievadiet %1"
po/ml.po+10−23
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2013-11-23 11:44+0000\n"
12−"Last-Translator: STyM Alfazz <Unknown>\n"
12+"Last-Translator: Stym alfaZ <Unknown>\n"
1313"Language-Team: Malayalam <ml@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -87,7 +86,7 @@ msgstr ""
8786msgid "See less"
8887msgstr ""
8988
90−#: qml/Dash/DashApps.qml:38
89+#: qml/Dash/DashApps.qml:37
9190msgid "Recent"
9291msgstr ""
9392
@@ -116,6 +115,10 @@ msgstr "ഒരു അവലോകനം ചേര്‍ക്കുക"
116115msgid "Send"
117116msgstr "അയയ്‌ക്കുക"
118117
118+#: qml/Greeter/Greeter.qml:151
119+msgid "Swipe to unlock"
120+msgstr ""
121+
119122#: qml/Greeter/Lockscreen.qml:149
120123msgid "Emergency Call"
121124msgstr "അടിയന്തിര വിളി"
@@ -161,23 +164,7 @@ msgstr ""
161164msgid "Search"
162165msgstr "തിരയുക"
163166
164−#: qml/Shell.qml:417
167+#: qml/Shell.qml:348
165168#, qt-format
166169msgid "Please enter %1"
167170msgstr "ദയവായി %1 നല്‍കുക"
168−
169−#, qt-format
170−#~ msgid "(%1)"
171−#~ msgstr "(%1)"
172−
173−#~ msgid "Comments:"
174−#~ msgstr "അഭിപ്രായങ്ങള്‍:"
175−
176−#~ msgid "Review"
177−#~ msgstr "അവലോകനം"
178−
179−#, qt-format
180−#~ msgid "%1 review"
181−#~ msgid_plural "%1 reviews"
182−#~ msgstr[0] "%1 അവലോകനം"
183−#~ msgstr[1] "%1 അവലോകനങ്ങള്‍"
po/mr.po+9−6
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\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"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr ""
114113msgid "Send"
115114msgstr ""
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr ""
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr ""
po/ms.po+9−22
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\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"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr "Tambah ulasan"
114113msgid "Send"
115114msgstr "Hantar"
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr "panggilan Kecemasan"
@@ -159,23 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr "Gelintar"
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr "Sila masukkan %1"
166−
167−#~ msgid "Comments:"
168−#~ msgstr "Ulasan:"
169−
170−#~ msgid "Review"
171−#~ msgstr "Tinjauan"
172−
173−#, qt-format
174−#~ msgid "%1 review"
175−#~ msgid_plural "%1 reviews"
176−#~ msgstr[0] "%1 ulasan"
177−#~ msgstr[1] "%1 ulasan"
178−
179−#, qt-format
180−#~ msgid "(%1)"
181−#~ msgstr "(%1)"
po/my.po+9−13
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\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"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr ""
114113msgid "Send"
115114msgstr "ပို့မည်"
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr "အရေးပေါ်ခေါ်မည်"
@@ -159,14 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr "ရှာဖွေ"
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr "%1ကိုရိုက်ထည့်ပါ"
166−
167−#, qt-format
168−#~ msgid "(%1)"
169−#~ msgstr "(%1)"
170−
171−#~ msgid "Comments:"
172−#~ msgstr "မှတ်ချက်များ-"
po/nb.po+9−6
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2013-06-27 07:02+0000\n"
1212"Last-Translator: Joakim Langvand <jlangvand@gmail.com>\n"
1313"Language-Team: Norwegian Bokmal <nb@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr ""
114113msgid "Send"
115114msgstr ""
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr "Søk"
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr ""
po/nl.po+9−22
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-01-15 16:42+0000\n"
1212"Last-Translator: Hannie Dumoleyn <Unknown>\n"
1313"Language-Team: Dutch <nl@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr "Voeg recensie toe"
114113msgid "Send"
115114msgstr "Versturen"
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr "Noodoproep"
@@ -159,23 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr "Zoeken"
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr "Voer %1 in"
166−
167−#, qt-format
168−#~ msgid "%1 review"
169−#~ msgid_plural "%1 reviews"
170−#~ msgstr[0] "%1 recensie"
171−#~ msgstr[1] "%1 recensies"
172−
173−#, qt-format
174−#~ msgid "(%1)"
175−#~ msgstr "(%1)"
176−
177−#~ msgid "Comments:"
178−#~ msgstr "Reacties:"
179−
180−#~ msgid "Review"
181−#~ msgstr "Recensie"
po/pl.po+9−24
@@ -7,17 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-01-10 11:38+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Polish <pl@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
18−"|| n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2119
2220#: plugins/Unity/Launcher/launcheritem.cpp:43
2321#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -88,7 +86,7 @@ msgstr ""
8886msgid "See less"
8987msgstr ""
9088
91−#: qml/Dash/DashApps.qml:38
89+#: qml/Dash/DashApps.qml:37
9290msgid "Recent"
9391msgstr ""
9492
@@ -117,6 +115,10 @@ msgstr "Dodaj recenzję"
117115msgid "Send"
118116msgstr "Wyślij"
119117
118+#: qml/Greeter/Greeter.qml:151
119+msgid "Swipe to unlock"
120+msgstr ""
121+
120122#: qml/Greeter/Lockscreen.qml:149
121123msgid "Emergency Call"
122124msgstr "Telefon ratunkowy"
@@ -162,24 +164,7 @@ msgstr ""
162164msgid "Search"
163165msgstr "Szukaj"
164166
165−#: qml/Shell.qml:417
167+#: qml/Shell.qml:348
166168#, qt-format
167169msgid "Please enter %1"
168170msgstr "Wprowadź %1"
169−
170−#~ msgid "Comments:"
171−#~ msgstr "Komentarze:"
172−
173−#~ msgid "Review"
174−#~ msgstr "Recenzja"
175−
176−#, qt-format
177−#~ msgid "%1 review"
178−#~ msgid_plural "%1 reviews"
179−#~ msgstr[0] "%1 opinia"
180−#~ msgstr[1] "%1 opinie"
181−#~ msgstr[2] "%1 opinii"
182−
183−#, qt-format
184−#~ msgid "(%1)"
185−#~ msgstr "(%1)"
po/pt.po+9−6
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-01-14 19:18+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Portuguese <pt@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr ""
114113msgid "Send"
115114msgstr ""
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr ""
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr ""
po/pt_BR.po+9−22
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-01-18 23:24+0000\n"
1212"Last-Translator: Fábio Nogueira <deb-user-ba@ubuntu.com>\n"
1313"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -87,7 +86,7 @@ msgstr ""
8786msgid "See less"
8887msgstr ""
8988
90−#: qml/Dash/DashApps.qml:38
89+#: qml/Dash/DashApps.qml:37
9190msgid "Recent"
9291msgstr ""
9392
@@ -116,6 +115,10 @@ msgstr "Adicionar uma análise"
116115msgid "Send"
117116msgstr "Enviar"
118117
118+#: qml/Greeter/Greeter.qml:151
119+msgid "Swipe to unlock"
120+msgstr ""
121+
119122#: qml/Greeter/Lockscreen.qml:149
120123msgid "Emergency Call"
121124msgstr "Chamada de emergência"
@@ -161,23 +164,7 @@ msgstr ""
161164msgid "Search"
162165msgstr "Pesquisar"
163166
164−#: qml/Shell.qml:417
167+#: qml/Shell.qml:348
165168#, qt-format
166169msgid "Please enter %1"
167170msgstr "Por favor, digite %1"
168−
169−#, qt-format
170−#~ msgid "(%1)"
171−#~ msgstr "(%1)"
172−
173−#, qt-format
174−#~ msgid "%1 review"
175−#~ msgid_plural "%1 reviews"
176−#~ msgstr[0] "%1 análise"
177−#~ msgstr[1] "%1 análises"
178−
179−#~ msgid "Comments:"
180−#~ msgstr "Comentários:"
181−
182−#~ msgid "Review"
183−#~ msgstr "Revisão"
po/ro.po+9−7
@@ -7,17 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2013-06-27 07:53+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Romanian <ro@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
18−"== 0) && (n != 0))) ? 2: 1));\n"
19−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2119
2220#: plugins/Unity/Launcher/launcheritem.cpp:43
2321#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -86,7 +84,7 @@ msgstr ""
8684msgid "See less"
8785msgstr ""
8886
89−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
9088msgid "Recent"
9189msgstr ""
9290
@@ -115,6 +113,10 @@ msgstr ""
115113msgid "Send"
116114msgstr ""
117115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
118120#: qml/Greeter/Lockscreen.qml:149
119121msgid "Emergency Call"
120122msgstr ""
@@ -160,7 +162,7 @@ msgstr ""
160162msgid "Search"
161163msgstr "Căutare"
162164
163−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
164166#, qt-format
165167msgid "Please enter %1"
166168msgstr ""
po/ru.po+9−5
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-04-03 13:07+0000\n"
1212"Last-Translator: Zonov Roman <Unknown>\n"
1313"Language-Team: Russian <ru@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-04-04 07:12+0000\n"
18−"X-Generator: Launchpad (build 16976)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -91,7 +91,7 @@ msgstr "Подробнее"
9191msgid "See less"
9292msgstr "Вкратце"
9393
94−#: qml/Dash/DashApps.qml:38
94+#: qml/Dash/DashApps.qml:37
9595msgid "Recent"
9696msgstr "Недавние"
9797
@@ -120,6 +120,10 @@ msgstr "Добавьте отзыв"
120120msgid "Send"
121121msgstr "Отправить"
122122
123+#: qml/Greeter/Greeter.qml:151
124+msgid "Swipe to unlock"
125+msgstr ""
126+
123127#: qml/Greeter/Lockscreen.qml:149
124128msgid "Emergency Call"
125129msgstr "Экстренный вызов"
@@ -165,7 +169,7 @@ msgstr "Введите PIN код"
165169msgid "Search"
166170msgstr "Поиск"
167171
168−#: qml/Shell.qml:417
172+#: qml/Shell.qml:348
169173#, qt-format
170174msgid "Please enter %1"
171175msgstr "Пожалуйста, введите %1"
po/shn.po+9−6
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2013-10-07 11:46+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Shan <shn@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=(n == 1) ? 0 : 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr ""
114113msgid "Send"
115114msgstr ""
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr ""
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr ""
po/si.po+9−6
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\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"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr ""
114113msgid "Send"
115114msgstr ""
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr ""
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr ""
po/sl.po+9−25
@@ -7,17 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-02-21 16:38+0000\n"
1212"Last-Translator: Damir Jerovšek <Unknown>\n"
1313"Language-Team: Slovenian <sl@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
18−"n%100==4 ? 3 : 0);\n"
19−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2119
2220#: plugins/Unity/Launcher/launcheritem.cpp:43
2321#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -90,7 +88,7 @@ msgstr "Pokaži več"
9088msgid "See less"
9189msgstr "Pokaži manj"
9290
93−#: qml/Dash/DashApps.qml:38
91+#: qml/Dash/DashApps.qml:37
9492msgid "Recent"
9593msgstr ""
9694
@@ -119,6 +117,10 @@ msgstr "Dodaj oceno"
119117msgid "Send"
120118msgstr "Pošlji"
121119
120+#: qml/Greeter/Greeter.qml:151
121+msgid "Swipe to unlock"
122+msgstr ""
123+
122124#: qml/Greeter/Lockscreen.qml:149
123125msgid "Emergency Call"
124126msgstr "Klic v sili"
@@ -164,25 +166,7 @@ msgstr "Vnesite PIN kartice SIM"
164166msgid "Search"
165167msgstr "Iskanje"
166168
167−#: qml/Shell.qml:417
169+#: qml/Shell.qml:348
168170#, qt-format
169171msgid "Please enter %1"
170172msgstr "Vnesite %1"
171−
172−#~ msgid "Review"
173−#~ msgstr "Ocena"
174−
175−#~ msgid "Comments:"
176−#~ msgstr "Opombe:"
177−
178−#, qt-format
179−#~ msgid "%1 review"
180−#~ msgid_plural "%1 reviews"
181−#~ msgstr[0] "%1 ocen"
182−#~ msgstr[1] "%1 ocena"
183−#~ msgstr[2] "%1 oceni"
184−#~ msgstr[3] "%1 ocene"
185−
186−#, qt-format
187−#~ msgid "(%1)"
188−#~ msgstr "(%1)"
po/sq.po+9−16
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-01-15 13:51+0000\n"
1212"Last-Translator: Besmir Zanaj <besmirzanaj@gmail.com>\n"
1313"Language-Team: Albanian <sq@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -86,7 +85,7 @@ msgstr ""
8685msgid "See less"
8786msgstr ""
8887
89−#: qml/Dash/DashApps.qml:38
88+#: qml/Dash/DashApps.qml:37
9089msgid "Recent"
9190msgstr ""
9291
@@ -115,6 +114,10 @@ msgstr "Shto një rishikim"
115114msgid "Send"
116115msgstr ""
117116
117+#: qml/Greeter/Greeter.qml:151
118+msgid "Swipe to unlock"
119+msgstr ""
120+
118121#: qml/Greeter/Lockscreen.qml:149
119122msgid "Emergency Call"
120123msgstr ""
@@ -160,17 +163,7 @@ msgstr ""
160163msgid "Search"
161164msgstr ""
162165
163−#: qml/Shell.qml:417
166+#: qml/Shell.qml:348
164167#, qt-format
165168msgid "Please enter %1"
166169msgstr ""
167−
168−#, qt-format
169−#~ msgid "%1 review"
170−#~ msgid_plural "%1 reviews"
171−#~ msgstr[0] "%1 rishikim"
172−#~ msgstr[1] "%1 rishikime"
173−
174−#, qt-format
175−#~ msgid "(%1)"
176−#~ msgstr "(%1)"
po/sr.po+9−7
@@ -7,17 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2013-06-27 09:19+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Serbian <sr@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18−"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2119
2220#: plugins/Unity/Launcher/launcheritem.cpp:43
2321#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -86,7 +84,7 @@ msgstr ""
8684msgid "See less"
8785msgstr ""
8886
89−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
9088msgid "Recent"
9189msgstr ""
9290
@@ -115,6 +113,10 @@ msgstr ""
115113msgid "Send"
116114msgstr ""
117115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
118120#: qml/Greeter/Lockscreen.qml:149
119121msgid "Emergency Call"
120122msgstr ""
@@ -160,7 +162,7 @@ msgstr ""
160162msgid "Search"
161163msgstr "Претрага"
162164
163−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
164166#, qt-format
165167msgid "Please enter %1"
166168msgstr ""
po/sv.po+9−6
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2013-06-26 22:36+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Swedish <sv@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr ""
114113msgid "Send"
115114msgstr ""
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr ""
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr ""
po/sw.po+9−9
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-01-14 19:28+0000\n"
1212"Last-Translator: Damas Mlabwa <Unknown>\n"
1313"Language-Team: Swahili <sw@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr ""
114113msgid "Send"
115114msgstr "Tuma"
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr ""
@@ -159,10 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr "Tafuta"
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr ""
166−
167−#~ msgid "Comments:"
168−#~ msgstr "Maoni:"
po/ta.po+10−23
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2013-10-24 11:36+0000\n"
12−"Last-Translator: Arun Kumar -அருண் குமார் <thangam.arunx@gmail.com>\n"
12+"Last-Translator: Arun Kumar - அருண் குமார் <thangam.arunx@gmail.com>\n"
1313"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019"Language: ta\n"
2120
2221#: plugins/Unity/Launcher/launcheritem.cpp:43
@@ -88,7 +87,7 @@ msgstr ""
8887msgid "See less"
8988msgstr ""
9089
91−#: qml/Dash/DashApps.qml:38
90+#: qml/Dash/DashApps.qml:37
9291msgid "Recent"
9392msgstr ""
9493
@@ -117,6 +116,10 @@ msgstr "ஒரு பரிசீலனையை சேர்"
117116msgid "Send"
118117msgstr "அனுப்பு"
119118
119+#: qml/Greeter/Greeter.qml:151
120+msgid "Swipe to unlock"
121+msgstr ""
122+
120123#: qml/Greeter/Lockscreen.qml:149
121124msgid "Emergency Call"
122125msgstr "அவசர அழைப்பு"
@@ -162,23 +165,7 @@ msgstr ""
162165msgid "Search"
163166msgstr "தெடு"
164167
165−#: qml/Shell.qml:417
168+#: qml/Shell.qml:348
166169#, qt-format
167170msgid "Please enter %1"
168171msgstr "தயவுச்செய்து %1 உள்ளிடு"
169−
170−#, qt-format
171−#~ msgid "(%1)"
172−#~ msgstr "(%1)"
173−
174−#, qt-format
175−#~ msgid "%1 review"
176−#~ msgid_plural "%1 reviews"
177−#~ msgstr[0] "%1 பரிசீலனை"
178−#~ msgstr[1] "%1 பரிசீலனைகள்"
179−
180−#~ msgid "Review"
181−#~ msgstr "மறுஆய்வு"
182−
183−#~ msgid "Comments:"
184−#~ msgstr "கருத்துகள்:"
po/te.po+9−6
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2013-06-27 09:57+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Telugu <te@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr ""
114113msgid "Send"
115114msgstr ""
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr ""
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr ""
po/tr.po+9−22
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-03-05 08:54+0000\n"
1212"Last-Translator: Muhammed Yüce <muhammedyuceee@gmail.com>\n"
1313"Language-Team: Turkish <tr@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -88,7 +87,7 @@ msgstr "Daha fazlası"
8887msgid "See less"
8988msgstr "Daha azını gör"
9089
91−#: qml/Dash/DashApps.qml:38
90+#: qml/Dash/DashApps.qml:37
9291msgid "Recent"
9392msgstr ""
9493
@@ -117,6 +116,10 @@ msgstr "Bir inceleme ekle"
117116msgid "Send"
118117msgstr "Gönder"
119118
119+#: qml/Greeter/Greeter.qml:151
120+msgid "Swipe to unlock"
121+msgstr ""
122+
120123#: qml/Greeter/Lockscreen.qml:149
121124msgid "Emergency Call"
122125msgstr "Acil Arama"
@@ -162,23 +165,7 @@ msgstr "Lütfen SIM PIN'inizi girin"
162165msgid "Search"
163166msgstr "Ara"
164167
165−#: qml/Shell.qml:417
168+#: qml/Shell.qml:348
166169#, qt-format
167170msgid "Please enter %1"
168171msgstr "Lütfen %1 girin"
169−
170−#~ msgid "Review"
171−#~ msgstr "İnceleme"
172−
173−#, qt-format
174−#~ msgid "%1 review"
175−#~ msgid_plural "%1 reviews"
176−#~ msgstr[0] "%1 inceleme"
177−#~ msgstr[1] "%1 inceleme"
178−
179−#, qt-format
180−#~ msgid "(%1)"
181−#~ msgstr "(%1)"
182−
183−#~ msgid "Comments:"
184−#~ msgstr "Yorumlar:"
po/ug.po+15−27
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11−"PO-Revision-Date: 2014-02-15 12:09+0000\n"
12−"Last-Translator: Gheyret T.Kenji <Unknown>\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11+"PO-Revision-Date: 2014-04-22 05:46+0000\n"
12+"Last-Translator: abdurahman <Unknown>\n"
1313"Language-Team: Uyghur <ug@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -87,22 +86,22 @@ msgstr "جىقراق كۆرۈش"
8786msgid "See less"
8887msgstr "ئازراق كۆرۈش"
8988
90−#: qml/Dash/DashApps.qml:38
89+#: qml/Dash/DashApps.qml:37
9190msgid "Recent"
92−msgstr ""
91+msgstr "يېقىنقى"
9392
9493#: qml/Dash/PreviewListView.qml:52
9594#, qt-format
9695msgid "%1 Preview"
97−msgstr ""
96+msgstr "%1 ئالدىن كۆرۈپ بىقىش"
9897
9998#: qml/Dash/Previews/PreviewActionCombo.qml:34
10099msgid "More..."
101−msgstr ""
100+msgstr "تېخىمۇ كۆپ…"
102101
103102#: qml/Dash/Previews/PreviewActionCombo.qml:34
104103msgid "Less..."
105−msgstr ""
104+msgstr "ئازراق..."
106105
107106#: qml/Dash/Previews/PreviewRatingInput.qml:81
108107msgid "Rate this"
@@ -116,6 +115,10 @@ msgstr "باھا قوشۇش"
116115msgid "Send"
117116msgstr "ئەۋەت"
118117
118+#: qml/Greeter/Greeter.qml:151
119+msgid "Swipe to unlock"
120+msgstr ""
121+
119122#: qml/Greeter/Lockscreen.qml:149
120123msgid "Emergency Call"
121124msgstr "جىددىي تېلېفون"
@@ -161,22 +164,7 @@ msgstr "پارولىنى كىرگۈزۈڭPINكارتىڭىزنىڭ SIM"
161164msgid "Search"
162165msgstr "ئىزدە"
163166
164−#: qml/Shell.qml:417
167+#: qml/Shell.qml:348
165168#, qt-format
166169msgid "Please enter %1"
167170msgstr "%1 نى كىرگۈزۈڭ"
168−
169−#, qt-format
170−#~ msgid "%1 review"
171−#~ msgid_plural "%1 reviews"
172−#~ msgstr[0] "%1 باھا"
173−
174−#, qt-format
175−#~ msgid "(%1)"
176−#~ msgstr "(%1)"
177−
178−#~ msgid "Comments:"
179−#~ msgstr "ئىنكاس:"
180−
181−#~ msgid "Review"
182−#~ msgstr "تەكشۈر"
po/uk.po+9−24
@@ -7,17 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2013-11-23 12:37+0000\n"
1212"Last-Translator: Ignat Kizenko <Unknown>\n"
1313"Language-Team: Ukrainian <uk@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18−"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2119
2220#: plugins/Unity/Launcher/launcheritem.cpp:43
2321#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -89,7 +87,7 @@ msgstr ""
8987msgid "See less"
9088msgstr ""
9189
92−#: qml/Dash/DashApps.qml:38
90+#: qml/Dash/DashApps.qml:37
9391msgid "Recent"
9492msgstr ""
9593
@@ -118,6 +116,10 @@ msgstr "Додати рецензію"
118116msgid "Send"
119117msgstr "Надіслати"
120118
119+#: qml/Greeter/Greeter.qml:151
120+msgid "Swipe to unlock"
121+msgstr ""
122+
121123#: qml/Greeter/Lockscreen.qml:149
122124msgid "Emergency Call"
123125msgstr "Терміновий виклик"
@@ -163,24 +165,7 @@ msgstr ""
163165msgid "Search"
164166msgstr "Пошук"
165167
166−#: qml/Shell.qml:417
168+#: qml/Shell.qml:348
167169#, qt-format
168170msgid "Please enter %1"
169171msgstr "Будь ласка, введіть %1"
170−
171−#~ msgid "Comments:"
172−#~ msgstr "Коментарі:"
173−
174−#~ msgid "Review"
175−#~ msgstr "Рецензія"
176−
177−#, qt-format
178−#~ msgid "%1 review"
179−#~ msgid_plural "%1 reviews"
180−#~ msgstr[0] "%1 рецензія"
181−#~ msgstr[1] "%1 рецензії"
182−#~ msgstr[2] "%1 рецензій"
183−
184−#, qt-format
185−#~ msgid "(%1)"
186−#~ msgstr "(%1)"
po/unity8.pot+7−3
@@ -8,7 +8,7 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity8\n"
1010"Report-Msgid-Bugs-To: \n"
11−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11+"POT-Creation-Date: 2014-04-10 11:13-0400\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"
@@ -84,7 +84,7 @@ msgstr ""
8484msgid "See less"
8585msgstr ""
8686
87−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8888msgid "Recent"
8989msgstr ""
9090
@@ -113,6 +113,10 @@ msgstr ""
113113msgid "Send"
114114msgstr ""
115115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
116120#: qml/Greeter/Lockscreen.qml:149
117121msgid "Emergency Call"
118122msgstr ""
@@ -158,7 +162,7 @@ msgstr ""
158162msgid "Search"
159163msgstr ""
160164
161−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
162166#, qt-format
163167msgid "Please enter %1"
164168msgstr ""
po/vi.po+9−6
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\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"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr ""
114113msgid "Send"
115114msgstr ""
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr ""
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr ""
po/xh.po+9−6
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\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"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr ""
114113msgid "Send"
115114msgstr ""
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr ""
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr ""
po/zh_CN.po+9−6
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2013-10-09 13:51+0000\n"
1212"Last-Translator: Aron Xu <Unknown>\n"
1313"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr ""
114113msgid "Send"
115114msgstr ""
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr "搜索"
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr ""
po/zh_HK.po+9−21
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-01-25 13:32+0000\n"
1212"Last-Translator: Daniel Cheung <daniel.2345@hotmail.com>\n"
1313"Language-Team: Chinese (Hong Kong) <zh_HK@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr "新增評論"
114113msgid "Send"
115114msgstr "傳送"
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr "緊急電話"
@@ -159,22 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr "搜尋"
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr "請輸入 %1"
166−
167−#~ msgid "Comments:"
168−#~ msgstr "評論:"
169−
170−#~ msgid "Review"
171−#~ msgstr "評論"
172−
173−#, qt-format
174−#~ msgid "%1 review"
175−#~ msgid_plural "%1 reviews"
176−#~ msgstr[0] "%1 評論"
177−
178−#, qt-format
179−#~ msgid "(%1)"
180−#~ msgstr "(%1)"
po/zh_TW.po+9−21
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
1111"PO-Revision-Date: 2014-01-16 06:04+0000\n"
1212"Last-Translator: Henry Yang <henry9846@hotmail.com>\n"
1313"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
8988msgid "Recent"
9089msgstr ""
9190
@@ -114,6 +113,10 @@ msgstr "新增回覆"
114113msgid "Send"
115114msgstr "發送"
116115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117120#: qml/Greeter/Lockscreen.qml:149
118121msgid "Emergency Call"
119122msgstr "緊急連絡"
@@ -159,22 +162,7 @@ msgstr ""
159162msgid "Search"
160163msgstr "搜尋"
161164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163166#, qt-format
164167msgid "Please enter %1"
165168msgstr ""
166−
167−#~ msgid "Comments:"
168−#~ msgstr "備註:"
169−
170−#~ msgid "Review"
171−#~ msgstr "回覆"
172−
173−#, qt-format
174−#~ msgid "%1 review"
175−#~ msgid_plural "%1 reviews"
176−#~ msgstr[0] "%1 回覆"
177−
178−#, qt-format
179−#~ msgid "(%1)"
180−#~ msgstr "(%1)"
qml/Bottombar/Bottombar.qmldeleted−227
@@ -1,227 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import "../Components"
19−import Utils 0.1
20−import Unity.Application 0.1
21−import Ubuntu.Gestures 0.1
22−import Ubuntu.Components 0.1
23−
24−Item {
25− id: bottombar
26−
27− // Whether there's an application on foreground (as opposed to have shell's Dash on foreground)
28− property bool applicationIsOnForeground
29−
30− property variant theHud
31− property bool enabled: false
32− property bool preventHiding: dragArea.dragging
33− readonly property real bottomEdgeButtonCenterDistance: units.gu(34)
34−
35− state: "hidden"
36−
37− function hide() {
38− dismissTimer.stop()
39− bottombar.state = "hidden"
40− }
41−
42− onApplicationIsOnForegroundChanged: {
43− if (!applicationIsOnForeground) {
44− hide()
45− }
46− }
47−
48− onStateChanged: {
49− if (state == "hidden") {
50− dismissTimer.stop()
51− bottomBarVisibilityCommunicatorShell.forceHidden = false
52− } else {
53− dismissTimer.restart()
54− }
55− }
56−
57− onPreventHidingChanged: {
58− if (!preventHiding) {
59− if (state == "hint" || state == "reveal")
60− hide()
61− }
62−
63− if (dismissTimer.running) {
64− dismissTimer.restart();
65− }
66− }
67−
68− Timer {
69− id: dismissTimer
70− interval: 1000
71− onTriggered: {
72− if (!bottombar.preventHiding) {
73− bottombar.state = "hidden"
74− } else {
75− dismissTimer.restart()
76− }
77− }
78− }
79−
80− HudButton {
81− id: hudButton
82−
83− readonly property bool centeredHud: parent.width < units.gu(68) // Nexus 7 has 67 gu width
84−
85− x: centeredHud ? parent.width / 2 - width / 2 : MathUtils.clamp(dragArea.touchStartX - (width / 2), 0, bottombar.width - width)
86− y: bottombar.height - bottomEdgeButtonCenterDistance - (height / 2) - bottomMargin
87− z: 1
88− visible: opacity != 0
89−
90− mouseOver: {
91− if (dragArea.status === DirectionalDragArea.Recognized) {
92− var touchLocal = mapFromItem(dragArea, dragArea.touchX, dragArea.touchY)
93− return touchLocal.x > 0 && touchLocal.x < width
94− && touchLocal.y > 0 && touchLocal.y < height
95− } else {
96− return false
97− }
98− }
99−
100− onClicked: theHud.show()
101−
102− Behavior on bottomMargin {
103− NumberAnimation{duration: hudButton.opacity < 0.01 ? 200 : 70; easing.type: Easing.OutQuart}
104− }
105−
106− Behavior on opacity {
107− NumberAnimation{duration: 200; easing.type: Easing.OutCubic}
108− }
109− }
110−
111− Connections {
112− target: theHud
113− onShownChanged: {
114− bottomBarVisibilityCommunicatorShell.forceHidden = theHud.shown
115− if (theHud.shown) {
116− bottombar.state = "hidden"
117− }
118− }
119− }
120−
121− EdgeDragArea {
122− id: dragArea
123− objectName: "hudDragArea"
124− width: parent.width
125− height: shell.edgeSize
126− anchors.bottom: parent.bottom
127−
128− distanceThreshold: units.gu(8)
129− enabled: !theHud.shown && bottombar.enabled && applicationIsOnForeground
130− direction: Direction.Upwards
131− maxSilenceTime: 2000
132−
133− property int previousStatus: -1
134− property real touchStartX: -1
135−
136− readonly property real distanceFromThreshold: (-distance) - distanceThreshold // distance is negative
137− readonly property real revealDistance: units.gu(2)
138− readonly property real commitDistance: units.gu(6)
139− readonly property real commitProgress: MathUtils.clamp(distanceFromThreshold / commitDistance, 0, 1)
140−
141− onStatusChanged: {
142− if (status === DirectionalDragArea.WaitingForTouch) {
143− if (previousStatus == DirectionalDragArea.Recognized) {
144− if (hudButton.mouseOver) {
145− hudButton.clicked()
146− }
147− }
148− } else if (status === DirectionalDragArea.Undecided) {
149− if (!hudButton.centeredHud) {
150− touchStartX = touchX
151− }
152− } else if (status === DirectionalDragArea.Recognized) {
153− bottombar.state = "hint"
154− }
155− previousStatus = status
156− }
157−
158− onDistanceChanged: {
159− if (status === DirectionalDragArea.Recognized) {
160− if (distanceFromThreshold > commitDistance)
161− bottombar.state = "shown"
162− else if (distanceFromThreshold > revealDistance)
163− bottombar.state = "reveal"
164− }
165− }
166− }
167−
168− Item {
169− id: dismissArea
170− anchors {
171− top: parent.top
172− left: parent.left
173− right: parent.right
174− }
175− height: parent.height - bottomBarVisibilityCommunicatorShell.position
176−
177− MouseArea {
178− anchors.fill: parent
179− enabled: bottombar.state == "shown"
180− onPressed: {
181− bottomBarVisibilityCommunicatorShell.forceHidden = true
182− bottombar.state = "hidden"
183− }
184− }
185−
186− InputFilterArea {
187− anchors.fill: parent
188− blockInput: (hudButton.opacity == 1)
189− }
190− }
191−
192− MouseArea {
193− anchors {
194− top: dismissArea.bottom
195− left: parent.left
196− right: parent.right
197− bottom: parent.bottom
198− }
199− enabled: bottombar.state == "shown" && bottomBarVisibilityCommunicatorShell.position > 0
200− onPressed: {
201− bottombar.state = "hidden"
202− }
203− }
204−
205− states: [
206− State {
207− name: "hidden"
208− PropertyChanges { target: hudButton; opacity: 0 }
209− PropertyChanges { target: hudButton; bottomMargin: units.gu(-2) }
210− },
211− State {
212− name: "hint"
213− extend: "hidden"
214− PropertyChanges { target: hudButton; opacity: 0.5 }
215− },
216− State {
217− name: "reveal"
218− extend: "hint"
219− PropertyChanges { target: hudButton; bottomMargin: units.gu(-2) + units.gu(2) * dragArea.commitProgress }
220− },
221− State {
222− name: "shown"
223− PropertyChanges { target: hudButton; opacity: 1 }
224− PropertyChanges { target: hudButton; bottomMargin: units.gu(0) }
225− }
226− ]
227−}
qml/Bottombar/HudButton.qmldeleted−64
@@ -1,64 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−
20−Item {
21− id: item
22−
23− property bool mouseOver
24−
25− property int bottomMargin: units.gu(2)
26−
27− signal clicked()
28−
29− readonly property real scaleOnMouseOver: 1.2
30−
31− width: hudButton.width * scaleOnMouseOver
32− height: hudButton.height * scaleOnMouseOver
33−
34− Item {
35− id: hudButton
36−
37− anchors.centerIn: parent
38− height: units.gu(12)
39− width: height
40− opacity: item.mouseOver || abstractButton.pressed ? 1 : 0.7
41− scale: item.mouseOver || abstractButton.pressed ? scaleOnMouseOver : 1
42− Behavior on opacity {NumberAnimation{duration: 200; easing.type: Easing.OutQuart}}
43− Behavior on scale {NumberAnimation{duration: 200; easing.type: Easing.OutQuart}}
44−
45− AbstractButton {
46− id: abstractButton
47− anchors.fill: parent
48− style: Image {
49− anchors.fill: parent
50− source: "graphics/hud_invoke_button_active.png"
51− }
52−
53− onClicked: item.clicked()
54− }
55−
56− Image {
57− width: units.gu(4)
58− height: width
59− source: "graphics/hud.png"
60− anchors.centerIn: parent
61− fillMode: Image.PreserveAspectFit
62− }
63− }
64−}
qml/Bottombar/graphics/hud@20.pngdeleted

Binary file not shown.

qml/Bottombar/graphics/hud_invoke_button_active@20.pngdeleted

Binary file not shown.

qml/CMakeLists.txt−1
@@ -5,7 +5,6 @@ install(FILES ${QML_JS_FILES}
55 )
66
77set(QML_DIRS
8− Bottombar
98 Components
109 Dash
1110 graphics
qml/Components/AnimationControllerWithSignals.qmldeleted−64
@@ -1,64 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−
19−AnimationController {
20− signal animationCompletedAtBeginning()
21− signal animationCompletedAtEnd()
22− readonly property bool completed: progress == 1.0 || progress == 0.0
23− property bool completing: false
24−
25− function __completeAtBeginning() {
26− completing = false;
27− animationCompletedAtBeginning();
28− }
29−
30− function __completeAtEnd() {
31− completing = false;
32− animationCompletedAtEnd();
33− }
34−
35− function completeToBeginningWithSignal() {
36− if (progress == 0.0) {
37− __completeAtBeginning()
38− } else {
39− completing = true;
40− completeToBeginning();
41− }
42− }
43−
44− function completeToEndWithSignal() {
45− if (progress == 1.0) {
46− __completeAtEnd()
47− } else {
48− completing = true;
49− completeToEnd();
50− }
51− }
52−
53− onProgressChanged: {
54− if (!completing) {
55− return;
56− }
57−
58− if (progress == 0.0) {
59− __completeAtBeginning()
60− } else if (progress == 1.0) {
61− __completeAtEnd()
62− }
63− }
64−}
qml/Components/Carousel.qml+13−19
@@ -75,6 +75,7 @@ Item {
7575 The scaling of the items is controlled by the variable continuousIndex, described below. */
7676 ListView {
7777 id: listView
78+ objectName: "listView"
7879
7980 property int highlightIndex: -1
8081 property real minimumTileWidth: 0
@@ -148,15 +149,19 @@ Item {
148149 maximumFlickVelocity: Math.max(2500 * Math.pow(realWidth / referenceWidth, 1.5), 2500) // 2500 is platform default
149150 orientation: ListView.Horizontal
150151
151− function itemClicked(index, delegateItem) {
152− listView.currentIndex = index
153− var x = CarouselJS.getXFromContinuousIndex(index,
152+ function getXFromContinuousIndex(index) {
153+ return CarouselJS.getXFromContinuousIndex(index,
154154 realWidth,
155− realContentWidth,
155+ footerItem.x,
156156 tileWidth,
157157 gapToMiddlePhase,
158158 gapToEndPhase,
159159 carousel.drawBuffer)
160+ }
161+
162+ function itemClicked(index, delegateItem) {
163+ listView.currentIndex = index
164+ var x = getXFromContinuousIndex(index);
160165
161166 if (Math.abs(x - contentX) < 1 && delegateItem !== undefined) {
162167 /* We're clicking the selected item and
@@ -174,13 +179,7 @@ Item {
174179 }
175180
176181 function itemPressAndHold(index, delegateItem) {
177− var x = CarouselJS.getXFromContinuousIndex(index,
178− realWidth,
179− realContentWidth,
180− tileWidth,
181− gapToMiddlePhase,
182− gapToEndPhase,
183− carousel.drawBuffer);
182+ var x = getXFromContinuousIndex(index);
184183
185184 if (Math.abs(x - contentX) < 1 && delegateItem !== undefined) {
186185 /* We're pressAndHold the selected item and
@@ -209,22 +208,17 @@ Item {
209208 newContentX = disabledNewContentX
210209 }
211210 onMovementEnded: {
212− if (realContentX > 0 && realContentX < realContentWidth - realWidth)
211+ if (realContentX > 0)
213212 stepAnimation.start()
214213 }
215214
216215 SmoothedAnimation {
217216 id: stepAnimation
217+ objectName: "stepAnimation"
218218
219219 target: listView
220220 property: "contentX"
221− to: CarouselJS.getXFromContinuousIndex(listView.selectedIndex,
222− listView.realWidth,
223− listView.realContentWidth,
224− listView.tileWidth,
225− listView.gapToMiddlePhase,
226− listView.gapToEndPhase,
227− carousel.drawBuffer)
221+ to: listView.getXFromContinuousIndex(listView.selectedIndex)
228222 duration: 450
229223 velocity: 200
230224 easing.type: Easing.InOutQuad
qml/Components/FilterGrid.qml+38−24
@@ -28,11 +28,6 @@ import "../Components"
2828Item {
2929 id: root
3030
31− /* If true, the number of elements displayed will be limited by collapsedRowCount.
32− If false, all elements will be displayed, effectively looking the same as a regular
33− ResponsiveGridView. */
34− property bool filter: true
35−
3631 /* Whether, when collapsed, a button should be displayed enabling the user to expand
3732 the grid to its full size. */
3833 readonly property bool expandable: model.count > rowsWhenCollapsed * iconTileGrid.columns
@@ -59,35 +54,54 @@ Item {
5954 property alias cellHeight: iconTileGrid.cellHeight
6055 property alias delegateCreationBegin: iconTileGrid.delegateCreationBegin
6156 property alias delegateCreationEnd: iconTileGrid.delegateCreationEnd
57+ readonly property alias originY: iconTileGrid.originY
6258 readonly property alias flicking: iconTileGrid.flicking
6359 readonly property alias moving: iconTileGrid.moving
6460 readonly property alias pressDelay: iconTileGrid.pressDelay
6561 property alias highlightIndex: iconTileGrid.highlightIndex
6662 readonly property alias currentItem: iconTileGrid.currentItem
63+ readonly property alias filtered: d.filter
64+
65+ QtObject {
66+ id: d
67+ // We do have filter and collapsed properties because we need to decouple
68+ // the real filtering with the animation since the closing animation
69+ // i.e. setFilter(false. true) we still need to not be filtering until
70+ // the animation finishes otherwise we hide the items when the animation
71+ // is still running
72+ property bool filter: true
73+ property bool collapsed: true
74+ }
6775
68− height: !filterAnimation.running ? childrenRect.height : height
76+ height: d.collapsed ? root.collapsedHeight : root.uncollapsedHeight
6977 clip: filterAnimation.running
7078
71− NumberAnimation {
72− property bool filterEndValue
73− id: filterAnimation
74− target: root
75− property: "height"
76− to: filterEndValue ? root.collapsedHeight : root.uncollapsedHeight
77− // Duration and easing here match the ListViewWithPageHeader::m_contentYAnimation
78− // otherwise since both animations can run at the same time you'll get
79− // some visual weirdness.
80− duration: 200
81− easing.type: Easing.InOutQuad
82− onStopped: {
83− root.filter = filterEndValue;
79+ Behavior on height {
80+ id: heightBehaviour
81+ enabled: false
82+ NumberAnimation {
83+ id: filterAnimation
84+ // Duration and easing here match the ListViewWithPageHeader::m_contentYAnimation
85+ // otherwise since both animations can run at the same time you'll get
86+ // some visual weirdness.
87+ duration: 200
88+ easing.type: Easing.InOutQuad
89+ onRunningChanged: {
90+ if (!running) {
91+ d.filter = d.collapsed;
92+ }
93+ heightBehaviour.enabled = false;
94+ }
8495 }
8596 }
8697
87− function startFilterAnimation(filter) {
88− filterAnimation.filterEndValue = filter
89− filterAnimation.start();
90− }
98+ function setFilter(filter, animate) {
99+ heightBehaviour.enabled = animate;
100+ d.collapsed = filter;
101+ if (!animate || !filter) {
102+ d.filter = filter;
103+ }
104+ }
91105
92106 ResponsiveGridView {
93107 id: iconTileGrid
@@ -104,7 +118,7 @@ Item {
104118
105119 model: LimitProxyModel {
106120 model: root.model
107− limit: (filter && !filterAnimation.running) ? rowsWhenCollapsed * iconTileGrid.columns : -1
121+ limit: d.filter ? rowsWhenCollapsed * iconTileGrid.columns : -1
108122 }
109123 }
110124}
qml/Components/LazyImage.qml+1
@@ -36,6 +36,7 @@ Item {
3636 property alias cache: image.cache
3737 property alias horizontalAlignment: image.horizontalAlignment
3838 property alias verticalAlignment: image.verticalAlignment
39+ property alias sourceImage: image
3940
4041 state: "default"
4142
qml/Components/ResponsiveGridView.qml+1
@@ -40,6 +40,7 @@ Item {
4040 readonly property alias flicking: gridView.flicking
4141 readonly property alias moving: gridView.moving
4242 readonly property alias pressDelay: gridView.pressDelay
43+ readonly property alias originY: gridView.originY
4344 property alias delegateCreationBegin: gridView.delegateCreationBegin
4445 property alias delegateCreationEnd: gridView.delegateCreationEnd
4546 property alias highlightIndex: gridView.highlightIndex
qml/Components/ZoomableImage.qmlnew file+153
@@ -0,0 +1,153 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+import "../Components"
20+
21+/*! \brief Zoomable for image.
22+
23+ This widget shows image contained in source,
24+ can be zoomable accordingly with zoomable.
25+ */
26+
27+Item {
28+ id: root
29+ property alias source: lazyImage.source
30+ property var zoomable: false
31+ property alias imageState: lazyImage.state
32+ property alias scaleTo: lazyImage.scaleTo
33+ property alias asynchronous: lazyImage.asynchronous
34+
35+ Flickable {
36+ id: flickable
37+ objectName: "flickable"
38+ clip: true
39+ contentHeight: imageContainer.height
40+ contentWidth: imageContainer.width
41+
42+ onHeightChanged: image.resetScale()
43+ onWidthChanged: image.resetScale()
44+ anchors.fill: parent
45+
46+ Item {
47+ id: imageContainer
48+ objectName: "imageContainer"
49+ width: Math.max(image.width * image.scale, flickable.width)
50+ height: Math.max(image.height * image.scale, flickable.height)
51+
52+ Item {
53+ id: image
54+ objectName: "image"
55+ property alias imageState: lazyImage.state
56+ property var prevScale
57+ anchors.centerIn: parent
58+
59+ signal imageReloaded
60+
61+ LazyImage {
62+ id: lazyImage
63+ objectName: "lazyImage"
64+ smooth: !flickable.movingVertically
65+ anchors.fill: parent
66+ fillMode: Image.PreserveAspectFit
67+ scaleTo: "fit"
68+
69+ onStateChanged: {
70+ if (state == "ready") {
71+ image.imageReloaded();
72+ }
73+ }
74+ }
75+
76+ onImageReloaded: {
77+ image.height = lazyImage.sourceImage.implicitHeight
78+ image.width = lazyImage.sourceImage.implicitWidth
79+ image.resetScale();
80+ }
81+
82+ function resetScale() {
83+ image.scale = Math.min(flickable.width / image.width, flickable.height / image.height);
84+ pinchArea.minScale = image.scale;
85+ prevScale = Math.min(image.scale, 1);
86+ }
87+
88+ onScaleChanged: {
89+ var currentWidth = width * scale
90+ var currentHeight = height * scale
91+ var scaleRatio = scale / prevScale
92+ if (currentWidth > flickable.width) {
93+ var xpos = flickable.width / 2 + flickable.contentX;
94+ var xoff = xpos * scaleRatio;
95+ flickable.contentX = xoff - flickable.width / 2;
96+ }
97+ if (currentHeight > flickable.height) {
98+ var ypos = flickable.height / 2 + flickable.contentY;
99+ var yoff = ypos * scaleRatio;
100+ flickable.contentY = yoff - flickable.height / 2;
101+ }
102+ prevScale = scale;
103+ }
104+ }
105+ }
106+
107+ PinchArea {
108+ id: pinchArea
109+ objectName: "pinchArea"
110+ property real minScale: 1.0
111+ anchors.fill: parent
112+ enabled: zoomable ? zoomable : false
113+
114+ pinch.target: image
115+ pinch.minimumScale: minScale
116+ pinch.maximumScale: 10
117+
118+ onPinchFinished: flickable.returnToBounds()
119+ }
120+
121+ MouseArea {
122+ id: mouseArea
123+ objectName: "mouseArea"
124+
125+ anchors.fill: parent
126+ enabled: zoomable ? zoomable : false
127+
128+ onWheel: {
129+ var startScale = image.scale;
130+ if (wheel.angleDelta.y > 0) {
131+ image.scale = startScale + 0.1;
132+ } else if (wheel.angleDelta.y < 0) {
133+ if (image.scale > 0.1 && image.scale > pinchArea.minScale) {
134+ image.scale = startScale - 0.1;
135+ }
136+ }
137+ wheel.accepted = true;
138+ }
139+
140+ onPressed: {
141+ mouse.accepted = false;
142+ }
143+
144+ onReleased: {
145+ mouse.accepted = false;
146+ }
147+
148+ onClicked: {
149+ mouse.accepted = false;
150+ }
151+ }
152+ }
153+}
qml/Dash/Card.qml+99−79
@@ -25,47 +25,53 @@ AbstractButton {
2525 property var components
2626 property var cardData
2727
28− property alias fontScale: header.fontScale
29− property alias headerAlignment: header.headerAlignment
30− property alias headerHeight: header.height
31− readonly property alias title: header.title
28+ property real fontScale: 1.0
29+ property int headerAlignment: Text.AlignLeft
30+ readonly property int headerHeight: headerLoader.item ? headerLoader.item.height : 0
31+ property int fixedHeaderHeight: -1
32+ readonly property string title: cardData && cardData["title"] || ""
3233
3334 property bool showHeader: true
3435
3536 implicitWidth: childrenRect.width
36− implicitHeight: summary.y + summary.height + (summary.text && background.visible ? units.gu(1) : 0)
37+ implicitHeight: summary.y + summary.height + (summary.text && backgroundLoader.active ? units.gu(1) : 0)
3738
38− UbuntuShape {
39− id: background
40− objectName: "background"
41− radius: "medium"
42− visible: template["card-layout"] !== "horizontal" && (template["card-background"] || components["background"]
43− || artAndSummary)
44− property bool artAndSummary: components["art"]["field"] && components["summary"] || false
45− color: getColor(0) || "white"
46− gradientColor: getColor(1) || color
47− anchors.fill: parent
48− image: backgroundImage.source ? backgroundImage : null
39+ Loader {
40+ id: backgroundLoader
41+ objectName: "backgroundLoader"
4942
50− property real luminance: 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b
43+ readonly property bool artAndSummary: components["art"]["field"] && components["summary"] || false
44+ active: template["card-layout"] !== "horizontal" && (template["card-background"] || components["background"] || artAndSummary)
45+ anchors.fill: parent
5146
52− property Image backgroundImage: Image {
53− objectName: "backgroundImage"
54− source: {
55− if (cardData && typeof cardData["background"] === "string") return cardData["background"]
56− else if (template && typeof template["card-background"] === "string") return template["card-background"]
57− else return ""
47+ sourceComponent: UbuntuShape {
48+ objectName: "background"
49+ radius: "medium"
50+ color: getColor(0) || "white"
51+ gradientColor: getColor(1) || color
52+ anchors.fill: parent
53+ image: backgroundImage.source ? backgroundImage : null
54+
55+ property real luminance: 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b
56+
57+ property Image backgroundImage: Image {
58+ objectName: "backgroundImage"
59+ source: {
60+ if (cardData && typeof cardData["background"] === "string") return cardData["background"]
61+ else if (template && typeof template["card-background"] === "string") return template["card-background"]
62+ else return ""
63+ }
5864 }
59− }
6065
61− function getColor(index) {
62− if (cardData && typeof cardData["background"] === "object"
63− && (cardData["background"]["type"] === "color" || cardData["background"]["type"] === "gradient")) {
64− return cardData["background"]["elements"][index];
65− } else if (template && typeof template["card-background"] === "object"
66− && (template["card-background"]["type"] === "color" || template["card-background"]["type"] === "gradient")) {
67− return template["card-background"]["elements"][index];
68− } else return undefined;
66+ function getColor(index) {
67+ if (cardData && typeof cardData["background"] === "object"
68+ && (cardData["background"]["type"] === "color" || cardData["background"]["type"] === "gradient")) {
69+ return cardData["background"]["elements"][index];
70+ } else if (template && typeof template["card-background"] === "object"
71+ && (template["card-background"]["type"] === "color" || template["card-background"]["type"] === "gradient")) {
72+ return template["card-background"]["elements"][index];
73+ } else return undefined;
74+ }
6975 }
7076 }
7177
@@ -111,7 +117,7 @@ AbstractButton {
111117 function updateWidthHeightBindings() {
112118 if (isHorizontal) {
113119 width = Qt.binding(function() { return height * artShape.aspect });
114− height = Qt.binding(function() { return header.height });
120+ height = Qt.binding(function() { return root.headerHeight });
115121 } else {
116122 width = Qt.binding(function() { return root.width });
117123 height = Qt.binding(function() { return width / artShape.aspect });
@@ -120,53 +126,58 @@ AbstractButton {
120126 }
121127 }
122128
123− ShaderEffect {
124− id: overlay
129+ Loader {
130+ id: overlayLoader
125131 anchors {
126132 left: artShape.left
127133 right: artShape.right
128134 bottom: artShape.bottom
129135 }
136+ active: template && template["overlay"] && artShape.visible && artShape.image.status === Image.Ready || false
130137
131− height: header.height
132− opacity: header.opacity * 0.6
133− visible: template && template["overlay"] && artShape.visible && artShape.image.status === Image.Ready || false
138+ sourceComponent: ShaderEffect {
139+ id: overlay
134140
135− property var source: ShaderEffectSource {
136− id: shaderSource
137− sourceItem: artShape
138− onVisibleChanged: if (visible) scheduleUpdate()
139− live: false
140− sourceRect: Qt.rect(0, artShape.height - overlay.height, artShape.width, overlay.height)
141− }
141+ height: headerLoader.item ? headerLoader.item.height : 0
142+ opacity: headerLoader.item ? headerLoader.item.opacity * 0.6 : 0
143+
144+ property var source: ShaderEffectSource {
145+ id: shaderSource
146+ sourceItem: artShape
147+ onVisibleChanged: if (visible) scheduleUpdate()
148+ live: false
149+ sourceRect: Qt.rect(0, artShape.height - overlay.height, artShape.width, overlay.height)
150+ }
142151
143− vertexShader: "
144− uniform highp mat4 qt_Matrix;
145− attribute highp vec4 qt_Vertex;
146− attribute highp vec2 qt_MultiTexCoord0;
147− varying highp vec2 coord;
148− void main() {
149− coord = qt_MultiTexCoord0;
150− gl_Position = qt_Matrix * qt_Vertex;
151− }"
152−
153− fragmentShader: "
154− varying highp vec2 coord;
155− uniform sampler2D source;
156− uniform lowp float qt_Opacity;
157− void main() {
158− lowp vec4 tex = texture2D(source, coord);
159− gl_FragColor = vec4(0, 0, 0, tex.a) * qt_Opacity;
160− }"
152+ vertexShader: "
153+ uniform highp mat4 qt_Matrix;
154+ attribute highp vec4 qt_Vertex;
155+ attribute highp vec2 qt_MultiTexCoord0;
156+ varying highp vec2 coord;
157+ void main() {
158+ coord = qt_MultiTexCoord0;
159+ gl_Position = qt_Matrix * qt_Vertex;
160+ }"
161+
162+ fragmentShader: "
163+ varying highp vec2 coord;
164+ uniform sampler2D source;
165+ uniform lowp float qt_Opacity;
166+ void main() {
167+ lowp vec4 tex = texture2D(source, coord);
168+ gl_FragColor = vec4(0, 0, 0, tex.a) * qt_Opacity;
169+ }"
170+ }
161171 }
162172
163− CardHeader {
164− id: header
165− objectName: "cardHeader"
173+ Loader {
174+ id: headerLoader
175+ objectName: "cardHeaderLoader"
176+
166177 anchors {
167178 top: {
168179 if (template) {
169− if (template["overlay"]) return overlay.top;
180+ if (template["overlay"]) return overlayLoader.top;
170181 if (template["card-layout"] === "horizontal") return artShape.top;
171182 }
172183 return artShape.bottom;
@@ -179,29 +190,38 @@ AbstractButton {
179190 }
180191 right: parent.right
181192 }
193+ active: cardData && cardData["title"] || cardData && cardData["mascot"] || false
194+
195+ sourceComponent: CardHeader {
196+ id: header
197+ objectName: "cardHeader"
182198
183− mascot: cardData && cardData["mascot"] || ""
184− title: cardData && cardData["title"] || ""
185− subtitle: cardData && cardData["subtitle"] || ""
199+ mascot: cardData && cardData["mascot"] || ""
200+ title: root.title
201+ subtitle: cardData && cardData["subtitle"] || ""
186202
187− titleWeight: components && components["subtitle"] ? Font.DemiBold : Font.Normal
203+ titleWeight: components && components["subtitle"] ? Font.DemiBold : Font.Normal
188204
189− opacity: showHeader ? 1 : 0
190− inOverlay: root.template && root.template["overlay"] === true
191− fontColor: inOverlay ? "white" : summary.color
192− useMascotShape: !background.visible && !inOverlay
205+ opacity: showHeader ? 1 : 0
206+ inOverlay: root.template && root.template["overlay"] === true
207+ fontColor: inOverlay ? "white" : summary.color
208+ useMascotShape: !backgroundLoader.active && !inOverlay
209+ headerAlignment: root.headerAlignment
210+ height: root.fixedHeaderHeight != -1 ? root.fixedHeaderHeight : implicitHeight
211+ fontScale: root.fontScale
193212
194− Behavior on opacity { NumberAnimation { duration: UbuntuAnimation.SnapDuration } }
213+ Behavior on opacity { NumberAnimation { duration: UbuntuAnimation.SnapDuration } }
214+ }
195215 }
196216
197217 Label {
198218 id: summary
199219 objectName: "summaryLabel"
200220 anchors {
201− top: header.visible ? header.bottom : artShape.bottom
221+ top: headerLoader.active ? headerLoader.bottom : artShape.bottom
202222 left: parent.left
203223 right: parent.right
204− margins: background.visible ? units.gu(1) : 0
224+ margins: backgroundLoader.active ? units.gu(1) : 0
205225 topMargin: 0
206226 }
207227 wrapMode: Text.Wrap
@@ -211,6 +231,6 @@ AbstractButton {
211231 height: text ? implicitHeight : 0
212232 fontSize: "small"
213233 // TODO karni: Change "grey" to Ubuntu.Components.Palette color once updated.
214− color: background.visible && background.luminance < 0.7 ? "white" : "grey"
234+ color: backgroundLoader.active && backgroundLoader.item.luminance < 0.7 ? "white" : "grey"
215235 }
216236}
qml/Dash/CardCarousel.qml+1−1
@@ -52,7 +52,7 @@ DashRenderer {
5252 itemComponent: Card {
5353 id: card
5454 objectName: "carouselDelegate" + index
55− headerHeight: carousel.headerHeight
55+ fixedHeaderHeight: carousel.headerHeight
5656 cardData: model
5757 template: cardTool.template
5858 components: cardTool.components
qml/Dash/CardFilterGrid.qml+7−10
@@ -24,12 +24,14 @@ DashRenderer {
2424 collapsedHeight: filterGrid.collapsedHeight
2525 margins: filterGrid.margins
2626 uncollapsedHeight: filterGrid.uncollapsedHeight
27+ originY: filterGrid.originY
2728 verticalSpacing: units.gu(1)
2829 currentItem: filterGrid.currentItem
2930 height: filterGrid.height
31+ filtered: filterGrid.filtered
3032
31− function startFilterAnimation(filter) {
32− filterGrid.startFilterAnimation(filter)
33+ function setFilter(filter, animate) {
34+ filterGrid.setFilter(filter, animate)
3335 }
3436
3537 FilterGrid {
@@ -40,18 +42,18 @@ DashRenderer {
4042 delegateHeight: cardTool.cardHeight
4143 verticalSpacing: genericFilterGrid.verticalSpacing
4244 model: genericFilterGrid.model
43− filter: genericFilterGrid.filter
4445 collapsedRowCount: Math.min(2, cardTool && cardTool.template && cardTool.template["collapsed-rows"] || 2)
4546 delegateCreationBegin: genericFilterGrid.delegateCreationBegin
4647 delegateCreationEnd: genericFilterGrid.delegateCreationEnd
47− delegate: Item {
48+ delegate: Loader {
49+ asynchronous: true
4850 width: filterGrid.cellWidth
4951 height: filterGrid.cellHeight
5052 Card {
5153 id: card
5254 width: cardTool.cardWidth
5355 height: cardTool.cardHeight
54− headerHeight: cardTool.headerHeight
56+ fixedHeaderHeight: cardTool.headerHeight
5557 anchors.horizontalCenter: parent.horizontalCenter
5658 objectName: "delegate" + index
5759 cardData: model
@@ -64,10 +66,5 @@ DashRenderer {
6466 onPressAndHold: genericFilterGrid.pressAndHold(index, card.y)
6567 }
6668 }
67−
68− onFilterChanged: {
69− genericFilterGrid.filter = filter
70− filter = Qt.binding(function() { return genericFilterGrid.filter })
71− }
7269 }
7370}
qml/Dash/CardHeader.qml+41−31
@@ -19,9 +19,9 @@ import Ubuntu.Components 0.1
1919
2020Item {
2121 id: root
22− property alias mascot: mascotImage.source
22+ property url mascot: ""
2323 property alias title: titleLabel.text
24− property alias subtitle: subtitleLabel.text
24+ property var subtitle
2525
2626 property alias titleWeight: titleLabel.font.weight
2727 property alias titleSize: titleLabel.fontSize
@@ -35,8 +35,8 @@ Item {
3535 property bool useMascotShape: true
3636 property color fontColor: Theme.palette.selected.backgroundText
3737
38− visible: mascotImage.status === Image.Ready || title
39− height: row.height > 0 ? row.height + row.margins * 2 : 0
38+ visible: mascot != "" || title
39+ implicitHeight: row.height > 0 ? row.height + row.margins * 2 : 0
4040
4141 Row {
4242 id: row
@@ -44,7 +44,7 @@ Item {
4444
4545 property real margins: units.gu(1)
4646
47− spacing: mascotShape.visible || mascotImage.visible || inOverlay ? margins : 0
47+ spacing: mascotShapeLoader.active || mascotImageLoader.active || inOverlay ? margins : 0
4848 anchors {
4949 top: parent.top; left: parent.left; right: parent.right
5050 margins: margins
@@ -52,33 +52,40 @@ Item {
5252 rightMargin: spacing
5353 }
5454
55− UbuntuShape {
56− id: mascotShape
57− objectName: "mascotShape"
55+ Loader {
56+ id: mascotShapeLoader
57+ objectName: "mascotShapeLoader"
5858
59+ active: useMascotShape && mascotImageLoader.item && mascotImageLoader.item.status === Image.Ready
60+ visible: active
61+ anchors.verticalCenter: parent.verticalCenter
5962 // TODO karni: Icon aspect-ratio is 8:7.5. Revisit these values to avoid fraction of pixels.
6063 width: units.gu(6)
6164 height: units.gu(5.625)
62− anchors.verticalCenter: parent.verticalCenter
63− visible: useMascotShape && image && image.status === Image.Ready
6465 readonly property int maxSize: Math.max(width, height) * 4
6566
66− image: useMascotShape ? mascotImage : null
67+ sourceComponent: UbuntuShape {
68+ image: mascotImageLoader.item
69+ }
6770 }
6871
69− Image {
70− id: mascotImage
71− objectName: "mascotImage"
72−
73− width: source ? mascotShape.width : 0
74− height: mascotShape.height
72+ Loader {
73+ id: mascotImageLoader
74+ active: root.mascot != ""
75+ visible: active && !useMascotShape && item.status === Image.Ready
7576 anchors.verticalCenter: parent.verticalCenter
76− visible: !useMascotShape && status === Image.Ready
77+ sourceComponent: Image {
78+ objectName: "mascotImage"
79+
80+ source: root.mascot
81+ width: source ? mascotShapeLoader.width : 0
82+ height: mascotShapeLoader.height
7783
78− sourceSize { width: mascotShape.maxSize; height: mascotShape.maxSize }
79− fillMode: Image.PreserveAspectCrop
80− horizontalAlignment: Image.AlignHCenter
81− verticalAlignment: Image.AlignVCenter
84+ sourceSize { width: mascotShapeLoader.maxSize; height: mascotShapeLoader.maxSize }
85+ fillMode: Image.PreserveAspectCrop
86+ horizontalAlignment: Image.AlignHCenter
87+ verticalAlignment: Image.AlignVCenter
88+ }
8289 }
8390
8491 Column {
@@ -100,16 +107,19 @@ Item {
100107 color: fontColor
101108 }
102109
103− Label {
104− id: subtitleLabel
105− objectName: "subtitleLabel"
110+ Loader {
111+ active: titleLabel.text && root.subtitle
106112 anchors { left: parent.left; right: parent.right }
107− elide: Text.ElideRight
108− fontSize: "small"
109− font.weight: Font.Light
110− visible: titleLabel.text && text
111− font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale)
112− color: fontColor
113+ sourceComponent: Label {
114+ id: subtitleLabel
115+ objectName: "subtitleLabel"
116+ elide: Text.ElideRight
117+ fontSize: "small"
118+ font.weight: Font.Light
119+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale)
120+ color: fontColor
121+ text: root.subtitle
122+ }
113123 }
114124 }
115125 }
qml/Dash/DashContent.qml+5−10
@@ -28,13 +28,9 @@ Item {
2828 readonly property alias currentIndex: dashContentList.currentIndex
2929 property alias previewOpen: previewListView.open
3030
31− property ScopeDelegateMapper scopeMapper : ScopeDelegateMapper {}
3231 property ListModel searchHistory
3332
34− signal movementStarted()
35− signal movementEnded()
3633 signal scopeLoaded(string scopeId)
37− signal positionedAtBeginning()
3834 signal gotoScope(string scopeId)
3935 signal openScope(var scope)
4036
@@ -72,7 +68,7 @@ Item {
7268 dashContentList.currentIndex = index
7369
7470 if (reset) {
75− dashContent.positionedAtBeginning()
71+ dashContentList.currentItem.item.positionAtBeginning()
7672 }
7773 }
7874
@@ -115,8 +111,7 @@ Item {
115111 highlightRangeMode: ListView.StrictlyEnforceRange
116112 // TODO Investigate if we can switch to a smaller cache buffer when/if UbuntuShape gets more performant
117113 cacheBuffer: 1073741823
118− onMovementStarted: dashContent.movementStarted()
119− onMovementEnded: dashContent.movementEnded()
114+ onMovementStarted: currentItem.item.showHeader();
120115 clip: parent.x != 0
121116
122117 // If the number of items is less than the current index, then need to reset to another item.
@@ -136,7 +131,9 @@ Item {
136131 width: ListView.view.width
137132 height: ListView.view.height
138133 asynchronous: true
139− source: scopeMapper.map(scope.id)
134+ // TODO This if will eventually go away since we're killing DashApps.qml
135+ // once we move app closing to the spread
136+ source: (scope.id == "clickscope") ? "DashApps.qml" : "GenericScopeView.qml"
140137 objectName: scope.id + " loader"
141138
142139 readonly property bool moving: item ? item.moving : false
@@ -155,8 +152,6 @@ Item {
155152 item.scope = Qt.binding(function() { return scope })
156153 item.isCurrent = Qt.binding(function() { return visible && ListView.isCurrentItem })
157154 item.tabBarHeight = dashPageHeader.implicitHeight;
158− dashContentList.movementStarted.connect(item.movementStarted)
159− dashContent.positionedAtBeginning.connect(item.positionedAtBeginning)
160155 dashContent.scopeLoaded(item.scope.id)
161156 }
162157 Connections {
qml/Dash/DashRenderer.qml+5−3
@@ -20,8 +20,8 @@ Item {
2020 // Can the item be expanded?
2121 property bool expandable: false
2222
23− // In case it can be expanded, should we filter it
24− property bool filter: true
23+ // In case it can be expanded, is it filtered
24+ property bool filtered: true
2525
2626 property int collapsedHeight: height
2727
@@ -33,6 +33,8 @@ Item {
3333
3434 property var delegateCreationEnd: undefined
3535
36+ property real originY: 0
37+
3638 property real verticalSpacing: 0
3739
3840 // The current item of the renderer
@@ -56,6 +58,6 @@ Item {
5658 /// @param itemY is y of the held delegate
5759 signal pressAndHold(int index, real itemY)
5860
59− function startFilterAnimation(filter) {
61+ function setFilter(filter, animate) {
6062 }
6163}
qml/Dash/GenericScopeView.qml+29−30
@@ -33,9 +33,6 @@ FocusScope {
3333 property PageHeader pageHeader: null
3434 property Item previewListView: null
3535
36− signal movementStarted
37− signal positionedAtBeginning
38−
3936 property bool enableHeightBehaviorOnNextCreation: false
4037 property var categoryView: categoryView
4138
@@ -49,6 +46,14 @@ FocusScope {
4946 shell.activateApplication(appId);
5047 }
5148
49+ function positionAtBeginning() {
50+ categoryView.positionAtBeginning()
51+ }
52+
53+ function showHeader() {
54+ categoryView.showHeader()
55+ }
56+
5257 Binding {
5358 target: scope
5459 property: "isActive"
@@ -69,10 +74,6 @@ FocusScope {
6974 previewListView.open = false;
7075 }
7176
72− onMovementStarted: categoryView.showHeader()
73−
74− onPositionedAtBeginning: categoryView.positionAtBeginning()
75−
7677 Binding {
7778 target: scopeView.scope
7879 property: "searchQuery"
@@ -121,7 +122,7 @@ FocusScope {
121122 showDivider: false
122123
123124 readonly property bool expandable: rendererLoader.item ? rendererLoader.item.expandable : false
124− readonly property bool filtered: rendererLoader.item ? rendererLoader.item.filter : true
125+ readonly property bool filtered: rendererLoader.item ? rendererLoader.item.filtered : true
125126 readonly property string category: categoryId
126127 readonly property var item: rendererLoader.item
127128
@@ -167,9 +168,7 @@ FocusScope {
167168 item.objectName = Qt.binding(function() { return categoryId })
168169 if (item.expandable) {
169170 var shouldFilter = categoryId != categoryView.expandedCategoryId;
170− if (shouldFilter != item.filter) {
171− item.filter = shouldFilter;
172− }
171+ item.setFilter(shouldFilter, false /*animate*/);
173172 }
174173 updateDelegateCreationRange();
175174 item.cardTool = cardTool;
@@ -218,11 +217,8 @@ FocusScope {
218217 var shrinkingVisible = shouldFilter && y + item.collapsedHeight < categoryView.height;
219218 var growingVisible = !shouldFilter && y + height < categoryView.height;
220219 if (!previewListView.open || !shouldFilter) {
221− if (shrinkingVisible || growingVisible) {
222− item.startFilterAnimation(shouldFilter)
223− } else {
224− item.filter = shouldFilter;
225− }
220+ var animate = shrinkingVisible || growingVisible;
221+ item.setFilter(shouldFilter, animate)
226222 if (!shouldFilter && !previewListView.open) {
227223 categoryView.maximizeVisibleArea(index, item.uncollapsedHeight);
228224 }
@@ -237,26 +233,29 @@ FocusScope {
237233 }
238234
239235 function updateDelegateCreationRange() {
240− // Do not update the range if we are overshooting up or down, since we'll come back
241− // to the stable position and delete/create items without any reason
242− if (categoryView.contentY < categoryView.originY) {
243− return;
244− } else if (categoryView.contentY + categoryView.height > categoryView.contentHeight) {
245− return;
236+ if (categoryView.moving) {
237+ // Do not update the range if we are overshooting up or down, since we'll come back
238+ // to the stable position and delete/create items without any reason
239+ if (categoryView.contentY < categoryView.originY) {
240+ return;
241+ } else if (categoryView.contentHeight - categoryView.originY > categoryView.height &&
242+ categoryView.contentY + categoryView.height > categoryView.contentHeight) {
243+ return;
244+ }
246245 }
247246
248247 if (item && item.hasOwnProperty("delegateCreationBegin")) {
249248 if (baseItem.y + baseItem.height <= 0) {
250− // Not visible (item at top of the list)
251− item.delegateCreationBegin = baseItem.height
252− item.delegateCreationEnd = baseItem.height
249+ // Not visible (item at top of the list viewport)
250+ item.delegateCreationBegin = item.originY + baseItem.height
251+ item.delegateCreationEnd = item.originY + baseItem.height
253252 } else if (baseItem.y >= categoryView.height) {
254− // Not visible (item at bottom of the list)
255− item.delegateCreationBegin = 0
256− item.delegateCreationEnd = 0
253+ // Not visible (item at bottom of the list viewport)
254+ item.delegateCreationBegin = item.originY
255+ item.delegateCreationEnd = item.originY
257256 } else {
258− item.delegateCreationBegin = Math.max(-baseItem.y, 0)
259− item.delegateCreationEnd = Math.min(categoryView.height + item.delegateCreationBegin, baseItem.height)
257+ item.delegateCreationBegin = item.originY + Math.max(-baseItem.y, 0)
258+ item.delegateCreationEnd = item.originY + Math.min(categoryView.height + item.delegateCreationBegin, baseItem.height)
260259 }
261260 }
262261 }
qml/Dash/Previews/PreviewProgress.qml+3−2
@@ -34,11 +34,12 @@ PreviewWidget {
3434 ProgressBar {
3535 id: progressBar
3636 objectName: "progressBar"
37+ anchors.right: parent.right
3738 value: 0
3839 maximumValue: 100
39− implicitHeight: units.gu(5)
40+ implicitHeight: units.gu(4)
4041 height: parent.height
41− width: parent.width
42+ width: (root.width - units.gu(1)) / 2
4243
4344 property var source: widgetData["source"]
4445 // TODO Eventually we will need to support more sources other
qml/Dash/Previews/PreviewRatingDisplay.qml+4−2
@@ -71,7 +71,8 @@ PreviewWidget {
7171 id: authorLabel
7272 objectName: "authorLabel"
7373 anchors { left: parent.left; right: parent.right }
74− color: Theme.palette.selected.backgroundText
74+ // TODO cimi: Yet another fix requiring Palette update.
75+ color: "grey" //Theme.palette.selected.backgroundText
7576 opacity: .8
7677 text: modelData["author"] || ""
7778 visible: text !== ""
@@ -82,7 +83,8 @@ PreviewWidget {
8283 id: reviewLabel
8384 objectName: "reviewLabel"
8485 anchors { left: parent.left; right: parent.right }
85− color: Theme.palette.selected.backgroundText
86+ // TODO cimi: Yet another fix requiring Palette update.
87+ color: "grey" //Theme.palette.selected.backgroundText
8688 opacity: .8
8789 text: modelData["review"] || ""
8890 visible: text !== ""
qml/Dash/Previews/PreviewRatingInput.qml+6−4
@@ -76,7 +76,8 @@ PreviewWidget {
7676 verticalCenter: parent.verticalCenter
7777 left: parent.left
7878 }
79− color: Theme.palette.selected.backgroundText
79+ // TODO cimi: Yet another fix requiring Palette update.
80+ color: "grey" //Theme.palette.selected.backgroundText
8081 opacity: .8
8182 text: widgetData["rating-label"] || i18n.tr("Rate this")
8283 }
@@ -121,7 +122,8 @@ PreviewWidget {
121122 left: parent.left
122123 right: parent.right
123124 }
124− color: Theme.palette.selected.backgroundText
125+ // TODO cimi: Yet another fix requiring Palette update.
126+ color: "grey" //Theme.palette.selected.backgroundText
125127 opacity: .8
126128 text: widgetData["review-label"] || i18n.tr("Add a review")
127129 }
@@ -153,8 +155,8 @@ PreviewWidget {
153155 objectName: "submitButton"
154156
155157 readonly property bool readyToSubmit: {
156− if (reviewTextArea.text === "" ||
157− (widgetData["visible"] === "both" && rating.value < 0)) return false;
158+ if ((widgetData["required"] !== "review" && rating.value < 0) ||
159+ (widgetData["required"] !== "rating" && reviewTextArea.text === "")) return false;
158160 else return true;
159161 }
160162
qml/Dash/Previews/PreviewZoomableImage.qml+4−7
@@ -28,14 +28,11 @@ PreviewWidget {
2828 id: root
2929 implicitHeight: units.gu(22)
3030
31− LazyImage {
31+ ZoomableImage {
32+ id: image
3233 objectName: "image"
33− anchors {
34− top: parent.top
35− bottom: parent.bottom
36− }
37− scaleTo: "height"
3834 source: widgetData["source"]
39− initialWidth: units.gu(13)
35+ zoomable: widgetData["zoomable"] ? widgetData["zoomable"] : false
36+ anchors.fill: parent
4037 }
4138}
qml/Dash/ScopeDelegateMapper.qmldeleted−30
@@ -1,30 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−
19−QtObject {
20− property var scopeDelegateMapping: {"clickscope": "DashApps.qml"}
21− property string genericScope: "GenericScopeView.qml"
22−
23− function map(scopeId) {
24− var customScope = scopeDelegateMapping[scopeId]
25− if (customScope != undefined) {
26− return customScope
27− }
28− return genericScope
29− }
30−}
qml/Greeter/Clock.qml+3−6
@@ -24,14 +24,11 @@ Item {
2424 implicitWidth: childrenRect.width
2525 implicitHeight: childrenRect.height
2626
27− // Allows to set the current Date. Will be overwritten if active
27+ // Allows to set the current Date. Will be overwritten if visible
2828 property date currentDate
2929
30− // If active, time will be updated through the indicators service
31− property bool active: clock.enabled && clock.visible
32−
3330 Component.onCompleted: {
34− if (active) {
31+ if (visible) {
3532 currentDate = new Date()
3633 }
3734 }
@@ -42,7 +39,7 @@ Item {
4239
4340 busName: "com.canonical.indicator.datetime"
4441 actionsObjectPath: "/com/canonical/indicator/datetime"
45− menuObjectPath: clock.active ? "/com/canonical/indicator/datetime/phone" : ""
42+ menuObjectPath: clock.visible ? "/com/canonical/indicator/datetime/phone" : ""
4643
4744 Indicators.RootActionState {
4845 menu: timeModel.model
qml/Greeter/Greeter.qml+115−42
@@ -28,10 +28,10 @@ Showable {
2828 property url defaultBackground
2929
3030 // 1 when fully shown and 0 when fully hidden
31− property real showProgress: MathUtils.clamp((width + x) / width, 0, 1)
31+ property real showProgress: MathUtils.clamp((width - Math.abs(x)) / width, 0, 1)
3232
3333 showAnimation: StandardAnimation { property: "x"; to: 0 }
34− hideAnimation: StandardAnimation { property: "x"; to: -width }
34+ hideAnimation: __leftHideAnimation
3535
3636 property alias dragHandleWidth: dragHandle.width
3737 property alias model: greeterContentLoader.model
@@ -40,19 +40,81 @@ Showable {
4040 readonly property bool narrowMode: !multiUser && height > width
4141 readonly property bool multiUser: LightDM.Users.count > 1
4242
43− readonly property bool leftTeaserPressed: greeterContentLoader.status == Loader.Ready &&
44− greeterContentLoader.item.leftTeaserPressed
45− readonly property bool rightTeaserPressed: greeterContentLoader.status == Loader.Ready &&
46− greeterContentLoader.item.rightTeaserPressed
47−
4843 readonly property int currentIndex: greeterContentLoader.currentIndex
4944
45+ property var __leftHideAnimation: StandardAnimation { property: "x"; to: -width }
46+ property var __rightHideAnimation: StandardAnimation { property: "x"; to: width }
47+
5048 signal selected(int uid)
5149 signal unlocked(int uid)
50+ signal tease()
51+
52+ function hideRight() {
53+ if (shown) {
54+ hideAnimation = __rightHideAnimation
55+ hide()
56+ }
57+ }
58+
59+ onRequiredChanged: {
60+ // Reset hide animation to default once we're finished with it
61+ if (!required) {
62+ // Put back on left for reliable show direction and so that
63+ // if normal hide() is called, we don't animate from right.
64+ x = -width
65+ hideAnimation = __leftHideAnimation
66+ }
67+ }
68+
69+ // Bi-directional revealer
70+ DraggingArea {
71+ id: dragHandle
72+ anchors.fill: parent
73+ enabled: greeter.narrowMode || !greeter.locked
74+ orientation: Qt.Horizontal
75+ propagateComposedEvents: true
76+
77+ Component.onCompleted: {
78+ // set evaluators to baseline of dragValue == 0
79+ leftEvaluator.reset()
80+ rightEvaluator.reset()
81+ }
82+
83+ function maybeTease() {
84+ if (!greeter.locked || greeter.narrowMode)
85+ greeter.tease();
86+ }
87+
88+ onClicked: maybeTease()
89+ onDragStart: maybeTease()
90+ onPressAndHold: {} // eat event, but no need to tease, as drag will cover it
91+
92+ onDragEnd: {
93+ if (rightEvaluator.shouldAutoComplete())
94+ greeter.hideRight()
95+ else if (leftEvaluator.shouldAutoComplete())
96+ greeter.hide();
97+ else
98+ greeter.show(); // undo drag
99+ }
100+
101+ onDragValueChanged: {
102+ // dragValue is kept as a "step" value since we do this x adjusting on the fly
103+ greeter.x += dragValue
104+ }
105+
106+ EdgeDragEvaluator {
107+ id: rightEvaluator
108+ trackedPosition: dragHandle.dragValue + greeter.x
109+ maxDragDistance: parent.width
110+ direction: Direction.Rightwards
111+ }
52112
53− onRightTeaserPressedChanged: {
54− if (rightTeaserPressed && (!locked || narrowMode) && x == 0) {
55− teasingTimer.start();
113+ EdgeDragEvaluator {
114+ id: leftEvaluator
115+ trackedPosition: dragHandle.dragValue + greeter.x
116+ maxDragDistance: parent.width
117+ direction: Direction.Leftwards
56118 }
57119 }
58120
@@ -82,45 +144,56 @@ Showable {
82144 }
83145 }
84146
85− Timer {
86− id: teasingTimer
87− interval: 200
88− }
147+ onTease: showLabelAnimation.start()
89148
90− states: [
91− State {
92− name: "teasing"
93− when: teasingTimer.running
94− PropertyChanges {
95− target: greeter
96− x: -dragHandle.hintDisplacement
149+ Label {
150+ id: swipeHint
151+ visible: greeter.shown
152+ property real baseOpacity: 0.5
153+ opacity: 0.0
154+ anchors.horizontalCenter: parent.horizontalCenter
155+ anchors.bottom: parent.bottom
156+ anchors.bottomMargin: units.gu(5)
157+ text: i18n.tr("Swipe to unlock")
158+ color: "white"
159+ font.weight: Font.Light
160+
161+ SequentialAnimation on opacity {
162+ id: showLabelAnimation
163+ running: false
164+ loops: 2
165+
166+ StandardAnimation {
167+ from: 0.0
168+ to: swipeHint.baseOpacity
169+ duration: UbuntuAnimation.SleepyDuration
97170 }
98− }
99− ]
100− transitions: [
101− Transition {
102− from: "*"
103− to: "*"
104− NumberAnimation {
105− target: greeter
106− property: "x"
107− duration: 300
108− easing.type: Easing.OutCubic
171+ PauseAnimation { duration: UbuntuAnimation.BriskDuration }
172+ StandardAnimation {
173+ from: swipeHint.baseOpacity
174+ to: 0.0
175+ duration: UbuntuAnimation.SleepyDuration
109176 }
110177 }
111− ]
112−
113− DragHandle {
114− id: dragHandle
178+ }
115179
180+ // right side shadow
181+ Image {
182+ anchors.left: parent.right
116183 anchors.top: parent.top
117184 anchors.bottom: parent.bottom
118− anchors.right: parent.right
119−
120− hintDisplacement: units.gu(2)
121−
122− enabled: greeter.narrowMode || !greeter.locked
185+ visible: parent.required
186+ fillMode: Image.Tile
187+ source: "../graphics/dropshadow_right.png"
188+ }
123189
124− direction: Direction.Leftwards
190+ // left side shadow
191+ Image {
192+ anchors.right: parent.left
193+ anchors.top: parent.top
194+ anchors.bottom: parent.bottom
195+ visible: parent.required
196+ fillMode: Image.Tile
197+ source: "../graphics/dropshadow_left.png"
125198 }
126199}
qml/Greeter/GreeterContent.qml+1−10
@@ -20,15 +20,11 @@ import Ubuntu.Components 0.1
2020import LightDM 0.1 as LightDM
2121import "../Components"
2222
23−MouseArea {
23+Item {
2424 id: root
2525 anchors.fill: parent
2626
2727 property bool ready: background.source == "" || background.status == Image.Ready || background.status == Image.Error
28− property bool leftTeaserPressed: teasingMouseArea.pressed &&
29− teasingMouseArea.mouseX < teasingMouseArea.width / 2
30− property bool rightTeaserPressed: teasingMouseArea.pressed &&
31− teasingMouseArea.mouseX > teasingMouseArea.width / 2
3228
3329 signal selected(int uid)
3430 signal unlocked(int uid)
@@ -74,11 +70,6 @@ MouseArea {
7470 opacity: 0.4
7571 }
7672
77− MouseArea {
78− id: teasingMouseArea
79− anchors.fill: parent
80− }
81−
8273 Loader {
8374 id: loginLoader
8475 objectName: "loginLoader"
qml/Greeter/Infographics.qml+3
@@ -457,5 +457,8 @@ Item {
457457 !circleGrowAnimTimer.running)
458458 infographic.model.nextDataSource()
459459 }
460+
461+ onClicked: mouse.accepted = false
462+ onPressed: mouse.accepted = false
460463 }
461464}
qml/Hud/Hud.qml+1−1
@@ -491,6 +491,6 @@ Item {
491491 anchors.top: hudContentClipper.top
492492 anchors.bottom: hudContentClipper.bottom
493493 fillMode: Image.Tile
494− source: "graphics/dropshadow_right.png"
494+ source: "../graphics/dropshadow_right.png"
495495 }
496496}
qml/Notifications/NotificationMenuItemFactory.qml+2−1
@@ -66,7 +66,8 @@ Loader {
6666 TextField {
6767 id: textfield
6868
69− inputMethodHints: Qt.ImhNoAutoUppercase
69+ // TODO using Qt.ImhNoPredictiveText here until lp #1291575 is fixed for ubuntu-ui-toolkit
70+ inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhNoPredictiveText
7071 anchors.left: parent.left; anchors.right: parent.right
7172 echoMode: checkBox.checked ? TextInput.Normal : TextInput.Password
7273 height: units.gu(5)
qml/Notifications/Notifications.qml+11
@@ -16,6 +16,8 @@
1616
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
19+import Unity.Notifications 1.0 as UnityNotifications
20+import Utils 0.1
1921import "../Components"
2022
2123ListView {
@@ -25,6 +27,15 @@ ListView {
2527 interactive: false
2628
2729 property real margin
30+ property bool useModal: snapDecisionProxyModel.count > 0
31+
32+ SortFilterProxyModel {
33+ id: snapDecisionProxyModel
34+
35+ model: notificationList.model
36+ filterRole: UnityNotifications.ModelInterface.RoleType
37+ filterRegExp: RegExp(UnityNotifications.Notification.SnapDecision)
38+ }
2839 spacing: delegate.fullscreen ? 0 : units.gu(.5)
2940
3041 currentIndex: (currentIndex < 1 && count > 1) ? 1 : -1
qml/Shell.qml+84−104
@@ -28,9 +28,7 @@ import "Dash"
2828import "Greeter"
2929import "Launcher"
3030import "Panel"
31−import "Hud"
3231import "Components"
33−import "Bottombar"
3432import "Notifications"
3533import Unity.Notifications 1.0 as NotificationBackend
3634
@@ -148,8 +146,8 @@ FocusScope {
148146
149147 available: !greeter.shown && !lockscreen.shown
150148 hides: [stages, launcher, panel.indicators]
151− shown: disappearingAnimationProgress !== 1.0
152− enabled: disappearingAnimationProgress === 0.0 && edgeDemo.dashEnabled
149+ shown: disappearingAnimationProgress !== 1.0 && greeterWrapper.showProgress !== 1.0
150+ enabled: disappearingAnimationProgress === 0.0 && greeterWrapper.showProgress === 0.0 && edgeDemo.dashEnabled
153151
154152 anchors {
155153 fill: parent
@@ -159,18 +157,14 @@ FocusScope {
159157 contentScale: 1.0 - 0.2 * disappearingAnimationProgress
160158 opacity: 1.0 - disappearingAnimationProgress
161159 property real disappearingAnimationProgress: {
162− if (greeter.shown) {
163− return greeter.showProgress;
160+ if (stages.overlayMode) {
161+ return 0;
164162 } else {
165− if (stages.overlayMode) {
166− return 0;
167− }
168163 return stages.showProgress
169164 }
170165 }
171166
172− // FIXME: only necessary because stages.showProgress and
173− // greeterRevealer.animatedProgress are not animated
167+ // FIXME: only necessary because stages.showProgress is not animated
174168 Behavior on disappearingAnimationProgress { SmoothedAnimation { velocity: 5 }}
175169 }
176170 }
@@ -240,6 +234,8 @@ FocusScope {
240234 function show(focusApp) {
241235 shown = true;
242236 panel.indicators.hide();
237+ edgeDemo.stopDemo();
238+ greeter.hide();
243239 if (!ApplicationManager.focusedApplicationId && ApplicationManager.count > 0 && focusApp) {
244240 ApplicationManager.focusApplication(ApplicationManager.get(0).appId);
245241 }
@@ -267,12 +263,6 @@ FocusScope {
267263 stages.hide();
268264 }
269265 }
270−
271− // If any app is focused when greeter is open, it's due to a user action
272− // like a snap decision (say, an incoming call).
273− // TODO: these should be protected to only unlock for certain applications / certain usecases
274− // potentially only in connection with a notification.
275− greeter.hide()
276266 }
277267
278268 onApplicationAdded: {
@@ -316,7 +306,7 @@ FocusScope {
316306
317307 readonly property int backgroundTopMargin: -panel.panelHeight
318308
319− hides: [launcher, panel.indicators, hud]
309+ hides: [launcher, panel.indicators]
320310 shown: false
321311 enabled: true
322312 showAnimation: StandardAnimation { property: "opacity"; to: 1 }
@@ -366,59 +356,73 @@ FocusScope {
366356 }
367357 }
368358
369− Greeter {
370− id: greeter
371− objectName: "greeter"
372−
373− available: true
374− hides: [launcher, panel.indicators, hud]
375− shown: true
376−
377− defaultBackground: shell.background
359+ Rectangle {
360+ anchors.fill: parent
361+ color: "black"
362+ opacity: greeterWrapper.showProgress * 0.8
363+ }
378364
365+ Item {
366+ // Just a tiny wrapper to adjust greeter's x without messing with its own dragging
367+ id: greeterWrapper
368+ x: launcher.progress
379369 y: panel.panelHeight
380370 width: parent.width
381371 height: parent.height - panel.panelHeight
382372
383− dragHandleWidth: shell.edgeSize
373+ Behavior on x {SmoothedAnimation{velocity: 600}}
384374
385− onShownChanged: {
386− if (shown) {
387− lockscreen.reset();
388− // If there is only one user, we start authenticating with that one here.
389− // If there are more users, the Greeter will handle that
390− if (LightDM.Users.count == 1) {
391− LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
375+ readonly property real showProgress: MathUtils.clamp((1 - x/width) + greeter.showProgress - 1, 0, 1)
376+
377+ Greeter {
378+ id: greeter
379+ objectName: "greeter"
380+
381+ available: true
382+ hides: [launcher, panel.indicators]
383+ shown: true
384+
385+ defaultBackground: shell.background
386+
387+ width: parent.width
388+ height: parent.height
389+
390+ dragHandleWidth: shell.edgeSize
391+
392+ onShownChanged: {
393+ if (shown) {
394+ lockscreen.reset();
395+ // If there is only one user, we start authenticating with that one here.
396+ // If there are more users, the Greeter will handle that
397+ if (LightDM.Users.count == 1) {
398+ LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
399+ }
400+ greeter.forceActiveFocus();
392401 }
393− greeter.forceActiveFocus();
394402 }
395− }
396403
397− onUnlocked: greeter.hide()
398− onSelected: {
399− // Update launcher items for new user
400− var user = LightDM.Users.data(uid, LightDM.UserRoles.NameRole);
401− AccountsService.user = user;
402− LauncherModel.setUser(user);
403− }
404−
405− onLeftTeaserPressedChanged: {
406− if (leftTeaserPressed) {
407− launcher.tease();
404+ onUnlocked: greeter.hide()
405+ onSelected: {
406+ // Update launcher items for new user
407+ var user = LightDM.Users.data(uid, LightDM.UserRoles.NameRole);
408+ AccountsService.user = user;
409+ LauncherModel.setUser(user);
408410 }
409− }
410411
411− Binding {
412− target: ApplicationManager
413− property: "suspended"
414− value: greeter.shown && greeter.showProgress == 1
412+ onTease: launcher.tease()
413+
414+ Binding {
415+ target: ApplicationManager
416+ property: "suspended"
417+ value: greeter.shown && greeterWrapper.showProgress == 1
418+ }
415419 }
416420 }
417421
418422 InputFilterArea {
419423 anchors.fill: parent
420424 blockInput: ApplicationManager.focusedApplicationId.length === 0 || greeter.shown || lockscreen.shown || launcher.shown
421− || panel.indicators.shown || hud.shown
425+ || panel.indicators.shown
422426 }
423427
424428 Connections {
@@ -482,47 +486,6 @@ FocusScope {
482486 }
483487 }
484488
485− Hud {
486− id: hud
487−
488− width: parent.width > units.gu(60) ? units.gu(40) : parent.width
489− height: parent.height
490−
491− available: !greeter.shown && !panel.indicators.shown && !lockscreen.shown && edgeDemo.dashEnabled
492− shown: false
493− showAnimation: StandardAnimation { property: "y"; duration: hud.showableAnimationDuration; to: 0; easing.type: Easing.Linear }
494− hideAnimation: StandardAnimation { property: "y"; duration: hud.showableAnimationDuration; to: hudRevealer.closedValue; easing.type: Easing.Linear }
495−
496− Connections {
497− target: ApplicationManager
498− onFocusedApplicationIdChanged: hud.hide()
499− }
500− }
501−
502− Revealer {
503− id: hudRevealer
504−
505− enabled: hud.shown
506− width: hud.width
507− anchors.left: hud.left
508− height: parent.height
509− target: hud.revealerTarget
510− closedValue: height
511− openedValue: 0
512− direction: Qt.RightToLeft
513− orientation: Qt.Vertical
514− handleSize: hud.handleHeight
515− onCloseClicked: target.hide()
516− }
517−
518− Bottombar {
519− id: bottombar
520− theHud: hud
521− anchors.fill: parent
522− enabled: hud.available
523− applicationIsOnForeground: ApplicationManager.focusedApplicationId
524− }
525−
526489 InputFilterArea {
527490 blockInput: launcher.shown
528491 anchors {
@@ -542,7 +505,7 @@ FocusScope {
542505 anchors.bottom: parent.bottom
543506 width: parent.width
544507 dragAreaWidth: shell.edgeSize
545− available: (!greeter.shown || greeter.narrowMode) && edgeDemo.launcherEnabled
508+ available: edgeDemo.launcherEnabled
546509
547510 onShowDashHome: {
548511 if (edgeDemo.running)
@@ -557,24 +520,41 @@ FocusScope {
557520 launcher.hide();
558521 }
559522 }
523+ if (greeter.shown) {
524+ greeter.hideRight();
525+ launcher.hide();
526+ }
560527 }
561528 onDashSwipeChanged: if (dashSwipe && stages.shown) dash.setCurrentScope("clickscope", false, true)
562− onLauncherApplicationSelected:{
563− if (edgeDemo.running)
564− return;
565−
566− greeter.hide()
567− shell.activateApplication(appId)
529+ onLauncherApplicationSelected: {
530+ if (!edgeDemo.running)
531+ shell.activateApplication(appId)
568532 }
569533 onShownChanged: {
570534 if (shown) {
571535 panel.indicators.hide()
572− hud.hide()
573− bottombar.hide()
574536 }
575537 }
576538 }
577539
540+ Rectangle {
541+ id: modalNotificationBackground
542+
543+ visible: notifications.useModal && !greeter.shown && (notifications.state == "narrow")
544+ color: "#000000"
545+ anchors.fill: parent
546+ opacity: 0.5
547+
548+ MouseArea {
549+ anchors.fill: parent
550+ }
551+
552+ InputFilterArea {
553+ anchors.fill: parent
554+ blockInput: modalNotificationBackground.visible
555+ }
556+ }
557+
578558 Notifications {
579559 id: notifications
580560
qml/graphics/dropshadow_left@20.pngnew file

Binary file not shown.

qml/Hud/graphics/dropshadow_right@20.png → qml/graphics/dropshadow_right@20.pngrenamed

Binary file not shown.

qml/graphics/phone_background.jpg

Binary file not shown.

qml/graphics/tablet_background.jpg

Binary file not shown.

run → run.shrenamed+15−1
@@ -68,8 +68,22 @@ if $MOUSE_TOUCH; then
6868 QML_PHONE_SHELL_ARGS="$QML_PHONE_SHELL_ARGS -mousetouch"
6969fi
7070
71+control_c()
72+{
73+ /sbin/initctl stop unity8
74+ exit $?
75+}
76+
77+trap control_c INT
78+
7179if $GDB; then
7280 gdb -ex run --args $QML_PHONE_SHELL_PATH $QML_PHONE_SHELL_ARGS $@
7381else
74− $QML_PHONE_SHELL_PATH $QML_PHONE_SHELL_ARGS $@
82+ status=`/sbin/initctl status unity8`
83+ if [ "$status" != "unity8 stop/waiting" ]; then
84+ echo "Unity8 is already running, please stop it first"
85+ exit 1
86+ fi
87+ /sbin/initctl start unity8 BINARY="`readlink -f $QML_PHONE_SHELL_PATH` $QML_PHONE_SHELL_ARGS $@" QML2_IMPORT_PATH=$QML2_IMPORT_PATH LD_LIBRARY_PATH=$LD_LIBRARY_PATH
88+ tailf -n 0 ~/.cache/upstart/unity8.log
7589fi
run_on_device → run_on_device.shrenamed+2−2
@@ -88,7 +88,7 @@ sync_code() {
8888}
8989
9090build() {
91− exec_with_ssh PATH=/usr/lib/ccache:$PATH "cd $CODE_DIR/ && PATH=/usr/lib/ccache:$PATH ./build"
91+ exec_with_ssh PATH=/usr/lib/ccache:$PATH "cd $CODE_DIR/ && PATH=/usr/lib/ccache:$PATH ./build.sh"
9292}
9393
9494run() {
@@ -105,7 +105,7 @@ run() {
105105
106106 exec_with_ssh "stop unity8"
107107 exec_with_ssh "start maliit-server"
108− exec_with_ssh "cd $CODE_DIR/ && ./run $ARGS -- $RUN_OPTIONS"
108+ exec_with_ssh "cd $CODE_DIR/ && ./run.sh $ARGS -- $RUN_OPTIONS"
109109 exec_with_ssh "stop maliit-server"
110110 exec_with_ssh "start unity8"
111111}
tests/autopilot/unity8/application_lifecycle/tests/__init__.py+49
@@ -0,0 +1,49 @@
1+# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2+#
3+# Unity Autopilot Test Suite
4+# Copyright (C) 2014 Canonical
5+#
6+# This program is free software: you can redistribute it and/or modify
7+# it under the terms of the GNU General Public License as published by
8+# the Free Software Foundation, either version 3 of the License, or
9+# (at your option) any later version.
10+#
11+# This program is distributed in the hope that it will be useful,
12+# but WITHOUT ANY WARRANTY; without even the implied warranty of
13+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+# GNU General Public License for more details.
15+#
16+# You should have received a copy of the GNU General Public License
17+# along with this program. If not, see <http://www.gnu.org/licenses/>.
18+#
19+
20+from autopilot.matchers import Eventually
21+from testtools.matchers import Equals
22+from ubuntuuitoolkit import fixture_setup
23+
24+from unity8 import process_helpers
25+from unity8.shell import tests
26+
27+
28+class ApplicationLifeCycleTestCase(tests.UnityTestCase):
29+
30+ def setUp(self):
31+ super(ApplicationLifeCycleTestCase, self).setUp()
32+ self._qml_mock_enabled = False
33+ self._data_dirs_mock_enabled = False
34+ unity_proxy = self.launch_unity()
35+ process_helpers.unlock_unity(unity_proxy)
36+
37+ def create_test_application(self):
38+ desktop_file_dict = fixture_setup.DEFAULT_DESKTOP_FILE_DICT
39+ desktop_file_dict.update({'X-Ubuntu-Single-Instance': 'true'})
40+ fake_application = fixture_setup.FakeApplication(
41+ desktop_file_dict=desktop_file_dict)
42+ self.useFixture(fake_application)
43+ return (
44+ fake_application.qml_file_path, fake_application.desktop_file_path)
45+
46+ def assert_current_focused_application(self, application_name):
47+ self.assertThat(
48+ self.main_window.get_current_focused_app_id,
49+ Eventually(Equals(application_name)))
tests/autopilot/unity8/application_lifecycle/tests/test_application_lifecycle.py+56−72
@@ -21,27 +21,26 @@
2121
2222from __future__ import absolute_import
2323
24−from unity8.process_helpers import unlock_unity
25−from unity8.shell import disable_qml_mocking
26−from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
24+import logging
25+import os
2726
2827from autopilot.matchers import Eventually
2928from autopilot.platform import model
30−from testtools.matchers import Equals, NotEquals
29+from testtools.matchers import Equals
3130
32−import logging
31+from unity8 import process_helpers
32+from unity8.application_lifecycle import tests
3333
34−logger = logging.getLogger(__name__)
3534
35+logger = logging.getLogger(__name__)
3636
37−class ApplicationLifecycleTests(UnityTestCase):
3837
39− scenarios = _get_device_emulation_scenarios()
38+class ApplicationLifecycleTests(tests.ApplicationLifeCycleTestCase):
4039
4140 def setUp(self):
41+ if model() == 'Desktop':
42+ self.skipTest('Test cannot be run on the desktop.')
4243 super(ApplicationLifecycleTests, self).setUp()
43− if model() == "Desktop":
44− self.skipTest("Test cannot be run on the desktop.")
4544
4645 def swipe_screen_from_right(self):
4746 width = self.main_window.width
@@ -54,80 +53,65 @@ class ApplicationLifecycleTests(UnityTestCase):
5453 logger.info("Swiping screen from the right edge")
5554 self.touch.drag(start_x, start_y, end_x, end_y)
5655
57− def _launch_app(self, app_name):
58− """Launches the application *app_name*
59−
60− Assumes that the desktop file resides at:
61− /usr/share/applications/{app_name}.desktop
56+ def launch_fake_app(self):
57+ _, desktop_file_path = self.create_test_application()
58+ desktop_file_name = os.path.basename(desktop_file_path)
59+ application_name, _ = os.path.splitext(desktop_file_name)
60+ self.launch_upstart_application(application_name)
61+ return application_name
6262
63− """
64− desktop_file = "--desktop_file_hint="\
65− "/usr/share/applications/{app_name}.desktop".format(
66− app_name=app_name
67− )
68− return self.launch_test_application(
69− app_name,
70− desktop_file,
71− "--stage_hint=main_stage",
72− app_type='qt'
73− )
74−
75− @disable_qml_mocking
7663 def test_can_launch_application(self):
7764 """Must be able to launch an application."""
78− unity_proxy = self.launch_unity()
79− unlock_unity(unity_proxy)
80−
81− app = self._launch_app("messaging-app")
65+ application_name = self.launch_fake_app()
66+ self.assert_current_focused_application(application_name)
8267
83− self.assertThat(app, NotEquals(None))
84− self.assertThat(
85− self.main_window.get_current_focused_app_id(),
86− Eventually(Equals("messaging-app"))
87− )
88−
89− @disable_qml_mocking
9068 def test_can_launch_multiple_applications(self):
9169 """A second application launched must be focused."""
92− unity_proxy = self.launch_unity()
93− unlock_unity(unity_proxy)
94−
95− self._launch_app("messaging-app")
96− self.assertThat(
97− self.main_window.get_current_focused_app_id(),
98− Eventually(Equals("messaging-app"))
99− )
100−
101− self._launch_app("address-book-app")
102− self.assertThat(
103− self.main_window.get_current_focused_app_id(),
104− Eventually(Equals("address-book-app"))
105− )
106−
107− @disable_qml_mocking
70+ application1_name = self.launch_fake_app()
71+ self.assert_current_focused_application(application1_name)
72+
73+ application2_name = self.launch_fake_app()
74+ self.assertFalse(application1_name == application2_name)
75+ self.assert_current_focused_application(application2_name)
76+
10877 def test_app_moves_from_unfocused_to_focused(self):
10978 """An application that is in the unfocused state must be able to be
11079 brought back to the focused state.
11180
11281 """
113− unity_proxy = self.launch_unity()
114− unlock_unity(unity_proxy)
115−
116− self._launch_app("messaging-app")
117− self.assertThat(
118− self.main_window.get_current_focused_app_id(),
119− Eventually(Equals("messaging-app"))
120− )
82+ application1_name = self.launch_fake_app()
83+ self.assert_current_focused_application(application1_name)
12184
122− self._launch_app("address-book-app")
123− self.assertThat(
124− self.main_window.get_current_focused_app_id(),
125− Eventually(Equals("address-book-app"))
126− )
85+ application2_name = self.launch_fake_app()
86+ self.assertFalse(application1_name == application2_name)
87+ self.assert_current_focused_application(application2_name)
12788
12889 self.swipe_screen_from_right()
12990
130− self.assertThat(
131− self.main_window.get_current_focused_app_id(),
132− Eventually(Equals("messaging-app"))
133− )
91+ self.assert_current_focused_application(application1_name)
92+
93+ def test_greeter_hides_on_app_open(self):
94+ """Greeter should hide when an app is opened"""
95+ process_helpers.lock_unity()
96+ greeter = self.main_window.get_greeter()
97+ self.assertThat(greeter.created, Eventually(Equals(True)))
98+
99+ application_name = self.launch_fake_app()
100+ self.assertThat(greeter.created, Eventually(Equals(False)))
101+ self.assert_current_focused_application(application_name)
102+
103+ def test_greeter_hides_on_app_focus(self):
104+ """Greeter should hide when an app is re-focused"""
105+ application_name = self.launch_fake_app()
106+ self.assert_current_focused_application(application_name)
107+
108+ self.main_window.show_dash_swiping()
109+ self.assert_current_focused_application('')
110+
111+ process_helpers.lock_unity()
112+ greeter = self.main_window.get_greeter()
113+ self.assertThat(greeter.created, Eventually(Equals(True)))
114+
115+ self.launch_upstart_application(application_name)
116+ self.assertThat(greeter.created, Eventually(Equals(False)))
117+ self.assert_current_focused_application(application_name)
tests/autopilot/unity8/application_lifecycle/tests/test_url_dispatcher.py+8−39
@@ -20,48 +20,19 @@
2020"""Test the integration with the URL dispatcher service."""
2121
2222import os
23+import subprocess
2324
2425from autopilot import platform
25−from autopilot.matchers import Eventually
26−from testtools.matchers import Equals
27−from ubuntuuitoolkit import fixture_setup
2826
29−from unity8 import process_helpers
30−from unity8.shell import tests
27+from unity8.application_lifecycle import tests
3128
3229
33−class URLDispatcherTestCase(tests.UnityTestCase):
34−
35− scenarios = tests._get_device_emulation_scenarios()
36−
37− test_qml = ("""
38−import QtQuick 2.0
39−import Ubuntu.Components 0.1
40−
41−MainView {
42− width: units.gu(48)
43− height: units.gu(60)
44−
45− Label {
46− text: 'Test application.'
47− }
48−}
49−""")
30+class URLDispatcherTestCase(tests.ApplicationLifeCycleTestCase):
5031
5132 def setUp(self):
5233 if platform.model() == 'Desktop':
5334 self.skipTest("URL dispatcher doesn't work on the desktop.")
5435 super(URLDispatcherTestCase, self).setUp()
55− self._qml_mock_enabled = False
56− self._data_dirs_mock_enabled = False
57− unity_proxy = self.launch_unity()
58− process_helpers.unlock_unity(unity_proxy)
59−
60− def create_test_application(self):
61− fake_application = fixture_setup.FakeApplication(self.test_qml)
62− self.useFixture(fake_application)
63− return (
64− fake_application.qml_file_path, fake_application.desktop_file_path)
6536
6637 def test_swipe_out_application_started_by_url_dispatcher(self):
6738 _, desktop_file_path = self.create_test_application()
@@ -70,12 +41,10 @@ MainView {
7041
7142 self.assertEqual('', self.main_window.get_current_focused_app_id())
7243 self.addCleanup(os.system, 'pkill qmlscene')
73− os.system('url-dispatcher application:///{}'.format(desktop_file_name))
74− self.assertThat(
75− self.main_window.get_current_focused_app_id,
76− Eventually(Equals(application_name)))
44+
45+ subprocess.check_call(
46+ ['url-dispatcher', 'application:///{}'.format(desktop_file_name)])
47+ self.assert_current_focused_application(application_name)
7748
7849 self.main_window.show_dash_swiping()
79− self.assertThat(
80− self.main_window.get_current_focused_app_id,
81− Eventually(Equals('')))
50+ self.assert_current_focused_application('')
tests/autopilot/unity8/indicators/tests/__init__.py+17
@@ -0,0 +1,17 @@
1+# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2+#
3+# Unity - Indicators Autopilot Test Suite
4+# Copyright (C) 2013, 2014 Canonical
5+#
6+# This program is free software: you can redistribute it and/or modify
7+# it under the terms of the GNU General Public License as published by
8+# the Free Software Foundation, either version 3 of the License, or
9+# (at your option) any later version.
10+#
11+# This program is distributed in the hope that it will be useful,
12+# but WITHOUT ANY WARRANTY; without even the implied warranty of
13+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+# GNU General Public License for more details.
15+#
16+# You should have received a copy of the GNU General Public License
17+# along with this program. If not, see <http://www.gnu.org/licenses/>.
tests/autopilot/unity8/indicators/tests/test_indicators.py+69−13
@@ -1,7 +1,7 @@
11# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
22#
3−# Unity - Indicators Autopilot Test Suite
4−# Copyright (C) 2013 Canonical
3+# Unity Indicators Autopilot Test Suite
4+# Copyright (C) 2013, 2014 Canonical
55#
66# This program is free software: you can redistribute it and/or modify
77# it under the terms of the GNU General Public License as published by
@@ -15,20 +15,32 @@
1515#
1616# You should have received a copy of the GNU General Public License
1717# along with this program. If not, see <http://www.gnu.org/licenses/>.
18−#
1918
2019from __future__ import absolute_import
2120
21+from testscenarios import multiply_scenarios
22+
2223from autopilot import platform
23−from testtools import skipIf
2424
2525from unity8.process_helpers import unlock_unity
26−from unity8.shell.tests import UnityTestCase
26+from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
2727
2828
2929class IndicatorTestCase(UnityTestCase):
3030
31− scenarios = [
31+ device_emulation_scenarios = _get_device_emulation_scenarios()
32+
33+ def setUp(self):
34+ if platform.model() == 'Desktop':
35+ self.skipTest('Test cannot be run on the desktop.')
36+ super(IndicatorTestCase, self).setUp()
37+ self.unity_proxy = self.launch_unity()
38+ unlock_unity(self.unity_proxy)
39+
40+
41+class IndicatorExistsTestCase(IndicatorTestCase):
42+
43+ indicator_scenarios = [
3244 ('Bluetooth', dict(indicator_name='indicator-bluetooth')),
3345 ('Datetime', dict(indicator_name='indicator-datetime')),
3446 ('Location', dict(indicator_name='indicator-location')),
@@ -37,14 +49,58 @@ class IndicatorTestCase(UnityTestCase):
3749 ('Power', dict(indicator_name='indicator-power')),
3850 ('Sound', dict(indicator_name='indicator-sound')),
3951 ]
52+ scenarios = multiply_scenarios(
53+ indicator_scenarios,
54+ IndicatorTestCase.device_emulation_scenarios
55+ )
4056
41− @skipIf(platform.image_codename() == 'Desktop',
42− "Unity8/phablet-only test!")
4357 def setUp(self):
44− super(IndicatorTestCase, self).setUp()
58+ super(IndicatorExistsTestCase, self).setUp()
59+ if (platform.model() == 'Nexus 10' and
60+ self.indicator_name == 'indicator-bluetooth'):
61+ self.skipTest('Nexus 10 does not have bluetooth at the moment.')
4562
4663 def test_indicator_exists(self):
47− unity_proxy = self.launch_unity()
48− unlock_unity(unity_proxy)
49− indicator = self.main_window.get_indicator(self.indicator_name)
50− self.assertIsNotNone(indicator)
64+ self.main_window._get_indicator_widget(
65+ self.indicator_name
66+ )
67+
68+
69+class IndicatorPageTitleMatchesWidgetTestCase(IndicatorTestCase):
70+
71+ indicator_scenarios = [
72+ ('Bluetooth', dict(indicator_name='indicator-bluetooth',
73+ title='Bluetooth')),
74+ ('Datetime', dict(indicator_name='indicator-datetime',
75+ title='Upcoming')),
76+ ('Location', dict(indicator_name='indicator-location',
77+ title='Location')),
78+ ('Messaging', dict(indicator_name='indicator-messages',
79+ title='Incoming')),
80+ ('Network', dict(indicator_name='indicator-network',
81+ title='Network')),
82+ ('Power', dict(indicator_name='indicator-power',
83+ title='Battery')),
84+ ('Sound', dict(indicator_name='indicator-sound',
85+ title='Sound')),
86+ ]
87+ scenarios = multiply_scenarios(
88+ indicator_scenarios,
89+ IndicatorTestCase.device_emulation_scenarios
90+ )
91+
92+ def setUp(self):
93+ super(IndicatorPageTitleMatchesWidgetTestCase, self).setUp()
94+ if (platform.model() == 'Nexus 10' and
95+ self.indicator_name == 'indicator-bluetooth'):
96+ self.skipTest('Nexus 10 does not have bluetooth at the moment.')
97+
98+ def test_indicator_page_title_matches_widget(self):
99+ """Swiping open an indicator must show its correct title.
100+
101+ See https://bugs.launchpad.net/ubuntu-ux/+bug/1253804 .
102+ """
103+ indicator_page = self.main_window.open_indicator_page(
104+ self.indicator_name)
105+ self.assertTrue(indicator_page.visible)
106+ self.assertEqual(indicator_page.title, self.title)
tests/autopilot/unity8/process_helpers.py+16
@@ -89,6 +89,22 @@ def unlock_unity(unity_proxy_obj=None):
8989 break
9090
9191
92+def lock_unity(unity_proxy_obj=None):
93+ """Helper function that attempts to lock the unity greeter."""
94+ import evdev, time
95+ uinput = evdev.UInput(name='unity8-autopilot-power-button',
96+ devnode='/dev/autopilot-uinput')
97+ # One press and release to turn screen off (locking unity)
98+ uinput.write(evdev.ecodes.EV_KEY, evdev.ecodes.KEY_POWER, 1)
99+ uinput.write(evdev.ecodes.EV_KEY, evdev.ecodes.KEY_POWER, 0)
100+ uinput.syn()
101+ time.sleep(1)
102+ # And another press and release to turn screen back on
103+ uinput.write(evdev.ecodes.EV_KEY, evdev.ecodes.KEY_POWER, 1)
104+ uinput.write(evdev.ecodes.EV_KEY, evdev.ecodes.KEY_POWER, 0)
105+ uinput.syn()
106+
107+
92108def restart_unity_with_testability(*args):
93109 """Restarts (or starts) unity with testability enabled.
94110
tests/autopilot/unity8/shell/__init__.py+50−1
@@ -21,8 +21,9 @@
2121
2222from time import sleep
2323from functools import wraps
24−import logging
24+from gi.repository import Notify
2525
26+import logging
2627
2728logger = logging.getLogger(__name__)
2829
@@ -48,6 +49,7 @@ def disable_qml_mocking(fn):
4849 return fn(*args, **kwargs)
4950 return wrapper
5051
52+
5153class DragMixin(object):
5254 def _drag(self, x1, y1, x2, y2):
5355 # XXX This ugly code is here just temporarily, waiting for drag
@@ -69,3 +71,50 @@ class DragMixin(object):
6971 self.touch._finger_move(int(x2), int(y2))
7072 except AttributeError:
7173 self.touch._device.finger_move(int(x2), int(y2))
74+
75+
76+def create_ephemeral_notification(
77+ summary='',
78+ body='',
79+ icon=None,
80+ hints=[],
81+ urgency='NORMAL'
82+):
83+ """Create an ephemeral (non-interactive) notification
84+
85+ :param summary: Summary text for the notification
86+ :param body: Body text to display in the notification
87+ :param icon: Path string to the icon to use
88+ :param hint_strings: List of tuples containing the 'name' and value
89+ for setting the hint strings for the notification
90+ :param urgency: Urgency string for the noticiation, either: 'LOW',
91+ 'NORMAL', 'CRITICAL'
92+ """
93+ Notify.init('Unity8')
94+
95+ logger.info(
96+ "Creating ephemeral: summary(%s), body(%s), urgency(%r) "
97+ "and Icon(%s)",
98+ summary,
99+ body,
100+ urgency,
101+ icon
102+ )
103+
104+ notification = Notify.Notification.new(summary, body, icon)
105+
106+ for hint in hints:
107+ key, value = hint
108+ notification.set_hint_string(key, value)
109+ logger.info("Adding hint to notification: (%s, %s)", key, value)
110+ notification.set_urgency(_get_urgency(urgency))
111+
112+ return notification
113+
114+
115+def _get_urgency(urgency):
116+ """Translates urgency string to enum."""
117+ _urgency_enums = {'LOW': Notify.Urgency.LOW,
118+ 'NORMAL': Notify.Urgency.NORMAL,
119+ 'CRITICAL': Notify.Urgency.CRITICAL}
120+ return _urgency_enums.get(urgency.upper())
tests/autopilot/unity8/shell/emulators/__init__.py+2−6
@@ -17,16 +17,12 @@
1717# along with this program. If not, see <http://www.gnu.org/licenses/>.
1818#
1919
20−from autopilot import input, introspection
20+from ubuntuuitoolkit import emulators as toolkit_emulators
2121
2222
23−class UnityEmulatorBase(introspection.CustomEmulatorBase):
23+class UnityEmulatorBase(toolkit_emulators.UbuntuUIToolkitEmulatorBase):
2424 """A base class for all unity emulators."""
2525
26− def __init__(self, *args):
27− super(UnityEmulatorBase, self).__init__(*args)
28− self.pointing_device = input.Pointer(device=input.Touch.create())
29−
3026
3127class UnityEmulatorException(Exception):
3228 """Exception raised when there is an error with the Unity emulators."""
tests/autopilot/unity8/shell/emulators/dash.py+25−5
@@ -23,6 +23,8 @@ from unity8.shell import emulators
2323
2424from autopilot import logging as autopilot_logging
2525from autopilot.introspection import dbus
26+from testtools.matchers import MatchesAny, Equals
27+from ubuntuuitoolkit import emulators as toolkit_emulators
2628
2729
2830logger = logging.getLogger(__name__)
@@ -132,6 +134,19 @@ class Dash(emulators.UnityEmulatorBase):
132134 self.pointing_device.drag(start_x, start_y, stop_x, stop_y)
133135 self.dash_content_list.currentIndex.wait_for(original_index + 1)
134136
137+ def enter_search_query(self, query):
138+ search_text_field = self._get_search_text_field()
139+ search_text_field.write(query)
140+ search_text_field.state.wait_for('idle')
141+
142+ def _get_search_text_field(self):
143+ page_header = self._get_page_header()
144+ search_container = page_header.select_single(
145+ 'QQuickItem', objectName='searchContainer')
146+ search_container.state.wait_for(
147+ MatchesAny(Equals('narrowActive'), Equals('active')))
148+ return search_container.select_single(toolkit_emulators.TextField)
149+
135150
136151class GenericScopeView(emulators.UnityEmulatorBase):
137152 """Autopilot emulator for generic scopes."""
@@ -176,13 +191,18 @@ class DashApps(GenericScopeView):
176191
177192 """
178193 category_element = self._get_category_element(category)
179− application_tiles = category_element.select_many('Card')
180− # TODO return them on the same order they are displayed.
181− # --elopio - 2014-1-15
194+ application_cards = category_element.select_many('Card')
195+
196+ # sort by y, x
197+ application_cards = sorted(
198+ application_cards,
199+ key=lambda card: (card.globalRect.y, card.globalRect.x))
200+
182201 result = []
183− for card in application_tiles:
202+ for card in application_cards:
184203 if card.objectName != 'cardToolCard':
185− result.append(card)
204+ card_header = card.select_single('CardHeader')
205+ result.append(card_header.title)
186206 return result
187207
188208
tests/autopilot/unity8/shell/emulators/main_window.py+32−2
@@ -20,6 +20,7 @@
2020import logging
2121
2222from autopilot import logging as autopilot_logging
23+from autopilot import input
2324
2425from unity8.shell import emulators
2526from unity8.shell.emulators.greeter import Greeter
@@ -87,12 +88,32 @@ class QQuickView(emulators.UnityEmulatorBase):
8788 def get_pinentryField(self):
8889 return self.select_single(objectName="pinentryField")
8990
90− def get_indicator(self, indicator_name):
91− return self.wait_select_single(
91+ def _get_indicator_widget(self, indicator_name):
92+ return self.select_single(
9293 'DefaultIndicatorWidget',
9394 objectName=indicator_name+'-widget'
9495 )
9596
97+ def _get_indicator_page(self, indicator_name):
98+ return self.select_single(
99+ 'DefaultIndicatorPage',
100+ objectName=indicator_name+'-page'
101+ )
102+
103+ @autopilot_logging.log_action(logger.info)
104+ def open_indicator_page(self, indicator_name):
105+ """Swipe to open the indicator, wait until it's open.
106+
107+ :returns: The indicator page.
108+ """
109+ widget = self._get_indicator_widget(indicator_name)
110+ start_x, start_y = input.get_center_point(widget)
111+ end_x = start_x
112+ end_y = self.height
113+ self.pointing_device.drag(start_x, start_y, end_x, end_y)
114+ self.wait_select_single('Indicators', fullyOpened=True)
115+ return self._get_indicator_page(indicator_name)
116+
96117 def get_shell_background(self):
97118 return self.select_single(
98119 "CrossFadeImage", objectName="backgroundImage")
@@ -113,3 +134,12 @@ class QQuickView(emulators.UnityEmulatorBase):
113134 def get_current_focused_app_id(self):
114135 """Return the id of the focused application."""
115136 return self.select_single('Shell').focusedApplicationId
137+
138+ @autopilot_logging.log_action(logger.info)
139+ def search(self, query):
140+ search_indicator = self._get_search_indicator()
141+ self.pointing_device.click_object(search_indicator)
142+ self.get_dash().enter_search_query(query)
143+
144+ def _get_search_indicator(self):
145+ return self.select_single('SearchIndicator', objectName='search')
tests/autopilot/unity8/shell/tests/test_emulators.py+20−12
@@ -39,6 +39,22 @@ from unity8.shell import emulators, fixture_setup, tests
3939from unity8.shell.emulators import dash as dash_emulators
4040
4141
42+class MainWindowTestCase(tests.UnityTestCase):
43+
44+ scenarios = tests._get_device_emulation_scenarios()
45+
46+ def setUp(self):
47+ super(MainWindowTestCase, self).setUp()
48+ unity_proxy = self.launch_unity()
49+ process_helpers.unlock_unity(unity_proxy)
50+
51+ def test_search(self):
52+ self.main_window.search('Test')
53+ text_field = self.main_window.get_dash()._get_search_text_field()
54+ self.assertEqual(text_field.text, 'Test')
55+ self.assertEqual(text_field.state, 'idle')
56+
57+
4258class DashBaseTestCase(tests.UnityTestCase):
4359
4460 scenarios = tests._get_device_emulation_scenarios()
@@ -150,7 +166,7 @@ class DashAppsEmulatorTestCase(DashBaseTestCase):
150166 available_applications = [
151167 'Title.2.0', 'Title.2.1', 'Title.2.2', 'Title.2.3', 'Title.2.4',
152168 'Title.2.5', 'Title.2.6', 'Title.2.7', 'Title.2.8', 'Title.2.9',
153− 'Title.2.9', 'Title.2.10', 'Title.2.11']
169+ 'Title.2.10', 'Title.2.11', 'Title.2.12']
154170
155171 def setUp(self):
156172 # Set up the fake scopes before launching unity.
@@ -167,28 +183,20 @@ class DashAppsEmulatorTestCase(DashBaseTestCase):
167183 self.assertEqual(
168184 'No category found with name unexisting category', str(exception))
169185
170− def test_get_applications_should_return_list_with_names(self):
186+ def test_get_applications_should_return_correct_applications(self):
171187 category = '2'
172188 expected_apps_count = self._get_number_of_application_slots(category)
173189 expected_applications = self.available_applications[
174190 :expected_apps_count]
175−
176191 applications = self.applications_scope.get_applications(category)
177− applications_titles = []
178− for application in applications:
179− cardHeader = application.select_single('CardHeader')
180− applications_titles.append(cardHeader.title)
181−
182− self.assertThat(applications, HasLength(expected_apps_count))
183− for expected in expected_applications:
184− self.assertThat(applications_titles, Contains(expected))
192+ self.assertEqual(expected_applications, applications)
185193
186194 def _get_number_of_application_slots(self, category):
187195 category_element = self.applications_scope._get_category_element(
188196 category)
189197 grid = category_element.select_single('CardFilterGrid')
190198 filtergrid = grid.select_single('FilterGrid')
191− if (grid.filter):
199+ if (grid.filtered):
192200 return filtergrid.collapsedRowCount * filtergrid.columns
193201 else:
194202 return filtergrid.uncollapsedRowCount * filtergrid.columns
tests/autopilot/unity8/shell/tests/test_notifications.py+100−61
@@ -21,6 +21,7 @@
2121
2222from __future__ import absolute_import
2323
24+from unity8 import shell
2425from unity8.process_helpers import unlock_unity
2526from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
2627
@@ -64,7 +65,8 @@ class NotificationsBase(UnityTestCase):
6465 if os.path.abspath(__file__).startswith('/usr/'):
6566 return '/usr/share/unity8/graphics/' + icon_name
6667 else:
67− return os.path.dirname(__file__) + "/../../../../../qml/graphics/" + icon_name
68+ return os.path.dirname(__file__) + (
69+ "/../../../../../qml/graphics/" + icon_name)
6870
6971 def _get_notifications_list(self):
7072 return self.main_window.select_single(
@@ -196,7 +198,7 @@ class InteractiveNotificationBase(NotificationsBase):
196198 get_notification = lambda: notify_list.wait_select_single(
197199 'Notification', objectName='notification1')
198200 notification = get_notification()
199− self._assert_notification(notification, None, None, True, True, 1.0)
201+ self._assert_notification(notification, summary, body, True, True, 1.0)
200202 initial_height = notification.height
201203 self.touch.tap_object(notification.select_single(objectName="button1"))
202204 self.assertThat(
@@ -209,6 +211,89 @@ class InteractiveNotificationBase(NotificationsBase):
209211 self.touch.tap_object(notification.select_single(objectName="button4"))
210212 self.assert_notification_action_id_was_called("action_decline_4")
211213
214+ def test_modal_sd_without_greeter (self):
215+ """A snap-decision on a phone should block input to shell beneath it when there's no greeter."""
216+ unity_proxy = self.launch_unity()
217+ unlock_unity(unity_proxy)
218+
219+ summary = "Incoming file"
220+ body = "Frank would like to send you the file: essay.pdf"
221+ icon_path = "sync-idle"
222+ hints = [
223+ ("x-canonical-snap-decisions", "true"),
224+ ("x-canonical-non-shaped-icon", "true"),
225+ ]
226+
227+ actions = [
228+ ('action_accept', 'Accept'),
229+ ('action_decline_1', 'Decline'),
230+ ]
231+
232+ self._create_interactive_notification(
233+ summary,
234+ body,
235+ icon_path,
236+ "NORMAL",
237+ actions,
238+ hints
239+ )
240+
241+ # verify that we cannot reveal the launcher (no longer interact with the shell)
242+ time.sleep(1)
243+ self.main_window.show_dash_swiping()
244+ launcher = self.main_window.get_launcher()
245+ self.assertThat(launcher.shown, Eventually(Equals(False)))
246+
247+ # verify and interact with the triggered snap-decision notification
248+ notify_list = self._get_notifications_list()
249+ get_notification = lambda: notify_list.wait_select_single(
250+ 'Notification', objectName='notification1')
251+ notification = get_notification()
252+ self._assert_notification(notification, summary, body, True, False, 1.0)
253+ self.touch.tap_object(notification.select_single(objectName="button0"))
254+ self.assert_notification_action_id_was_called("action_accept")
255+
256+ def test_modal_sd_with_greeter (self):
257+ """A snap-decision on a phone should not block input to the greeter beneath it."""
258+ unity_proxy = self.launch_unity()
259+
260+ summary = "Incoming file"
261+ body = "Frank would like to send you the file: essay.pdf"
262+ icon_path = "sync-idle"
263+ hints = [
264+ ("x-canonical-snap-decisions", "true"),
265+ ("x-canonical-non-shaped-icon", "true"),
266+ ]
267+
268+ actions = [
269+ ('action_accept', 'Accept'),
270+ ('action_decline_1', 'Decline'),
271+ ]
272+
273+ self._create_interactive_notification(
274+ summary,
275+ body,
276+ icon_path,
277+ "NORMAL",
278+ actions,
279+ hints
280+ )
281+
282+ # verify that we can swipe away the greeter (interact with the "shell")
283+ time.sleep(1)
284+ self.main_window.show_dash_swiping()
285+ greeter = self.main_window.get_greeter()
286+ self.assertThat(greeter.shown, Eventually(Equals(False)))
287+
288+ # verify and interact with the triggered snap-decision notification
289+ notify_list = self._get_notifications_list()
290+ get_notification = lambda: notify_list.wait_select_single(
291+ 'Notification', objectName='notification1')
292+ notification = get_notification()
293+ self._assert_notification(notification, summary, body, True, False, 1.0)
294+ self.touch.tap_object(notification.select_single(objectName="button0"))
295+ self.assert_notification_action_id_was_called("action_accept")
296+
212297 def _create_interactive_notification(
213298 self,
214299 summary="",
@@ -354,7 +439,7 @@ class EphemeralNotificationsTests(NotificationsBase):
354439 )
355440 ]
356441
357− notification = self._create_ephemeral_notification(
442+ notification = shell.create_ephemeral_notification(
358443 summary,
359444 body,
360445 icon_path,
@@ -391,7 +476,7 @@ class EphemeralNotificationsTests(NotificationsBase):
391476 )
392477 ]
393478
394− notification = self._create_ephemeral_notification(
479+ notification = shell.create_ephemeral_notification(
395480 summary,
396481 None,
397482 None,
@@ -403,7 +488,6 @@ class EphemeralNotificationsTests(NotificationsBase):
403488
404489 notification = lambda: notify_list.wait_select_single(
405490 'Notification', objectName='notification1')
406−
407491 self._assert_notification(
408492 notification(),
409493 summary,
@@ -434,7 +518,7 @@ class EphemeralNotificationsTests(NotificationsBase):
434518 body_critical = 'Dude, this is so urgent you have no idea :)'
435519 icon_path_critical = self._get_icon_path('avatars/anna_olsson.png')
436520
437− notification_normal = self._create_ephemeral_notification(
521+ notification_normal = shell.create_ephemeral_notification(
438522 summary_normal,
439523 body_normal,
440524 icon_path_normal,
@@ -442,7 +526,7 @@ class EphemeralNotificationsTests(NotificationsBase):
442526 )
443527 notification_normal.show()
444528
445− notification_low = self._create_ephemeral_notification(
529+ notification_low = shell.create_ephemeral_notification(
446530 summary_low,
447531 body_low,
448532 icon_path_low,
@@ -450,7 +534,7 @@ class EphemeralNotificationsTests(NotificationsBase):
450534 )
451535 notification_low.show()
452536
453− notification_critical = self._create_ephemeral_notification(
537+ notification_critical = shell.create_ephemeral_notification(
454538 summary_critical,
455539 body_critical,
456540 icon_path_critical,
@@ -511,7 +595,7 @@ class EphemeralNotificationsTests(NotificationsBase):
511595 summary = 'Summary-Body'
512596 body = 'This is a superfluous notification'
513597
514− notification = self._create_ephemeral_notification(summary, body)
598+ notification = shell.create_ephemeral_notification(summary, body)
515599 notification.show()
516600
517601 notification = notify_list.wait_select_single(
@@ -535,7 +619,7 @@ class EphemeralNotificationsTests(NotificationsBase):
535619
536620 summary = 'Summary-Only'
537621
538− notification = self._create_ephemeral_notification(summary)
622+ notification = shell.create_ephemeral_notification(summary)
539623 notification.show()
540624
541625 notification = notify_list.wait_select_single(
@@ -555,7 +639,7 @@ class EphemeralNotificationsTests(NotificationsBase):
555639 body = 'This is the original content of this notification-bubble.'
556640 icon_path = self._get_icon_path('avatars/funky.png')
557641
558− notification = self._create_ephemeral_notification(
642+ notification = shell.create_ephemeral_notification(
559643 summary,
560644 body,
561645 icon_path
@@ -579,7 +663,7 @@ class EphemeralNotificationsTests(NotificationsBase):
579663 icon_path = self._get_icon_path('avatars/amanda.png')
580664 notification.update(summary, body, icon_path)
581665 notification.show()
582− self._assert_notification(get_notification(), summary, body)
666+ self._assert_notification(get_notification(), summary, body, True, False, 1.0)
583667
584668 def test_update_notification_layout_change(self):
585669 """Notification must allow updating its contents and layout while
@@ -595,7 +679,7 @@ class EphemeralNotificationsTests(NotificationsBase):
595679 icon_path = self._get_icon_path('avatars/anna_olsson.png')
596680 hint_icon = self._get_icon_path('applicationIcons/phone-app.png')
597681
598− notification = self._create_ephemeral_notification(
682+ notification = shell.create_ephemeral_notification(
599683 summary,
600684 body,
601685 icon_path
@@ -626,7 +710,7 @@ class EphemeralNotificationsTests(NotificationsBase):
626710 notification.show()
627711
628712 self.assertThat(get_notification, Eventually(NotEquals(None)))
629− self._assert_notification(get_notification(), summary, body, False)
713+ self._assert_notification(get_notification(), summary, body, False, False, 1.0)
630714
631715 def test_append_hint(self):
632716 """Notification has to accumulate body-text using append-hint."""
@@ -639,7 +723,7 @@ class EphemeralNotificationsTests(NotificationsBase):
639723 body = 'Hey Bro Coly!'
640724 icon_path = self._get_icon_path('avatars/amanda.png')
641725 body_sum = body
642− notification = self._create_ephemeral_notification(
726+ notification = shell.create_ephemeral_notification(
643727 summary,
644728 body,
645729 icon_path,
@@ -675,7 +759,7 @@ class EphemeralNotificationsTests(NotificationsBase):
675759 for new_body in bodies:
676760 body = new_body
677761 body_sum += '\n' + body
678− notification = self._create_ephemeral_notification(
762+ notification = shell.create_ephemeral_notification(
679763 summary,
680764 body,
681765 icon_path,
@@ -696,48 +780,3 @@ class EphemeralNotificationsTests(NotificationsBase):
696780 False,
697781 1.0
698782 )
699−
700− def _create_ephemeral_notification(
701− self,
702− summary="",
703− body="",
704− icon=None,
705− hints=[],
706− urgency="NORMAL"
707− ):
708− """Create an ephemeral (non-interactive) notification
709−
710− :param summary: Summary text for the notification
711− :param body: Body text to display in the notification
712− :param icon: Path string to the icon to use
713− :param hint_strings: List of tuples containing the 'name' and value
714− for setting the hint strings for the notification
715− :param urgency: Urgency string for the noticiation, either: 'LOW',
716− 'NORMAL', 'CRITICAL'
717−
718− """
719− logger.info(
720− "Creating ephemeral: summary(%s), body(%s), urgency(%r) "
721− "and Icon(%s)",
722− summary,
723− body,
724− urgency,
725− icon
726− )
727−
728− n = Notify.Notification.new(summary, body, icon)
729−
730− for hint in hints:
731− key, value = hint
732− n.set_hint_string(key, value)
733− logger.info("Adding hint to notification: (%s, %s)", key, value)
734− n.set_urgency(self._get_urgency(urgency))
735−
736− return n
737−
738− def _get_urgency(self, urgency):
739− """Translates urgency string to enum."""
740− _urgency_enums = {'LOW': Notify.Urgency.LOW,
741− 'NORMAL': Notify.Urgency.NORMAL,
742− 'CRITICAL': Notify.Urgency.CRITICAL}
743− return _urgency_enums.get(urgency.upper())
tests/autopilot/unity8/shell/tests/test_system_integration.py+1−1
@@ -37,5 +37,5 @@ class SystemIntegrationTests(UnityTestCase):
3737 self.launch_unity()
3838
3939 # invoke policykit to check permissions
40− pid = subprocess.check_output("pidof -s unity8", shell=True)
40+ pid = subprocess.check_output(["pidof", "-s", "unity8"], universal_newlines=True)
4141 subprocess.check_call("pkcheck --action-id org.freedesktop.NetworkManager.enable-disable-network --process " + pid, shell=True)
tests/autopilot/unity8/shell/tests/test_upstart.py+2−2
@@ -82,7 +82,7 @@ class UpstartIntegrationTests(UnityTestCase):
8282 ))
8383
8484 def test_no_sigstop(self):
85− self.patch_environment("UPSTART_JOB", "foo")
85+ self.patch_environment("UNITY_MIR_EMITS_SIGSTOP", "")
8686 self._launch_unity()
8787 self._set_proxy()
8888
@@ -91,7 +91,7 @@ class UpstartIntegrationTests(UnityTestCase):
9191 logger.debug("Unity loaded and ready.")
9292
9393 def test_expect_sigstop(self):
94− self.patch_environment("UPSTART_JOB", "unity8")
94+ self.patch_environment("UNITY_MIR_EMITS_SIGSTOP", "1")
9595 self._launch_unity()
9696 self.assertThat(lambda: os.WIFSTOPPED(self._get_status()), Eventually(Equals(True)), "Unity8 should raise SIGSTOP when ready")
9797
tests/plugins/DashViews/CMakeLists.txt+23−35
@@ -25,46 +25,41 @@ remove_definitions(-DQT_NO_KEYWORDS)
2525add_definitions(-DDASHVIEWSTEST_FOLDER="${CMAKE_CURRENT_SOURCE_DIR}")
2626add_definitions(-DBUILT_PLUGINS_DIR="${CMAKE_BINARY_DIR}/plugins")
2727
28−add_executable(listviewwithpageheadertestExec listviewwithpageheadertest.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/listviewwithpageheader.cpp)
29−qt5_use_modules(listviewwithpageheadertestExec Test Core Qml)
30−target_link_libraries(listviewwithpageheadertestExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
31−add_custom_target(testlistviewwithpageheader ${CMAKE_CURRENT_BINARY_DIR}/listviewwithpageheadertestExec -o ${CMAKE_BINARY_DIR}/testlistviewwithpageheader.xml,xunitxml -o -,txt)
28+macro(add_lvwph_test FILENAME TESTNAME)
29+ add_executable(${TESTNAME}TestExec
30+ ${FILENAME}test.cpp
31+ ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/listviewwithpageheader.cpp)
32+ qt5_use_modules(${TESTNAME}TestExec Test Core Qml)
33+ target_link_libraries(${TESTNAME}TestExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
3234
33−add_executable(listviewwithpageheadertestsectionExec listviewwithpageheadertestsection.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/listviewwithpageheader.cpp)
34−qt5_use_modules(listviewwithpageheadertestsectionExec Test Core Qml)
35−target_link_libraries(listviewwithpageheadertestsectionExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
36−add_custom_target(testlistviewwithpageheadersection ${CMAKE_CURRENT_BINARY_DIR}/listviewwithpageheadertestsectionExec -o ${CMAKE_BINARY_DIR}/testlistviewwithpageheadersection.xml,xunitxml -o -,txt)
35+ add_binary_qml_test(${TESTNAME} "" "DashViews-qml")
36+endmacro()
3737
38−add_executable(listviewwithpageheadertestsectionexternalmodelExec listviewwithpageheadertestsectionexternalmodel.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/listviewwithpageheader.cpp)
39−qt5_use_modules(listviewwithpageheadertestsectionexternalmodelExec Test Core Qml)
40−target_link_libraries(listviewwithpageheadertestsectionexternalmodelExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
41−add_custom_target(testlistviewwithpageheadersectionexternalmodel ${CMAKE_CURRENT_BINARY_DIR}/listviewwithpageheadertestsectionexternalmodelExec -o ${CMAKE_BINARY_DIR}/testlistviewwithpageheadersectionexternalmodel.xml,xunitxml -o -,txt)
38+add_lvwph_test(listviewwithpageheader ListViewWithPageHeader)
39+add_lvwph_test(listviewwithpageheadersection ListViewWithPageHeaderSection)
40+add_lvwph_test(listviewwithpageheadersectionexternalmodel ListViewWithPageHeaderSectionExternalModel)
4241
4342macro(add_dashview_try_test FILENAME TESTNAME)
44− add_executable(${FILENAME}testExec
43+ add_executable(${TESTNAME}TestExec
4544 ${FILENAME}test.cpp
4645 ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/${FILENAME}.cpp
4746 ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/abstractdashview.cpp
4847 )
49− qt5_use_modules(${FILENAME}testExec Test Core Qml)
50− target_link_libraries(${FILENAME}testExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
51− add_custom_target(test${TESTNAME}
52− ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}testExec
53− -o ${CMAKE_BINARY_DIR}/test${TESTNAME}.xml,xunitxml
54− -o -,txt
55− DEPENDS ${FILENAME}testExec DashViews-qml
56− )
48+ qt5_use_modules(${TESTNAME}TestExec Test Core Qml)
49+ target_link_libraries(${TESTNAME}TestExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
5750
58− add_executable(${FILENAME}tryExec
51+ add_binary_qml_test(${TESTNAME} "" "DashViews-qml")
52+
53+ add_executable(${TESTNAME}tryExec
5954 ${FILENAME}try.cpp
6055 ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/${FILENAME}.cpp
6156 ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/abstractdashview.cpp
6257 )
63− qt5_use_modules(${FILENAME}tryExec Test Core Qml)
64− target_link_libraries(${FILENAME}tryExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
58+ qt5_use_modules(${TESTNAME}tryExec Test Core Qml)
59+ target_link_libraries(${TESTNAME}tryExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
6560 add_custom_target(try${TESTNAME}
66− ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}tryExec
67− DEPENDS ${FILENAME}tryExec DashViews-qml
61+ ${CMAKE_CURRENT_BINARY_DIR}/${TESTNAME}tryExec
62+ DEPENDS ${TESTNAME}tryExec DashViews-qml
6863 )
6964endmacro()
7065
@@ -72,13 +67,6 @@ add_dashview_try_test(verticaljournal VerticalJournal)
7267add_dashview_try_test(horizontaljournal HorizontalJournal)
7368add_dashview_try_test(organicgrid OrganicGrid)
7469
70+set(qmltest_DEFAULT_TARGETS qmluitests)
7571set(qmltest_DEFAULT_NO_ADD_TEST TRUE)
76−add_qml_test(. listviewwithpageheaderqml IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
77−
78−add_dependencies(qmluitests testlistviewwithpageheader)
79−add_dependencies(qmluitests testlistviewwithpageheadersection)
80−add_dependencies(qmluitests testlistviewwithpageheadersectionexternalmodel)
81−add_dependencies(qmluitests testlistviewwithpageheaderqml)
82−add_dependencies(qmluitests testVerticalJournal)
83−add_dependencies(qmluitests testHorizontalJournal)
84−add_dependencies(qmluitests testOrganicGrid)
72+add_qml_test(. ListViewWithPageHeaderQML IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
tests/plugins/DashViews/listviewwithpageheadertestsectionexternalmodel.cpp → tests/plugins/DashViews/listviewwithpageheadersectionexternalmodeltest.cpprenamed+1−5
@@ -24,11 +24,7 @@
2424#include <QtTestGui>
2525#pragma GCC diagnostic push
2626#pragma GCC diagnostic ignored "-pedantic"
27−#if QT_VERSION < QT_VERSION_CHECK(5, 1, 0)
28−#include <private/qquicklistmodel_p.h>
29−#else
3027#include <private/qqmllistmodel_p.h>
31−#endif
3228#include <private/qquickanimation_p.h>
3329#include <private/qquickitem_p.h>
3430#pragma GCC diagnostic pop
@@ -248,4 +244,4 @@ private:
248244
249245QTEST_MAIN(ListViewWithPageHeaderTestSection)
250246
251−#include "listviewwithpageheadertestsectionexternalmodel.moc"
247+#include "listviewwithpageheadersectionexternalmodeltest.moc"
tests/plugins/DashViews/listviewwithpageheadertestsection.cpp → tests/plugins/DashViews/listviewwithpageheadersectiontest.cpprenamed+1−13
@@ -23,11 +23,7 @@
2323#include <QtTestGui>
2424#pragma GCC diagnostic push
2525#pragma GCC diagnostic ignored "-pedantic"
26−#if QT_VERSION < QT_VERSION_CHECK(5, 1, 0)
27−#include <private/qquicklistmodel_p.h>
28−#else
2926#include <private/qqmllistmodel_p.h>
30−#endif
3127#include <private/qquickanimation_p.h>
3228#include <private/qquickitem_p.h>
3329#pragma GCC diagnostic pop
@@ -135,11 +131,7 @@ private Q_SLOTS:
135131 view->engine()->addImportPath(BUILT_PLUGINS_DIR);
136132 view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/listviewwithpageheadertestsection.qml"));
137133 lvwph = dynamic_cast<ListViewWithPageHeader*>(view->rootObject()->findChild<QQuickFlickable*>());
138−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
139− model = view->rootObject()->findChild<QQuickListModel*>();
140−#else
141134 model = view->rootObject()->findChild<QQmlListModel*>();
142−#endif
143135 otherDelegate = view->rootObject()->findChild<QQmlComponent*>();
144136 QVERIFY(lvwph);
145137 QVERIFY(model);
@@ -2156,14 +2148,10 @@ private Q_SLOTS:
21562148private:
21572149 QQuickView *view;
21582150 ListViewWithPageHeader *lvwph;
2159−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
2160− QQuickListModel *model;
2161−#else
21622151 QQmlListModel *model;
2163−#endif
21642152 QQmlComponent *otherDelegate;
21652153};
21662154
21672155QTEST_MAIN(ListViewWithPageHeaderTestSection)
21682156
2169−#include "listviewwithpageheadertestsection.moc"
2157+#include "listviewwithpageheadersectiontest.moc"
tests/plugins/DashViews/listviewwithpageheadertest.cpp−15
@@ -23,11 +23,7 @@
2323#include <QtTestGui>
2424#pragma GCC diagnostic push
2525#pragma GCC diagnostic ignored "-pedantic"
26−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
27−#include <private/qquicklistmodel_p.h>
28−#else
2926#include <private/qqmllistmodel_p.h>
30−#endif
3127#include <private/qquickanimation_p.h>
3228#include <private/qquickitem_p.h>
3329#pragma GCC diagnostic pop
@@ -124,11 +120,7 @@ private Q_SLOTS:
124120 view->engine()->addImportPath(BUILT_PLUGINS_DIR);
125121 view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/listviewwithpageheadertest.qml"));
126122 lvwph = dynamic_cast<ListViewWithPageHeader*>(view->rootObject()->findChild<QQuickFlickable*>());
127−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
128− model = view->rootObject()->findChild<QQuickListModel*>();
129−#else
130123 model = view->rootObject()->findChild<QQmlListModel*>();
131−#endif
132124 otherDelegate = view->rootObject()->findChild<QQmlComponent*>();
133125 QVERIFY(lvwph);
134126 QVERIFY(model);
@@ -1747,9 +1739,6 @@ private Q_SLOTS:
17471739
17481740 void testMaximizeVisibleAreaMoveUpAndShowHeader()
17491741 {
1750−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
1751− QSKIP("This test is extremely unstable in 5.0.x");
1752−#endif
17531742 model->setProperty(0, "size", 800);
17541743 verifyItem(0, 50., 800., false);
17551744
@@ -1913,11 +1902,7 @@ private Q_SLOTS:
19131902private:
19141903 QQuickView *view;
19151904 ListViewWithPageHeader *lvwph;
1916−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
1917− QQuickListModel *model;
1918−#else
19191905 QQmlListModel *model;
1920−#endif
19211906 QQmlComponent *otherDelegate;
19221907};
19231908
tests/plugins/DashViews/tst_listviewwithpageheaderqml.qml → tests/plugins/DashViews/tst_ListViewWithPageHeaderQML.qmlrenamed

The content is the same.

tests/plugins/Ubuntu/Gestures/CMakeLists.txt+1
@@ -20,6 +20,7 @@ macro(add_gesture_ui_test CLASSNAME)
2020 target_link_libraries(${CLASSNAME}TestExec UbuntuGestureQml)
2121
2222 add_binary_qml_test(${CLASSNAME} ${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures UbuntuGesturesTestQmlFiles)
23+ add_manual_qml_test(. ${CLASSNAME} IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
2324endmacro(add_gesture_ui_test)
2425
2526macro(add_gesture_test CLASSNAME)
tests/plugins/Unity/Launcher/CMakeLists.txt+3−3
@@ -15,9 +15,9 @@ add_definitions(-DSRCDIR="${CMAKE_CURRENT_SOURCE_DIR}")
1515add_definitions(-DLAUNCHER_TESTING)
1616
1717### LauncherBackendTest
18−set(testBackendCommand ${CMAKE_CURRENT_BINARY_DIR}/launcherbackendtestExec
19− -o ${CMAKE_BINARY_DIR}/launcherbackendtest.xml,xunitxml
20− -o -,txt)
18+set(testBackendCommand dbus-test-runner --task ${CMAKE_CURRENT_BINARY_DIR}/launcherbackendtestExec
19+ --parameter -o --parameter ${CMAKE_BINARY_DIR}/launcherbackendtest.xml,xunitxml
20+ --parameter -o --parameter -,txt)
2121add_test(NAME launcherbackendtest COMMAND ${testBackendCommand})
2222add_custom_target(launcherbackendtest ${testBackendCommand})
2323add_executable(launcherbackendtestExec
tests/plugins/Unity/Launcher/launcherbackendtest.cpp+167
@@ -20,6 +20,10 @@
2020#include "launcherbackend.h"
2121
2222#include <QtTest>
23+#include <QDBusConnection>
24+#include <QDBusMessage>
25+#include <QDBusVariant>
26+
2327
2428class LauncherBackendTest : public QObject
2529{
@@ -66,6 +70,169 @@ private Q_SLOTS:
6670
6771 QCOMPARE(backend.icon(appId), expectedIcon);
6872 }
73+
74+ void testGetItem_data() {
75+ QTest::addColumn<QString>("appId");
76+ QTest::addColumn<bool>("exists");
77+
78+ QTest::newRow("Exists") << "rel-icon" << true;
79+ QTest::newRow("Doesn't Exist") << "does-not-exist" << false;
80+ }
81+
82+ void testGetItem() {
83+ QFETCH(QString, appId);
84+ QFETCH(bool, exists);
85+
86+ LauncherBackend backend;
87+ auto item = backend.getItem(appId);
88+
89+ if (exists) {
90+ QVERIFY(item != nullptr);
91+ } else {
92+ QVERIFY(item == nullptr);
93+ }
94+ }
95+
96+ void testCount_data() {
97+ QTest::addColumn<QString>("appId");
98+ QTest::addColumn<bool>("setCount");
99+ QTest::addColumn<int>("inCount");
100+ QTest::addColumn<bool>("countVisible");
101+ QTest::addColumn<int>("expectedCount");
102+
103+ /* Get baseline data on things working */
104+ QTest::newRow("Baseline") << "rel-icon" << false << 0 << false << -1;
105+
106+ /* Valid count, but not visible */
107+ QTest::newRow("Not visible") << "rel-icon" << true << 42 << false << -1;
108+
109+ /* Turn it on */
110+ QTest::newRow("Visible Count") << "rel-icon" << true << 42 << true << 42;
111+
112+ /* Invalide app to load */
113+ QTest::newRow("Invalid App ID") << "this-app-doesnt-exist" << true << 42 << true << -1;
114+ }
115+
116+ void testCount() {
117+ QFETCH(QString, appId);
118+ QFETCH(bool, setCount);
119+ QFETCH(int, inCount);
120+ QFETCH(bool, countVisible);
121+ QFETCH(int, expectedCount);
122+
123+ LauncherBackend backend;
124+
125+ if (setCount)
126+ backend.setCount(appId, inCount);
127+ backend.setCountVisible(appId, countVisible);
128+
129+ QCOMPARE(backend.count(appId), expectedCount);
130+ }
131+
132+ void testDbusName_data() {
133+ QTest::addColumn<QString>("decoded");
134+ QTest::addColumn<QString>("encoded");
135+
136+ /* Passthrough test */
137+ QTest::newRow("Passthrough") << "fine" << "fine";
138+
139+ /* Number as first characeter */
140+ QTest::newRow("Number first") << "31337" << "_331337";
141+
142+ /* Underscore test */
143+ QTest::newRow("Underscore test") << "this_is_c_style_namespacing" << "this_5Fis_5Fc_5Fstyle_5Fnamespacing";
144+
145+ /* Hyphen test */
146+ QTest::newRow("Hyphen test") << "typical-application" << "typical_2Dapplication";
147+
148+ /* Japanese test */
149+ QTest::newRow("日本語 test") << "日本語" << "_E6_97_A5_E6_9C_AC_E8_AA_9E";
150+ }
151+
152+ void testDbusName() {
153+ QFETCH(QString, decoded);
154+ QFETCH(QString, encoded);
155+
156+ QString encodeOut = LauncherBackend::encodeAppId(decoded);
157+ QCOMPARE(encoded, encodeOut);
158+
159+ QString decodeOut = LauncherBackend::decodeAppId(encoded);
160+ QCOMPARE(decoded, decodeOut);
161+ }
162+
163+ void testDbusIface_data() {
164+ QTest::addColumn<QString>("appId");
165+ QTest::addColumn<bool>("setCount");
166+ QTest::addColumn<int>("inCount");
167+ QTest::addColumn<bool>("countVisible");
168+ QTest::addColumn<int>("expectedCount");
169+
170+ /* Get baseline data on things working */
171+ QTest::newRow("Baseline") << "rel-icon" << false << 0 << false << -1;
172+
173+ /* Turn it on */
174+ QTest::newRow("Visible Count") << "rel-icon" << true << 42 << true << 42;
175+
176+ /* Invalide app to load */
177+ QTest::newRow("Invalid App ID") << "this-app-doesnt-exist" << true << 42 << true << -1;
178+ }
179+
180+ void testDbusIface() {
181+ QFETCH(QString, appId);
182+ QFETCH(bool, setCount);
183+ QFETCH(int, inCount);
184+ QFETCH(bool, countVisible);
185+ QFETCH(int, expectedCount);
186+
187+ QDBusConnection con = QDBusConnection::sessionBus();
188+ QDBusMessage message;
189+ QDBusMessage reply;
190+
191+ LauncherBackend backend;
192+
193+ if (setCount) {
194+ message = QDBusMessage::createMethodCall("com.canonical.Unity.Launcher",
195+ "/com/canonical/Unity/Launcher/" + LauncherBackend::encodeAppId(appId),
196+ "org.freedesktop.DBus.Properties",
197+ "Set");
198+ QVariantList cargs;
199+ cargs.append(QString("com.canonical.Unity.Launcher.Item"));
200+ cargs.append(QString("count"));
201+ cargs.append(QVariant::fromValue(QDBusVariant(inCount)));
202+
203+ message.setArguments(cargs);
204+ reply = con.call(message);
205+ QCOMPARE(reply.type(), QDBusMessage::ReplyMessage);
206+ }
207+
208+ /* Set countVisible */
209+ message = QDBusMessage::createMethodCall("com.canonical.Unity.Launcher",
210+ "/com/canonical/Unity/Launcher/" + LauncherBackend::encodeAppId(appId),
211+ "org.freedesktop.DBus.Properties",
212+ "Set");
213+ QVariantList cvargs;
214+ cvargs.append(QString("com.canonical.Unity.Launcher.Item"));
215+ cvargs.append(QString("countVisible"));
216+ cvargs.append(QVariant::fromValue(QDBusVariant(countVisible)));
217+
218+ message.setArguments(cvargs);
219+ reply = con.call(message);
220+ QCOMPARE(reply.type(), QDBusMessage::ReplyMessage);
221+
222+ /* Get value */
223+ message = QDBusMessage::createMethodCall("com.canonical.Unity.Launcher",
224+ "/com/canonical/Unity/Launcher/" + LauncherBackend::encodeAppId(appId),
225+ "org.freedesktop.DBus.Properties",
226+ "Get");
227+ QVariantList getargs;
228+ getargs.append(QString("com.canonical.Unity.Launcher.Item"));
229+ getargs.append(QString("count"));
230+
231+ message.setArguments(getargs);
232+ reply = con.call(message);
233+ QCOMPARE(reply.type(), QDBusMessage::ReplyMessage);
234+ QCOMPARE(reply.arguments()[0].value<QDBusVariant>().variant().toInt(), expectedCount);
235+ }
69236};
70237
71238QTEST_GUILESS_MAIN(LauncherBackendTest)
tests/plugins/Utils/CMakeLists.txt+2−1
@@ -11,7 +11,8 @@ macro(run_tests)
1111 -o ${CMAKE_BINARY_DIR}/${_test}.xml,xunitxml
1212 -o -,txt)
1313 add_test(NAME ${_test} COMMAND ${testCommand})
14− add_custom_target(${_test} ${testCommand})
14+ set_tests_properties(${_test} PROPERTIES ENVIRONMENT "LC_ALL=C")
15+ add_custom_target(${_test} env "LC_ALL=C" ${testCommand})
1516 add_executable(${_test}Exec ${_test}.cpp modeltest.cpp)
1617 qt5_use_modules(${_test}Exec Test Core Qml)
1718 target_link_libraries(${_test}Exec
tests/qmltests/CMakeLists.txt+3−2
@@ -11,13 +11,12 @@ set(qmltest_DEFAULT_IMPORT_PATHS
1111set(qmltest_DEFAULT_TARGETS qmlunittests)
1212set(qmltest_DEFAULT_NO_ADD_TEST FALSE)
1313set(qmltest_DEFAULT_PROPERTIES ENVIRONMENT "QT_QPA_PLATFORM=minimal")
14−add_qml_test(Components AnimationControllerWithSignals)
1514add_qml_test(Panel IndicatorItem)
1615add_qml_test(utils/Unity/Test UnityTest)
1716
1817set(qmltest_DEFAULT_TARGETS qmluitests)
1918set(qmltest_DEFAULT_NO_ADD_TEST TRUE)
20−set(qmltest_DEFAULT_PROPERTIES "")
19+set(qmltest_DEFAULT_PROPERTIES ENVIRONMENT "LC_ALL=C")
2120
2221add_qml_test(. Shell IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks
2322 ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
@@ -33,9 +32,11 @@ add_qml_test(Components Revealer)
3332add_qml_test(Components SeeMore)
3433add_qml_test(Components Showable)
3534add_qml_test(Components PageHeaderLabel)
35+add_qml_test(Components ZoomableImage)
3636add_qml_test(Dash Dash IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
3737add_qml_test(Dash DashContent IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
3838add_qml_test(Dash Card)
39+add_qml_benchmark(Dash CardBenchmark 1000)
3940add_qml_test(Dash CardHeader)
4041add_qml_test(Dash CardTool)
4142add_qml_test(Dash GenericScopeView IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
tests/qmltests/Components/CMakeLists.txt+1
@@ -11,6 +11,7 @@ qt5_use_modules(DragHandleTestExec Test Core Qml Gui Quick)
1111target_link_libraries(DragHandleTestExec UbuntuGestureQml)
1212
1313add_binary_qml_test(DragHandle ${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures "")
14+add_manual_qml_test(. DragHandle IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
1415
1516add_definitions(-DUBUNTU_GESTURES_PLUGIN_DIR="${CMAKE_BINARY_DIR}/plugins")
1617add_definitions(-DTEST_DIR="${CMAKE_CURRENT_LIST_DIR}")
tests/qmltests/Components/tst_AnimationControllerWithSignals.qmldeleted−142
@@ -1,142 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import QtTest 1.0
19−import "../../../qml/Components"
20−
21−TestCase {
22− id: testCase
23− name: "AnimationControllerWithSignals"
24−
25− property real someNumber: 0.0
26−
27− NumberAnimation {
28− id: someNumberAnimation
29− target: testCase
30− properties: "someNumber"
31− from: 1.0
32− to: 100.0
33− }
34−
35− Component {
36− id: testSubjectComponent
37− AnimationControllerWithSignals {}
38− }
39−
40− Loader {
41− id: loader
42− asynchronous: false
43− }
44−
45− SignalSpy {
46− id: signalSpy
47− }
48−
49− function test_completeToEndWithSignal() {
50− loader.sourceComponent = testSubjectComponent;
51− var testSubject = loader.item;
52−
53− testSubject.animation = someNumberAnimation;
54− testSubject.progress = 0;
55−
56− signalSpy.signalName = "animationCompletedAtEnd";
57− signalSpy.target = testSubject;
58− signalSpy.clear();
59−
60− compare(testSubject.completing, false)
61− compare(testSubject.completed, true)
62−
63− testSubject.completeToEndWithSignal();
64− compare(testSubject.completing, true)
65− compare(testSubject.completed, true)
66− compare(signalSpy.count, 0);
67−
68− testSubject.progress = 0.5;
69− compare(testSubject.completing, true)
70− compare(testSubject.completed, false)
71− compare(signalSpy.count, 0);
72−
73− testSubject.progress = 1.0;
74− compare(testSubject.completing, false)
75− compare(testSubject.completed, true)
76− compare(signalSpy.count, 1);
77−
78− testSubject.animation = null
79− loader.sourceComponent = undefined;
80− }
81−
82− function test_completeToBeginningWithSignal() {
83− loader.sourceComponent = testSubjectComponent;
84− var testSubject = loader.item;
85−
86− testSubject.animation = someNumberAnimation;
87− testSubject.progress = 1;
88−
89− signalSpy.signalName = "animationCompletedAtBeginning";
90− signalSpy.target = testSubject;
91− signalSpy.clear();
92−
93− compare(testSubject.completing, false)
94− compare(testSubject.completed, true)
95−
96− testSubject.completeToBeginningWithSignal();
97− compare(testSubject.completing, true)
98− compare(testSubject.completed, true)
99− compare(signalSpy.count, 0);
100−
101− testSubject.progress = 0.5;
102− compare(testSubject.completing, true)
103− compare(testSubject.completed, false)
104− compare(signalSpy.count, 0);
105−
106− testSubject.progress = 0;
107− compare(testSubject.completing, false)
108− compare(testSubject.completed, true)
109− compare(signalSpy.count, 1);
110−
111− testSubject.animation = null
112− loader.sourceComponent = undefined;
113− }
114−
115− function test_settingProgressWithoutCallingCompleteWithSignal() {
116− loader.sourceComponent = testSubjectComponent;
117− var testSubject = loader.item;
118−
119− testSubject.animation = someNumberAnimation;
120− testSubject.progress = 0;
121−
122− signalSpy.signalName = "animationCompletedAtEnd";
123− signalSpy.target = testSubject;
124− signalSpy.clear();
125−
126− compare(testSubject.completing, false)
127− compare(testSubject.completed, true)
128−
129− testSubject.progress = 0.5;
130− compare(testSubject.completing, false)
131− compare(testSubject.completed, false)
132− compare(signalSpy.count, 0);
133−
134− testSubject.progress = 1;
135− compare(testSubject.completing, false)
136− compare(testSubject.completed, true)
137− compare(signalSpy.count, 0);
138−
139− testSubject.animation = null
140− loader.sourceComponent = undefined;
141− }
142−}
tests/qmltests/Components/tst_Carousel.qml+34−7
@@ -18,6 +18,7 @@ import QtQuick 2.0
1818import QtTest 1.0
1919import "../../../qml/Components/"
2020import "../../../qml/Components/carousel.js" as Carousel
21+import Unity.Test 0.1 as UT
2122
2223Item {
2324 width: 700
@@ -31,13 +32,17 @@ Item {
3132 property int createdDelegates: 0
3233 property int destroyedDelegates: 0
3334
34− itemComponent: Rectangle {
35− color: "red"
36− Component.onCompleted: carousel.createdDelegates++
37− Component.onDestruction: carousel.destroyedDelegates++
35+ itemComponent: BaseCarouselDelegate {
36+ Rectangle {
37+ anchors.fill: parent
38+ border.color: "black"
39+ color: "red"
40+ Component.onCompleted: carousel.createdDelegates++
41+ Component.onDestruction: carousel.destroyedDelegates++
42+ }
3843 }
3944 }
40− TestCase {
45+ UT.UnityTestCase {
4146 id: root
4247 name: "Carousel"
4348 when: windowShown
@@ -55,8 +60,11 @@ Item {
5560 property real kGapEnd: kMiddleIndex * (1 - gapToEndPhase / gapToMiddlePhase)
5661 property real kXBeginningEnd: 1 / tileWidth + kMiddleIndex / gapToMiddlePhase
5762
58− function test_onlyNeededItemsCreated() {
59− compare(carousel.createdDelegates, 10);
63+ // This test needs to run first since it tests a corner case condition
64+ // to where the carousel is just being created
65+ // That is why it has a 1 in the name
66+ function test_1onlyNeededItemsCreated() {
67+ tryCompare(carousel, "createdDelegates", 10);
6068 compare(carousel.destroyedDelegates, 0);
6169 }
6270
@@ -216,5 +224,24 @@ Item {
216224 data.maxTranslation)
217225 compare(scale, data.result)
218226 }
227+
228+ function test_lastItemXPosition() {
229+ var carouselList = findChild(carousel, "listView");
230+ var stepAnimation = findInvisibleChild(carouselList, "stepAnimation");
231+ var stepDiff = 0;
232+ stepAnimation.onRunningChanged.connect(function() { if (stepAnimation.running) stepDiff = Math.abs(carouselList.contentX - stepAnimation.to); })
233+ var overshootOnce = false;
234+ while (!overshootOnce) {
235+ overshootOnce = carouselList.realContentX > carouselList.realContentWidth - carouselList.realWidth;
236+ mouseFlick(carousel, carousel.width - units.gu(1),
237+ carousel.height / 2,
238+ units.gu(2),
239+ carousel.height / 2);
240+ tryCompare(carouselList, "moving", false);
241+ }
242+ verify(stepDiff < 1);
243+ var x = carouselList.getXFromContinuousIndex(carousel.model - 1);
244+ verify(Math.abs(x - carouselList.contentX) < 1);
245+ }
219246 }
220247}
tests/qmltests/Components/tst_FilterGrid.qml+1−1
@@ -50,6 +50,7 @@ Rectangle {
5050 CheckBox {
5151 id: filterCheckBox
5252 checked: true
53+ onCheckedChanged: filterGrid.setFilter(checked, false /*animate*/)
5354 }
5455 }
5556 }
@@ -99,7 +100,6 @@ Rectangle {
99100 maximumNumberOfColumns: 3
100101 collapsedRowCount:
101102 collapsedRowCountSelector.values[collapsedRowCountSelector.selectedIndex]
102− filter: filterCheckBox.checked
103103 minimumHorizontalSpacing: units.gu(1)
104104 delegateWidth: units.gu(6)
105105 delegateHeight: units.gu(6)
tests/qmltests/Components/tst_ZoomableImage.qmlnew file+192
@@ -0,0 +1,192 @@
1+/*
2+ * Copyright 2014 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import QtTest 1.0
19+import "../../../qml/Components"
20+import Unity.Test 0.1 as UT
21+
22+Rectangle {
23+ id: root
24+ width: units.gu(30)
25+ height: units.gu(60)
26+ color: "lightgrey"
27+
28+ property var widgetData0: {
29+ "source": "",
30+ "zoomable": false
31+ }
32+
33+ property var widgetData1: {
34+ "source": "../../../qml/graphics/phone_background.jpg",
35+ "zoomable": false
36+ }
37+
38+ property var widgetData2: {
39+ "source": "../../../qml/Dash/graphics/phone/screenshots/gallery@12.png",
40+ "zoomable": true
41+ }
42+
43+ ZoomableImage {
44+ id: zoomableImage
45+ width: parent.width
46+ anchors.fill: parent
47+ asynchronous: false
48+ }
49+
50+ SignalSpy {
51+ id: signalSpy
52+ }
53+
54+ UT.UnityTestCase {
55+ name: "ZoomableImageTest"
56+ when: windowShown
57+
58+ function test_loadImage() {
59+ var lazyImage = findChild(zoomableImage, "lazyImage");
60+
61+ zoomableImage.source = widgetData0["source"];
62+ zoomableImage.zoomable = widgetData0["zoomable"];
63+ waitForRendering(zoomableImage);
64+ tryCompare(zoomableImage, "imageState", "default");
65+
66+ signalSpy.signalName = "onStateChanged";
67+ signalSpy.target = lazyImage;
68+ signalSpy.clear();
69+
70+ zoomableImage.source = widgetData1["source"];
71+ zoomableImage.zoomable = widgetData1["zoomable"];
72+ waitForRendering(lazyImage);
73+ tryCompareFunction(function() { return get_filename(lazyImage.source.toString()) === get_filename(widgetData1["source"]); }, true);
74+ waitForRendering(zoomableImage);
75+ tryCompare(zoomableImage, "imageState", "ready");
76+ compare (signalSpy.count, 1);
77+ }
78+
79+ function get_filename(a) {
80+ var wordsA = a.split("/");
81+ var filenameA = wordsA[wordsA.length-1];
82+ return filenameA;
83+ }
84+
85+ function test_mousewheel() {
86+ var image = findChild(zoomableImage, "image");
87+ var lazyImage = findChild(zoomableImage, "lazyImage");
88+ var flickable = findChild(zoomableImage, "flickable");
89+
90+ zoomableImage.source = widgetData2["source"];
91+ zoomableImage.zoomable = true;
92+ waitForRendering(zoomableImage);
93+
94+ tryCompare(zoomableImage, "imageState", "ready");
95+ tryCompareFunction(function() { return get_filename(lazyImage.source.toString()) === get_filename(widgetData2["source"]); }, true);
96+ waitForRendering(image);
97+
98+ // move mouse to center
99+ mouseMove(zoomableImage, zoomableImage.width / 2, zoomableImage.height / 2);
100+
101+ // Test Zoom-in Zoom-out twice.
102+ for (var c=0; c<2; c++) {
103+ // zoom in
104+ for (var i=0; i<10; i++) {
105+ mouseWheel(zoomableImage, zoomableImage.width / 2, zoomableImage.height / 2, 0, 10);
106+ tryCompare(image, "scale", 1.0 + (i + 1) * 0.1);
107+ compare(flickable.contentWidth, lazyImage.width * image.scale);
108+ compare(flickable.contentHeight, lazyImage.height * image.scale);
109+ }
110+
111+ // zoom out
112+ for (var i=0; i<10; i++) {
113+ mouseWheel(zoomableImage, zoomableImage.width / 2, zoomableImage.height / 2, 0, -10);
114+ tryCompare(image, "scale", 2.0 - (i + 1) * 0.1);
115+ compare(flickable.contentWidth, lazyImage.width * image.scale);
116+ compare(flickable.contentHeight, lazyImage.height * image.scale);
117+ }
118+ }
119+ }
120+
121+ function test_pinch_data() {
122+ return [ { source:widgetData2["source"],
123+ zoomable:false,
124+ answer1: true,
125+ answer2: false,
126+ answer3: true,
127+ answer4: 1.0,
128+ answer5: 1.0 },
129+ { source:widgetData2["source"],
130+ zoomable:true,
131+ answer1: false,
132+ answer2: true,
133+ answer3: false,
134+ answer4: 1.7740461882048026,
135+ answer5: 1.0 }
136+ ]
137+ }
138+
139+ function test_pinch(data) {
140+ var image = findChild(zoomableImage, "image");
141+ var lazyImage = findChild(zoomableImage, "lazyImage");
142+ var flickable = findChild(zoomableImage, "flickable");
143+
144+ signalSpy.signalName = "onScaleChanged";
145+ signalSpy.target = image;
146+ signalSpy.clear();
147+
148+ zoomableImage.source = data.source;
149+ zoomableImage.zoomable = data.zoomable;
150+ waitForRendering(zoomableImage);
151+
152+ tryCompare(zoomableImage, "imageState", "ready");
153+ tryCompareFunction(function() { return get_filename(lazyImage.source.toString()) === get_filename(data.source); }, true);
154+ waitForRendering(image);
155+
156+ var x1Start = zoomableImage.width * 2 / 6;
157+ var y1Start = zoomableImage.height * 2 / 6;
158+ var x1End = zoomableImage.width * 1 / 6;
159+ var y1End = zoomableImage.height * 1 / 6;
160+ var x2Start = zoomableImage.width * 4 / 6;
161+ var y2Start = zoomableImage.height * 4 / 6;
162+ var x2End = zoomableImage.width * 5 / 6;
163+ var y2End = zoomableImage.height * 5 / 6;
164+
165+ var oldScale = image.scale;
166+
167+ // move mouse to center
168+ mouseMove(zoomableImage, zoomableImage.width / 2, zoomableImage.height / 2);
169+
170+ // Test Zoom-in Zoom-out twice.
171+ for (var c=0; c<2; c++) {
172+ wait(3000); // have to delay between two consequent pinch event.
173+ // pinch zoom-in
174+ touchPinch(zoomableImage, x1Start, y1Start, x1End, y1End, x2Start, y2Start, x2End, y2End);
175+
176+ tryCompare(image, "scale", data.answer4);
177+ var newScale = image.scale;
178+ compare(newScale == oldScale, data.answer1, "scale factor not equal: "+ oldScale + "=?" + newScale);
179+ compare(newScale > oldScale, data.answer2, "scale factor didn't changed");
180+ compare(signalSpy.count == 0, data.answer3, "scale signal count error");
181+ compare(newScale, data.answer4, "scale factor error");
182+ compare(flickable.contentWidth, lazyImage.width * image.scale);
183+ compare(flickable.contentHeight, lazyImage.height * image.scale);
184+
185+ wait(3000); // have to delay between two consequent pinch event.
186+ // pinch zoom-out
187+ touchPinch(zoomableImage, x1End, y1End, x1Start, y1Start, x2End, y2End, x2Start, y2Start);
188+ tryCompare(image, "scale", data.answer5);
189+ }
190+ }
191+ }
192+}
tests/qmltests/Dash/Previews/tst_PreviewRatingInput.qml+21−2
@@ -36,6 +36,8 @@ Rectangle {
3636 property var triggeredDataReviewOnly: { "rating": invalidInputRating, "review": validInputText, "author": null }
3737
3838 property var widgetDataBoth: { "visible": "both", "required": "both" }
39+ property var widgetDataBothRequireRating: { "visible": "both", "required": "rating" }
40+ property var widgetDataBothRequireReview: { "visible": "both", "required": "review" }
3941 property var widgetDataRating: { "visible": "rating", "required": "rating" }
4042 property var widgetDataRatingBroken: { "visible": "rating", "required": "review" }
4143 property var widgetDataReview: { "visible": "review", "required": "review" }
@@ -85,6 +87,14 @@ Rectangle {
8587 {tag: "both, rating-only review", widgetData: widgetDataBoth, inputRating: validInputRating, inputText: invalidInputText, emitted: false},
8688 {tag: "both, review-only review", widgetData: widgetDataBoth, inputRating: invalidInputRating, inputText: validInputText, emitted: false},
8789 {tag: "both, complete review", widgetData: widgetDataBoth, inputRating: validInputRating, inputText: validInputText, emitted: true},
90+ {tag: "both require rating, null review", widgetData: widgetDataBothRequireRating, inputRating: invalidInputRating, inputText: invalidInputText, emitted: false},
91+ {tag: "both require rating, rating-only review", widgetData: widgetDataBothRequireRating, inputRating: validInputRating, inputText: invalidInputText, emitted: true},
92+ {tag: "both require rating, review-only review", widgetData: widgetDataBothRequireRating, inputRating: invalidInputRating, inputText: validInputText, emitted: false},
93+ {tag: "both require rating, complete review", widgetData: widgetDataBothRequireRating, inputRating: validInputRating, inputText: validInputText, emitted: true},
94+ {tag: "both require review, null review", widgetData: widgetDataBothRequireReview, inputRating: invalidInputRating, inputText: invalidInputText, emitted: false},
95+ {tag: "both require review, rating-only review", widgetData: widgetDataBothRequireReview, inputRating: validInputRating, inputText: invalidInputText, emitted: false},
96+ {tag: "both require review, review-only review", widgetData: widgetDataBothRequireReview, inputRating: invalidInputRating, inputText: validInputText, emitted: true},
97+ {tag: "both require review, complete review", widgetData: widgetDataBothRequireReview, inputRating: validInputRating, inputText: validInputText, emitted: true},
8898 {tag: "rating, null review", widgetData: widgetDataRating, inputRating: invalidInputRating, inputText: invalidInputText, emitted: false},
8999 {tag: "rating, rating-only review", widgetData: widgetDataRating, inputRating: validInputRating, inputText: invalidInputText, emitted: true},
90100 {tag: "rating, review-only review", widgetData: widgetDataRating, inputRating: invalidInputRating, inputText: validInputText, emitted: false},
@@ -114,7 +124,9 @@ Rectangle {
114124 verify(rating.visible === true);
115125
116126 rating.value = data.inputRating;
117− if (data.widgetData["required"] !== "rating" || data.inputRating < 0) {
127+ if (data.widgetData["required"] !== "rating" ||
128+ data.widgetData["visible"] !== "rating" ||
129+ data.inputRating < 0) {
118130 compare(spy.count, 0);
119131 } else {
120132 compare(spy.count, 1);
@@ -129,7 +141,14 @@ Rectangle {
129141 reviewTextArea.text = data.inputText;
130142 mouseClick(submitButton, submitButton.width / 2, submitButton.height / 2);
131143 switch (data.widgetData["required"]) {
132− case "rating": compare(spy.count, 0); break;
144+ case "rating": {
145+ if (rating.visible === false || data.inputRating < 0) {
146+ compare(spy.count, 0);
147+ } else {
148+ compare(spy.count, 1);
149+ }
150+ break;
151+ }
133152 case "both":
134153 default: {
135154 if (data.inputRating < 0 || data.inputText === "") {
tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml+6−3
@@ -36,7 +36,8 @@ Rectangle {
3636
3737 PreviewZoomableImage {
3838 id: zoomableImage
39− width: parent.width
39+ anchors.fill: parent
40+ widgetData: widgetData1
4041 }
4142
4243 UT.UnityTestCase {
@@ -47,10 +48,12 @@ Rectangle {
4748 var image = findChild(zoomableImage, "image");
4849
4950 zoomableImage.widgetData = widgetData0;
50− tryCompare(image, "state", "default");
51+ waitForRendering(zoomableImage);
52+ tryCompare(image, "imageState", "default");
5153
5254 zoomableImage.widgetData = widgetData1;
53− tryCompare(image, "state", "ready");
55+ waitForRendering(zoomableImage);
56+ tryCompare(image, "imageState", "ready");
5457 }
5558 }
5659}
tests/qmltests/Dash/qml/FakeScopeView.qmldeleted−45
@@ -1,45 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Unity 0.2
19−
20−import "../../../../qml/Dash"
21−
22−GenericScopeView {
23− id: fakeScopeView
24−
25− property alias backColor : back.color
26− property var categoryView: null
27−
28− onMovementStarted: {
29− if (shell != undefined && shell.scopeStatus != undefined) {
30− shell.scopeStatus[scope.id].movementStarted++;
31− }
32− }
33− onPositionedAtBeginning: {
34− if (shell != undefined && shell.scopeStatus != undefined) {
35− shell.scopeStatus[scope.id].positionedAtBeginning++;
36− }
37− }
38−
39− Rectangle {
40− id: back
41− anchors.fill: parent
42− color: "grey"
43− z: -1
44− }
45−}
tests/qmltests/Dash/qml/fake_generic_scopeView.qmldeleted−24
@@ -1,24 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−
19−FakeScopeView {
20− id: fake_generic_scopeView
21− objectName: "fake_generic_scopeView"
22−
23− backColor: "#D0D0D0"
24−}
tests/qmltests/Dash/qml/fake_scopeView1.qmldeleted−24
@@ -1,24 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−
19−FakeScopeView {
20− id: fake_scopeView1
21− objectName: "fake_scopeView1"
22−
23− backColor: "#90E090"
24−}
tests/qmltests/Dash/qml/fake_scopeView2.qmldeleted−24
@@ -1,24 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−
19−FakeScopeView {
20− id: fake_scopeView2
21− objectName: "fake_scopeView2"
22−
23− backColor: "#A0D0A0"
24−}
tests/qmltests/Dash/qml/fake_scopeView3.qmldeleted−24
@@ -1,24 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−
19−FakeScopeView {
20− id: fake_scopeView3
21− objectName: "fake_scopeView3"
22−
23− backColor: "#B0C0B0"
24−}
tests/qmltests/Dash/qml/fake_scopeView4.qmldeleted−24
@@ -1,24 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−
19−FakeScopeView {
20− id: fake_scopeView4
21− objectName: "fake_scopeView4"
22−
23− backColor: "#C0C0C0"
24−}
tests/qmltests/Dash/tst_Card.qml+12−10
@@ -182,11 +182,13 @@ Rectangle {
182182 when: windowShown
183183
184184 property Item header: findChild(card, "cardHeader")
185+ property Item headerLoader: findChild(card, "cardHeaderLoader")
185186 property Item title: findChild(header, "titleLabel")
186187 property Item art: findChild(card, "artShape")
187188 property Item artImage: findChild(card, "artImage")
188189 property Item summary: findChild(card, "summaryLabel")
189190 property Item background: findChild(card, "background")
191+ property Item backgroundLoader: findChild(card, "backgroundLoader")
190192 property Item backgroundImage: findChild(card, "backgroundImage")
191193
192194 function initTestCase() {
@@ -244,8 +246,8 @@ Rectangle {
244246 { tag: "Wide", width: units.gu(18.5), aspect: 0.5, index: 0 },
245247 { tag: "Horizontal", width: units.gu(38), index: 5 },
246248 // Make sure card ends with header when there's no summary
247− { tag: "NoSummary", height: function() { return header.y + header.height }, index: 6 },
248− { tag: "HorizontalNoSummary", height: function() { return header.height }, card_layout: "horizontal", index: 6 },
249+ { tag: "NoSummary", height: function() { return headerLoader.y + headerLoader.height }, index: 6 },
250+ { tag: "HorizontalNoSummary", height: function() { return headerLoader.height }, card_layout: "horizontal", index: 6 },
249251 ]
250252 }
251253
@@ -288,7 +290,7 @@ Rectangle {
288290 { tag: "Fit", height: units.gu(38), size: "large", width: units.gu(19), index: 4 },
289291 { tag: "VerticalWidth", width: function() { return header.width }, index: 0 },
290292 { tag: "HorizontalHeight", height: function() { return header.height }, index: 5 },
291− { tag: "HorizontalWidth", width: function() { return header.x }, index: 5 },
293+ { tag: "HorizontalWidth", width: function() { return headerLoader.x }, index: 5 },
292294 ]
293295 }
294296
@@ -332,7 +334,7 @@ Rectangle {
332334 function test_art_layout(data) {
333335 selector.selectedIndex = data.index;
334336
335− tryCompare(testCase.header, "x", data.left());
337+ tryCompare(testCase.headerLoader, "x", data.left());
336338 }
337339
338340 function test_header_layout_data() {
@@ -349,13 +351,13 @@ Rectangle {
349351 function test_header_layout(data) {
350352 selector.selectedIndex = data.index;
351353
352− tryCompareFunction(function() { return testCase.header.y === data.top() }, true);
353− tryCompareFunction(function() { return testCase.header.x === data.left() }, true);
354+ tryCompareFunction(function() { return testCase.headerLoader.y === data.top() }, true);
355+ tryCompareFunction(function() { return testCase.headerLoader.x === data.left() }, true);
354356 }
355357
356358 function test_summary_layout_data() {
357359 return [
358− { tag: "With header", top: function() { return header.y + header.height }, index: 0 },
360+ { tag: "With header", top: function() { return headerLoader.y + headerLoader.height }, index: 0 },
359361 { tag: "Without header", top: function() { return art.y + art.height }, index: 7 },
360362 ]
361363 }
@@ -400,7 +402,7 @@ Rectangle {
400402
401403 waitForRendering(card);
402404
403− tryCompare(background, "visible", data.visible);
405+ tryCompare(backgroundLoader, "active", data.visible);
404406
405407 if (data.hasOwnProperty("color")) {
406408 tryCompare(background, "color", data.color);
@@ -467,13 +469,13 @@ Rectangle {
467469 function test_mascotShape(data) {
468470 selector.selectedIndex = data.index;
469471
470− var shape = findChild(card, "mascotShape");
472+ var shape = findChild(card, "mascotShapeLoader");
471473 var image = findChild(card, "mascotImage");
472474
473475 verify(shape, "Could not find shape.");
474476 verify(image, "Could not find image.");
475477
476− tryCompare(shape, "visible", data.shape);
478+ tryCompare(shape, "active", data.shape);
477479 tryCompare(image, "visible", !data.shape);
478480 }
479481 }
tests/qmltests/Dash/tst_CardBenchmark.qmlnew file+94
@@ -0,0 +1,94 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import QtTest 1.0
19+import Ubuntu.Components 0.1
20+import Unity.Test 0.1 as UT
21+import "../../../qml/Dash"
22+import "CardHelpers.js" as Helpers
23+
24+Rectangle {
25+ id: root
26+ width: units.gu(80)
27+ height: units.gu(72)
28+ color: "#88FFFFFF"
29+
30+ property string cardData: '
31+ {
32+ "art": "../../tests/qmltests/Dash/artwork/music-player-design.png",
33+ "mascot": "../../tests/qmltests/Dash/artwork/avatar.png",
34+ "title": "foo",
35+ "subtitle": "bar",
36+ "summary": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
37+ }'
38+
39+ property string currentModel: '{}'
40+ property string cardTitleArtSubtitleMascotSummaryModel: '{ "components": { "title": "title", "art": "art", "subtitle": "subtitle", "mascot": "mascot", "summary": "summary" } }'
41+ property string cardTitleArtSubtitleMascotModel: '{ "components": { "title": "title", "art": "art", "subtitle": "subtitle", "mascot": "mascot" } }'
42+ property string cardTitleArtSubtitleModel: '{ "components": { "title": "title", "art": "art", "subtitle": "subtitle" } }'
43+ property string cardTitleArtModel: '{ "components": { "title": "title", "art": "art" } }'
44+ property string cardArtModel: '{ "components": { "art": "art" } }'
45+ property string cardTitleModel: '{ "components": { "title": "title" } }'
46+
47+ CardTool {
48+ id: cardTool
49+ template: Helpers.update(JSON.parse(Helpers.defaultLayout), JSON.parse(currentModel))['template'];
50+ components: Helpers.update(JSON.parse(Helpers.defaultLayout), JSON.parse(currentModel))['components'];
51+ viewWidth: units.gu(48)
52+ }
53+
54+ Repeater {
55+ id: cardRepeater
56+ model: 0
57+ Card {
58+ width: cardTool.cardWidth || implicitWidth
59+ height: cardTool.cardHeight || implicitHeight
60+
61+ template: cardTool.template
62+ components: cardTool.components
63+ cardData: Helpers.mapData(root.cardData, components)
64+ }
65+ }
66+
67+ UT.UnityTestCase {
68+ id: testCase
69+ name: "CardBenchmark"
70+
71+ when: windowShown
72+
73+ function init() {
74+ wait(1);
75+ }
76+
77+ function benchmark_time_data() {
78+ return [
79+ { tag: "cardTitleArtSubtitleMascotSummaryModel", model: cardTitleArtSubtitleMascotSummaryModel },
80+ { tag: "cardTitleArtSubtitleMascotModel", model: cardTitleArtSubtitleMascotModel },
81+ { tag: "cardTitleArtSubtitleModel", model: cardTitleArtSubtitleModel },
82+ { tag: "cardTitleArtModel", model: cardTitleArtModel },
83+ { tag: "cardArtModel", model: cardArtModel },
84+ { tag: "cardTitleModel", model: cardTitleModel },
85+ ];
86+ }
87+
88+ function benchmark_time(data) {
89+ currentModel = data.model;
90+ cardRepeater.model = 1;
91+ cardRepeater.model = 0;
92+ }
93+ }
94+}
tests/qmltests/Dash/tst_CardHeader.qml+1−1
@@ -43,7 +43,7 @@ Rectangle {
4343
4444 when: windowShown
4545
46− property Item mascot: findChild(cardHeader, "mascotShape")
46+ property Item mascot: findChild(cardHeader, "mascotShapeLoader")
4747 property Item titleLabel: findChild(cardHeader, "titleLabel")
4848 property Item subtitleLabel: findChild(cardHeader, "subtitleLabel")
4949 property Item oldPriceLabel: findChild(cardHeader, "oldPriceLabel")
tests/qmltests/Dash/tst_Dash.qml−11
@@ -41,16 +41,6 @@ Item {
4141 showScopeOnLoaded: "MockScope2"
4242 }
4343
44− ScopeDelegateMapper {
45− id: scopeDelegateMapper
46− scopeDelegateMapping: {
47− "MockScope1": Qt.resolvedUrl("qml/fake_scopeView1.qml"),
48− "MockScope2": Qt.resolvedUrl("qml/fake_scopeView2.qml"),
49− "clickscope": Qt.resolvedUrl("qml/fake_scopeView3.qml")
50− }
51− genericScope: Qt.resolvedUrl("qml/fake_generic_scopeView.qml")
52− }
53−
5444 UT.UnityTestCase {
5545 name: "Dash"
5646 when: windowShown
@@ -59,7 +49,6 @@ Item {
5949
6050 Component.onCompleted: {
6151 var dashContent = findChild(dash, "dashContent");
62− dashContent.scopeMapper = scopeDelegateMapper;
6352 scopes = dashContent.scopes;
6453 }
6554
tests/qmltests/Dash/tst_DashContent.qml+27−51
@@ -35,13 +35,6 @@ Item {
3535 property var panel: null
3636 // BEGIN To reduce warnings
3737
38− property var scopeStatus: {
39− 'MockScope1': { 'movementStarted': 0, 'positionedAtBeginning': 0 },
40− 'MockScope2': { 'movementStarted': 0, 'positionedAtBeginning': 0 },
41− 'clickscope': { 'movementStarted': 0, 'positionedAtBeginning': 0 },
42− 'MockScope5': { 'movementStarted': 0, 'positionedAtBeginning': 0 }
43− }
44−
4538 Scopes {
4639 id: scopesModel
4740 }
@@ -55,34 +48,9 @@ Item {
5548 }
5649 scopes : scopesModel
5750
58− scopeMapper : scopeDelegateMapper
5951 searchHistory: SearchHistoryModel {}
6052 }
6153
62− ScopeDelegateMapper {
63− id: scopeDelegateMapper
64− scopeDelegateMapping: {
65− "MockScope1": Qt.resolvedUrl("qml/fake_scopeView1.qml"),
66− "MockScope2": Qt.resolvedUrl("qml/fake_scopeView2.qml"),
67− "clickscope": Qt.resolvedUrl("qml/fake_scopeView3.qml"),
68− }
69− genericScope: Qt.resolvedUrl("qml/fake_generic_scopeView.qml")
70− }
71−
72− function clear_scope_status() {
73− scopeStatus["MockScope1"].movementStarted = 0;
74− scopeStatus["MockScope1"].positionedAtBeginning = 0;
75−
76− scopeStatus["MockScope2"].movementStarted = 0;
77− scopeStatus["MockScope2"].positionedAtBeginning = 0;
78−
79− scopeStatus["clickscope"].movementStarted = 0;
80− scopeStatus["clickscope"].positionedAtBeginning = 0;
81−
82− scopeStatus["MockScope5"].movementStarted = 0;
83− scopeStatus["MockScope5"].positionedAtBeginning = 0;
84− }
85−
8654 SignalSpy {
8755 id: scopeLoadedSpy
8856 target: dashContent
@@ -97,7 +65,7 @@ Item {
9765
9866 UT.UnityTestCase {
9967 name: "DashContent"
100− when: scopesModel.loaded
68+ when: scopesModel.loaded && windowShown
10169
10270 function init() {
10371 scopesModel.clear();
@@ -108,7 +76,6 @@ Item {
10876
10977 function cleanup() {
11078 movementStartedSpy.clear();
111− clear_scope_status();
11279 dashContent.visible = true;
11380
11481 var dashContentList = findChild(dashContent, "dashContentList");
@@ -149,29 +116,38 @@ Item {
149116 verify(dashContentList.currentIndex >= 0 && dashContentList.currentIndex < 5);
150117 }
151118
152− function test_movement_started_signal() {
153− dashContent.setCurrentScopeAtIndex(3, true, false);
154−
119+ function test_show_header_on_list_movement() {
155120 var dashContentList = findChild(dashContent, "dashContentList");
156− verify(dashContentList != undefined)
121+ verify(dashContentList != undefined);
122+ var categoryListView = findChild(dashContentList, "categoryListView");
123+ verify(categoryListView != undefined);
124+
125+ waitForRendering(categoryListView);
157126
158− dashContentList.movementStarted();
127+ categoryListView.contentY = units.gu(11);
128+ console.log("contentY", categoryListView.contentY);
159129
160− compare(movementStartedSpy.count, 1, "DashContent should have emitted movementStarted signal when content list did.");
161− compare(scopeStatus["MockScope1"].movementStarted, 1, "MockScope1 should have emitted movementStarted signal when content list did.");
162− compare(scopeStatus["MockScope2"].movementStarted, 1, "MockScope2 should have emitted movementStarted signal when content list did.");
163− compare(scopeStatus["clickscope"].movementStarted, 1, "clickscope should have emitted movementStarted signal when content list did.");
164− compare(scopeStatus["MockScope5"].movementStarted, 1, "MockScope5 should have emitted movementStarted signal when content list did.");
130+ var startX = dashContentList.width/2;
131+ var startY = dashContentList.height/2;
132+ touchFlick(dashContentList, startX - units.gu(2), startY, startX, startY);
133+ tryCompare(categoryListView, "contentY", units.gu(11) - categoryListView.pageHeader.height);
165134 }
166135
167− function test_positioned_at_beginning_signal() {
168− dashContent.setCurrentScopeAtIndex(3, true, false);
136+ function test_set_current_scope_reset() {
137+ var dashContentList = findChild(dashContent, "dashContentList");
138+ verify(dashContentList != undefined);
139+ var categoryListView = findChild(dashContentList, "categoryListView");
140+ verify(categoryListView != undefined);
141+
142+ categoryListView.contentY = units.gu(10);
143+
144+ compare(dashContentList.currentItem.item.objectName, "MockScope1")
145+ compare(categoryListView.contentY, units.gu(10));
146+
147+ dashContent.setCurrentScopeAtIndex(0, false, true);
169148
170− dashContent.positionedAtBeginning();
171− compare(scopeStatus["MockScope1"].positionedAtBeginning, 1, "MockScope1 should have emitted positionedAtBeginning signal when DashContent did.");
172− compare(scopeStatus["MockScope2"].positionedAtBeginning, 1, "MockScope2 should have emitted positionedAtBeginning signal when DashContent did.");
173− compare(scopeStatus["clickscope"].positionedAtBeginning, 1, "clickscope should have emitted positionedAtBeginning signal when DashContent did.");
174− compare(scopeStatus["MockScope5"].positionedAtBeginning, 1, "MockScope5 should have emitted positionedAtBeginning signal when DashContent did.");
149+ compare(dashContentList.currentItem.item.objectName, "MockScope1")
150+ compare(categoryListView.contentY, 0);
175151 }
176152
177153 // This tests that setting the current scope index will end up at the correct index even if
tests/qmltests/Dash/tst_GenericScopeView.qml+4−4
@@ -64,7 +64,7 @@ Item {
6464
6565 UT.UnityTestCase {
6666 name: "GenericScopeView"
67− when: scopes.loaded
67+ when: scopes.loaded && windowShown
6868
6969 function init() {
7070 genericScopeView.scope = scopes.get(2)
@@ -140,7 +140,7 @@ Item {
140140 mouseClick(header, header.width / 2, header.height / 2);
141141 tryCompareFunction(function() { middleHeight = category.height; return category.height > initialHeight; }, true);
142142 tryCompare(category, "filtered", false);
143− verify(category.height > middleHeight);
143+ tryCompareFunction(function() { return category.height > middleHeight; }, true);
144144
145145 mouseClick(header, header.width / 2, header.height / 2);
146146 verify(category.expandable);
@@ -165,7 +165,7 @@ Item {
165165
166166 mouseClick(header2, header2.width / 2, header2.height / 2);
167167 tryCompare(category2, "filtered", false);
168− tryCompare(category2FilterGrid, "filter", false);
168+ tryCompare(category2FilterGrid, "filtered", false);
169169
170170 categoryListView.positionAtBeginning();
171171
@@ -182,7 +182,7 @@ Item {
182182 mouseClick(header0, header0.width / 2, header0.height / 2);
183183 tryCompare(category0, "filtered", false);
184184 tryCompare(category2, "filtered", true);
185− tryCompare(category2FilterGrid, "filter", true);
185+ tryCompare(category2FilterGrid, "filtered", true);
186186 mouseClick(header0, header0.width / 2, header0.height / 2);
187187 tryCompare(category0, "filtered", true);
188188 tryCompare(category2, "filtered", true);
tests/qmltests/Greeter/tst_Clock.qml+3−3
@@ -71,10 +71,10 @@ Rectangle {
7171 var dateString = Qt.formatDate(dateObj, Qt.DefaultLocaleLongDate)
7272 var timeString = Qt.formatTime(dateObj)
7373
74− clock.enabled = false
74+ clock.visible = false
7575 var timeModel = findInvisibleChild(clock, "timeModel")
7676
77− compare(timeModel.menuObjectPath, "", "Clock shouldn't be connected to Indicators when not active.")
77+ compare(timeModel.menuObjectPath, "", "Clock shouldn't be connected to Indicators when not visible.")
7878
7979 clock.currentDate = dateObj
8080
@@ -83,7 +83,7 @@ Rectangle {
8383 var timeLabel = findChild(clock, "timeLabel")
8484 compare(timeLabel.text, timeString, "Not the expected time")
8585
86− clock.enabled = true
86+ clock.visible = true
8787
8888 verify(timeModel.menuObjectPath != "", "Should be connected to Indicators.")
8989 }
tests/qmltests/Greeter/tst_Phone.qml+10−50
@@ -61,6 +61,12 @@ Item {
6161 signalName: "unlocked"
6262 }
6363
64+ SignalSpy {
65+ id: teaseSpy
66+ target: greeter
67+ signalName: "tease"
68+ }
69+
6470 UT.UnityTestCase {
6571 name: "Greeter"
6672 when: windowShown
@@ -82,56 +88,10 @@ Item {
8288 }
8389
8490 function test_teasingArea(data) {
85− tryCompare(greeter, "leftTeaserPressed", false)
86− tryCompare(greeter, "rightTeaserPressed", false)
87− mousePress(greeter, data.posX, greeter.height - units.gu(1))
88− tryCompare(greeter, "leftTeaserPressed", data.leftPressed)
89− tryCompare(greeter, "rightTeaserPressed", data.rightPressed)
90− mouseRelease(greeter, data.posX, greeter.height - units.gu(1))
91− tryCompare(greeter, "leftTeaserPressed", false)
92− tryCompare(greeter, "rightTeaserPressed", false)
93− }
94−
95− function test_teaseLockedUnlocked_data() {
96− return [
97− {tag: "unlocked", locked: false, moved: false},
98− {tag: "locked", locked: true, moved: false},
99− {tag: "moved", locked: false, moved: true}
100− ];
101− }
102−
103− function test_teaseLockedUnlocked(data) {
104− tryCompare(greeter, "rightTeaserPressed", false);
105− tryCompare(greeter, "x", 0);
106− greeter.locked = data.locked;
107−
108− // simulate greeter being in the middle of a swipe
109− if (data.moved) {
110− greeter.x = -units.gu(4);
111− tryCompare(greeter, "x", -units.gu(4));
112− }
113−
114− mouseClick(greeter, greeter.width - units.gu(5), greeter.height - units.gu(1));
115− greeter.minX = 0; // This is needed because the transition actually makes x jump once before animating
116−
117− if (!data.moved) {
118− // Check if it has been moved over by 2 GUs. Give it a 2 pixel grace area
119− // because animation duration and teaseTimer are the same duration and
120− // might cause slight offsets
121− tryCompareFunction(function() { return greeter.minX <= -units.gu(2) + 2}, true);
122− } else {
123− // waiting 100ms to make sure nothing moves
124− wait(100);
125− compare(greeter.minX, 0, "Greeter teasing not disabled even though it's locked or moving.");
126− }
127−
128− // Restore position in case we moved it for the test
129− if (data.moved) {
130− greeter.x = 0;
131− }
132−
133− // Wait until we're back to 0
134− tryCompareFunction(function() { return greeter.x;}, 0);
91+ teaseSpy.clear()
92+ mouseClick(greeter, data.posX, greeter.height - units.gu(1))
93+ teaseSpy.wait()
94+ tryCompare(teaseSpy, "count", 1)
13595 }
13696
13797 function test_statsWelcomeScreen() {
tests/qmltests/Greeter/tst_Tablet.qml+36−8
@@ -54,6 +54,12 @@ Item {
5454 signalName: "selected"
5555 }
5656
57+ SignalSpy {
58+ id: teaseSpy
59+ target: greeter
60+ signalName: "tease"
61+ }
62+
5763 UT.UnityTestCase {
5864 name: "Greeter"
5965 when: windowShown
@@ -325,14 +331,36 @@ Item {
325331 }
326332
327333 function test_teasingArea(data) {
328− tryCompare(greeter, "leftTeaserPressed", false)
329− tryCompare(greeter, "rightTeaserPressed", false)
330− mousePress(greeter, data.posX, greeter.height - units.gu(1))
331− tryCompare(greeter, "leftTeaserPressed", data.leftPressed)
332− tryCompare(greeter, "rightTeaserPressed", data.rightPressed)
333− mouseRelease(greeter, data.posX, greeter.height - units.gu(1))
334− tryCompare(greeter, "leftTeaserPressed", false)
335− tryCompare(greeter, "rightTeaserPressed", false)
334+ teaseSpy.clear()
335+ mouseClick(greeter, data.posX, greeter.height - units.gu(1))
336+ teaseSpy.wait()
337+ tryCompare(teaseSpy, "count", 1)
338+ }
339+
340+ function test_teaseLockedUnlocked_data() {
341+ return [
342+ {tag: "unlocked", locked: false, narrow: false},
343+ {tag: "locked", locked: true, narrow: false},
344+ ];
345+ }
346+
347+ function test_teaseLockedUnlocked(data) {
348+ teaseSpy.clear()
349+ greeter.locked = data.locked;
350+
351+ mouseClick(greeter, greeter.width - units.gu(5), greeter.height - units.gu(1));
352+
353+ if (!data.locked || data.narrow) {
354+ teaseSpy.wait()
355+ tryCompare(teaseSpy, "count", 1);
356+ } else {
357+ // waiting 100ms to make sure nothing happens
358+ wait(100);
359+ compare(teaseSpy.count, 0, "Greeter teasing not disabled even though it's locked.");
360+ }
361+
362+ // Reset value
363+ greeter.locked = false;
336364 }
337365
338366 function test_dbus_set_active_entry() {
tests/qmltests/Launcher/tst_Launcher.qml+1
@@ -66,6 +66,7 @@ Item {
6666
6767 UT.UnityTestCase {
6868 id: revealer
69+ when: windowShown
6970
7071 function dragLauncherIntoView() {
7172 var startX = launcher.dragAreaWidth/2;
tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+30−4
@@ -19,6 +19,7 @@ import QtTest 1.0
1919import Unity.Test 0.1 as UT
2020import QMenuModel 0.1
2121import Unity.Indicators 0.1 as Indicators
22+import Utils 0.1 as Utils
2223
2324Item {
2425 id: testView
@@ -42,8 +43,13 @@ Item {
4243 }
4344 }
4445
46+ Utils.GDateTimeFormatter {
47+ id: timeFormatter
48+ }
49+
4550 UT.UnityTestCase {
4651 name: "MenuItemFactory"
52+ when: windowShown
4753
4854 property QtObject menuData: QtObject {
4955 property string label: "root"
@@ -357,8 +363,10 @@ Item {
357363
358364 function test_create_alarmMenu_data() {
359365 return [
360− {label: "testLabel1", enabled: true, icon: "file:///testIcon1" },
361− {label: "testLabel2", enabled: false, icon: "file:///testIcon2" },
366+ {label: "testLabel1", enabled: true, icon: "file:///testIcon1", color: Qt.rgba(0, 0, 0, 0),
367+ time: new Date(2014, 04, 14).getTime()*1000, timeFormat: "%a %d %b %l:%M %p"},
368+ {label: "testLabel2", enabled: false, icon: "file:///testIcon2", color: Qt.rgba(1, 0, 0, 0),
369+ time: new Date(2015, 12, 31).getTime()*1000, timeFormat: "%A" },
362370 ];
363371 }
364372
@@ -367,6 +375,12 @@ Item {
367375 menuData.label = data.label;
368376 menuData.sensitive = data.enabled;
369377 menuData.icon = data.icon;
378+ menuData.ext = {
379+ 'xCanonicalTime': data.time,
380+ 'xCanonicalTimeFormat': data.timeFormat
381+ };
382+ timeFormatter.format = data.timeFormat;
383+ timeFormatter.time = data.time;
370384
371385 loader.data = menuData;
372386 loader.sourceComponent = factory.load(menuData);
@@ -375,13 +389,16 @@ Item {
375389
376390 compare(loader.item.text, data.label, "Label does not match data");
377391 compare(loader.item.iconSource, data.icon, "Icon does not match data");
392+ compare(loader.item.time, timeFormatter.timeString, "Time does not match data");
378393 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
379394 }
380395
381396 function test_create_appointmentMenu_data() {
382397 return [
383− {label: "testLabel1", enabled: true, icon: "file:///testIcon1" },
384− {label: "testLabel2", enabled: false, icon: "file:///testIcon2" },
398+ {label: "testLabel1", enabled: true, icon: "file:///testIcon1", color: Qt.rgba(0, 0, 0, 0),
399+ time: new Date(2014, 04, 14).getTime()*1000, timeFormat: "%a %d %b %l:%M %p"},
400+ {label: "testLabel2", enabled: false, icon: "file:///testIcon2", color: Qt.rgba(1, 0, 0, 0),
401+ time: new Date(2015, 12, 31).getTime()*1000, timeFormat: "%A" },
385402 ];
386403 }
387404
@@ -390,6 +407,13 @@ Item {
390407 menuData.label = data.label;
391408 menuData.sensitive = data.enabled;
392409 menuData.icon = data.icon;
410+ menuData.ext = {
411+ 'xCanonicalColor': data.colour,
412+ 'xCanonicalTime': data.time,
413+ 'xCanonicalTimeFormat': data.timeFormat
414+ };
415+ timeFormatter.format = data.timeFormat;
416+ timeFormatter.time = data.time;
393417
394418 loader.data = menuData;
395419 loader.sourceComponent = factory.load(menuData);
@@ -398,6 +422,8 @@ Item {
398422
399423 compare(loader.item.text, data.label, "Label does not match data");
400424 compare(loader.item.iconSource, data.icon, "Icon does not match data");
425+ compare(loader.item.time, timeFormatter.timeString, "Time does not match data");
426+ compare(loader.item.eventColor, data.color, "Colour does not match data");
401427 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
402428 }
403429
tests/qmltests/Panel/Indicators/tst_MessageMenuItemFactory.qml+1
@@ -39,6 +39,7 @@ Item {
3939
4040 UT.UnityTestCase {
4141 name: "MessageMenuItemFactory"
42+ when: windowShown
4243
4344 property QtObject menuData: QtObject {
4445 property string label: "root"
tests/qmltests/tst_Shell.qml+11
@@ -554,5 +554,16 @@ Item {
554554
555555 tryCompare(searchIndicator, "opacity", 0);
556556 }
557+
558+ function test_focusRequestedHidesGreeter() {
559+ var greeter = findChild(shell, "greeter")
560+
561+ greeter.show()
562+ tryCompare(greeter, "showProgress", 1)
563+
564+ ApplicationManager.focusRequested("notes-app")
565+ tryCompare(greeter, "showProgress", 0)
566+ waitUntilApplicationWindowIsFullyVisible()
567+ }
557568 }
558569}
tests/utils/modules/Unity/Test/UnityTestCase.qml+26
@@ -260,6 +260,32 @@ TestCase {
260260 }
261261 }
262262
263+ function touchPinch(item, x1Start, y1Start, x1End, y1End, x2Start, y2Start, x2End, y2End) {
264+ // Make sure the item is rendered
265+ waitForRendering(item);
266+
267+ var event1 = touchEvent();
268+ // first finger
269+ event1.press(0, x1Start, y1Start);
270+ event1.commit();
271+ // second finger
272+ event1.stationary(0);
273+ event1.press(1, x2Start, y2Start);
274+ event1.commit();
275+
276+ // pinch
277+ for (var i = 0.0; i < 1.0; i += 0.02) {
278+ event1.move(0, x1Start + (x1End - x1Start) * i, y1Start + (y1End - y1Start) * i);
279+ event1.move(1, x2Start + (x2End - x2Start) * i, y2Start + (y2End - y2Start) * i);
280+ event1.commit();
281+ }
282+
283+ // release
284+ event1.release(0, x1End, y1End);
285+ event1.release(1, x2End, y2End);
286+ event1.commit();
287+ }
288+
263289 function fetchRootItem(item) {
264290 if (item.parent)
265291 return fetchRootItem(item.parent)
tools/CMakeLists.txt+2
@@ -9,3 +9,5 @@ qt5_use_modules(${SCOPE_TOOL} Qml Quick)
99install(TARGETS ${SCOPE_TOOL}
1010 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
1111 )
12+
13+install(FILES unlock-device DESTINATION ${SHELL_APP_DIR})
tools/unlock-devicenew file+42
@@ -0,0 +1,42 @@
1+#!/bin/bash
2+# -*- Mode: sh; indent-tabs-mode: nil; tab-width: 4 -*-
3+
4+# Our goal here is to get an Ubuntu Touch device into a testable unlocked state.
5+# This will include a reboot.
6+
7+WAIT_COMMAND="sleep 20"
8+
9+while getopts s:w: opt; do
10+ case $opt in
11+ s)
12+ export ANDROID_SERIAL=$OPTARG
13+ ;;
14+ w)
15+ WAIT_COMMAND=$OPTARG
16+ ;;
17+ esac
18+done
19+
20+UNLOCK_SCRIPT='
21+import dbus, logging;
22+from unity8 import process_helpers as helpers;
23+logging.basicConfig(level=logging.INFO);
24+bus = dbus.SystemBus().get_object("com.canonical.powerd", "/com/canonical/powerd");
25+cookie = bus.requestSysState("unlock-device-hold", 1, dbus_interface="com.canonical.powerd");
26+helpers.restart_unity_with_testability();
27+bus.clearSysState(cookie, dbus_interface="com.canonical.powerd");
28+helpers.unlock_unity()
29+'
30+
31+adb reboot
32+sleep 5
33+adb "wait-for-device"
34+eval "$WAIT_COMMAND"
35+UNLOCK_OUTPUT=$(adb shell "sudo -u phablet -i python3 -c '$UNLOCK_SCRIPT'" 2>&1)
36+if echo "$UNLOCK_OUTPUT" | grep 'Greeter unlocked' >/dev/null; then
37+ echo "I: Unlock passed"
38+ exit 0
39+else
40+ echo "I: Unlock failed, script output: '$UNLOCK_OUTPUT'"
41+ exit 1
42+fi