on xenial help sign in
Merge with trunk.
commit243492ddda4f8215b2b09ed684af71e71b5bebc9 authorMirco Müller <mirco.mueller@canonical.com> dateTue 17 Jun 2014, 16:16 (12 years ago) parentd77f712cbf1d54
289 files changed+6859−5297
CMakeLists.txt+5−5 CODING+11−11 build → build.sh+1−2 cmake/modules/Plugins.cmake−68 cmake/modules/QmlPlugins.cmake+143 cmake/modules/QmlTest.cmake+4−4 data/unity8-greeter-logrotate.conf+14 debian/changelog+286 debian/control+11−10 debian/rules+1−2 debian/unity8-private.install+1−1 debian/unity8.install−1 plugins/AccountsService/CMakeLists.txt+1−4 plugins/AccountsService/qmldir+1−1 plugins/CMakeLists.txt+14−1 plugins/DashViews/CMakeLists.txt → plugins/Dash/CMakeLists.txt+4−9 plugins/Dash/CardCreator.js+520 plugins/Dash/CardCreatorCache.qml+40 plugins/DashViews/abstractdashview.cpp → plugins/Dash/abstractdashview.cpp+21−82 plugins/DashViews/abstractdashview.h → plugins/Dash/abstractdashview.h+14−37 plugins/DashViews/horizontaljournal.cpp → plugins/Dash/horizontaljournal.cpp−12 plugins/DashViews/horizontaljournal.h → plugins/Dash/horizontaljournal.h−4 plugins/DashViews/listviewwithpageheader.cpp → plugins/Dash/listviewwithpageheader.cpp+39−78 plugins/DashViews/listviewwithpageheader.h → plugins/Dash/listviewwithpageheader.h+9−25 plugins/DashViews/organicgrid.cpp → plugins/Dash/organicgrid.cpp−8 plugins/DashViews/organicgrid.h → plugins/Dash/organicgrid.h−4 plugins/DashViews/plugin.cpp → plugins/Dash/plugin.cpp+2−2 plugins/DashViews/plugin.h → plugins/Dash/plugin.h+3−3 plugins/Dash/qmldir+4 plugins/DashViews/verticaljournal.cpp → plugins/Dash/verticaljournal.cpp−8 plugins/DashViews/verticaljournal.h → plugins/Dash/verticaljournal.h−4 plugins/DashViews/qmldir−3 plugins/HudClient/CMakeLists.txt+1−6 plugins/HudClient/qmldir+1−1 plugins/LightDM/CMakeLists.txt+1−6 plugins/LightDM/qmldir+1−1 plugins/Powerd/CMakeLists.txt+1−3 plugins/Powerd/qmldir+1−1 plugins/SessionBroadcast/CMakeLists.txt+1−4 plugins/SessionBroadcast/qmldir+1−1 plugins/Ubuntu/DownloadDaemonListener/CMakeLists.txt+1−6 plugins/Ubuntu/DownloadDaemonListener/qmldir+1−1 plugins/Ubuntu/Gestures/CMakeLists.txt+1−6 plugins/Ubuntu/Gestures/qmldir+1−1 plugins/Unity/Indicators/CMakeLists.txt+4−7 plugins/Unity/Indicators/menucontentactivator.cpp−1 plugins/Unity/Indicators/qml/CMakeLists.txt−5 plugins/Unity/Indicators/qml/qmldir+1−1 plugins/Unity/Indicators/rootactionstate.cpp+7−8 plugins/Unity/Launcher/CMakeLists.txt+1−3 plugins/Unity/Launcher/backend/launcherbackend.cpp+293−29 plugins/Unity/Launcher/backend/launcherbackend.h+52−4 plugins/Unity/Launcher/launchermodel.cpp+22 plugins/Unity/Launcher/launchermodel.h+1 plugins/Unity/Launcher/qmldir+1−1 plugins/Utils/CMakeLists.txt+1−4 plugins/Utils/bottombarvisibilitycommunicatorshell.cpp−49 plugins/Utils/bottombarvisibilitycommunicatorshell.h−59 plugins/Utils/plugin.cpp−10 plugins/Utils/qmldir+1−1 po/am.po+33−26 po/ar.po+36−29 po/ast.po+33−26 po/az.po+33−26 po/bg.po+33−26 po/br.po+68−54 po/bs.po+33−26 po/ca.po+45−36 po/ckb.po+33−26 po/cs.po+33−26 po/da.po+33−26 po/de.po+55−45 po/el.po+33−26 po/en_AU.po+33−26 po/en_GB.po+33−26 po/eo.po+33−26 po/es.po+38−31 po/eu.po+33−26 po/fa.po+33−26 po/fi.po+35−28 po/fo.po+33−26 po/fr.po+54−38 po/gd.po+46−37 po/gl.po+38−31 po/he.po+43−34 po/hi.po+33−26 po/hr.po+33−26 po/hu.po+33−26 po/hy.po+33−26 po/id.po+33−26 po/is.po+33−26 po/it.po+44−35 po/ja.po+33−26 po/km.po+36−29 po/kn.po+33−26 po/ko.po+33−26 po/ky.po+33−26 po/lo.po+33−26 po/lt.po+40−33 po/lv.po+51−44 po/ml.po+33−26 po/mr.po+33−26 po/ms.po+33−26 po/my.po+33−26 po/nb.po+62−53 po/nl.po+33−26 po/pl.po+44−35 po/pt.po+33−26 po/pt_BR.po+44−35 po/ro.po+33−26 po/ru.po+35−28 po/shn.po+33−26 po/si.po+33−26 po/sl.po+36−29 po/sq.po+33−26 po/sr.po+33−26 po/sv.po+49−42 po/sw.po+33−26 po/ta.po+33−26 po/te.po+33−26 po/tr.po+37−30 po/ug.po+40−33 po/uk.po+44−35 po/unity8.pot+31−24 po/vi.po+33−26 po/xh.po+33−26 po/zh_CN.po+60−53 po/zh_HK.po+33−26 po/zh_TW.po+33−26 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/FilterGrid.qml+2−2 qml/Components/LazyImage.qml+1 qml/Greeter/Lockscreen.qml → qml/Components/Lockscreen.qml+91−8 qml/Components/PageHeader.qml+1−1 qml/Greeter/PassphraseLockscreen.qml → qml/Components/PassphraseLockscreen.qml+6−2 qml/Greeter/PinLockscreen.qml → qml/Components/PinLockscreen.qml+30−12 qml/Components/PinPadButton.qml+2−1 qml/Components/ResponsiveGridView.qml+3−3 qml/Components/Revealer.qml−241 qml/Components/ZoomableImage.qml+153 qml/Dash/Card.qml−236 qml/Dash/CardCarousel.qml+26−14 qml/Dash/CardFilterGrid.qml+21−18 qml/Dash/CardHeader.qml−126 qml/Dash/CardTool.qml+30−22 qml/Dash/DashContent.qml+19−11 qml/Dash/DashRenderer.qml+5−6 qml/Dash/GenericScopeView.qml+14−12 qml/Dash/PreviewListView.qml+3−3 qml/Dash/Previews/PreviewHeader.qml+89−9 qml/Dash/Previews/PreviewProgress.qml+3−2 qml/Dash/Previews/PreviewTextSummary.qml+4−2 qml/Dash/Previews/PreviewZoomableImage.qml+4−7 qml/Dash/ScopeListView.qml+1−1 qml/Dash/graphics/carousel_dropshadow@27.png qml/Dash/graphics/carousel_dropshadow@27.sci+5 qml/Greeter/LoginList.qml+1 qml/Notifications/NotificationMenuItemFactory.qml−1 qml/Notifications/Notifications.qml+11 qml/Panel/Panel.qml+1−1 qml/ScopeTool.qml+1−1 qml/Shell.qml+27−59 tests/mocks/Unity/iconutils.h → qml/Stages/Dot.qml+9−13 qml/Stages/PhoneStage.qml+5−2 qml/Stages/StageWithSideStage.qml+8−2 qml/Stages/WaitingDots.qml+76 run → run.sh+1−1 run_on_device → run_on_device.sh+2−2 src/ApplicationArguments.h+4−8 src/main.cpp+43−6 tests/autopilot/unity8/process_helpers.py+11−4 tests/autopilot/unity8/shell/emulators/dash.py+3−4 tests/autopilot/unity8/shell/emulators/main_window.py−4 tests/autopilot/unity8/shell/tests/test_notifications.py+83 tests/mocks/AccountsService/CMakeLists.txt+1−12 tests/mocks/AccountsService/qmldir+1 tests/mocks/CMakeLists.txt+30 tests/mocks/GSettings.1.0/CMakeLists.txt+1−4 tests/mocks/GSettings.1.0/qmldir+1 tests/mocks/HudClient/CMakeLists.txt+1−4 tests/mocks/HudClient/qmldir+2 tests/mocks/LightDM/CMakeLists.txt+5−12 tests/mocks/LightDM/qmldir+1 tests/mocks/Powerd/CMakeLists.txt+1−12 tests/mocks/Powerd/qmldir+1 tests/mocks/QMenuModel/CMakeLists.txt+2−12 tests/mocks/QMenuModel/qmldir+1 tests/mocks/QtMultimedia/CMakeLists.txt+1−12 tests/mocks/QtMultimedia/qmldir+1 tests/mocks/Ubuntu/DownloadDaemonListener/CMakeLists.txt+1−9 tests/mocks/Ubuntu/DownloadDaemonListener/qmldir+1 tests/mocks/Ubuntu/Thumbnailer/CMakeLists.txt+1−7 tests/mocks/Ubuntu/Thumbnailer/qmldir+2 tests/mocks/Unity/Application/CMakeLists.txt+9−35 tests/mocks/Unity/Application/qmldir+2 tests/mocks/Unity/CMakeLists.txt+9−13 tests/mocks/Unity/Indicators/CMakeLists.txt+1−14 tests/mocks/Unity/Indicators/qml/FakeMenuPage.qml → tests/mocks/Unity/Indicators/FakeMenuPage.qml tests/mocks/Unity/Indicators/qmldir+1 tests/mocks/Unity/Launcher/CMakeLists.txt+1−5 tests/mocks/Unity/Launcher/MockLauncherModel.cpp+5 tests/mocks/Unity/Launcher/MockLauncherModel.h+1 tests/mocks/Unity/Launcher/qmldir+1 tests/mocks/Unity/Notifications/CMakeLists.txt+1−11 tests/mocks/Unity/Notifications/qmldir+1 tests/mocks/Unity/fake_categories.cpp+26−25 tests/mocks/Unity/fake_categories.h+5−18 tests/mocks/Unity/fake_previewmodel.cpp+2−15 tests/mocks/Unity/fake_previewmodel.h+7−25 tests/mocks/Unity/fake_previewstack.cpp+3−11 tests/mocks/Unity/fake_previewstack.h+6−17 tests/mocks/Unity/fake_previewwidgetmodel.cpp+2−10 tests/mocks/Unity/fake_previewwidgetmodel.h+3−12 tests/mocks/Unity/fake_resultsmodel.cpp+2−44 tests/mocks/Unity/fake_resultsmodel.h+5−37 tests/mocks/Unity/fake_scope.cpp+3−14 tests/mocks/Unity/fake_scope.h+26−72 tests/mocks/Unity/fake_scopes.cpp+11−26 tests/mocks/Unity/fake_scopes.h+7−24 tests/mocks/Unity/fake_unity_plugin.cpp+3−2 tests/mocks/Unity/iconutils.cpp−124 tests/mocks/Unity/qmldir+1 tests/plugins/CMakeLists.txt+1−1 tests/plugins/DashViews/CMakeLists.txt → tests/plugins/Dash/CMakeLists.txt+16−9 tests/plugins/Dash/cardcreator/1.res+79 tests/plugins/Dash/cardcreator/1.tst+3 tests/plugins/Dash/cardcreator/2.res+116 tests/plugins/Dash/cardcreator/2.tst+3 tests/plugins/Dash/cardcreator/3.res+96 tests/plugins/Dash/cardcreator/3.tst+3 tests/plugins/Dash/cardcreator/4.res+96 tests/plugins/Dash/cardcreator/4.tst+3 tests/plugins/Dash/cardcreator/5.res+139 tests/plugins/Dash/cardcreator/5.tst+3 tests/plugins/Dash/cardcreatortest.cpp+91 tests/plugins/Dash/cardcreatortest.qml+29 tests/plugins/DashViews/horizontaljournaltest.cpp → tests/plugins/Dash/horizontaljournaltest.cpp+6−6 tests/plugins/DashViews/horizontaljournaltest.qml → tests/plugins/Dash/horizontaljournaltest.qml+1−1 tests/plugins/DashViews/horizontaljournaltry.cpp → tests/plugins/Dash/horizontaljournaltry.cpp tests/plugins/DashViews/horizontaljournaltry.qml → tests/plugins/Dash/horizontaljournaltry.qml+24−3 tests/plugins/DashViews/listviewwithpageheadersectionexternalmodeltest.cpp → tests/plugins/Dash/listviewwithpageheadersectionexternalmodeltest.cpp+3−7 tests/plugins/DashViews/listviewwithpageheadersectiontest.cpp → tests/plugins/Dash/listviewwithpageheadersectiontest.cpp+11−17 tests/plugins/DashViews/listviewwithpageheadertest.cpp → tests/plugins/Dash/listviewwithpageheadertest.cpp−15 tests/plugins/DashViews/listviewwithpageheadertest.qml → tests/plugins/Dash/listviewwithpageheadertest.qml+1−1 tests/plugins/DashViews/listviewwithpageheadertestsection.qml → tests/plugins/Dash/listviewwithpageheadertestsection.qml+1−1 tests/plugins/DashViews/listviewwithpageheadertestsectionexternalmodel.qml → tests/plugins/Dash/listviewwithpageheadertestsectionexternalmodel.qml+1−1 tests/plugins/DashViews/organicgridtest.cpp → tests/plugins/Dash/organicgridtest.cpp+7−5 tests/plugins/DashViews/organicgridtest.qml → tests/plugins/Dash/organicgridtest.qml+1−1 tests/plugins/DashViews/organicgridtry.cpp → tests/plugins/Dash/organicgridtry.cpp tests/plugins/DashViews/organicgridtry.qml → tests/plugins/Dash/organicgridtry.qml+23−3 tests/plugins/DashViews/tst_ListViewWithPageHeaderQML.qml → tests/plugins/Dash/tst_ListViewWithPageHeaderQML.qml+1−1 tests/plugins/DashViews/verticaljournaltest.cpp → tests/plugins/Dash/verticaljournaltest.cpp+6−6 tests/plugins/DashViews/verticaljournaltest.qml → tests/plugins/Dash/verticaljournaltest.qml+1−1 tests/plugins/DashViews/verticaljournaltry.cpp → tests/plugins/Dash/verticaljournaltry.cpp tests/plugins/DashViews/verticaljournaltry.qml → tests/plugins/Dash/verticaljournaltry.qml+24−3 tests/plugins/Unity/Indicators/rootactionstatetest.cpp+37 tests/plugins/Unity/Launcher/CMakeLists.txt+4−4 tests/plugins/Unity/Launcher/launcherbackendtest.cpp+167 tests/plugins/Unity/Launcher/launchermodeltest.cpp+9 tests/qmltests/CMakeLists.txt+36−46 tests/qmltests/Components/RevealingRectangle.qml−78 tests/qmltests/Components/tst_LazyImage.qml+1−1 tests/qmltests/Components/tst_PageHeaderLabel.qml+4−4 tests/qmltests/Components/tst_Revealer.qml−262 tests/qmltests/Components/tst_ZoomableImage.qml+194 tests/qmltests/Dash/Previews/tst_Preview.qml+1−1 tests/qmltests/Dash/Previews/tst_PreviewHeader.qml+71−4 tests/qmltests/Dash/Previews/tst_PreviewTextSummary.qml+5−5 tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml+11−6 tests/qmltests/Dash/tst_Card.qml+78−92 tests/qmltests/Dash/tst_CardBenchmark.qml+10−7 tests/qmltests/Dash/tst_CardHeader.qml−116 tests/qmltests/Dash/tst_CardTool.qml+11−31 tests/qmltests/Dash/tst_Dash.qml+1−1 tests/qmltests/Dash/tst_DashContent.qml+34−19 tests/qmltests/Dash/tst_GenericScopeView.qml+12−11 tests/qmltests/Greeter/tst_Lockscreen.qml+209−31 tests/qmltests/Greeter/tst_Tablet.qml → tests/qmltests/Greeter/tst_MultiGreeter.qml+1−1 tests/qmltests/Greeter/tst_Phone.qml → tests/qmltests/Greeter/tst_SingleGreeter.qml+1−19 tests/qmltests/tst_Shell.qml−9 tests/utils/modules/Unity/Test/CMakeLists.txt+4−7 tests/utils/modules/Unity/Test/UnityTestCase.qml+26 tests/utils/modules/Unity/Test/qmldir+2 tools/registry-tracker.cpp+33−26 tools/unlock-device+2−4
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−11
@@ -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:
@@ -171,7 +171,7 @@ Running autopilot tests
171171=======================
172172
173173Autopilot tests are run from the build directory (which will be ./builddir if you used
174−the ./build script).
174+the ./build.sh script).
175175
176176$ make autopilot
177177
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/Plugins.cmakedeleted−68
@@ -1,68 +0,0 @@
1−find_program(qmlplugindump_exe qmlplugindump)
2−
3−if(NOT qmlplugindump_exe)
4− msg(FATAL_ERROR "Could not locate qmlplugindump.")
5−endif()
6−
7−# Creates target for copying and installing qmlfiles
8−#
9−# export_qmlfiles(plugin sub_path)
10−#
11−#
12−# Target to be created:
13−# - plugin-qmlfiles - Copies the qml files (*.qml, *.js, qmldir) into the shadow build folder.
14−
15−macro(export_qmlfiles PLUGIN PLUGIN_SUBPATH)
16−
17− file(GLOB QMLFILES
18− *.qml
19− *.js
20− qmldir
21− )
22−
23− # copy the qmldir file
24− add_custom_target(${PLUGIN}-qmlfiles ALL
25− COMMAND cp ${QMLFILES} ${CMAKE_BINARY_DIR}/plugins/${PLUGIN_SUBPATH}
26− DEPENDS ${QMLFILES}
27− SOURCES ${QMLFILES}
28− )
29−
30− # install the qmlfiles file.
31− install(FILES ${QMLFILES}
32− DESTINATION ${SHELL_INSTALL_QML}/${PLUGIN_SUBPATH}
33− )
34−endmacro(export_qmlfiles)
35−
36−
37−# Creates target for generating the qmltypes file for a plugin and installs plugin files
38−#
39−# export_qmlplugin(plugin version sub_path [TARGETS target1 [target2 ...]])
40−#
41−# TARGETS additional install targets (eg the plugin shared object)
42−#
43−# Target to be created:
44−# - plugin-qmltypes - Generates the qmltypes file in the shadow build folder.
45−
46−macro(export_qmlplugin PLUGIN VERSION PLUGIN_SUBPATH)
47− set(multi_value_keywords TARGETS)
48− cmake_parse_arguments(qmlplugin "" "" "${multi_value_keywords}" ${ARGN})
49−
50− # Only try to generate .qmltypes if not cross compiling
51− if(NOT CMAKE_CROSSCOMPILING)
52− # create the plugin.qmltypes file
53− add_custom_target(${PLUGIN}-qmltypes ALL
54− COMMAND ${qmlplugindump_exe} -notrelocatable ${PLUGIN} ${VERSION} ${CMAKE_BINARY_DIR}/plugins > ${CMAKE_BINARY_DIR}/plugins/${PLUGIN_SUBPATH}/plugin.qmltypes
55− )
56− add_dependencies(${PLUGIN}-qmltypes ${PLUGIN}-qmlfiles ${qmlplugin_TARGETS})
57−
58− # install the qmltypes file.
59− install(FILES ${CMAKE_BINARY_DIR}/plugins/${PLUGIN_SUBPATH}/plugin.qmltypes
60− DESTINATION ${SHELL_INSTALL_QML}/${PLUGIN_SUBPATH}
61− )
62− endif()
63−
64− # install the additional targets
65− install(TARGETS ${qmlplugin_TARGETS}
66− DESTINATION ${SHELL_INSTALL_QML}/${PLUGIN_SUBPATH}
67− )
68−endmacro(export_qmlplugin)
cmake/modules/QmlPlugins.cmakenew file+143
@@ -0,0 +1,143 @@
1+# If you need to override the qmlplugindump binary, create the qmlplugin executable
2+# target before loading this plugin.
3+
4+if(NOT TARGET qmlplugindump)
5+ find_program(qmlplugindump_exe qmlplugindump)
6+
7+ if(NOT qmlplugindump_exe)
8+ msg(FATAL_ERROR "Could not locate qmlplugindump.")
9+ endif()
10+
11+ add_executable(qmlplugindump IMPORTED)
12+ set_target_properties(qmlplugindump PROPERTIES IMPORTED_LOCATION ${qmlplugindump_exe})
13+endif()
14+
15+
16+# Creates a target for copying resource files into build dir and optionally installing them.
17+#
18+# Files will be copied into ${BINARY_DIR}/${path} or ${CMAKE_CURRENT_BINARY_DIR} and installed
19+# into ${DESTINATION}/${path}.
20+#
21+# Resource file names are matched against {*.{qml,js,jpg,png,sci,svg},qmldir}.
22+#
23+# export_qmlfiles(plugin path
24+# [SEARCH_PATH path] # Path to search for resources in (defaults to ${CMAKE_CURRENT_SOURCE_DIR})
25+# [BINARY_DIR path]
26+# [DESTINATION path]
27+# [TARGET_PREFIX string] # Will be prefixed to the target name
28+# )
29+#
30+# Created target:
31+# - ${TARGET_PREFIX}${plugin}-qmlfiles - Copies resources into the binary dir.
32+
33+macro(export_qmlfiles PLUGIN PATH)
34+ set(single SEARCH_PATH BINARY_DIR DESTINATION TARGET_PREFIX)
35+ cmake_parse_arguments(QMLFILES "" "${single}" "" ${ARGN})
36+
37+ if(NOT QMLFILES_SEARCH_PATH)
38+ set(QMLFILES_SEARCH_PATH ${CMAKE_CURRENT_SOURCE_DIR})
39+ endif()
40+
41+ if(QMLFILES_BINARY_DIR)
42+ set(qmlfiles_dir ${QMLFILES_BINARY_DIR}/${PATH})
43+ else()
44+ set(qmlfiles_dir ${CMAKE_CURRENT_BINARY_DIR})
45+ endif()
46+
47+ file(GLOB QMLFILES
48+ ${QMLFILES_SEARCH_PATH}/*.qml
49+ ${QMLFILES_SEARCH_PATH}/*.js
50+ ${QMLFILES_SEARCH_PATH}/*.jpg
51+ ${QMLFILES_SEARCH_PATH}/*.png
52+ ${QMLFILES_SEARCH_PATH}/*.sci
53+ ${QMLFILES_SEARCH_PATH}/*.svg
54+ ${QMLFILES_SEARCH_PATH}/qmldir
55+ )
56+
57+ execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${qmlfiles_dir})
58+
59+ # copy the files
60+ add_custom_target(${QMLFILES_TARGET_PREFIX}${PLUGIN}-qmlfiles ALL
61+ COMMAND cp ${QMLFILES} ${qmlfiles_dir}
62+ DEPENDS ${QMLFILES}
63+ SOURCES ${QMLFILES}
64+ )
65+
66+ if(QMLFILES_DESTINATION)
67+ # install the qmlfiles file.
68+ install(FILES ${QMLFILES}
69+ DESTINATION ${QMLFILES_DESTINATION}/${PATH}
70+ )
71+ endif()
72+endmacro(export_qmlfiles)
73+
74+
75+# Creates a target for generating the typeinfo file for a QML plugin and optionally installs it
76+# and additional targets.
77+#
78+# Files will be copied into ${BINARY_DIR}/${path} or ${CMAKE_CURRENT_BINARY_DIR} and installed
79+# into ${DESTINATION}/${path}. If you don't pass BINARY_DIR, it's assumed that current source
80+# path ends with ${path}.
81+#
82+# The generated file will be named after the last segment of the plugin name, e.g. Foo.qmltypes.
83+#
84+# export_qmlplugin(plugin version path
85+# [BINARY_DIR path]
86+# [DESTINATION path]
87+# [TARGET_PREFIX string] # Will be prefixed to the target name
88+# [ENVIRONMENT string] # Will be added to qmlplugindump's env
89+# [TARGETS target1 [target2 ...]] # Targets to depend on and install (e.g. the plugin shared object)
90+# )
91+#
92+# Created target:
93+# - ${TARGET_PREFIX}${plugin}-qmltypes - Generates the qmltypes file in the binary dir.
94+
95+macro(export_qmlplugin PLUGIN VERSION PATH)
96+ set(single BINARY_DIR DESTINATION TARGET_PREFIX ENVIRONMENT)
97+ set(multi TARGETS)
98+ cmake_parse_arguments(QMLPLUGIN "" "${single}" "${multi}" ${ARGN})
99+
100+ get_target_property(qmlplugindump_executable qmlplugindump LOCATION)
101+
102+ if(QMLPLUGIN_BINARY_DIR)
103+ set(qmlplugin_dir ${QMLPLUGIN_BINARY_DIR}/${PATH})
104+ else()
105+ # Find import path to point qmlplugindump at
106+ string(REGEX REPLACE "${PATH}$" "" QMLPLUGIN_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
107+ set(qmlplugin_dir ${CMAKE_CURRENT_BINARY_DIR})
108+ endif()
109+
110+ # Find the last segment of the plugin name to use as qmltypes basename
111+ string(REGEX MATCH "[^.]+$" plugin_suffix ${PLUGIN})
112+ set(target_prefix ${QMLPLUGIN_TARGET_PREFIX}${PLUGIN})
113+ set(qmltypes_path ${qmlplugin_dir}/${plugin_suffix}.qmltypes)
114+
115+ # Only generate typeinfo if not cross compiling
116+ if(NOT CMAKE_CROSSCOMPILING)
117+ add_custom_target(${target_prefix}-qmltypes ALL
118+ COMMAND env ${QMLPLUGIN_ENVIRONMENT} ${qmlplugindump_executable} -notrelocatable
119+ ${PLUGIN} ${VERSION} ${QMLPLUGIN_BINARY_DIR} > ${qmltypes_path}
120+ )
121+ add_dependencies(${target_prefix}-qmltypes ${target_prefix}-qmlfiles ${QMLPLUGIN_TARGETS})
122+
123+ if (QMLPLUGIN_DESTINATION)
124+ # Install the typeinfo file
125+ install(FILES ${qmltypes_path}
126+ DESTINATION ${QMLPLUGIN_DESTINATION}/${PATH}
127+ )
128+ endif()
129+ endif()
130+
131+ set_target_properties(${QMLPLUGIN_TARGETS} PROPERTIES
132+ ARCHIVE_OUTPUT_DIRECTORY ${qmlplugin_dir}
133+ LIBRARY_OUTPUT_DIRECTORY ${qmlplugin_dir}
134+ RUNTIME_OUTPUT_DIRECTORY ${qmlplugin_dir}
135+ )
136+
137+ if (QMLPLUGIN_DESTINATION)
138+ # Install additional targets
139+ install(TARGETS ${QMLPLUGIN_TARGETS}
140+ DESTINATION ${QMLPLUGIN_DESTINATION}/${PATH}
141+ )
142+ endif()
143+endmacro()
cmake/modules/QmlTest.cmake+4−4
@@ -51,7 +51,7 @@ macro(add_manual_qml_test SUBPATH COMPONENT_NAME)
5151
5252 set(qmlscene_command
5353 env ${qmltest_ENVIRONMENT}
54− ${qmlscene_exe} ${CMAKE_CURRENT_SOURCE_DIR}/${qmltest_FILE}.qml
54+ ${qmlscene_exe} -qmljsdebugger=port:3768 ${CMAKE_CURRENT_SOURCE_DIR}/${qmltest_FILE}.qml
5555 ${qmlscene_imports}
5656 )
5757 add_custom_target(${qmlscene_TARGET} ${qmlscene_command})
@@ -111,9 +111,9 @@ macro(add_qml_test_internal SUBPATH COMPONENT_NAME ITERATIONS)
111111 -o -,txt
112112 ${function_ARGS}
113113 )
114− find_program( HAVE_GCC gcc )
115− if (NOT ${HAVE_GCC} STREQUAL "")
116− exec_program( gcc ARGS "-dumpmachine" OUTPUT_VARIABLE ARCH_TRIPLET )
114+ find_program(DPKG dpkg-architecture)
115+ if(DPKG)
116+ exec_program(${DPKG} ARGS "-qDEB_BUILD_MULTIARCH" OUTPUT_VARIABLE ARCH_TRIPLET )
117117 set(LD_PRELOAD_PATH "LD_PRELOAD=/usr/lib/${ARCH_TRIPLET}/mesa/libGL.so.1")
118118 endif()
119119 set(qmltest_xvfb_command
data/unity8-greeter-logrotate.confnew file+14
@@ -0,0 +1,14 @@
1+description "Unity 8 Greeter logrotate support"
2+author "Michael Terry <mterry@ubuntu.com>"
3+
4+start on unity8-greeter-started
5+task
6+
7+script
8+ # logrotate normally starts on startup and then sleeps for 60 seconds.
9+ # Otherwise, it skips that sleep. Since we can't emit the startup signal
10+ # for a unity8-greeter session, we have to trigger logrotate manually.
11+ # So we do the sleep ourselves in its stead.
12+ sleep 60
13+ initctl emit :sys:rotate-logs
14+end script
debian/changelog+286
@@ -1,3 +1,289 @@
1+unity8 (7.89+14.10.20140616.1-0ubuntu1) utopic; urgency=low
2+
3+ [ Pawel Stolowski ]
4+ * Extend the hack for click scope categories with the upcoming 'store'
5+ category: single-tap on results from the 'store' category should
6+ activate them, instead of requesting a preview. (LP: #1326292)
7+
8+ [ Albert Astals ]
9+ * Drop the " Preview" suffix from Preview title As requested in
10+ https://bugs.launchpad.net/unity8/+bug/1316671 (LP: #1316671)
11+
12+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 16 Jun 2014 14:43:01 +0000
13+
14+unity8 (7.89+14.10.20140613-0ubuntu1) utopic; urgency=medium
15+
16+ [ Michael Terry ]
17+ * Revert split greeter for now. We will bring it back as an option
18+ for Desktop, but use a big hammer revert right now to get Touch back
19+ in shape.
20+
21+ [ CI bot ]
22+ * Fix build problems. Reviewed by: Michael Terry (LP: #1328850)
23+
24+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 13 Jun 2014 08:30:48 +0000
25+
26+unity8 (7.88+14.10.20140606-0ubuntu1) utopic; urgency=low
27+
28+ [ Michał Sawicz ]
29+ * Make lockscreen buttons translatable.
30+
31+ [ Albert Astals ]
32+ * Correctly mark these functions as overrides
33+ * Remove connections to non existant signal
34+ * Better test name
35+ * Improvements for headerless categories LVPWH: No section name -> no
36+ header LVPWH: New hasSectionHeader context property for delegates
37+ GSV: Add topMargin if no hasSectionHeader (LP: #1326415)
38+ * Make tryVerticalJournal, tryHorizontalJournal and tryOrganicGrid
39+ work again
40+
41+ [ Michael Zanetti ]
42+ * Don't crash when we get an invalid app from ApplicationManager (LP:
43+ #1309162)
44+
45+ [ Andrea Cimitan ]
46+ * Workaround for lp1324159 (LP: #1322233, #1324159)
47+
48+ [ CI bot ]
49+ * Resync trunk
50+
51+ [ Florian Boucault ]
52+ * Application startup: changed splash rectangle to be black instead of
53+ white and added a neat little animation. (LP: #1124265)
54+
55+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 06 Jun 2014 11:38:53 +0000
56+
57+unity8 (7.88+14.10.20140603.1-0ubuntu1) utopic; urgency=medium
58+
59+ [ Michael Terry ]
60+ * Bump version so ubuntu-touch-session can reference this one
61+
62+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 03 Jun 2014 20:31:00 +0000
63+
64+unity8 (7.87+14.10.20140603.1-0ubuntu1) utopic; urgency=low
65+
66+ [ CI bot ]
67+ * Resync trunk
68+
69+ [ Michał Sawicz ]
70+ * Move env setup past session init in greeter wrapper. (LP: #1325882)
71+
72+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 03 Jun 2014 10:33:11 +0000
73+
74+unity8 (7.87+14.10.20140530.1-0ubuntu3) utopic; urgency=medium
75+
76+ * no change rebuild
77+
78+ -- Oliver Grawert <ogra@ubuntu.com> Mon, 02 Jun 2014 16:19:10 +0200
79+
80+unity8 (7.87+14.10.20140530.1-0ubuntu2) utopic; urgency=medium
81+
82+ * drop dbus-x11 dependency of unity8-greeter, it makes us end up with
83+ multiple session dbus daemons which breaks many AP tests in the lab
84+
85+ -- Oliver Grawert <ogra@ubuntu.com> Mon, 02 Jun 2014 14:50:59 +0200
86+
87+unity8 (7.87+14.10.20140530.1-0ubuntu1) utopic; urgency=medium
88+
89+ [ Michael Terry ]
90+ * Bump version for Breaks due to unity8-greeter
91+ * In split mode, determine whether the application identifiers in
92+ AccountsService are click packages or not, so we know the correct
93+ url prefix to use.
94+ * Start logrotate in the greeter's session.
95+
96+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 30 May 2014 09:29:15 +0000
97+
98+unity8 (7.86+14.10.20140527-0ubuntu1) utopic; urgency=low
99+
100+ [ Andrea Cimitan ]
101+ * Passes to make tryCommand -qmljsdebugger=port:3768 to enable
102+ debug/profiling test apps
103+ * Fixes carousel shadow
104+
105+ [ Michał Sawicz ]
106+ * Use dpkg-architecture, not gcc, to determine the machine triplet.
107+
108+ [ Ying-Chun Liu ]
109+ * Fix ZoomableImage test failure. (LP: #1317254)
110+
111+ [ Albert Astals ]
112+ * We don't need iconutils in this mock
113+ * Don't reserve space for mascot if no mascot is specified (LP:
114+ #1319343)
115+ * CardHeader is no more, remove stale line in CMakeLists.txt
116+ * GenericScopeViewTest: Wait a bit more Otherwise sometimes we end
117+ getting up the wrong delegate (maybe one that will be garbage
118+ collected?) (LP: #1322279)
119+ * Fix crash in organicgridtest
120+
121+ [ Daniel d'Andrada ]
122+ * Remove Shell's underlay background image as it cannot be seen
123+ anymore Now that the Dash has its own, opaque, background, the
124+ underlay's background image can no longer be seen. So it's just a
125+ waste of resources to have it.
126+
127+ [ Michael Terry ]
128+ * Use the same animation when dismissing a greeter slide from the
129+ launcher as from a normal greeter drag. (LP: #1316513)
130+
131+ [ Michael Zanetti ]
132+ * enhance lockscreen add a retry indication label (e.g. 3 attempts
133+ left). add an additional label (e.g. phone number for multi sim).
134+ add a infoPopup (e.g. to display a warning for last retry). add min
135+ and max limit values. add tests for the above (LP: #1302050)
136+
137+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 27 May 2014 07:47:11 +0000
138+
139+unity8 (7.86+14.10.20140522-0ubuntu1) utopic; urgency=low
140+
141+ [ Albert Astals ]
142+ * Use Interface classes from unity-api
143+
144+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 22 May 2014 17:59:23 +0000
145+
146+unity8 (7.86+14.10.20140519-0ubuntu1) utopic; urgency=low
147+
148+ [ Ubuntu daily release ]
149+ * New rebuild forced
150+
151+ [ Albert Astals ]
152+ * Use the new displayMargin feature Also port our DashViews to use
153+ same naming and behaviour + update tests
154+
155+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 19 May 2014 07:35:51 +0000
156+
157+unity8 (7.86+14.10.20140516.5-0ubuntu1) utopic; urgency=low
158+
159+ [ Michal Hruby ]
160+ * Updated scope tool to create proper config files after recent
161+ libunity-scopes-api changes.
162+
163+ [ Michał Sawicz ]
164+ * Refactor export_qmlfiles and export_qmlplugins to be more generic
165+ and clean up installed mocks.
166+
167+ [ Albert Astals ]
168+ * Remove empty dirs
169+ * Set the tabbarmodel index as we do on real code It works better :D
170+ (LP: #1317255)
171+
172+ [ Thomi Richards ]
173+ * Use new import location for ProcessSearchError in process_helpers
174+ script.
175+
176+ [ Andrea Cimitan ]
177+ * Adds shadow for the carousel
178+
179+ [ Daniel d'Andrada ]
180+ * Remove Revealer component It's not used anywhere anymore. It's been
181+ replaced by DragHandle.
182+
183+ [ Andy Doan ]
184+ * unlock_device: support more complex reboot/wait cycles Currently
185+ this script only allows you to override how to "wait" on the device.
186+ This changes the logic to also support how you go about rebooting
187+ the device. This is handy for the ubuntu-emulator because adb-reboot
188+ is not currently supported. However, we also have a more
189+ sophisticated, fool-proof way we reboot/wait in the CI lab that
190+ would be nice to take advantage of:
191+ http://bazaar.launchpad.net/~ubuntu-test-case-dev/ubuntu-test-
192+ cases/touch/view/head:/scripts/reboot-and-wait
193+
194+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 16 May 2014 18:46:32 +0000
195+
196+unity8 (7.86+14.10.20140516.2-0ubuntu1) utopic; urgency=low
197+
198+ [ CI bot ]
199+ * Resync trunk
200+
201+ [ Michael Zanetti ]
202+ * support appid:// entries in gsettings schema and make
203+ findDesktopFile work with short-appid (LP: #1239750)
204+
205+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 16 May 2014 12:32:40 +0000
206+
207+unity8 (7.86+14.10.20140514.1-0ubuntu1) utopic; urgency=low
208+
209+ [ Antti Kaijanmäki ]
210+ * Indicators/RootActionState: use g_variant_iter_loop to extract
211+ icons.
212+
213+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 14 May 2014 11:43:55 +0000
214+
215+unity8 (7.86+14.10.20140513-0ubuntu1) utopic; urgency=low
216+
217+ [ Andrea Cimitan ]
218+ * Improve padding in Text preview widget. (LP: #1316683)
219+
220+ [ CI bot ]
221+ * Resync trunk
222+
223+ [ Nick Dedekind ]
224+ * Removed binding loop from Unity.Indicators.MenuContentActivator
225+ Change handler for QMLListProperty used by MenuContent.qml:
226+ menuActivator.content[index].active If we're already asking for the
227+ index, we know it exists already. No need to send a
228+ changeNotification on an implied creation.
229+
230+ [ Josh Arenson ]
231+ * Implements usage-style documentation for unity8 executable. Fixes
232+ lp:1269282 (LP: #1269282)
233+
234+ [ Albert Astals ]
235+ * Create specialized Card code in Javascript instead of having various
236+ copied&pasted files (LP: #1297197)
237+
238+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 13 May 2014 08:34:02 +0000
239+
240+unity8 (7.86+14.10.20140507.3-0ubuntu1) utopic; urgency=low
241+
242+ [ Michał Sawicz ]
243+ * Remove HUD from the bottom edge. Again.
244+
245+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 07 May 2014 11:14:30 +0000
246+
247+unity8 (7.86+14.10.20140505-0ubuntu1) utopic; urgency=low
248+
249+ [ Ted Gould ]
250+ * Provide a dbus interface for setting the count and countVisible
251+ properties. (LP: #1301400)
252+
253+ [ Michał Sawicz ]
254+ * Pass env variables to initctl start.
255+ * Suffix .sh to our scripts and clean up debian/rules.
256+ * Adapt to Debian Qt package renames and drop unneeded Dee plugin
257+ dependency.
258+
259+ [ Ying-Chun Liu ]
260+ * Add Zoomable Image for Preview widgets.
261+
262+ [ Albert Astals ]
263+ * Remove support for Qt <= 5.2.1
264+
265+ [ Mirco Müller ]
266+ * Implemented feature-request from Design for modal snap-decision
267+ notifications on the phone. See LP #1285712 (LP: #1285712)
268+
269+ [ Andrea Cimitan ]
270+ * Make progressbas in preview widget big as the button
271+
272+ [ CI bot ]
273+ * Resync trunk
274+
275+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 05 May 2014 12:09:43 +0000
276+
277+unity8 (7.86+14.10.20140502.6-0ubuntu1) utopic; urgency=low
278+
279+ [ tpeeters ]
280+ * Adapt to new TabBar
281+
282+ [ Tim Peeters ]
283+ * Adapt to new TabBar
284+
285+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 02 May 2014 16:44:52 +0000
286+
1287unity8 (7.86+14.10.20140429.2-0ubuntu1) utopic; urgency=medium
2288
3289 [ Andrea Cimitan ]
debian/control+11−10
@@ -26,19 +26,19 @@ Build-Depends: cmake,
2626 python3-all:any,
2727 python3-setuptools,
2828 python:any (>= 2.7),
29+ qml-module-qtquick-xmllistmodel,
30+ qml-module-qtquick2,
31+ qml-module-qttest,
2932 qt5-default,
30− qtbase5-dev,
33+ qtbase5-dev (>= 5.2.1),
3134 qtbase5-dev-tools,
32− qtbase5-private-dev,
33− qtdeclarative5-dev,
35+ qtbase5-private-dev (>= 5.2.1),
36+ qtdeclarative5-dev (>= 5.2.1),
3437 qtdeclarative5-dev-tools,
35− qtdeclarative5-private-dev,
38+ qtdeclarative5-private-dev (>= 5.2.1),
3639 qtdeclarative5-qtmultimedia-plugin,
37− qtdeclarative5-qtquick2-plugin,
38− qtdeclarative5-test-plugin,
3940 qtdeclarative5-ubuntu-settings-components,
4041 qtdeclarative5-ubuntu-ui-toolkit-plugin,
41− qtdeclarative5-xmllistmodel-plugin,
4242 ttf-ubuntu-font-family,
4343Standards-Version: 3.9.4
4444Homepage: http://launchpad.net/unity
@@ -76,10 +76,9 @@ Depends: gsettings-desktop-schemas,
7676 libglib2.0-bin,
7777 libunity-mir1 (>= 0.4),
7878 qmenumodel-qml (>= 0.2.7),
79− qtdeclarative5-dee-plugin,
79+ qml-module-qtquick-xmllistmodel,
8080 qtdeclarative5-gsettings1.0,
8181 qtdeclarative5-ubuntu-settings-components,
82− qtdeclarative5-xmllistmodel-plugin,
8382 unity-launcher-impl-3,
8483 unity8-common (= ${source:Version}),
8584 unity8-private (= ${binary:Version}),
@@ -91,7 +90,9 @@ Recommends: unity-scope-click,
9190 unity-scope-scopes,
9291Breaks: indicator-network (<< 0.5.1),
9392 ubuntu-touch-session (<< 0.107),
93+ unity8-greeter (<< 7.89),
9494Replaces: ubuntu-touch-session (<< 0.82~),
95+ unity8-greeter (<< 7.89),
9596Description: Unity 8 shell
9697 The Unity 8 shell is the primary user interface for Ubuntu devices.
9798
@@ -102,7 +103,7 @@ Depends: qtdeclarative5-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
102103 qtdeclarative5-unity-notifications-plugin | unity-notifications-impl,
103104 ubuntu-thumbnailer-impl-0,
104105 unity-application-impl-2,
105− unity-notifications-impl-2,
106+ unity-notifications-impl-3,
106107 unity-plugin-scopes | unity-scopes-impl,
107108 unity-scopes-impl-0,
108109 unity8-fake-env | unity-application-impl,
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/unity8-private.install+1−1
@@ -1,5 +1,5 @@
11usr/lib/*/unity8/qml/AccountsService
2−usr/lib/*/unity8/qml/DashViews
2+usr/lib/*/unity8/qml/Dash
33usr/lib/*/unity8/qml/HudClient
44usr/lib/*/unity8/qml/LightDM
55usr/lib/*/unity8/qml/Powerd
debian/unity8.install−1
@@ -1,7 +1,6 @@
11data/unity8.conf usr/share/upstart/sessions/
22usr/bin/unity8
33usr/share/applications/unity8.desktop
4−usr/share/unity8/Bottombar
54usr/share/unity8/Greeter
65usr/share/unity8/Hud
76usr/share/unity8/Launcher
plugins/AccountsService/CMakeLists.txt+1−4
@@ -1,5 +1,3 @@
1−include(Plugins)
2−
31add_definitions(-DSM_BUSNAME=systemBus)
42
53add_library(AccountsService-qml MODULE
@@ -10,8 +8,7 @@ add_library(AccountsService-qml MODULE
108
119qt5_use_modules(AccountsService-qml DBus Qml)
1210
13−export_qmlfiles(AccountsService AccountsService)
14−export_qmlplugin(AccountsService 0.1 AccountsService TARGETS AccountsService-qml)
11+add_unity8_plugin(AccountsService 0.1 AccountsService TARGETS AccountsService-qml)
1512
1613set(POLKIT_LIB_DIR "${CMAKE_INSTALL_LOCALSTATEDIR}/lib/polkit-1")
1714set(POLKIT_DATA_DIR "${CMAKE_INSTALL_PREFIX}/share/polkit-1")
plugins/AccountsService/qmldir+1−1
@@ -1,3 +1,3 @@
11module AccountsService
22plugin AccountsService-qml
3−typeinfo plugin.qmltypes
3+typeinfo AccountsService.qmltypes
plugins/CMakeLists.txt+14−1
@@ -1,7 +1,20 @@
1+include(QmlPlugins)
2+
3+# Set up and install a plugin for unity8.
4+#
5+# add_unity8_plugin(plugin version path
6+# [...] # See export_qmlfiles and export_qmlplugin documentation for more options
7+# )
8+
9+macro(add_unity8_plugin PLUGIN VERSION PATH)
10+ export_qmlfiles(${PLUGIN} ${PATH} DESTINATION ${SHELL_INSTALL_QML} ${ARGN})
11+ export_qmlplugin(${PLUGIN} ${VERSION} ${PATH} DESTINATION ${SHELL_INSTALL_QML} ${ARGN})
12+endmacro()
13+
114add_subdirectory(AccountsService)
215add_subdirectory(HudClient)
316add_subdirectory(LightDM)
4−add_subdirectory(DashViews)
17+add_subdirectory(Dash)
518add_subdirectory(Powerd)
619add_subdirectory(SessionBroadcast)
720add_subdirectory(Ubuntu)
plugins/DashViews/CMakeLists.txt → plugins/Dash/CMakeLists.txtrenamed+4−9
@@ -1,6 +1,3 @@
1−# export_qmlplugin macro
2−include(Plugins)
3−
41# There's no cmake var for v8 include path :-/
52# so create one
63LIST(GET Qt5Core_INCLUDE_DIRS 0 QtCoreDir0)
@@ -30,17 +27,15 @@ set(QMLPLUGIN_SRC
3027 organicgrid.cpp
3128 )
3229
33−add_library(DashViews-qml MODULE
30+add_library(Dash-qml MODULE
3431 ${QMLPLUGIN_SRC}
3532 )
3633
37−target_link_libraries(DashViews-qml
34+target_link_libraries(Dash-qml
3835 ${Qt5Gui_LIBRARIES}
3936 ${Qt5Quick_LIBRARIES}
4037 )
4138
42−qt5_use_modules(DashViews-qml Qml Quick)
39+qt5_use_modules(Dash-qml Qml Quick)
4340
44−# export the qmldir qmltypes and plugin files
45−export_qmlfiles(DashViews DashViews)
46−export_qmlplugin(DashViews 0.1 DashViews TARGETS DashViews-qml)
41+add_unity8_plugin(Dash 0.1 Dash TARGETS Dash-qml)
plugins/Dash/CardCreator.jsnew file+520
@@ -0,0 +1,520 @@
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+.pragma library
18+
19+var kBackgroundLoaderCode = 'Loader {\n\
20+ id: backgroundLoader; \n\
21+ objectName: "backgroundLoader"; \n\
22+ anchors.fill: parent; \n\
23+ asynchronous: root.asynchronous; \n\
24+ visible: status == Loader.Ready; \n\
25+ sourceComponent: UbuntuShape { \n\
26+ objectName: "background"; \n\
27+ radius: "medium"; \n\
28+ color: getColor(0) || "white"; \n\
29+ gradientColor: getColor(1) || color; \n\
30+ anchors.fill: parent; \n\
31+ image: backgroundImage.source ? backgroundImage : null; \n\
32+ property real luminance: 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b; \n\
33+ property Image backgroundImage: Image { \n\
34+ objectName: "backgroundImage"; \n\
35+ source: { \n\
36+ if (cardData && typeof cardData["background"] === "string") return cardData["background"]; \n\
37+ else if (template && typeof template["card-background"] === "string") return template["card-background"]; \n\
38+ else return ""; \n\
39+ } \n\
40+ } \n\
41+ function getColor(index) { \n\
42+ if (cardData && typeof cardData["background"] === "object" \n\
43+ && (cardData["background"]["type"] === "color" || cardData["background"]["type"] === "gradient")) { \n\
44+ return cardData["background"]["elements"][index]; \n\
45+ } else if (template && typeof template["card-background"] === "object" \n\
46+ && (template["card-background"]["type"] === "color" || template["card-background"]["type"] === "gradient")) { \n\
47+ return template["card-background"]["elements"][index]; \n\
48+ } else return undefined; \n\
49+ } \n\
50+ } \n\
51+ }\n';
52+
53+// %1 is used as anchors of artShapeHolder
54+// %2 is used as image width
55+// %3 is used as image height
56+var kArtShapeHolderCode = 'Item { \n\
57+ id: artShapeHolder; \n\
58+ height: root.fixedArtShapeSize.height != -1 ? root.fixedArtShapeSize.height : artShapeLoader.height; \n\
59+ width: root.fixedArtShapeSize.width != -1 ? root.fixedArtShapeSize.width : artShapeLoader.width; \n\
60+ anchors { %1 } \n\
61+ Loader { \n\
62+ id: artShapeLoader; \n\
63+ objectName: "artShapeLoader"; \n\
64+ active: cardData && cardData["art"] || false; \n\
65+ asynchronous: root.asynchronous; \n\
66+ visible: status == Loader.Ready; \n\
67+ sourceComponent: UbuntuShape { \n\
68+ id: artShape; \n\
69+ objectName: "artShape"; \n\
70+ radius: "medium"; \n\
71+ readonly property real aspect: components !== undefined ? components["art"]["aspect-ratio"] : 1; \n\
72+ readonly property bool aspectSmallerThanImageAspect: aspect < image.aspect; \n\
73+ Component.onCompleted: { updateWidthHeightBindings(); if (artShapeBorderSource !== undefined) borderSource = artShapeBorderSource; } \n\
74+ onAspectSmallerThanImageAspectChanged: updateWidthHeightBindings(); \n\
75+ visible: image.status == Image.Ready; \n\
76+ function updateWidthHeightBindings() { \n\
77+ if (aspectSmallerThanImageAspect) { \n\
78+ width = Qt.binding(function() { return !visible ? 0 : image.width }); \n\
79+ height = Qt.binding(function() { return !visible ? 0 : image.fillMode === Image.PreserveAspectCrop ? image.height : width / image.aspect }); \n\
80+ } else { \n\
81+ width = Qt.binding(function() { return !visible ? 0 : image.fillMode === Image.PreserveAspectCrop ? image.width : height * image.aspect }); \n\
82+ height = Qt.binding(function() { return !visible ? 0 : image.height }); \n\
83+ } \n\
84+ } \n\
85+ image: Image { \n\
86+ objectName: "artImage"; \n\
87+ source: cardData && cardData["art"] || ""; \n\
88+ cache: true; \n\
89+ asynchronous: root.asynchronous; \n\
90+ fillMode: components && components["art"]["fill-mode"] === "fit" ? Image.PreserveAspectFit: Image.PreserveAspectCrop; \n\
91+ readonly property real aspect: implicitWidth / implicitHeight; \n\
92+ width: %2; \n\
93+ height: %3; \n\
94+ } \n\
95+ } \n\
96+ } \n\
97+ }\n';
98+
99+var kOverlayLoaderCode = 'Loader { \n\
100+ id: overlayLoader; \n\
101+ anchors { \n\
102+ left: artShapeHolder.left; \n\
103+ right: artShapeHolder.right; \n\
104+ bottom: artShapeHolder.bottom; \n\
105+ } \n\
106+ active: artShapeLoader.active && artShapeLoader.item && artShapeLoader.item.image.status === Image.Ready || false; \n\
107+ asynchronous: root.asynchronous; \n\
108+ visible: showHeader && status == Loader.Ready; \n\
109+ sourceComponent: ShaderEffect { \n\
110+ id: overlay; \n\
111+ height: fixedHeaderHeight != -1 ? fixedHeaderHeight : headerHeight; \n\
112+ opacity: 0.6; \n\
113+ property var source: ShaderEffectSource { \n\
114+ id: shaderSource; \n\
115+ sourceItem: artShapeLoader.item; \n\
116+ onVisibleChanged: if (visible) scheduleUpdate(); \n\
117+ live: false; \n\
118+ sourceRect: Qt.rect(0, artShapeLoader.height - overlay.height, artShapeLoader.width, overlay.height); \n\
119+ } \n\
120+ vertexShader: " \n\
121+ uniform highp mat4 qt_Matrix; \n\
122+ attribute highp vec4 qt_Vertex; \n\
123+ attribute highp vec2 qt_MultiTexCoord0; \n\
124+ varying highp vec2 coord; \n\
125+ void main() { \n\
126+ coord = qt_MultiTexCoord0; \n\
127+ gl_Position = qt_Matrix * qt_Vertex; \n\
128+ }"; \n\
129+ fragmentShader: " \n\
130+ varying highp vec2 coord; \n\
131+ uniform sampler2D source; \n\
132+ uniform lowp float qt_Opacity; \n\
133+ void main() { \n\
134+ lowp vec4 tex = texture2D(source, coord); \n\
135+ gl_FragColor = vec4(0, 0, 0, tex.a) * qt_Opacity; \n\
136+ }"; \n\
137+ } \n\
138+ }\n';
139+
140+// %1 is used as anchors of row
141+// %2 is used as first child of the row
142+// %3 is used as second child of the row
143+var kHeaderRow2Code = 'Row { \n\
144+ id: row; \n\
145+ objectName: "outerRow"; \n\
146+ property real margins: units.gu(1); \n\
147+ spacing: margins; \n\
148+ anchors { %1 } \n\
149+ anchors.right: parent.right; \n\
150+ anchors.margins: margins;\n\
151+ data: [ %2\n\
152+ ,\n\
153+ %3 \n\
154+ ] \n\
155+ }\n';
156+
157+// %1 is used as anchors of row
158+// %2 is used as first child of the row
159+// %3 is used as second child of the row
160+// %4 is used as third child of the row
161+var kHeaderRow3Code = 'Row { \n\
162+ id: row; \n\
163+ objectName: "outerRow"; \n\
164+ property real margins: units.gu(1); \n\
165+ spacing: margins; \n\
166+ anchors { %1 } \n\
167+ anchors.right: parent.right; \n\
168+ anchors.margins: margins;\n\
169+ data: [ %2\n\
170+ ,\n\
171+ %3 \n\
172+ ,\n\
173+ %4 \n\
174+ ] \n\
175+ }\n';
176+
177+// %1 is used as first child of the column
178+// %2 is used as second child of the column
179+var kHeaderColumnCode = 'Column { \n\
180+ anchors.verticalCenter: parent.verticalCenter; \n\
181+ spacing: units.dp(2); \n\
182+ width: parent.width - x;\n\
183+ data: [ %1\n\
184+ ,\n\
185+ %2 \n\
186+ ] \n\
187+ }\n';
188+
189+// %1 is used as anchors of mascotShapeLoader
190+var kMascotShapeLoaderCode = 'Loader { \n\
191+ id: mascotShapeLoader; \n\
192+ objectName: "mascotShapeLoader"; \n\
193+ asynchronous: root.asynchronous; \n\
194+ active: mascotImage.status === Image.Ready; \n\
195+ visible: showHeader && active && status == Loader.Ready; \n\
196+ width: units.gu(6); \n\
197+ height: units.gu(5.625); \n\
198+ sourceComponent: UbuntuShape { image: mascotImage } \n\
199+ anchors { %1 } \n\
200+ }\n';
201+
202+// %1 is used as anchors of mascotImage
203+// %2 is used as visible of mascotImage
204+var kMascotImageCode = 'Image { \n\
205+ id: mascotImage; \n\
206+ objectName: "mascotImage"; \n\
207+ anchors { %1 } \n\
208+ readonly property int maxSize: Math.max(width, height) * 4; \n\
209+ source: cardData && cardData["mascot"]; \n\
210+ width: units.gu(6); \n\
211+ height: units.gu(5.625); \n\
212+ sourceSize { width: maxSize; height: maxSize } \n\
213+ fillMode: Image.PreserveAspectCrop; \n\
214+ horizontalAlignment: Image.AlignHCenter; \n\
215+ verticalAlignment: Image.AlignVCenter; \n\
216+ visible: %2; \n\
217+ }\n';
218+
219+// %1 is used as anchors of titleLabel
220+// %1 is used as color of titleLabel
221+// %3 is used as extra condition for visible of titleLabel
222+var kTitleLabelCode = 'Label { \n\
223+ id: titleLabel; \n\
224+ objectName: "titleLabel"; \n\
225+ anchors { %1 } \n\
226+ elide: Text.ElideRight; \n\
227+ fontSize: "small"; \n\
228+ wrapMode: Text.Wrap; \n\
229+ maximumLineCount: 2; \n\
230+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale); \n\
231+ color: %2; \n\
232+ visible: showHeader %3; \n\
233+ text: root.title; \n\
234+ font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal; \n\
235+ horizontalAlignment: root.headerAlignment; \n\
236+ }\n';
237+
238+// %1 is used as anchors of subtitleLabel
239+// %2 is used as color of subtitleLabel
240+var kSubtitleLabelCode = 'Label { \n\
241+ id: subtitleLabel; \n\
242+ objectName: "subtitleLabel"; \n\
243+ anchors { %1 } \n\
244+ elide: Text.ElideRight; \n\
245+ fontSize: "small"; \n\
246+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale); \n\
247+ color: %2; \n\
248+ visible: titleLabel.visible && titleLabel.text; \n\
249+ text: cardData && cardData["subtitle"] || ""; \n\
250+ font.weight: Font.Light; \n\
251+ horizontalAlignment: root.headerAlignment; \n\
252+ }\n';
253+
254+// %1 is used as top anchor of summary
255+// %2 is used as topMargin anchor of summary
256+// %3 is used as color of summary
257+var kSummaryLabelCode = 'Label { \n\
258+ id: summary; \n\
259+ objectName: "summaryLabel"; \n\
260+ anchors { \n\
261+ top: %1; \n\
262+ left: parent.left; \n\
263+ right: parent.right; \n\
264+ margins: units.gu(1); \n\
265+ topMargin: %2; \n\
266+ } \n\
267+ wrapMode: Text.Wrap; \n\
268+ maximumLineCount: 5; \n\
269+ elide: Text.ElideRight; \n\
270+ text: cardData && cardData["summary"] || ""; \n\
271+ height: text ? implicitHeight : 0; \n\
272+ fontSize: "small"; \n\
273+ color: %3; \n\
274+ }\n';
275+
276+function cardString(template, components) {
277+ var code;
278+ code = 'AbstractButton { \n\
279+ id: root; \n\
280+ property var template; \n\
281+ property var components; \n\
282+ property var cardData; \n\
283+ property var artShapeBorderSource: undefined; \n\
284+ property real fontScale: 1.0; \n\
285+ property int headerAlignment: Text.AlignLeft; \n\
286+ property int fixedHeaderHeight: -1; \n\
287+ property size fixedArtShapeSize: Qt.size(-1, -1); \n\
288+ readonly property string title: cardData && cardData["title"] || ""; \n\
289+ property bool asynchronous: true; \n\
290+ property bool showHeader: true; \n\
291+ implicitWidth: childrenRect.width; \n';
292+
293+ var hasArt = components["art"] && components["art"]["field"] || false;
294+ var hasSummary = components["summary"] || false;
295+ var artAndSummary = hasArt && hasSummary;
296+ var isHorizontal = template["card-layout"] === "horizontal";
297+ var hasBackground = !isHorizontal && (template["card-background"] || components["background"] || artAndSummary);
298+ var hasTitle = components["title"] || false;
299+ var hasMascot = components["mascot"] || false;
300+ var headerAsOverlay = hasArt && template && template["overlay"] === true && (hasTitle || hasMascot);
301+ var hasSubtitle = components["subtitle"] || false;
302+ var hasHeaderRow = hasMascot && hasTitle;
303+
304+ if (hasBackground) {
305+ code += kBackgroundLoaderCode;
306+ }
307+
308+ if (hasArt) {
309+ code += 'onArtShapeBorderSourceChanged: { if (artShapeBorderSource !== undefined && artShapeLoader.item) artShapeLoader.item.borderSource = artShapeBorderSource; } \n';
310+ code += 'readonly property size artShapeSize: artShapeLoader.item ? Qt.size(artShapeLoader.item.width, artShapeLoader.item.height) : Qt.size(-1, -1);\n';
311+
312+ var widthCode, heightCode;
313+ var anchors;
314+ if (isHorizontal) {
315+ anchors = 'left: parent.left';
316+ if (hasMascot || hasTitle) {
317+ widthCode = 'height * artShape.aspect'
318+ heightCode = 'headerHeight';
319+ } else {
320+ // This side of the else is a bit silly, who wants an horizontal layout without mascot and title?
321+ // So we define a "random" height of the image height + 2 gu for the margins
322+ widthCode = 'height * artShape.aspect'
323+ heightCode = 'units.gu(7.625)';
324+ }
325+ } else {
326+ anchors = 'horizontalCenter: parent.horizontalCenter;';
327+ widthCode = 'root.width'
328+ heightCode = 'width / artShape.aspect';
329+ }
330+
331+ code += kArtShapeHolderCode.arg(anchors).arg(widthCode).arg(heightCode);
332+ } else {
333+ code += 'readonly property size artShapeSize: Qt.size(-1, -1);\n'
334+ }
335+
336+ if (headerAsOverlay) {
337+ code += kOverlayLoaderCode;
338+ }
339+
340+ var headerVerticalAnchors;
341+ if (headerAsOverlay) {
342+ headerVerticalAnchors = 'bottom: artShapeHolder.bottom; \n\
343+ bottomMargin: units.gu(1);\n';
344+ } else {
345+ if (hasArt) {
346+ if (isHorizontal) {
347+ headerVerticalAnchors = 'top: artShapeHolder.top; \n\
348+ topMargin: units.gu(1);\n';
349+ } else {
350+ headerVerticalAnchors = 'top: artShapeHolder.bottom; \n\
351+ topMargin: units.gu(1);\n';
352+ }
353+ } else {
354+ headerVerticalAnchors = 'top: parent.top; \n\
355+ topMargin: units.gu(1);\n';
356+ }
357+ }
358+ var headerLeftAnchor;
359+ var headerLeftAnchorHasMagin = false;
360+ if (isHorizontal && hasArt) {
361+ headerLeftAnchor = 'left: artShapeHolder.right; \n\
362+ leftMargin: units.gu(1);\n';
363+ headerLeftAnchorHasMagin = true;
364+ } else {
365+ headerLeftAnchor = 'left: parent.left;\n';
366+ }
367+
368+ if (hasHeaderRow) {
369+ code += 'readonly property int headerHeight: row.height + row.margins * 2;\n'
370+ } else if (hasMascot) {
371+ code += 'readonly property int headerHeight: mascotImage.height + units.gu(1) * 2;\n'
372+ } else if (hasSubtitle) {
373+ code += 'readonly property int headerHeight: titleLabel.height + titleLabel.anchors.topMargin * 2 + subtitleLabel.height + subtitleLabel.anchors.topMargin;\n'
374+ } else if (hasTitle) {
375+ code += 'readonly property int headerHeight: titleLabel.height + titleLabel.anchors.topMargin * 2;\n'
376+ } else {
377+ code += 'readonly property int headerHeight: 0;\n'
378+ }
379+
380+ var mascotShapeCode = "";
381+ var mascotCode = "";
382+ if (hasMascot) {
383+ var useMascotShape = !hasBackground && !headerAsOverlay;
384+ var anchors = "";
385+ if (!hasHeaderRow) {
386+ anchors += headerLeftAnchor;
387+ anchors += headerVerticalAnchors;
388+ if (!headerLeftAnchorHasMagin) {
389+ anchors += 'leftMargin: units.gu(1);\n'
390+ }
391+ } else {
392+ anchors = "verticalCenter: parent.verticalCenter;"
393+ }
394+
395+ if (useMascotShape) {
396+ mascotShapeCode = kMascotShapeLoaderCode.arg(anchors);
397+ }
398+
399+ var mascotImageVisible = useMascotShape ? 'false' : 'showHeader';
400+ mascotCode = kMascotImageCode.arg(anchors).arg(mascotImageVisible);
401+ }
402+
403+ var summaryColorWithBackground = 'backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < 0.7 ? "white" : "grey"';
404+
405+ var titleSubtitleCode = "";
406+ if (hasTitle) {
407+ var color;
408+ if (headerAsOverlay) {
409+ color = '"white"';
410+ } else if (hasSummary) {
411+ color = 'summary.color';
412+ } else if (hasBackground) {
413+ color = summaryColorWithBackground;
414+ } else {
415+ color = '"grey"';
416+ }
417+
418+ var titleAnchors;
419+ var subtitleAnchors;
420+ if (hasMascot && hasSubtitle) {
421+ // Using row + column
422+ titleAnchors = 'left: parent.left; right: parent.right';
423+ subtitleAnchors = titleAnchors;
424+ } else if (hasMascot) {
425+ // Using row + label
426+ titleAnchors = 'verticalCenter: parent.verticalCenter;\n'
427+ } else {
428+ if (headerAsOverlay) {
429+ // Using anchors to the overlay
430+ titleAnchors = 'left: parent.left; \n\
431+ leftMargin: units.gu(1); \n\
432+ right: parent.right; \n\
433+ top: overlayLoader.top; \n\
434+ topMargin: units.gu(1);\n';
435+ } else {
436+ // Using anchors to the mascot/parent
437+ titleAnchors = "right: parent.right;";
438+ titleAnchors += headerLeftAnchor;
439+ titleAnchors += headerVerticalAnchors;
440+ }
441+ subtitleAnchors = 'left: titleLabel.left; \n\
442+ leftMargin: titleLabel.leftMargin; \n\
443+ right: titleLabel.right; \n\
444+ top: titleLabel.bottom; \n\
445+ topMargin: units.dp(2);\n';
446+ }
447+
448+ var titleLabelVisibleExtra = (headerAsOverlay ? '&& overlayLoader.active': '');
449+ var titleCode = kTitleLabelCode.arg(titleAnchors).arg(color).arg(titleLabelVisibleExtra);
450+ var subtitleCode = "";
451+ if (hasSubtitle) {
452+ subtitleCode += kSubtitleLabelCode.arg(subtitleAnchors).arg(color);
453+ }
454+
455+ if (hasMascot && hasSubtitle) {
456+ // If using row + column wrap the code in the column
457+ titleSubtitleCode = kHeaderColumnCode.arg(titleCode).arg(subtitleCode);
458+ } else {
459+ titleSubtitleCode = titleCode + subtitleCode;
460+ }
461+ }
462+
463+ if (hasHeaderRow) {
464+ if (mascotShapeCode != "") {
465+ code += kHeaderRow3Code.arg(headerVerticalAnchors + headerLeftAnchor).arg(mascotShapeCode).arg(mascotCode).arg(titleSubtitleCode);
466+ } else {
467+ code += kHeaderRow2Code.arg(headerVerticalAnchors + headerLeftAnchor).arg(mascotCode).arg(titleSubtitleCode);
468+ }
469+ } else {
470+ code += mascotShapeCode + mascotCode + titleSubtitleCode;
471+ }
472+
473+ if (hasSummary) {
474+ var summaryTopAnchor;
475+ if (isHorizontal && hasArt) summaryTopAnchor = "artShapeHolder.bottom";
476+ else if (headerAsOverlay && hasArt) summaryTopAnchor = "artShapeHolder.bottom";
477+ else if (hasHeaderRow) summaryTopAnchor = "row.bottom";
478+ else if (hasMascot) summaryTopAnchor = "mascotImage.bottom";
479+ else if (hasSubtitle) summaryTopAnchor = "subtitleLabel.bottom";
480+ else if (hasTitle) summaryTopAnchor = "titleLabel.bottom";
481+ else if (hasArt) summaryTopAnchor = "artShapeHolder.bottom";
482+ else summaryTopAnchor = "parent.top";
483+
484+ var color;
485+ if (hasBackground) {
486+ color = summaryColorWithBackground;
487+ } else {
488+ color = '"grey"';
489+ }
490+
491+ var summaryTopMargin = (hasMascot || hasSubtitle ? 'anchors.margins' : '0');
492+
493+ code += kSummaryLabelCode.arg(summaryTopAnchor).arg(summaryTopMargin).arg(color);
494+ }
495+
496+ if (hasSummary) {
497+ code += 'implicitHeight: summary.y + summary.height + (summary.text ? units.gu(1) : 0);\n';
498+ } else if (hasHeaderRow) {
499+ code += 'implicitHeight: row.y + row.height + units.gu(1);\n';
500+ } else if (hasMascot) {
501+ code += 'implicitHeight: mascotImage.y + mascotImage.height;\n';
502+ } else if (hasSubtitle) {
503+ code += 'implicitHeight: subtitleLabel.y + subtitleLabel.height + units.gu(1);\n';
504+ } else if (hasTitle) {
505+ code += 'implicitHeight: titleLabel.y + titleLabel.height + units.gu(1);\n';
506+ }
507+ // Close the AbstractButton
508+ code += '}\n';
509+
510+ return code;
511+}
512+
513+function createCardComponent(parent, template, components) {
514+ var imports = 'import QtQuick 2.2; \n\
515+ import Ubuntu.Components 0.1; \n\
516+ import Ubuntu.Thumbnailer 0.1;\n';
517+ var card = cardString(template, components);
518+ var code = imports + 'Component {\n' + card + '}\n';
519+ return Qt.createQmlObject(code, parent, "createCardComponent");
520+}
plugins/Dash/CardCreatorCache.qmlnew file+40
@@ -0,0 +1,40 @@
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+pragma Singleton
18+import QtQuick 2.2
19+import "CardCreator.js" as CardCreator
20+
21+QtObject {
22+ id: root
23+
24+ property var cache: new Object();
25+
26+ function getCardComponent(template, components) {
27+ if (template === undefined || components === undefined)
28+ return undefined;
29+
30+ var tString = JSON.stringify(template);
31+ var cString = JSON.stringify(components);
32+ var allString = tString + cString;
33+ var component = cache[allString];
34+ if (component === undefined) {
35+ component = CardCreator.createCardComponent(root, template, components);
36+ cache[allString] = component;
37+ }
38+ return component;
39+ }
40+}
plugins/DashViews/abstractdashview.cpp → plugins/Dash/abstractdashview.cpprenamed+21−82
@@ -23,10 +23,8 @@ AbstractDashView::AbstractDashView()
2323 , m_asyncRequestedIndex(-1)
2424 , m_columnSpacing(0)
2525 , m_rowSpacing(0)
26− , m_delegateCreationBegin(0)
27− , m_delegateCreationEnd(0)
28− , m_delegateCreationBeginValid(false)
29− , m_delegateCreationEndValid(false)
26+ , m_displayMarginBeginning(0)
27+ , m_displayMarginEnd(0)
3028 , m_needsRelayout(false)
3129 , m_delegateValidated(false)
3230 , m_implicitHeightDirty(false)
@@ -46,17 +44,10 @@ void AbstractDashView::setModel(QAbstractItemModel *model)
4644 if (!m_delegateModel) {
4745 createDelegateModel();
4846 } 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
5547 disconnect(m_delegateModel, SIGNAL(modelUpdated(QQmlChangeSet,bool)), this, SLOT(onModelUpdated(QQmlChangeSet,bool)));
5648 }
5749 m_delegateModel->setModel(QVariant::fromValue<QAbstractItemModel *>(model));
5850 connect(m_delegateModel, SIGNAL(modelUpdated(QQmlChangeSet,bool)), this, SLOT(onModelUpdated(QQmlChangeSet,bool)));
59−#endif
6051
6152 cleanupExistingItems();
6253
@@ -121,73 +112,42 @@ void AbstractDashView::setRowSpacing(qreal rowSpacing)
121112 }
122113}
123114
124−qreal AbstractDashView::delegateCreationBegin() const
125−{
126− return m_delegateCreationBegin;
127−}
128−
129−void AbstractDashView::setDelegateCreationBegin(qreal begin)
115+qreal AbstractDashView::displayMarginBeginning() const
130116{
131− m_delegateCreationBeginValid = true;
132− if (m_delegateCreationBegin == begin)
133− return;
134− m_delegateCreationBegin = begin;
135− if (isComponentComplete()) {
136− polish();
137− }
138− emit delegateCreationBeginChanged();
117+ return m_displayMarginBeginning;
139118}
140119
141−void AbstractDashView::resetDelegateCreationBegin()
120+void AbstractDashView::setDisplayMarginBeginning(qreal begin)
142121{
143− m_delegateCreationBeginValid = false;
144− if (m_delegateCreationBegin == 0)
122+ if (m_displayMarginBeginning == begin)
145123 return;
146− m_delegateCreationBegin = 0;
124+ m_displayMarginBeginning = begin;
147125 if (isComponentComplete()) {
148126 polish();
149127 }
150− emit delegateCreationBeginChanged();
128+ emit displayMarginBeginningChanged();
151129}
152130
153−qreal AbstractDashView::delegateCreationEnd() const
131+qreal AbstractDashView::displayMarginEnd() const
154132{
155− return m_delegateCreationEnd;
133+ return m_displayMarginEnd;
156134}
157135
158−void AbstractDashView::setDelegateCreationEnd(qreal end)
136+void AbstractDashView::setDisplayMarginEnd(qreal end)
159137{
160− m_delegateCreationEndValid = true;
161− if (m_delegateCreationEnd == end)
138+ if (m_displayMarginEnd == end)
162139 return;
163− m_delegateCreationEnd = end;
140+ m_displayMarginEnd = end;
164141 if (isComponentComplete()) {
165142 polish();
166143 }
167− emit delegateCreationEndChanged();
168−}
169−
170−void AbstractDashView::resetDelegateCreationEnd()
171−{
172− m_delegateCreationEndValid = false;
173− if (m_delegateCreationEnd == 0)
174− return;
175− m_delegateCreationEnd = 0;
176− if (isComponentComplete()) {
177− polish();
178− }
179− emit delegateCreationEndChanged();
144+ emit displayMarginEndChanged();
180145}
181146
182147void AbstractDashView::createDelegateModel()
183148{
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
188149 m_delegateModel = new QQmlDelegateModel(qmlContext(this), this);
189150 connect(m_delegateModel, SIGNAL(createdItem(int,QObject*)), this, SLOT(itemCreated(int,QObject*)));
190−#endif
191151 if (isComponentComplete())
192152 m_delegateModel->componentComplete();
193153}
@@ -198,9 +158,8 @@ void AbstractDashView::refill()
198158 return;
199159 }
200160
201− const bool delegateRangesValid = m_delegateCreationBeginValid && m_delegateCreationEndValid;
202− const qreal from = delegateRangesValid ? m_delegateCreationBegin : 0;
203− const qreal to = delegateRangesValid ? m_delegateCreationEnd : from + height();
161+ const qreal from = -m_displayMarginBeginning;
162+ const qreal to = height() + m_displayMarginEnd;
204163 const qreal buffer = (to - from) * bufferRatio;
205164 const qreal bufferFrom = from - buffer;
206165 const qreal bufferTo = to + buffer;
@@ -217,6 +176,9 @@ void AbstractDashView::refill()
217176
218177bool AbstractDashView::addVisibleItems(qreal fillFromY, qreal fillToY, bool asynchronous)
219178{
179+ if (fillToY <= fillFromY)
180+ return false;
181+
220182 if (!delegate())
221183 return false;
222184
@@ -253,16 +215,9 @@ QQuickItem *AbstractDashView::createItem(int modelIndex, bool asynchronous)
253215 return nullptr;
254216
255217 m_asyncRequestedIndex = -1;
256−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
257− QQuickItem *item = m_delegateModel->item(modelIndex, asynchronous);
258−#else
259218 QObject* object = m_delegateModel->object(modelIndex, asynchronous);
260219 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
261−#endif
262220 if (!item) {
263−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
264− m_asyncRequestedIndex = modelIndex;
265−#else
266221 if (object) {
267222 m_delegateModel->release(object);
268223 if (!m_delegateValidated) {
@@ -273,7 +228,6 @@ QQuickItem *AbstractDashView::createItem(int modelIndex, bool asynchronous)
273228 } else {
274229 m_asyncRequestedIndex = modelIndex;
275230 }
276−#endif
277231 return nullptr;
278232 } else {
279233 addItemToView(modelIndex, item);
@@ -283,13 +237,8 @@ QQuickItem *AbstractDashView::createItem(int modelIndex, bool asynchronous)
283237
284238void AbstractDashView::releaseItem(QQuickItem *item)
285239{
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
290240 QQmlDelegateModel::ReleaseFlags flags = m_delegateModel->release(item);
291241 if (flags & QQmlDelegateModel::Destroyed) {
292−#endif
293242 item->setParentItem(nullptr);
294243 }
295244}
@@ -299,10 +248,6 @@ void AbstractDashView::setImplicitHeightDirty()
299248 m_implicitHeightDirty = true;
300249}
301250
302−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
303−void AbstractDashView::itemCreated(int modelIndex, QQuickItem *item)
304−{
305−#else
306251void AbstractDashView::itemCreated(int modelIndex, QObject *object)
307252{
308253 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
@@ -310,7 +255,6 @@ void AbstractDashView::itemCreated(int modelIndex, QObject *object)
310255 qWarning() << "AbstractDashView::itemCreated got a non item for index" << modelIndex;
311256 return;
312257 }
313−#endif
314258 item->setParentItem(this);
315259
316260 // We only need to call createItem if we are here because of an asynchronous generation
@@ -325,11 +269,7 @@ void AbstractDashView::itemCreated(int modelIndex, QObject *object)
325269 }
326270}
327271
328−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
329−void AbstractDashView::onModelUpdated(const QQuickChangeSet &changeSet, bool reset)
330−#else
331272void AbstractDashView::onModelUpdated(const QQmlChangeSet &changeSet, bool reset)
332−#endif
333273{
334274 if (reset) {
335275 cleanupExistingItems();
@@ -364,9 +304,8 @@ void AbstractDashView::updatePolish()
364304
365305 refill();
366306
367− const bool delegateRangesValid = m_delegateCreationBeginValid && m_delegateCreationEndValid;
368− const qreal from = delegateRangesValid ? m_delegateCreationBegin : 0;
369− const qreal to = delegateRangesValid ? m_delegateCreationEnd : from + height();
307+ const qreal from = -m_displayMarginBeginning;
308+ const qreal to = height() + m_displayMarginEnd;
370309 updateItemCulling(from, to);
371310
372311 if (m_implicitHeightDirty) {
plugins/DashViews/abstractdashview.h → plugins/Dash/abstractdashview.hrenamed+14−37
@@ -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
@@ -39,14 +35,12 @@ class AbstractDashView : public QQuickItem
3935 Q_PROPERTY(QQmlComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
4036 Q_PROPERTY(qreal columnSpacing READ columnSpacing WRITE setColumnSpacing NOTIFY columnSpacingChanged)
4137 Q_PROPERTY(qreal rowSpacing READ rowSpacing WRITE setRowSpacing NOTIFY rowSpacingChanged)
42− Q_PROPERTY(qreal delegateCreationBegin READ delegateCreationBegin
43− WRITE setDelegateCreationBegin
44− NOTIFY delegateCreationBeginChanged
45− RESET resetDelegateCreationBegin)
46− Q_PROPERTY(qreal delegateCreationEnd READ delegateCreationEnd
47− WRITE setDelegateCreationEnd
48− NOTIFY delegateCreationEndChanged
49− RESET resetDelegateCreationEnd)
38+ Q_PROPERTY(qreal displayMarginBeginning READ displayMarginBeginning
39+ WRITE setDisplayMarginBeginning
40+ NOTIFY displayMarginBeginningChanged)
41+ Q_PROPERTY(qreal displayMarginEnd READ displayMarginEnd
42+ WRITE setDisplayMarginEnd
43+ NOTIFY displayMarginEndChanged)
5044
5145friend class VerticalJournalTest;
5246friend class HorizontalJournalTest;
@@ -67,21 +61,19 @@ public:
6761 qreal rowSpacing() const;
6862 void setRowSpacing(qreal rowSpacing);
6963
70− qreal delegateCreationBegin() const;
71− void setDelegateCreationBegin(qreal);
72− void resetDelegateCreationBegin();
64+ qreal displayMarginBeginning() const;
65+ void setDisplayMarginBeginning(qreal);
7366
74− qreal delegateCreationEnd() const;
75− void setDelegateCreationEnd(qreal);
76− void resetDelegateCreationEnd();
67+ qreal displayMarginEnd() const;
68+ void setDisplayMarginEnd(qreal);
7769
7870Q_SIGNALS:
7971 void modelChanged();
8072 void delegateChanged();
8173 void columnSpacingChanged();
8274 void rowSpacingChanged();
83− void delegateCreationBeginChanged();
84− void delegateCreationEndChanged();
75+ void displayMarginBeginningChanged();
76+ void displayMarginEndChanged();
8577
8678protected Q_SLOTS:
8779 void relayout();
@@ -94,13 +86,8 @@ protected:
9486 void setImplicitHeightDirty();
9587
9688private 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
10189 void itemCreated(int modelIndex, QObject *object);
10290 void onModelUpdated(const QQmlChangeSet &changeSet, bool reset);
103−#endif
10491 void onHeightChanged();
10592
10693private:
@@ -117,27 +104,17 @@ private:
117104 virtual void doRelayout() = 0;
118105 virtual void updateItemCulling(qreal visibleFromY, qreal visibleToY) = 0;
119106 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
123107 virtual void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) = 0;
124−#endif
125108
126−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
127− QQuickVisualDataModel *m_delegateModel;
128−#else
129109 QQmlDelegateModel *m_delegateModel;
130−#endif
131110
132111 // Index we are waiting because we requested it asynchronously
133112 int m_asyncRequestedIndex;
134113
135114 int m_columnSpacing;
136115 int m_rowSpacing;
137− qreal m_delegateCreationBegin;
138− qreal m_delegateCreationEnd;
139− bool m_delegateCreationBeginValid;
140− bool m_delegateCreationEndValid;
116+ qreal m_displayMarginBeginning;
117+ qreal m_displayMarginEnd;
141118 bool m_needsRelayout;
142119 bool m_delegateValidated;
143120 bool m_implicitHeightDirty;
plugins/DashViews/horizontaljournal.cpp → plugins/Dash/horizontaljournal.cpprenamed−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 → plugins/Dash/horizontaljournal.hrenamed−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 → plugins/Dash/listviewwithpageheader.cpprenamed+39−78
@@ -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>
@@ -142,6 +138,13 @@ void ListViewWithPageHeader::ListItem::setCulled(bool culled)
142138 QQuickItemPrivate::get(m_sectionItem)->setCulled(culled);
143139}
144140
141+void ListViewWithPageHeader::ListItem::setSectionItem(QQuickItem *sectionItem)
142+{
143+ m_sectionItem = sectionItem;
144+ QQmlContext *context = QQmlEngine::contextForObject(m_item)->parentContext();
145+ context->setContextProperty(QLatin1String("hasSectionHeader"), QVariant::fromValue<bool>(sectionItem != nullptr));
146+}
147+
145148ListViewWithPageHeader::ListViewWithPageHeader()
146149 : m_delegateModel(nullptr)
147150 , m_asyncRequestedIndex(-1)
@@ -191,17 +194,10 @@ void ListViewWithPageHeader::setModel(QAbstractItemModel *model)
191194 if (!m_delegateModel) {
192195 createDelegateModel();
193196 } 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
200197 disconnect(m_delegateModel, SIGNAL(modelUpdated(QQmlChangeSet,bool)), this, SLOT(onModelUpdated(QQmlChangeSet,bool)));
201198 }
202199 m_delegateModel->setModel(QVariant::fromValue<QAbstractItemModel *>(model));
203200 connect(m_delegateModel, SIGNAL(modelUpdated(QQmlChangeSet,bool)), this, SLOT(onModelUpdated(QQmlChangeSet,bool)));
204−#endif
205201 Q_EMIT modelChanged();
206202 polish();
207203 // TODO?
@@ -433,7 +429,7 @@ bool ListViewWithPageHeader::maximizeVisibleArea(int modelIndex, int itemHeight)
433429
434430 ListItem *listItem = itemAtIndex(modelIndex);
435431 if (listItem) {
436− return maximizeVisibleArea(listItem, itemHeight + (listItem->m_sectionItem ? listItem->m_sectionItem->height() : 0));
432+ return maximizeVisibleArea(listItem, itemHeight + (listItem->sectionItem() ? listItem->sectionItem()->height() : 0));
437433 }
438434
439435 return false;
@@ -451,7 +447,7 @@ bool ListViewWithPageHeader::maximizeVisibleArea(ListItem *listItem, int listIte
451447 contentYAnimationType = ContentYAnimationMaximizeVisibleArea;
452448 m_contentYAnimation->start();
453449 } else if ((listItemY < contentY() && listItemY + listItemHeight < contentY() + height()) ||
454− (m_topSectionItem && !listItem->m_sectionItem && listItemY - m_topSectionItem->height() < contentY() && listItemY + listItemHeight < contentY() + height()))
450+ (m_topSectionItem && !listItem->sectionItem() && listItemY - m_topSectionItem->height() < contentY() && listItemY + listItemHeight < contentY() + height()))
455451 {
456452 // we can scroll the list down to show more stuff
457453 auto realVisibleListItemY = listItemY;
@@ -460,7 +456,7 @@ bool ListViewWithPageHeader::maximizeVisibleArea(ListItem *listItem, int listIte
460456 // item we have to make sure to scroll it a bit more so that it is not underlapping
461457 // the top section sticky item
462458 bool topSectionShown = !QQuickItemPrivate::get(m_topSectionItem)->culled;
463− if (topSectionShown && !listItem->m_sectionItem) {
459+ if (topSectionShown && !listItem->sectionItem()) {
464460 realVisibleListItemY -= m_topSectionItem->height();
465461 }
466462 }
@@ -570,13 +566,8 @@ void ListViewWithPageHeader::viewportMoved(Qt::Orientations orient)
570566
571567void ListViewWithPageHeader::createDelegateModel()
572568{
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
577569 m_delegateModel = new QQmlDelegateModel(qmlContext(this), this);
578570 connect(m_delegateModel, SIGNAL(createdItem(int,QObject*)), this, SLOT(itemCreated(int,QObject*)));
579−#endif
580571 if (isComponentComplete())
581572 m_delegateModel->componentComplete();
582573 updateWatchedRoles();
@@ -657,16 +648,11 @@ bool ListViewWithPageHeader::addVisibleItems(qreal fillFrom, qreal fillTo, bool
657648void ListViewWithPageHeader::reallyReleaseItem(ListItem *listItem)
658649{
659650 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
664651 QQmlDelegateModel::ReleaseFlags flags = m_delegateModel->release(item);
665652 if (flags & QQmlDelegateModel::Destroyed) {
666−#endif
667653 item->setParentItem(nullptr);
668654 }
669− delete listItem->m_sectionItem;
655+ delete listItem->sectionItem();
670656 delete listItem;
671657}
672658
@@ -693,6 +679,9 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(int modelIndex, bool alreadyI
693679 return nullptr;
694680
695681 const QString section = m_delegateModel->stringValue(modelIndex, m_sectionProperty);
682+ if (section.isEmpty())
683+ return nullptr;
684+
696685 if (modelIndex > 0) {
697686 const QString prevSection = m_delegateModel->stringValue(modelIndex - 1, m_sectionProperty);
698687 if (section == prevSection)
@@ -705,8 +694,8 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(int modelIndex, bool alreadyI
705694 // Steal the section header
706695 ListItem *nextItem = itemAtIndex(modelIndex); // Not +1 since not yet inserted into m_visibleItems
707696 if (nextItem) {
708− QQuickItem *sectionItem = nextItem->m_sectionItem;
709− nextItem->m_sectionItem = nullptr;
697+ QQuickItem *sectionItem = nextItem->sectionItem();
698+ nextItem->setSectionItem(nullptr);
710699 return sectionItem;
711700 }
712701 }
@@ -796,16 +785,9 @@ ListViewWithPageHeader::ListItem *ListViewWithPageHeader::createItem(int modelIn
796785 return nullptr;
797786
798787 m_asyncRequestedIndex = -1;
799−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
800− QQuickItem *item = m_delegateModel->item(modelIndex, asynchronous);
801−#else
802788 QObject* object = m_delegateModel->object(modelIndex, asynchronous);
803789 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
804−#endif
805790 if (!item) {
806−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
807− m_asyncRequestedIndex = modelIndex;
808−#else
809791 if (object) {
810792 m_delegateModel->release(object);
811793 if (!m_delegateValidated) {
@@ -816,13 +798,12 @@ ListViewWithPageHeader::ListItem *ListViewWithPageHeader::createItem(int modelIn
816798 } else {
817799 m_asyncRequestedIndex = modelIndex;
818800 }
819−#endif
820801 return 0;
821802 } else {
822803// qDebug() << "ListViewWithPageHeader::createItem::We have the item" << modelIndex << item;
823804 ListItem *listItem = new ListItem;
824805 listItem->m_item = item;
825− listItem->m_sectionItem = getSectionItem(modelIndex, false /*Not yet inserted into m_visibleItems*/);
806+ listItem->setSectionItem(getSectionItem(modelIndex, false /*Not yet inserted into m_visibleItems*/));
826807 QQuickItemPrivate::get(item)->addItemChangeListener(this, QQuickItemPrivate::Geometry);
827808 ListItem *prevItem = itemAtIndex(modelIndex - 1);
828809 bool lostItem = false; // Is an item that we requested async but because of model changes
@@ -861,8 +842,8 @@ ListViewWithPageHeader::ListItem *ListViewWithPageHeader::createItem(int modelIn
861842 m_firstVisibleIndex = modelIndex;
862843 polish();
863844 }
864− if (listItem->m_sectionItem) {
865− QQmlContext *context = QQmlEngine::contextForObject(listItem->m_sectionItem)->parentContext();
845+ if (listItem->sectionItem()) {
846+ QQmlContext *context = QQmlEngine::contextForObject(listItem->sectionItem())->parentContext();
866847 context->setContextProperty(QLatin1String("delegateIndex"), modelIndex);
867848 }
868849 adjustMinYExtent();
@@ -872,10 +853,6 @@ ListViewWithPageHeader::ListItem *ListViewWithPageHeader::createItem(int modelIn
872853 }
873854}
874855
875−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
876−void ListViewWithPageHeader::itemCreated(int modelIndex, QQuickItem *item)
877−{
878−#else
879856void ListViewWithPageHeader::itemCreated(int modelIndex, QObject *object)
880857{
881858 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
@@ -883,7 +860,6 @@ void ListViewWithPageHeader::itemCreated(int modelIndex, QObject *object)
883860 qWarning() << "ListViewWithPageHeader::itemCreated got a non item for index" << modelIndex;
884861 return;
885862 }
886−#endif
887863// qDebug() << "ListViewWithPageHeader::itemCreated" << modelIndex << item;
888864 // Check we are not being taken down and don't paint anything
889865 // TODO Check if we still need this in 5.2
@@ -895,6 +871,7 @@ void ListViewWithPageHeader::itemCreated(int modelIndex, QObject *object)
895871 QQmlContext *context = QQmlEngine::contextForObject(item)->parentContext();
896872 context->setContextProperty(QLatin1String("ListViewWithPageHeader"), this);
897873 context->setContextProperty(QLatin1String("heightToClip"), QVariant::fromValue<int>(0));
874+ context->setContextProperty(QLatin1String("hasSectionHeader"), QVariant::fromValue<bool>(false));
898875 if (modelIndex == m_asyncRequestedIndex) {
899876 createItem(modelIndex, false);
900877 refill();
@@ -924,21 +901,13 @@ void ListViewWithPageHeader::onHeightChanged()
924901}
925902
926903
927−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
928−void ListViewWithPageHeader::onModelUpdated(const QQuickChangeSet &changeSet, bool /*reset*/)
929−#else
930904void ListViewWithPageHeader::onModelUpdated(const QQmlChangeSet &changeSet, bool /*reset*/)
931−#endif
932905{
933906 // TODO Do something with reset
934907// qDebug() << "ListViewWithPageHeader::onModelUpdated" << changeSet << reset;
935908 const auto oldFirstVisibleIndex = m_firstVisibleIndex;
936909
937−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
938− Q_FOREACH(const QQuickChangeSet::Remove &remove, changeSet.removes()) {
939−#else
940910 Q_FOREACH(const QQmlChangeSet::Remove &remove, changeSet.removes()) {
941−#endif
942911// qDebug() << "ListViewWithPageHeader::onModelUpdated Remove" << remove.index << remove.count;
943912 if (remove.index + remove.count > m_firstVisibleIndex && remove.index < m_firstVisibleIndex + m_visibleItems.count()) {
944913 const qreal oldFirstValidIndexPos = m_visibleItems.first()->y();
@@ -957,11 +926,11 @@ void ListViewWithPageHeader::onModelUpdated(const QQmlChangeSet &changeSet, bool
957926 if (visibleIndex >= 0 && visibleIndex < m_visibleItems.count()) {
958927 ListItem *item = m_visibleItems[visibleIndex];
959928 // Pass the section item down if needed
960− if (item->m_sectionItem && visibleIndex + 1 < m_visibleItems.count()) {
929+ if (item->sectionItem() && visibleIndex + 1 < m_visibleItems.count()) {
961930 ListItem *nextItem = m_visibleItems[visibleIndex + 1];
962− if (!nextItem->m_sectionItem) {
963− nextItem->m_sectionItem = item->m_sectionItem;
964− item->m_sectionItem = nullptr;
931+ if (!nextItem->sectionItem()) {
932+ nextItem->setSectionItem(item->sectionItem());
933+ item->setSectionItem(nullptr);
965934 }
966935 }
967936 releaseItem(item);
@@ -992,11 +961,7 @@ void ListViewWithPageHeader::onModelUpdated(const QQmlChangeSet &changeSet, bool
992961 }
993962 }
994963
995−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
996− Q_FOREACH(const QQuickChangeSet::Insert &insert, changeSet.inserts()) {
997−#else
998964 Q_FOREACH(const QQmlChangeSet::Insert &insert, changeSet.inserts()) {
999−#endif
1000965// qDebug() << "ListViewWithPageHeader::onModelUpdated Insert" << insert.index << insert.count;
1001966 const bool insertingInValidIndexes = insert.index > m_firstVisibleIndex && insert.index < m_firstVisibleIndex + m_visibleItems.count();
1002967 const bool firstItemWithViewOnTop = insert.index == 0 && m_firstVisibleIndex == 0 && m_visibleItems.first()->y() + m_clipItem->y() > contentY();
@@ -1028,11 +993,11 @@ void ListViewWithPageHeader::onModelUpdated(const QQmlChangeSet &changeSet, bool
1028993 // if we need adding a new section item
1029994 if (m_sectionDelegate) {
1030995 ListItem *nextItem = itemAtIndex(modelIndex + 1);
1031− if (nextItem && !nextItem->m_sectionItem) {
1032− nextItem->m_sectionItem = getSectionItem(modelIndex + 1, true /* alredy inserted into m_visibleItems*/);
1033− if (growUp && nextItem->m_sectionItem) {
996+ if (nextItem && !nextItem->sectionItem()) {
997+ nextItem->setSectionItem(getSectionItem(modelIndex + 1, true /* alredy inserted into m_visibleItems*/));
998+ if (growUp && nextItem->sectionItem()) {
1034999 ListItem *firstItem = m_visibleItems.first();
1035− firstItem->setY(firstItem->y() - nextItem->m_sectionItem->height());
1000+ firstItem->setY(firstItem->y() - nextItem->sectionItem()->height());
10361001 }
10371002 }
10381003 }
@@ -1054,16 +1019,12 @@ void ListViewWithPageHeader::onModelUpdated(const QQmlChangeSet &changeSet, bool
10541019 }
10551020 }
10561021
1057−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
1058− Q_FOREACH(const QQuickChangeSet::Change &change, changeSet.changes()) {
1059−#else
10601022 Q_FOREACH(const QQmlChangeSet::Change &change, changeSet.changes()) {
1061−#endif
10621023// qDebug() << "ListViewWithPageHeader::onModelUpdated Change" << change.index << change.count;
10631024 for (int i = change.index; i < change.count; ++i) {
10641025 ListItem *item = itemAtIndex(i);
1065− if (item && item->m_sectionItem) {
1066− QQmlContext *context = QQmlEngine::contextForObject(item->m_sectionItem)->parentContext();
1026+ if (item && item->sectionItem()) {
1027+ QQmlContext *context = QQmlEngine::contextForObject(item->sectionItem())->parentContext();
10671028 const QString sectionText = m_delegateModel->stringValue(i, m_sectionProperty);
10681029 context->setContextProperty(QLatin1String("section"), sectionText);
10691030 }
@@ -1076,8 +1037,8 @@ void ListViewWithPageHeader::onModelUpdated(const QQmlChangeSet &changeSet, bool
10761037
10771038 for (int i = 0; i < m_visibleItems.count(); ++i) {
10781039 ListItem *item = m_visibleItems[i];
1079− if (item->m_sectionItem) {
1080− QQmlContext *context = QQmlEngine::contextForObject(item->m_sectionItem)->parentContext();
1040+ if (item->sectionItem()) {
1041+ QQmlContext *context = QQmlEngine::contextForObject(item->sectionItem())->parentContext();
10811042 context->setContextProperty(QLatin1String("delegateIndex"), m_firstVisibleIndex + i);
10821043 }
10831044 }
@@ -1206,18 +1167,18 @@ void ListViewWithPageHeader::layout()
12061167 if (topSectionStickPos > pos) {
12071168 showStickySectionItem = true;
12081169 } else if (topSectionStickPos == pos) {
1209− showStickySectionItem = !item->m_sectionItem;
1170+ showStickySectionItem = !item->sectionItem();
12101171 } else {
12111172 showStickySectionItem = false;
12121173 }
12131174 if (!showStickySectionItem) {
12141175 QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
1215− if (item->m_sectionItem) {
1176+ if (item->sectionItem()) {
12161177 // This seems it should happen since why would we cull the top section
12171178 // if the first visible item has no section header? This only happens briefly
12181179 // when increasing the height of a list that is at the bottom, the m_topSectionItem
12191180 // gets shown shortly in the next polish call
1220− QQuickItemPrivate::get(item->m_sectionItem)->setCulled(false);
1181+ QQuickItemPrivate::get(item->sectionItem())->setCulled(false);
12211182 }
12221183 } else {
12231184 // Update the top sticky section header
@@ -1236,14 +1197,14 @@ void ListViewWithPageHeader::layout()
12361197 delegateIndex--;
12371198 }
12381199 context->setContextProperty(QLatin1String("delegateIndex"), delegateIndex);
1239− if (item->m_sectionItem) {
1240− QQuickItemPrivate::get(item->m_sectionItem)->setCulled(true);
1200+ if (item->sectionItem()) {
1201+ QQuickItemPrivate::get(item->sectionItem())->setCulled(true);
12411202 }
12421203 }
12431204 }
12441205 }
12451206 QQmlContext *context = QQmlEngine::contextForObject(item->m_item)->parentContext();
1246− const qreal clipFrom = visibleFrom + (!item->m_sectionItem && m_topSectionItem && !QQuickItemPrivate::get(m_topSectionItem)->culled ? m_topSectionItem->height() : 0);
1207+ const qreal clipFrom = visibleFrom + (!item->sectionItem() && m_topSectionItem && !QQuickItemPrivate::get(m_topSectionItem)->culled ? m_topSectionItem->height() : 0);
12471208 if (!cull && pos < clipFrom) {
12481209 context->setContextProperty(QLatin1String("heightToClip"), clipFrom - pos);
12491210 } else {
@@ -1260,7 +1221,7 @@ void ListViewWithPageHeader::layout()
12601221 if (firstReallyVisibleItem >= 0) {
12611222 for (int i = firstReallyVisibleItem - m_firstVisibleIndex + 1; i < m_visibleItems.count(); ++i) {
12621223 ListItem *item = m_visibleItems[i];
1263− if (item->m_sectionItem) {
1224+ if (item->sectionItem()) {
12641225 if (m_topSectionItem->y() + m_topSectionItem->height() > item->y()) {
12651226 m_topSectionItem->setY(item->y() - m_topSectionItem->height());
12661227 }
plugins/DashViews/listviewwithpageheader.h → plugins/Dash/listviewwithpageheader.hrenamed+9−25
@@ -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/**
@@ -110,26 +102,18 @@ Q_SIGNALS:
110102 void stickyHeaderHeightChanged();
111103
112104protected:
113− void componentComplete();
114− void viewportMoved(Qt::Orientations orient);
115− qreal minYExtent() const;
116− void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry);
117− void updatePolish();
105+ void componentComplete() override;
106+ void viewportMoved(Qt::Orientations orient) override;
107+ qreal minYExtent() const override;
108+ void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) override;
109+ void updatePolish() override;
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:
@@ -144,7 +128,11 @@ private:
144128 bool culled() const;
145129 void setCulled(bool culled);
146130
131+ QQuickItem *sectionItem() const { return m_sectionItem; }
132+ void setSectionItem(QQuickItem *sectionItem);
133+
147134 QQuickItem *m_item;
135+ private:
148136 QQuickItem *m_sectionItem;
149137 };
150138
@@ -168,11 +156,7 @@ private:
168156 QQuickItem *getSectionItem(int modelIndex, bool alreadyInserted);
169157 QQuickItem *getSectionItem(const QString &sectionText);
170158
171−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
172− QQuickVisualDataModel *m_delegateModel;
173−#else
174159 QQmlDelegateModel *m_delegateModel;
175−#endif
176160
177161 // Index we are waiting because we requested it asynchronously
178162 int m_asyncRequestedIndex;
plugins/DashViews/organicgrid.cpp → plugins/Dash/organicgrid.cpprenamed−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 → plugins/Dash/organicgrid.hrenamed−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/plugin.cpp → plugins/Dash/plugin.cpprenamed+2−2
@@ -24,9 +24,9 @@
2424
2525#include <QAbstractItemModel>
2626
27−void DashViewsPlugin::registerTypes(const char *uri)
27+void DashPlugin::registerTypes(const char *uri)
2828{
29− Q_ASSERT(uri == QLatin1String("DashViews"));
29+ Q_ASSERT(uri == QLatin1String("Dash"));
3030 qmlRegisterType<QAbstractItemModel>();
3131 qmlRegisterType<HorizontalJournal>(uri, 0, 1, "HorizontalJournal");
3232 qmlRegisterType<ListViewWithPageHeader>(uri, 0, 1, "ListViewWithPageHeader");
plugins/DashViews/plugin.h → plugins/Dash/plugin.hrenamed+3−3
@@ -15,13 +15,13 @@
1515 *
1616 */
1717
18−#ifndef DASHVIEWS_PLUGIN_H
19−#define DASHVIEWS_PLUGIN_H
18+#ifndef DASH_PLUGIN_H
19+#define DASH_PLUGIN_H
2020
2121#include <QtQml/QQmlEngine>
2222#include <QtQml/QQmlExtensionPlugin>
2323
24−class DashViewsPlugin : public QQmlExtensionPlugin
24+class DashPlugin : public QQmlExtensionPlugin
2525{
2626 Q_OBJECT
2727 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
plugins/Dash/qmldirnew file+4
@@ -0,0 +1,4 @@
1+module Dash
2+plugin Dash-qml
3+typeinfo Dash.qmltypes
4+singleton CardCreatorCache 0.1 CardCreatorCache.qml
plugins/DashViews/verticaljournal.cpp → plugins/Dash/verticaljournal.cpprenamed−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 → plugins/Dash/verticaljournal.hrenamed−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/DashViews/qmldirdeleted−3
@@ -1,3 +0,0 @@
1−module DashViews
2−plugin DashViews-qml
3−typeinfo plugin.qmltypes
plugins/HudClient/CMakeLists.txt+1−6
@@ -1,6 +1,3 @@
1−# export_qmlplugin macro
2−include(Plugins)
3−
41find_package(Qt5Core REQUIRED)
52find_package(Qt5Quick REQUIRED)
63pkg_search_module(DEE dee-1.0 REQUIRED)
@@ -38,6 +35,4 @@ target_link_libraries(HudClientQml
3835
3936qt5_use_modules(HudClientQml Qml)
4037
41−# export the qmldir qmltypes and plugin files
42−export_qmlfiles(HudClient HudClient)
43−export_qmlplugin(HudClient 0.1 HudClient TARGETS HudClientQml)
38+add_unity8_plugin(HudClient 0.1 HudClient TARGETS HudClientQml)
plugins/HudClient/qmldir+1−1
@@ -1,3 +1,3 @@
11module HudClient
22plugin HudClientQml
3−typeinfo plugin.qmltypes
3+typeinfo HudClient.qmltypes
plugins/LightDM/CMakeLists.txt+1−6
@@ -1,6 +1,3 @@
1−# export_qmlplugin macro
2−include(Plugins)
3−
41# Dependencies
52include(FindPkgConfig)
63pkg_check_modules(LIBUSERMETRICSOUTPUT REQUIRED libusermetricsoutput-1)
@@ -37,6 +34,4 @@ target_link_libraries(LightDM-qml
3734
3835qt5_use_modules(LightDM-qml DBus Gui Qml)
3936
40−# export the qmldir qmltypes and plugin files
41−export_qmlfiles(LightDM LightDM)
42−export_qmlplugin(LightDM 0.1 LightDM TARGETS LightDM-qml)
37+add_unity8_plugin(LightDM 0.1 LightDM TARGETS LightDM-qml)
plugins/LightDM/qmldir+1−1
@@ -1,3 +1,3 @@
11module LightDM
22plugin LightDM-qml
3−typeinfo plugin.qmltypes
3+typeinfo LightDM.qmltypes
plugins/Powerd/CMakeLists.txt+1−3
@@ -1,4 +1,3 @@
1−include(Plugins)
21include(FindPkgConfig)
32
43pkg_search_module(GIO REQUIRED gio-2.0)
@@ -17,5 +16,4 @@ add_library(Powerd-qml MODULE
1716qt5_use_modules(Powerd-qml DBus Qml)
1817target_link_libraries(Powerd-qml ${GIO_LDFLAGS})
1918
20−export_qmlfiles(Powerd Powerd)
21−export_qmlplugin(Powerd 0.1 Powerd TARGETS Powerd-qml)
19+add_unity8_plugin(Powerd 0.1 Powerd TARGETS Powerd-qml)
plugins/Powerd/qmldir+1−1
@@ -1,3 +1,3 @@
11module Powerd
22plugin Powerd-qml
3−typeinfo plugin.qmltypes
3+typeinfo Powerd.qmltypes
plugins/SessionBroadcast/CMakeLists.txt+1−4
@@ -1,5 +1,3 @@
1−include(Plugins)
2−
31add_definitions(-DSM_BUSNAME=systemBus)
42
53add_library(SessionBroadcast-qml MODULE
@@ -9,5 +7,4 @@ add_library(SessionBroadcast-qml MODULE
97
108qt5_use_modules(SessionBroadcast-qml DBus Qml)
119
12−export_qmlfiles(SessionBroadcast SessionBroadcast)
13−export_qmlplugin(SessionBroadcast 0.1 SessionBroadcast TARGETS SessionBroadcast-qml)
10+add_unity8_plugin(SessionBroadcast 0.1 SessionBroadcast TARGETS SessionBroadcast-qml)
plugins/SessionBroadcast/qmldir+1−1
@@ -1,3 +1,3 @@
11module SessionBroadcast
22plugin SessionBroadcast-qml
3−typeinfo plugin.qmltypes
3+typeinfo SessionBroadcast.qmltypes
plugins/Ubuntu/DownloadDaemonListener/CMakeLists.txt+1−6
@@ -1,6 +1,3 @@
1−# export_qmlplugin macro
2−include(Plugins)
3−
41include_directories(
52 ${CMAKE_CURRENT_SOURCE_DIR}
63 ${CMAKE_CURRENT_BINARY_DIR}
@@ -17,6 +14,4 @@ add_library(DownloadDaemonListener MODULE ${DOWNLOADDAEMONLISTENER_SOURCES})
1714
1815qt5_use_modules(DownloadDaemonListener Qml Quick DBus Core)
1916
20−# export the qmldir qmltypes and plugin files
21−export_qmlfiles(Ubuntu.DownloadDaemonListener Ubuntu/DownloadDaemonListener)
22−export_qmlplugin(Ubuntu.DownloadDaemonListener 0.1 Ubuntu/DownloadDaemonListener TARGETS DownloadDaemonListener)
17+add_unity8_plugin(Ubuntu.DownloadDaemonListener 0.1 Ubuntu/DownloadDaemonListener TARGETS DownloadDaemonListener)
plugins/Ubuntu/DownloadDaemonListener/qmldir+1−1
@@ -1,3 +1,3 @@
11module Ubuntu.DownloadDaemonListener
22plugin DownloadDaemonListener
3−typeinfo plugins.qmltypes
3+typeinfo DownloadDaemonListener.qmltypes
plugins/Ubuntu/Gestures/CMakeLists.txt+1−6
@@ -1,6 +1,3 @@
1−# export_qmlplugin macro
2−include(Plugins)
3−
41set(UbuntuGestureQml_SOURCES
52 plugin.cpp
63 AxisVelocityCalculator.cpp
@@ -19,6 +16,4 @@ qt5_use_modules(UbuntuGestureQml Core Quick)
1916# So that Foo.cpp can #include "Foo.moc"
2017include_directories(${CMAKE_CURRENT_BINARY_DIR})
2118
22−# export the qmldir qmltypes and plugin files
23−export_qmlfiles(Ubuntu.Gestures Ubuntu/Gestures)
24−export_qmlplugin(Ubuntu.Gestures 0.1 Ubuntu/Gestures TARGETS UbuntuGestureQml)
19+add_unity8_plugin(Ubuntu.Gestures 0.1 Ubuntu/Gestures TARGETS UbuntuGestureQml)
plugins/Ubuntu/Gestures/qmldir+1−1
@@ -1,3 +1,3 @@
11module Ubuntu.Gestures
22plugin UbuntuGestureQml
3−typeinfo plugin.qmltypes
3+typeinfo Gestures.qmltypes
plugins/Unity/Indicators/CMakeLists.txt+4−7
@@ -1,6 +1,3 @@
1−# export_qmlplugin macro
2−include(Plugins)
3−
41project(IndicatorsQml)
52
63pkg_check_modules(GLIB REQUIRED glib-2.0>=2.32)
@@ -10,8 +7,6 @@ pkg_check_modules(QMENUMODEL REQUIRED qmenumodel)
107find_package(Qt5Core REQUIRED)
118find_package(Qt5Quick REQUIRED)
129
13−add_subdirectory(qml)
14−
1510include_directories(
1611 ${CMAKE_CURRENT_SOURCE_DIR}
1712 ${CMAKE_CURRENT_BINARY_DIR}
@@ -56,5 +51,7 @@ target_link_libraries(IndicatorsQml
5651
5752qt5_use_modules(IndicatorsQml Core Qml Quick)
5853
59−# export the qmltypes and plugin files
60−export_qmlplugin(Unity.Indicators 0.1 Unity/Indicators TARGETS IndicatorsQml)
54+add_unity8_plugin(Unity.Indicators 0.1 Unity/Indicators
55+ SEARCH_PATH qml
56+ TARGETS IndicatorsQml
57+)
plugins/Unity/Indicators/menucontentactivator.cpp−1
@@ -316,7 +316,6 @@ MenuContentState* MenuContentActivatorPrivate::content_at(QQmlListProperty<MenuC
316316 if (!d->m_content.contains(index)) {
317317 MenuContentState* content = new MenuContentState(false);
318318 d->m_content[index] = content;
319− Q_EMIT p->contentChanged();
320319 return content;
321320 }
322321
plugins/Unity/Indicators/qml/CMakeLists.txtdeleted−5
@@ -1,5 +0,0 @@
1−# export_qmlplugin macro
2−include(Plugins)
3−
4−# export the qmldir, *.qml files.
5−export_qmlfiles(Unity.Indicators Unity/Indicators)
plugins/Unity/Indicators/qml/qmldir+1−1
@@ -1,6 +1,6 @@
11module Unity.Indicators
22plugin IndicatorsQml
3−typeinfo plugin.qmltypes
3+typeinfo Indicators.qmltypes
44
55CachedUnityMenuModel 0.1 CachedUnityMenuModel.qml
66IndicatorBase 0.1 IndicatorBase.qml
plugins/Unity/Indicators/rootactionstate.cpp+7−8
@@ -240,19 +240,18 @@ QVariant RootActionState::toQVariant(GVariant* state) const
240240
241241 QStringList icons;
242242
243− if (g_variant_type_is_array(g_variant_get_type(vvalue))) {
244−
245−
246− for (int i = 0, iMax = g_variant_n_children(vvalue); i < iMax; i++) {
247− GVariant *child = g_variant_get_child_value(vvalue, i);
248−
243+ if (g_variant_is_of_type(vvalue, G_VARIANT_TYPE("av"))) {
244+ GVariantIter iter;
245+ GVariant *val = 0;
246+ g_variant_iter_init (&iter, vvalue);
247+ while (g_variant_iter_loop (&iter, "v", &val))
248+ {
249249 // FIXME - should be sending a url.
250− GIcon *gicon = g_icon_deserialize (child);
250+ GIcon *gicon = g_icon_deserialize (val);
251251 if (gicon) {
252252 icons << iconUri(gicon);
253253 g_object_unref (gicon);
254254 }
255− g_variant_unref(child);
256255 }
257256 }
258257 // will overwrite icon.
plugins/Unity/Launcher/CMakeLists.txt+1−3
@@ -32,6 +32,4 @@ target_link_libraries(UnityLauncher-qml ${GSETTINGS_QT_LDFLAGS})
3232
3333qt5_use_modules(UnityLauncher-qml DBus Qml)
3434
35−# export the qmldir and qmltypes files
36−export_qmlfiles(Unity.Launcher Unity/Launcher)
37−export_qmlplugin(Unity.Launcher 0.1 Unity/Launcher TARGETS UnityLauncher-qml)
35+add_unity8_plugin(Unity.Launcher 0.1 Unity/Launcher TARGETS UnityLauncher-qml)
plugins/Unity/Launcher/backend/launcherbackend.cpp+293−29
@@ -31,13 +31,14 @@
3131class LauncherBackendItem
3232{
3333public:
34− QString desktopFile;
3534 QString displayName;
3635 QString icon;
36+ int count;
37+ bool countVisible;
3738};
3839
3940LauncherBackend::LauncherBackend(QObject *parent):
40− QObject(parent),
41+ QDBusVirtualObject(parent),
4142 m_accounts(nullptr)
4243{
4344#ifndef LAUNCHER_TESTING
@@ -45,10 +46,25 @@ LauncherBackend::LauncherBackend(QObject *parent):
4546#endif
4647 m_user = qgetenv("USER");
4748 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+ }
4858}
4959
5060LauncherBackend::~LauncherBackend()
5161{
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 */
5268 m_storedApps.clear();
5369
5470 Q_FOREACH(LauncherBackendItem *item, m_itemCache) {
@@ -90,17 +106,12 @@ void LauncherBackend::setStoredApplications(const QStringList &appIds)
90106
91107QString LauncherBackend::desktopFile(const QString &appId) const
92108{
93− LauncherBackendItem *item = m_itemCache.value(appId);
94− if (item) {
95− return item->desktopFile;
96− }
97−
98109 return findDesktopFile(appId);
99110}
100111
101112QString LauncherBackend::displayName(const QString &appId) const
102113{
103− LauncherBackendItem *item = m_itemCache.value(appId);
114+ LauncherBackendItem *item = m_itemCache.value(appId, nullptr);
104115 if (item) {
105116 return item->displayName;
106117 }
@@ -118,16 +129,9 @@ QString LauncherBackend::displayName(const QString &appId) const
118129QString LauncherBackend::icon(const QString &appId) const
119130{
120131 QString iconName;
121− LauncherBackendItem *item = m_itemCache.value(appId);
132+ LauncherBackendItem *item = getItem(appId);
122133 if (item) {
123134 iconName = item->icon;
124− } else {
125− QString df = findDesktopFile(appId);
126− if (!df.isEmpty()) {
127− LauncherBackendItem *item = parseDesktopFile(df);
128− m_itemCache.insert(appId, item);
129− iconName = item->icon;
130− }
131135 }
132136
133137 return iconName;
@@ -153,10 +157,70 @@ int LauncherBackend::progress(const QString &appId) const
153157
154158int LauncherBackend::count(const QString &appId) const
155159{
156− // TODO: Return value for count emblem.
157− // TODO: emit countChanged() when this value changes.
158− Q_UNUSED(appId)
159− 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+ }
160224}
161225
162226void LauncherBackend::setUser(const QString &username)
@@ -194,13 +258,33 @@ void LauncherBackend::syncFromAccounts()
194258 Q_FOREACH(const QString &entry, gSettings.get("favorites").toStringList()) {
195259 if (entry.startsWith("application://")) {
196260 QString appId = entry;
197− // Transform "application://foobar.desktop" to "foobar"
261+ // Transform "application://foobar.desktop" to "application://foobar"
198262 appId.remove("application://");
199263 if (appId.endsWith(".desktop")) {
200264 appId.chop(8);
201265 }
202266 QString df = findDesktopFile(appId);
203267
268+ if (!df.isEmpty()) {
269+ m_storedApps << appId;
270+
271+ if (!m_itemCache.contains(appId)) {
272+ m_itemCache.insert(appId, parseDesktopFile(df));
273+ }
274+ }
275+ }
276+ if (entry.startsWith("appid://")) {
277+ QString appId = entry;
278+ appId.remove("appid://");
279+ // Strip hook name and current-user-version in case its there
280+
281+ if (appId.split('/').count() != 3) {
282+ qWarning() << "ignoring entry " + appId + ". Not a valid appId.";
283+ continue;
284+ }
285+ appId = appId.split('/').first() + "_" + appId.split('/').at(1);
286+ QString df = findDesktopFile(appId);
287+
204288 if (!df.isEmpty()) {
205289 m_storedApps << appId;
206290
@@ -245,10 +329,13 @@ QString LauncherBackend::findDesktopFile(const QString &appId) const
245329 helper = helper.replace(dashPos, 1, '/');
246330 }
247331
248− Q_FOREACH(const QString &searchDir, searchDirs) {
249− QFileInfo fileInfo(QDir(searchDir), helper + ".desktop");
250− if (fileInfo.exists()) {
251− return fileInfo.absoluteFilePath();
332+ Q_FOREACH(const QString &searchDirName, searchDirs) {
333+ QDir searchDir(searchDirName);
334+ Q_FOREACH(const QString &desktopFile, searchDir.entryList(QStringList() << "*.desktop")) {
335+ if (desktopFile.startsWith(helper)) {
336+ QFileInfo fileInfo(searchDir, desktopFile);
337+ return fileInfo.absoluteFilePath();
338+ }
252339 }
253340 }
254341
@@ -263,7 +350,6 @@ LauncherBackendItem* LauncherBackend::parseDesktopFile(const QString &desktopFil
263350 QSettings settings(desktopFile, QSettings::IniFormat);
264351
265352 LauncherBackendItem* item = new LauncherBackendItem();
266− item->desktopFile = desktopFile;
267353 item->displayName = settings.value("Desktop Entry/Name").toString();
268354
269355 QString iconString = settings.value("Desktop Entry/Icon").toString();
@@ -275,6 +361,35 @@ LauncherBackendItem* LauncherBackend::parseDesktopFile(const QString &desktopFil
275361 } else {
276362 item->icon = "image://theme/" + iconString;
277363 }
364+
365+ /* TODO: These should be looked up in a cache somewhere */
366+ item->count = 0;
367+ item->countVisible = false;
368+
369+ return item;
370+}
371+
372+/* Gets an item, and tries to create a new one if we need it to */
373+LauncherBackendItem* LauncherBackend::getItem(const QString &appId) const
374+{
375+ LauncherBackendItem *item = m_itemCache.value(appId, nullptr);
376+ if (!item) {
377+ QString df = findDesktopFile(appId);
378+ if (!df.isEmpty()) {
379+ item = parseDesktopFile(df);
380+ if (item) {
381+ m_itemCache[appId] = item;
382+ } else {
383+ qWarning() << "Unable to parse desktop file for" << appId << "path" << df;
384+ }
385+ } else {
386+ qWarning() << "Unable to find desktop file for:" << appId;
387+ }
388+ }
389+
390+ if (!item)
391+ qWarning() << "Unable to find item for: " << appId;
392+
278393 return item;
279394}
280395
@@ -285,16 +400,17 @@ void LauncherBackend::loadFromVariant(const QVariantMap &details)
285400 }
286401 QString appId = details.value("id").toString();
287402
288− LauncherBackendItem *item = m_itemCache.value(appId);
403+ LauncherBackendItem *item = m_itemCache.value(appId, nullptr);
289404 if (item) {
290405 delete item;
291406 }
292407
293408 item = new LauncherBackendItem();
294409
295− item->desktopFile = details.value("desktopFile").toString();
296410 item->displayName = details.value("name").toString();
297411 item->icon = details.value("icon").toString();
412+ item->count = details.value("count").toInt();
413+ item->countVisible = details.value("countVisible").toBool();
298414
299415 m_itemCache.insert(appId, item);
300416 m_storedApps.append(appId);
@@ -307,7 +423,8 @@ QVariantMap LauncherBackend::itemToVariant(const QString &appId) const
307423 details.insert("id", appId);
308424 details.insert("name", item->displayName);
309425 details.insert("icon", item->icon);
310− details.insert("desktopFile", item->desktopFile);
426+ details.insert("count", item->count);
427+ details.insert("countVisible", item->countVisible);
311428 return details;
312429}
313430
@@ -318,3 +435,150 @@ bool LauncherBackend::isDefaultsItem(const QList<QVariantMap> &apps) const
318435 // list of one item with the 'defaults' field set to true.
319436 return (apps.size() == 1 && apps[0].value("defaults").toBool());
320437}
438+
439+bool LauncherBackend::handleMessage(const QDBusMessage& message, const QDBusConnection& connection)
440+{
441+ /* Check to make sure we're getting properties on our interface */
442+ if (message.type() != QDBusMessage::MessageType::MethodCallMessage) {
443+ return false;
444+ }
445+ if (message.interface() != "org.freedesktop.DBus.Properties") {
446+ return false;
447+ }
448+ if (message.arguments()[0].toString() != "com.canonical.Unity.Launcher.Item") {
449+ return false;
450+ }
451+
452+ /* Break down the path to just the app id */
453+ QString pathtemp = message.path();
454+ if (!pathtemp.startsWith("/com/canonical/Unity/Launcher/")) {
455+ return false;
456+ }
457+ pathtemp.remove("/com/canonical/Unity/Launcher/");
458+ if (pathtemp.indexOf('/') >= 0) {
459+ return false;
460+ }
461+
462+ /* Find ourselves an appid */
463+ QString appid = decodeAppId(pathtemp);
464+ QVariantList retval;
465+
466+ if (message.member() == "Get") {
467+ if (message.arguments()[1].toString() == "count") {
468+ retval.append(QVariant::fromValue(QDBusVariant(this->count(appid))));
469+ } else if (message.arguments()[1].toString() == "countVisible") {
470+ retval.append(QVariant::fromValue(QDBusVariant(this->countVisible(appid))));
471+ }
472+ } else if (message.member() == "Set") {
473+ if (message.arguments()[1].toString() == "count") {
474+ this->setCount(appid, message.arguments()[2].value<QDBusVariant>().variant().toInt());
475+ } else if (message.arguments()[1].toString() == "countVisible") {
476+ this->setCountVisible(appid, message.arguments()[2].value<QDBusVariant>().variant().toBool());
477+ }
478+ } else if (message.member() == "GetAll") {
479+ retval.append(this->itemToVariant(appid));
480+ } else {
481+ return false;
482+ }
483+
484+ QDBusMessage reply = message.createReply(retval);
485+ return connection.send(reply);
486+}
487+
488+QString LauncherBackend::introspect(const QString &path) const
489+{
490+ /* This case we should just list the nodes */
491+ if (path == "/com/canonical/Unity/Launcher/" || path == "/com/canonical/Unity/Launcher") {
492+ QString nodes;
493+
494+ Q_FOREACH(const QString &appId, m_itemCache.keys()) {
495+ nodes.append("<node name=\"");
496+ nodes.append(encodeAppId(appId));
497+ nodes.append("\"/>\n");
498+ }
499+
500+ return nodes;
501+ }
502+
503+ /* Should not happen, but let's handle it */
504+ if (!path.startsWith("/com/canonical/Unity/Launcher")) {
505+ return "";
506+ }
507+
508+ /* Now we should be looking at a node */
509+ QString nodeiface =
510+ "<interface name=\"com.canonical.Unity.Launcher.Item\">"
511+ "<property name=\"count\" type=\"i\" access=\"readwrite\" />"
512+ "<property name=\"countVisible\" type=\"b\" access=\"readwrite\" />"
513+ "</interface>";
514+ return nodeiface;
515+}
516+
517+QString LauncherBackend::decodeAppId(const QString& path)
518+{
519+ QByteArray bytes = path.toUtf8();
520+ QByteArray decoded;
521+
522+ for (int i = 0; i < bytes.size(); ++i) {
523+ char chr = bytes.at(i);
524+
525+ if (chr == '_') {
526+ QString number;
527+ number.append(bytes.at(i+1));
528+ number.append(bytes.at(i+2));
529+
530+ bool okay;
531+ char newchar = number.toUInt(&okay, 16);
532+ if (okay)
533+ decoded.append(newchar);
534+
535+ i += 2;
536+ } else {
537+ decoded.append(chr);
538+ }
539+ }
540+
541+ return QString::fromUtf8(decoded);
542+}
543+
544+QString LauncherBackend::encodeAppId(const QString& appId)
545+{
546+ QByteArray bytes = appId.toUtf8();
547+ QString encoded;
548+
549+ for (int i = 0; i < bytes.size(); ++i) {
550+ uchar chr = bytes.at(i);
551+
552+ if ((chr >= 'a' && chr <= 'z') ||
553+ (chr >= 'A' && chr <= 'Z') ||
554+ (chr >= '0' && chr <= '9'&& i != 0)) {
555+ encoded.append(chr);
556+ } else {
557+ QString hexval = QString("_%1").arg(chr, 2, 16, QChar('0'));
558+ encoded.append(hexval.toUpper());
559+ }
560+ }
561+
562+ return encoded;
563+}
564+
565+void LauncherBackend::emitPropChangedDbus(const QString& appId, const QString& property, QVariant &value) const
566+{
567+ QString path("/com/canonical/Unity/Launcher/");
568+ path.append(encodeAppId(appId));
569+
570+ QDBusMessage message = QDBusMessage::createSignal(path, "org.freedesktop.DBus.Properties", "PropertiesChanged");
571+
572+ QList<QVariant> arguments;
573+ QVariantHash changedprops;
574+ changedprops[property] = QVariant::fromValue(QDBusVariant(value));
575+ QVariantList deletedprops;
576+
577+ arguments.append(changedprops);
578+ arguments.append(deletedprops);
579+
580+ message.setArguments(arguments);
581+
582+ QDBusConnection con = QDBusConnection::sessionBus();
583+ con.send(message);
584+}
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/Unity/Launcher/launchermodel.cpp+22
@@ -23,6 +23,8 @@
2323
2424#include <unity/shell/application/ApplicationInfoInterface.h>
2525
26+#include <QDebug>
27+
2628using namespace unity::shell::application;
2729
2830LauncherModel::LauncherModel(QObject *parent):
@@ -199,6 +201,22 @@ void LauncherModel::setUser(const QString &username)
199201 m_backend->setUser(username);
200202}
201203
204+QString LauncherModel::getUrlForAppId(const QString &appId) const
205+{
206+ // appId is either an appId or a legacy app name. Let's find out which
207+ if (appId.isEmpty())
208+ return QString();
209+
210+ QString df = m_backend->desktopFile(appId + ".desktop");
211+ if (!df.isEmpty())
212+ return "application:///" + appId + ".desktop";
213+
214+ QStringList parts = appId.split('_');
215+ QString package = parts.value(0);
216+ QString app = parts.value(1, "first-listed-app");
217+ return "appid://" + package + "/" + app + "/current-user-version";
218+}
219+
202220ApplicationManagerInterface *LauncherModel::applicationManager() const
203221{
204222 return m_appManager;
@@ -291,6 +309,10 @@ void LauncherModel::applicationAdded(const QModelIndex &parent, int row)
291309 Q_UNUSED(parent);
292310
293311 ApplicationInfoInterface *app = m_appManager->get(row);
312+ if (!app) {
313+ qWarning() << "LauncherModel received an applicationAdded signal, but there's no such application!";
314+ return;
315+ }
294316
295317 bool found = false;
296318 Q_FOREACH(LauncherItem *item, m_list) {
plugins/Unity/Launcher/launchermodel.h+1
@@ -51,6 +51,7 @@ public:
5151 Q_INVOKABLE void requestRemove(const QString &appId);
5252 Q_INVOKABLE void quickListActionInvoked(const QString &appId, int actionIndex);
5353 Q_INVOKABLE void setUser(const QString &username);
54+ Q_INVOKABLE QString getUrlForAppId(const QString &appId) const;
5455
5556 unity::shell::application::ApplicationManagerInterface* applicationManager() const;
5657 void setApplicationManager(unity::shell::application::ApplicationManagerInterface *appManager);
plugins/Unity/Launcher/qmldir+1−1
@@ -1,3 +1,3 @@
11module Unity.Launcher
22plugin UnityLauncher-qml
3−typeinfo plugin.qmltypes
3+typeinfo Launcher.qmltypes
plugins/Utils/CMakeLists.txt+1−4
@@ -11,7 +11,6 @@ include_directories(
1111)
1212
1313set(QMLPLUGIN_SRC
14− bottombarvisibilitycommunicatorshell.cpp
1514 qlimitproxymodelqml.cpp
1615 qsortfilterproxymodelqml.cpp
1716 timeformatter.cpp
@@ -34,6 +33,4 @@ set_target_properties(Utils-qml PROPERTIES COMPILE_FLAGS -fvisibility=default)
3433
3534qt5_use_modules(Utils-qml Qml Quick DBus Network XmlPatterns Gui Concurrent)
3635
37−# export the qmldir qmltypes and plugin files
38−export_qmlfiles(Utils Utils)
39−export_qmlplugin(Utils 0.1 Utils TARGETS Utils-qml)
36+add_unity8_plugin(Utils 0.1 Utils TARGETS Utils-qml)
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}
plugins/Utils/qmldir+1−1
@@ -1,3 +1,3 @@
11module Utils
22plugin Utils-qml
3−typeinfo plugin.qmltypes
3+typeinfo Utils.qmltypes
po/am.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr ""
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr "ሰላም %1"
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr "ሰላም"
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr "መላኪያ"
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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 "ሰላም %1"
128−
129−#: qml/Greeter/PassphraseLockscreen.qml:59
130−msgid "Hello"
131−msgstr "ሰላም"
132−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr "ማረጋገጫ"
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr "መፈለጊያ"
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr "እባክዎን ያስገቡ %1"
po/ar.po+36−29
@@ -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-04-10 11:13-0400\n"
11−"PO-Revision-Date: 2014-02-21 11:19+0000\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"PO-Revision-Date: 2014-05-22 08:22+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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,10 +75,35 @@ msgstr ""
7575"أنت الآن بارع في إيماءات الحواف ويمكنك البدء باستخدام هاتفك<br><br>انقر على "
7676"الشاشة للبدء"
7777
78+#: qml/Components/Lockscreen.qml:214
79+msgid "Emergency Call"
80+msgstr "مكالمة طوارئ"
81+
82+#: qml/Components/Lockscreen.qml:231
83+msgid "OK"
84+msgstr ""
85+
7886#: qml/Components/PageHeader.qml:365
7987msgid "Recent searches"
8088msgstr "عمليات البحث الأخيرة"
8189
90+#: qml/Components/PassphraseLockscreen.qml:60
91+#, qt-format
92+msgid "Hello %1"
93+msgstr "مرحبا %1"
94+
95+#: qml/Components/PassphraseLockscreen.qml:60
96+msgid "Hello"
97+msgstr "مرحبًا"
98+
99+#: qml/Components/PinLockscreen.qml:198
100+msgid "CANCEL"
101+msgstr ""
102+
103+#: qml/Components/PinLockscreen.qml:216
104+msgid "DONE"
105+msgstr ""
106+
82107#: qml/Components/SeeMore.qml:35
83108msgid "See more"
84109msgstr "شاهد المزيد"
@@ -89,12 +114,7 @@ msgstr "شاهد أقل"
89114
90115#: qml/Dash/DashApps.qml:37
91116msgid "Recent"
92−msgstr ""
93−
94−#: qml/Dash/PreviewListView.qml:52
95−#, qt-format
96−msgid "%1 Preview"
97−msgstr ""
117+msgstr "استُخدمت مؤخرًا"
98118
99119#: qml/Dash/Previews/PreviewActionCombo.qml:34
100120msgid "More..."
@@ -104,34 +124,21 @@ msgstr "المزيد..."
104124msgid "Less..."
105125msgstr "أقل..."
106126
107−#: qml/Dash/Previews/PreviewRatingInput.qml:81
127+#: qml/Dash/Previews/PreviewRatingInput.qml:82
108128msgid "Rate this"
109129msgstr "قيّم ذلك"
110130
111−#: qml/Dash/Previews/PreviewRatingInput.qml:126
131+#: qml/Dash/Previews/PreviewRatingInput.qml:128
112132msgid "Add a review"
113133msgstr "أضف تعليق"
114134
115−#: qml/Dash/Previews/PreviewRatingInput.qml:166
135+#: qml/Dash/Previews/PreviewRatingInput.qml:168
116136msgid "Send"
117137msgstr "أرسل"
118138
119−#: qml/Greeter/Greeter.qml:151
139+#: qml/Greeter/Greeter.qml:157
120140msgid "Swipe to unlock"
121−msgstr ""
122−
123−#: qml/Greeter/Lockscreen.qml:149
124−msgid "Emergency Call"
125−msgstr "مكالمة طوارئ"
126−
127−#: qml/Greeter/PassphraseLockscreen.qml:59
128−#, qt-format
129−msgid "Hello %1"
130−msgstr "مرحبا %1"
131−
132−#: qml/Greeter/PassphraseLockscreen.qml:59
133−msgid "Hello"
134−msgstr "مرحبًا"
141+msgstr "اسحب لفتح القفل"
135142
136143#: qml/Hud/HudParametrizedActionsPage.qml:132
137144msgid "Confirm"
@@ -165,7 +172,7 @@ msgstr "من فضلك أدخِل رقم التعريف الشخصي لبطاقة
165172msgid "Search"
166173msgstr "ابحث"
167174
168−#: qml/Shell.qml:348
175+#: qml/Shell.qml:334
169176#, qt-format
170177msgid "Please enter %1"
171178msgstr "من فضلك أدخِل %1"
po/ast.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -76,10 +76,35 @@ msgstr ""
7676"Agora domina los xestos de los bordes y pue principiar a usar el "
7777"teléfonu<br><br>Toque la pantalla pa comenzar"
7878
79+#: qml/Components/Lockscreen.qml:214
80+msgid "Emergency Call"
81+msgstr "Llamada d'emerxencia"
82+
83+#: qml/Components/Lockscreen.qml:231
84+msgid "OK"
85+msgstr ""
86+
7987#: qml/Components/PageHeader.qml:365
8088msgid "Recent searches"
8189msgstr "Busques recientes"
8290
91+#: qml/Components/PassphraseLockscreen.qml:60
92+#, qt-format
93+msgid "Hello %1"
94+msgstr "Hola %1"
95+
96+#: qml/Components/PassphraseLockscreen.qml:60
97+msgid "Hello"
98+msgstr "Hola"
99+
100+#: qml/Components/PinLockscreen.qml:198
101+msgid "CANCEL"
102+msgstr ""
103+
104+#: qml/Components/PinLockscreen.qml:216
105+msgid "DONE"
106+msgstr ""
107+
83108#: qml/Components/SeeMore.qml:35
84109msgid "See more"
85110msgstr "Ver más"
@@ -92,11 +117,6 @@ msgstr "Ver menos"
92117msgid "Recent"
93118msgstr "Reciente"
94119
95−#: qml/Dash/PreviewListView.qml:52
96−#, qt-format
97−msgid "%1 Preview"
98−msgstr "Vista previa de %1"
99−
100120#: qml/Dash/Previews/PreviewActionCombo.qml:34
101121msgid "More..."
102122msgstr "Más…"
@@ -105,35 +125,22 @@ msgstr "Más…"
105125msgid "Less..."
106126msgstr "Menos…"
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:81
128+#: qml/Dash/Previews/PreviewRatingInput.qml:82
109129msgid "Rate this"
110130msgstr "Valorar esto"
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:126
132+#: qml/Dash/Previews/PreviewRatingInput.qml:128
113133msgid "Add a review"
114134msgstr "Amestar una reseña"
115135
116−#: qml/Dash/Previews/PreviewRatingInput.qml:166
136+#: qml/Dash/Previews/PreviewRatingInput.qml:168
117137msgid "Send"
118138msgstr "Unviar"
119139
120−#: qml/Greeter/Greeter.qml:151
140+#: qml/Greeter/Greeter.qml:157
121141msgid "Swipe to unlock"
122142msgstr ""
123143
124−#: qml/Greeter/Lockscreen.qml:149
125−msgid "Emergency Call"
126−msgstr "Llamada d'emerxencia"
127−
128−#: qml/Greeter/PassphraseLockscreen.qml:59
129−#, qt-format
130−msgid "Hello %1"
131−msgstr "Hola %1"
132−
133−#: qml/Greeter/PassphraseLockscreen.qml:59
134−msgid "Hello"
135−msgstr "Hola"
136−
137144#: qml/Hud/HudParametrizedActionsPage.qml:132
138145msgid "Confirm"
139146msgstr "Confirmar"
@@ -166,7 +173,7 @@ msgstr "Escriba'l PIN de la SIM"
166173msgid "Search"
167174msgstr "Guetar"
168175
169−#: qml/Shell.qml:348
176+#: qml/Shell.qml:334
170177#, qt-format
171178msgid "Please enter %1"
172179msgstr "Introduz %1"
po/az.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,10 +73,35 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76+#: qml/Components/Lockscreen.qml:214
77+msgid "Emergency Call"
78+msgstr "Zərurət zəngi"
79+
80+#: qml/Components/Lockscreen.qml:231
81+msgid "OK"
82+msgstr ""
83+
7684#: qml/Components/PageHeader.qml:365
7785msgid "Recent searches"
7886msgstr "Son axtarışlar"
7987
88+#: qml/Components/PassphraseLockscreen.qml:60
89+#, qt-format
90+msgid "Hello %1"
91+msgstr "Xoş gördük %1"
92+
93+#: qml/Components/PassphraseLockscreen.qml:60
94+msgid "Hello"
95+msgstr "Xoş gördük"
96+
97+#: qml/Components/PinLockscreen.qml:198
98+msgid "CANCEL"
99+msgstr ""
100+
101+#: qml/Components/PinLockscreen.qml:216
102+msgid "DONE"
103+msgstr ""
104+
80105#: qml/Components/SeeMore.qml:35
81106msgid "See more"
82107msgstr ""
@@ -89,11 +114,6 @@ msgstr ""
89114msgid "Recent"
90115msgstr ""
91116
92−#: qml/Dash/PreviewListView.qml:52
93−#, qt-format
94−msgid "%1 Preview"
95−msgstr ""
96−
97117#: qml/Dash/Previews/PreviewActionCombo.qml:34
98118msgid "More..."
99119msgstr ""
@@ -102,35 +122,22 @@ msgstr ""
102122msgid "Less..."
103123msgstr ""
104124
105−#: qml/Dash/Previews/PreviewRatingInput.qml:81
125+#: qml/Dash/Previews/PreviewRatingInput.qml:82
106126msgid "Rate this"
107127msgstr "Qiymət ver"
108128
109−#: qml/Dash/Previews/PreviewRatingInput.qml:126
129+#: qml/Dash/Previews/PreviewRatingInput.qml:128
110130msgid "Add a review"
111131msgstr "Rəy yaz"
112132
113−#: qml/Dash/Previews/PreviewRatingInput.qml:166
133+#: qml/Dash/Previews/PreviewRatingInput.qml:168
114134msgid "Send"
115135msgstr "Göndər"
116136
117−#: qml/Greeter/Greeter.qml:151
137+#: qml/Greeter/Greeter.qml:157
118138msgid "Swipe to unlock"
119139msgstr ""
120140
121−#: qml/Greeter/Lockscreen.qml:149
122−msgid "Emergency Call"
123−msgstr "Zərurət zəngi"
124−
125−#: qml/Greeter/PassphraseLockscreen.qml:59
126−#, qt-format
127−msgid "Hello %1"
128−msgstr "Xoş gördük %1"
129−
130−#: qml/Greeter/PassphraseLockscreen.qml:59
131−msgid "Hello"
132−msgstr "Xoş gördük"
133−
134141#: qml/Hud/HudParametrizedActionsPage.qml:132
135142msgid "Confirm"
136143msgstr "Təsdiqlə"
@@ -163,7 +170,7 @@ msgstr ""
163170msgid "Search"
164171msgstr "Axtar"
165172
166−#: qml/Shell.qml:348
173+#: qml/Shell.qml:334
167174#, qt-format
168175msgid "Please enter %1"
169176msgstr "Xahiş edirik daxil edin: %1"
po/bg.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -79,10 +79,35 @@ msgid ""
7979"phone<br><br>Tap on the screen to start"
8080msgstr ""
8181
82+#: qml/Components/Lockscreen.qml:214
83+msgid "Emergency Call"
84+msgstr "Спешно повикване"
85+
86+#: qml/Components/Lockscreen.qml:231
87+msgid "OK"
88+msgstr ""
89+
8290#: qml/Components/PageHeader.qml:365
8391msgid "Recent searches"
8492msgstr "Последни търсения"
8593
94+#: qml/Components/PassphraseLockscreen.qml:60
95+#, qt-format
96+msgid "Hello %1"
97+msgstr "Здравей, %1"
98+
99+#: qml/Components/PassphraseLockscreen.qml:60
100+msgid "Hello"
101+msgstr "Здравей"
102+
103+#: qml/Components/PinLockscreen.qml:198
104+msgid "CANCEL"
105+msgstr ""
106+
107+#: qml/Components/PinLockscreen.qml:216
108+msgid "DONE"
109+msgstr ""
110+
86111#: qml/Components/SeeMore.qml:35
87112msgid "See more"
88113msgstr ""
@@ -95,11 +120,6 @@ msgstr ""
95120msgid "Recent"
96121msgstr "Последни"
97122
98−#: qml/Dash/PreviewListView.qml:52
99−#, qt-format
100−msgid "%1 Preview"
101−msgstr ""
102−
103123#: qml/Dash/Previews/PreviewActionCombo.qml:34
104124msgid "More..."
105125msgstr ""
@@ -108,35 +128,22 @@ msgstr ""
108128msgid "Less..."
109129msgstr "По-малко..."
110130
111−#: qml/Dash/Previews/PreviewRatingInput.qml:81
131+#: qml/Dash/Previews/PreviewRatingInput.qml:82
112132msgid "Rate this"
113133msgstr "Оценете това"
114134
115−#: qml/Dash/Previews/PreviewRatingInput.qml:126
135+#: qml/Dash/Previews/PreviewRatingInput.qml:128
116136msgid "Add a review"
117137msgstr "Добави отзив"
118138
119−#: qml/Dash/Previews/PreviewRatingInput.qml:166
139+#: qml/Dash/Previews/PreviewRatingInput.qml:168
120140msgid "Send"
121141msgstr "Изпрати"
122142
123−#: qml/Greeter/Greeter.qml:151
143+#: qml/Greeter/Greeter.qml:157
124144msgid "Swipe to unlock"
125145msgstr ""
126146
127−#: qml/Greeter/Lockscreen.qml:149
128−msgid "Emergency Call"
129−msgstr "Спешно повикване"
130−
131−#: qml/Greeter/PassphraseLockscreen.qml:59
132−#, qt-format
133−msgid "Hello %1"
134−msgstr "Здравей, %1"
135−
136−#: qml/Greeter/PassphraseLockscreen.qml:59
137−msgid "Hello"
138−msgstr "Здравей"
139−
140147#: qml/Hud/HudParametrizedActionsPage.qml:132
141148msgid "Confirm"
142149msgstr "Потвърди"
@@ -169,7 +176,7 @@ msgstr ""
169176msgid "Search"
170177msgstr "Търсене"
171178
172−#: qml/Shell.qml:348
179+#: qml/Shell.qml:334
173180#, qt-format
174181msgid "Please enter %1"
175182msgstr "Моля, въведете %1"
po/br.po+68−54
@@ -7,44 +7,46 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"PO-Revision-Date: 2014-06-16 11:41+0000\n"
12+"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
1313"Language-Team: Breton <br@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
2222msgid "Lock to Launcher"
23−msgstr ""
23+msgstr "Stagañ ouzh al lañser"
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
2626msgid "Unlock from Launcher"
27−msgstr ""
27+msgstr "Distagañ diouzh al lañser"
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
31−msgstr ""
31+msgstr "Tremen hep sellet ouzh an digoradur"
3232
3333#: qml/Components/EdgeDemo.qml:113
3434msgid "Right edge"
35−msgstr ""
35+msgstr "Bord dehoù"
3636
3737#: qml/Components/EdgeDemo.qml:114
3838msgid "Try swiping from the right edge to unlock the phone"
3939msgstr ""
40+"Lakait ho piz da riklañ adalek ar bord dehoù da zibrennañ ar pellgomzer."
4041
4142#: qml/Components/EdgeDemo.qml:145
4243msgid "Top edge"
43−msgstr ""
44+msgstr "Bord uhelañ"
4445
4546#: qml/Components/EdgeDemo.qml:146
4647msgid "Try swiping from the top edge to access the indicators"
4748msgstr ""
49+"Lakait ho piz da riklañ adalek ar bord uhelañ da lakaat ar merkerioù war wel."
4850
4951#: qml/Components/EdgeDemo.qml:171
5052msgid "Close"
@@ -53,116 +55,128 @@ msgstr "Serriñ"
5355#: qml/Components/EdgeDemo.qml:172
5456msgid "Swipe up again to close the settings screen"
5557msgstr ""
58+"Lakait ho piz da riklañ war-du ar bord uhelañ da serriñ skramm an arventennoù"
5659
5760#: qml/Components/EdgeDemo.qml:199
5861msgid "Left edge"
59−msgstr ""
62+msgstr "Bord kleiz"
6063
6164#: qml/Components/EdgeDemo.qml:200
6265msgid "Swipe from the left to reveal the launcher for quick access to apps"
6366msgstr ""
67+"Lakait ho piz da riklañ adalek ar bord kleiz da ziskouez al lañser arloadoù "
68+"prim."
6469
6570#: qml/Components/EdgeDemo.qml:227
6671msgid "Well done"
67−msgstr ""
72+msgstr "Gourc'hemennoù !"
6873
6974#: qml/Components/EdgeDemo.qml:228
7075msgid ""
7176"You have now mastered the edge gestures and can start using the "
7277"phone<br><br>Tap on the screen to start"
7378msgstr ""
79+"Mestroniañ a rit ar jestroù ha gallout a rit kregiñ da implijout ar "
80+"pellgomzer<br><br>Touchit d'ar skramm evit kregiñ ganti"
81+
82+#: qml/Components/Lockscreen.qml:214
83+msgid "Emergency Call"
84+msgstr "Pellgomzadenn vallus"
85+
86+#: qml/Components/Lockscreen.qml:231
87+msgid "OK"
88+msgstr "Mat eo"
7489
7590#: qml/Components/PageHeader.qml:365
7691msgid "Recent searches"
77−msgstr ""
92+msgstr "Enklaskoù graet nevez zo"
93+
94+#: qml/Components/PassphraseLockscreen.qml:60
95+#, qt-format
96+msgid "Hello %1"
97+msgstr "Demat %1"
98+
99+#: qml/Components/PassphraseLockscreen.qml:60
100+msgid "Hello"
101+msgstr "Demat"
102+
103+#: qml/Components/PinLockscreen.qml:198
104+msgid "CANCEL"
105+msgstr "NULLAÑ"
106+
107+#: qml/Components/PinLockscreen.qml:216
108+msgid "DONE"
109+msgstr "ECHU"
78110
79111#: qml/Components/SeeMore.qml:35
80112msgid "See more"
81−msgstr ""
113+msgstr "Gwelet muioc'h"
82114
83115#: qml/Components/SeeMore.qml:58
84116msgid "See less"
85−msgstr ""
117+msgstr "Gwelet nebeutoc'h"
86118
87119#: qml/Dash/DashApps.qml:37
88120msgid "Recent"
89−msgstr ""
90−
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
121+msgstr "Nevez zo"
95122
96123#: qml/Dash/Previews/PreviewActionCombo.qml:34
97124msgid "More..."
98−msgstr ""
125+msgstr "Muioc'h..."
99126
100127#: qml/Dash/Previews/PreviewActionCombo.qml:34
101128msgid "Less..."
102−msgstr ""
129+msgstr "Nebeutoc'h..."
103130
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
131+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105132msgid "Rate this"
106−msgstr ""
133+msgstr "Priziit an dra-mañ"
107134
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
135+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109136msgid "Add a review"
110−msgstr ""
137+msgstr "Ouzhpennañ un ali"
111138
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
139+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113140msgid "Send"
114−msgstr ""
141+msgstr "Kas"
115142
116−#: qml/Greeter/Greeter.qml:151
143+#: qml/Greeter/Greeter.qml:157
117144msgid "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 ""
145+msgstr "Riklañ evit dibrennañ"
132146
133147#: qml/Hud/HudParametrizedActionsPage.qml:132
134148msgid "Confirm"
135−msgstr ""
149+msgstr "Kadarnaat"
136150
137151#: qml/Hud/Hud.qml:61 qml/Hud/Hud.qml:99 qml/Hud/Hud.qml:372
138152msgid "Type or say a command"
139−msgstr ""
153+msgstr "Skrivit pe lavarit un urzhiad"
140154
141155#: qml/Hud/Hud.qml:84
142156msgid "Loading. Please Wait..."
143−msgstr ""
157+msgstr "O kargañ. Gortozit, mar plij..."
144158
145159#: qml/Hud/Hud.qml:89
146160msgid "Speak Now..."
147−msgstr ""
161+msgstr "Komzit bremañ..."
148162
149163#: qml/Hud/Hud.qml:94
150164msgid "Speaking..."
151−msgstr ""
165+msgstr "O komz..."
152166
153167#: qml/Notifications/NotificationMenuItemFactory.qml:91
154168msgid "Show password"
155−msgstr ""
169+msgstr "Diskouez ar ger-tremen"
156170
157171#: qml/Notifications/NotificationMenuItemFactory.qml:103
158172msgid "Please enter SIM PIN"
159−msgstr ""
173+msgstr "Ebarzhit kod PIN ho kartenn SIM, mar plij"
160174
161175#: qml/Panel/SearchIndicator.qml:27
162176msgid "Search"
163−msgstr ""
177+msgstr "Klask"
164178
165−#: qml/Shell.qml:348
179+#: qml/Shell.qml:334
166180#, qt-format
167181msgid "Please enter %1"
168−msgstr ""
182+msgstr "Ebarzhit %1, mar plij"
po/bs.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr ""
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr ""
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr ""
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr ""
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr ""
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
po/ca.po+45−36
@@ -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-04-10 11:13-0400\n"
11−"PO-Revision-Date: 2014-01-10 07:45+0000\n"
12−"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"PO-Revision-Date: 2014-06-13 07:47+0000\n"
12+"Last-Translator: David Planella <david.planella@ubuntu.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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -77,64 +77,73 @@ msgid ""
7777"You have now mastered the edge gestures and can start using the "
7878"phone<br><br>Tap on the screen to start"
7979msgstr ""
80+"Ja heu après com utilitzar els gestos de les vores per fer servir el "
81+"telèfon<br><br>Feu un toc a la pantalla per començar"
82+
83+#: qml/Components/Lockscreen.qml:214
84+msgid "Emergency Call"
85+msgstr "Trucada d'emergència"
86+
87+#: qml/Components/Lockscreen.qml:231
88+msgid "OK"
89+msgstr "D'acord"
8090
8191#: qml/Components/PageHeader.qml:365
8292msgid "Recent searches"
8393msgstr "Cerques recents"
8494
95+#: qml/Components/PassphraseLockscreen.qml:60
96+#, qt-format
97+msgid "Hello %1"
98+msgstr "Hola %1"
99+
100+#: qml/Components/PassphraseLockscreen.qml:60
101+msgid "Hello"
102+msgstr "Hola"
103+
104+#: qml/Components/PinLockscreen.qml:198
105+msgid "CANCEL"
106+msgstr "Cancel·la"
107+
108+#: qml/Components/PinLockscreen.qml:216
109+msgid "DONE"
110+msgstr "Fet"
111+
85112#: qml/Components/SeeMore.qml:35
86113msgid "See more"
87−msgstr ""
114+msgstr "Mostra'n més"
88115
89116#: qml/Components/SeeMore.qml:58
90117msgid "See less"
91−msgstr ""
118+msgstr "Mostra'n menys"
92119
93120#: qml/Dash/DashApps.qml:37
94121msgid "Recent"
95−msgstr ""
96−
97−#: qml/Dash/PreviewListView.qml:52
98−#, qt-format
99−msgid "%1 Preview"
100−msgstr ""
122+msgstr "Recents"
101123
102124#: qml/Dash/Previews/PreviewActionCombo.qml:34
103125msgid "More..."
104−msgstr ""
126+msgstr "Més..."
105127
106128#: qml/Dash/Previews/PreviewActionCombo.qml:34
107129msgid "Less..."
108−msgstr ""
130+msgstr "Menys..."
109131
110−#: qml/Dash/Previews/PreviewRatingInput.qml:81
132+#: qml/Dash/Previews/PreviewRatingInput.qml:82
111133msgid "Rate this"
112−msgstr ""
134+msgstr "Puntueu-ho"
113135
114−#: qml/Dash/Previews/PreviewRatingInput.qml:126
136+#: qml/Dash/Previews/PreviewRatingInput.qml:128
115137msgid "Add a review"
116138msgstr "Afegiu una ressenya"
117139
118−#: qml/Dash/Previews/PreviewRatingInput.qml:166
140+#: qml/Dash/Previews/PreviewRatingInput.qml:168
119141msgid "Send"
120142msgstr "Envia"
121143
122−#: qml/Greeter/Greeter.qml:151
144+#: qml/Greeter/Greeter.qml:157
123145msgid "Swipe to unlock"
124−msgstr ""
125−
126−#: qml/Greeter/Lockscreen.qml:149
127−msgid "Emergency Call"
128−msgstr "Trucada d'emergència"
129−
130−#: qml/Greeter/PassphraseLockscreen.qml:59
131−#, qt-format
132−msgid "Hello %1"
133−msgstr "Hola %1"
134−
135−#: qml/Greeter/PassphraseLockscreen.qml:59
136−msgid "Hello"
137−msgstr "Hola"
146+msgstr "Feu lliscar el dit per desbloquejar"
138147
139148#: qml/Hud/HudParametrizedActionsPage.qml:132
140149msgid "Confirm"
@@ -162,13 +171,13 @@ msgstr "Mostra la contrasenya"
162171
163172#: qml/Notifications/NotificationMenuItemFactory.qml:103
164173msgid "Please enter SIM PIN"
165−msgstr ""
174+msgstr "Introduïu el PIN de la targeta SIM"
166175
167176#: qml/Panel/SearchIndicator.qml:27
168177msgid "Search"
169178msgstr "Cerca"
170179
171−#: qml/Shell.qml:348
180+#: qml/Shell.qml:334
172181#, qt-format
173182msgid "Please enter %1"
174183msgstr "Introduïu %1"
po/ckb.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr "هێڵی فریاگوزاری"
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr "دوایین گەڕانەکان"
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr "سڵاو %1"
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr "سڵاو"
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr "پلە دابنی بۆی"
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr "پێداچوونەوە زۆر بکە"
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr "ناردن"
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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 "سڵاو %1"
128−
129−#: qml/Greeter/PassphraseLockscreen.qml:59
130−msgid "Hello"
131−msgstr "سڵاو"
132−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr "پشتڕاستکردنەوە"
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr "گەڕان"
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr "تکایە %1 بنووسە"
po/cs.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr "Tísňové volání"
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr "Poslední vyhledávání"
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr "Ahoj %1"
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr "Ahoj"
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr "Ohodnoťte to"
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr "Přidat recenzi"
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr "Odeslat"
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
120−#: qml/Greeter/Lockscreen.qml:149
121−msgid "Emergency Call"
122−msgstr "Tísňové volání"
123−
124−#: qml/Greeter/PassphraseLockscreen.qml:59
125−#, qt-format
126−msgid "Hello %1"
127−msgstr "Ahoj %1"
128−
129−#: qml/Greeter/PassphraseLockscreen.qml:59
130−msgid "Hello"
131−msgstr "Ahoj"
132−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr "Potvrdit"
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr "Hledat"
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr "Zadejte prosím %1"
po/da.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr ""
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr ""
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr ""
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr ""
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr ""
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
po/de.po+55−45
@@ -7,24 +7,24 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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-01-15 11:01+0000\n"
12−"Last-Translator: Dennis Baudys <Unknown>\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"PO-Revision-Date: 2014-06-06 19:34+0000\n"
12+"Last-Translator: Phillip Sz <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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
2222msgid "Lock to Launcher"
23−msgstr ""
23+msgstr "Im Starter sperren"
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
2626msgid "Unlock from Launcher"
27−msgstr ""
27+msgstr "Aus dem Starter entsperren"
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -32,19 +32,20 @@ msgstr "Einführung überspringen"
3232
3333#: qml/Components/EdgeDemo.qml:113
3434msgid "Right edge"
35−msgstr "Rechter Rand"
35+msgstr "Rechter Bildschirmrand"
3636
3737#: qml/Components/EdgeDemo.qml:114
3838msgid "Try swiping from the right edge to unlock the phone"
39−msgstr "Vom rechten Rand her wischen, um das Gerät zu entsperren"
39+msgstr "Vom rechten Bildschirmrand her wischen, um das Gerät zu entsperren"
4040
4141#: qml/Components/EdgeDemo.qml:145
4242msgid "Top edge"
43−msgstr "Oberer Rand"
43+msgstr "Oberer Bildschirmrand"
4444
4545#: qml/Components/EdgeDemo.qml:146
4646msgid "Try swiping from the top edge to access the indicators"
47−msgstr "Vom oberen Rand her wischen, um die Statusmeldungen anzuzeigen"
47+msgstr ""
48+"Vom oberen Bildschirmrand her wischen, um die Statusmeldungen anzuzeigen"
4849
4950#: qml/Components/EdgeDemo.qml:171
5051msgid "Close"
@@ -52,7 +53,7 @@ msgstr "Schließen"
5253
5354#: qml/Components/EdgeDemo.qml:172
5455msgid "Swipe up again to close the settings screen"
55−msgstr "Nochmals nach oben wischen, um das Einstellungsmenü zu schließen"
56+msgstr "Wischen Sie erneut nach oben, um das Einstellungsmenü zu schließen"
5657
5758#: qml/Components/EdgeDemo.qml:199
5859msgid "Left edge"
@@ -61,8 +62,8 @@ msgstr "Linker Rand"
6162#: qml/Components/EdgeDemo.qml:200
6263msgid "Swipe from the left to reveal the launcher for quick access to apps"
6364msgstr ""
64−"Von links wischen, um die Seitenleiste für den Anwendungs-Schnellzugriff "
65−"aufzurufen"
65+"Wischen Sie von links nach rechts, um die Seitenleiste für den Anwendungs-"
66+"Schnellzugriff aufzurufen"
6667
6768#: qml/Components/EdgeDemo.qml:227
6869msgid "Well done"
@@ -73,64 +74,73 @@ msgid ""
7374"You have now mastered the edge gestures and can start using the "
7475"phone<br><br>Tap on the screen to start"
7576msgstr ""
77+"Sie haben nun die Kantengesten erfolgreich erlernt und können das Telefon "
78+"nun nutzen<br><br>Zum Starten auf den Bildschirm tippen"
79+
80+#: qml/Components/Lockscreen.qml:214
81+msgid "Emergency Call"
82+msgstr "Notruf"
83+
84+#: qml/Components/Lockscreen.qml:231
85+msgid "OK"
86+msgstr ""
7687
7788#: qml/Components/PageHeader.qml:365
7889msgid "Recent searches"
79−msgstr "Letzte Suchbegriffe"
90+msgstr "Zuletzt verwendete Suchbegriffe"
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+#, qt-format
94+msgid "Hello %1"
95+msgstr "Hallo %1"
96+
97+#: qml/Components/PassphraseLockscreen.qml:60
98+msgid "Hello"
99+msgstr "Hallo"
100+
101+#: qml/Components/PinLockscreen.qml:198
102+msgid "CANCEL"
103+msgstr ""
104+
105+#: qml/Components/PinLockscreen.qml:216
106+msgid "DONE"
107+msgstr ""
80108
81109#: qml/Components/SeeMore.qml:35
82110msgid "See more"
83−msgstr ""
111+msgstr "Mehr ansehen"
84112
85113#: qml/Components/SeeMore.qml:58
86114msgid "See less"
87−msgstr ""
115+msgstr "Weniger ansehen"
88116
89117#: qml/Dash/DashApps.qml:37
90118msgid "Recent"
91−msgstr ""
92−
93−#: qml/Dash/PreviewListView.qml:52
94−#, qt-format
95−msgid "%1 Preview"
96−msgstr ""
119+msgstr "Kürzlich"
97120
98121#: qml/Dash/Previews/PreviewActionCombo.qml:34
99122msgid "More..."
100−msgstr ""
123+msgstr "Mehr …"
101124
102125#: qml/Dash/Previews/PreviewActionCombo.qml:34
103126msgid "Less..."
104−msgstr ""
127+msgstr "Weniger …"
105128
106−#: qml/Dash/Previews/PreviewRatingInput.qml:81
129+#: qml/Dash/Previews/PreviewRatingInput.qml:82
107130msgid "Rate this"
108131msgstr "Bewerten"
109132
110−#: qml/Dash/Previews/PreviewRatingInput.qml:126
133+#: qml/Dash/Previews/PreviewRatingInput.qml:128
111134msgid "Add a review"
112135msgstr "Bewertung hinzufügen"
113136
114−#: qml/Dash/Previews/PreviewRatingInput.qml:166
137+#: qml/Dash/Previews/PreviewRatingInput.qml:168
115138msgid "Send"
116139msgstr "Senden"
117140
118−#: qml/Greeter/Greeter.qml:151
141+#: qml/Greeter/Greeter.qml:157
119142msgid "Swipe to unlock"
120−msgstr ""
121−
122−#: qml/Greeter/Lockscreen.qml:149
123−msgid "Emergency Call"
124−msgstr "Notruf"
125−
126−#: qml/Greeter/PassphraseLockscreen.qml:59
127−#, qt-format
128−msgid "Hello %1"
129−msgstr "Hallo %1"
130−
131−#: qml/Greeter/PassphraseLockscreen.qml:59
132−msgid "Hello"
133−msgstr "Hallo"
143+msgstr "Wischen zum Entsperren"
134144
135145#: qml/Hud/HudParametrizedActionsPage.qml:132
136146msgid "Confirm"
@@ -158,13 +168,13 @@ msgstr "Passwort anzeigen"
158168
159169#: qml/Notifications/NotificationMenuItemFactory.qml:103
160170msgid "Please enter SIM PIN"
161−msgstr ""
171+msgstr "Bitte die PIN der SIM eingeben"
162172
163173#: qml/Panel/SearchIndicator.qml:27
164174msgid "Search"
165175msgstr "Suchen"
166176
167−#: qml/Shell.qml:348
177+#: qml/Shell.qml:334
168178#, qt-format
169179msgid "Please enter %1"
170180msgstr "Bitte geben Sie %1 ein"
po/el.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -76,10 +76,35 @@ msgstr ""
7676"Πλέον γνωρίζετε τις χειρονομίες από τα άκρα και μπορείτε να ξεκινήσετε να "
7777"χρησιμοποιείτε το τηλέφωνο<br><br>Αγγίξτε την οθόνη για να ξεκινήσετε"
7878
79+#: qml/Components/Lockscreen.qml:214
80+msgid "Emergency Call"
81+msgstr "Κλήση έκτακτης ανάγκης"
82+
83+#: qml/Components/Lockscreen.qml:231
84+msgid "OK"
85+msgstr ""
86+
7987#: qml/Components/PageHeader.qml:365
8088msgid "Recent searches"
8189msgstr "Πρόσφατες αναζητήσεις"
8290
91+#: qml/Components/PassphraseLockscreen.qml:60
92+#, qt-format
93+msgid "Hello %1"
94+msgstr "Γεια σας %1"
95+
96+#: qml/Components/PassphraseLockscreen.qml:60
97+msgid "Hello"
98+msgstr "Γεια σας"
99+
100+#: qml/Components/PinLockscreen.qml:198
101+msgid "CANCEL"
102+msgstr ""
103+
104+#: qml/Components/PinLockscreen.qml:216
105+msgid "DONE"
106+msgstr ""
107+
83108#: qml/Components/SeeMore.qml:35
84109msgid "See more"
85110msgstr "Περρισότερα"
@@ -92,11 +117,6 @@ msgstr "Λιγότερα"
92117msgid "Recent"
93118msgstr ""
94119
95−#: qml/Dash/PreviewListView.qml:52
96−#, qt-format
97−msgid "%1 Preview"
98−msgstr ""
99−
100120#: qml/Dash/Previews/PreviewActionCombo.qml:34
101121msgid "More..."
102122msgstr ""
@@ -105,35 +125,22 @@ msgstr ""
105125msgid "Less..."
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:81
128+#: qml/Dash/Previews/PreviewRatingInput.qml:82
109129msgid "Rate this"
110130msgstr "Βαθμολογήστε το"
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:126
132+#: qml/Dash/Previews/PreviewRatingInput.qml:128
113133msgid "Add a review"
114134msgstr "Προσθέστε την αξιολόγησή σας"
115135
116−#: qml/Dash/Previews/PreviewRatingInput.qml:166
136+#: qml/Dash/Previews/PreviewRatingInput.qml:168
117137msgid "Send"
118138msgstr "Αποστολή"
119139
120−#: qml/Greeter/Greeter.qml:151
140+#: qml/Greeter/Greeter.qml:157
121141msgid "Swipe to unlock"
122142msgstr ""
123143
124−#: qml/Greeter/Lockscreen.qml:149
125−msgid "Emergency Call"
126−msgstr "Κλήση έκτακτης ανάγκης"
127−
128−#: qml/Greeter/PassphraseLockscreen.qml:59
129−#, qt-format
130−msgid "Hello %1"
131−msgstr "Γεια σας %1"
132−
133−#: qml/Greeter/PassphraseLockscreen.qml:59
134−msgid "Hello"
135−msgstr "Γεια σας"
136−
137144#: qml/Hud/HudParametrizedActionsPage.qml:132
138145msgid "Confirm"
139146msgstr "Επιβεβαίωση"
@@ -166,7 +173,7 @@ msgstr "Παρακαλώ εισάγετε το PIN της κάρτας SIM"
166173msgid "Search"
167174msgstr "Αναζήτηση"
168175
169−#: qml/Shell.qml:348
176+#: qml/Shell.qml:334
170177#, qt-format
171178msgid "Please enter %1"
172179msgstr "Πληκτρολογήστε %1"
po/en_AU.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr "Emergency Call"
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr "Recent searches"
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr "Hello %1"
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr "Hello"
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr "Rate this"
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr "Add a review"
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr "Send"
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
120−#: qml/Greeter/Lockscreen.qml:149
121−msgid "Emergency Call"
122−msgstr "Emergency Call"
123−
124−#: qml/Greeter/PassphraseLockscreen.qml:59
125−#, qt-format
126−msgid "Hello %1"
127−msgstr "Hello %1"
128−
129−#: qml/Greeter/PassphraseLockscreen.qml:59
130−msgid "Hello"
131−msgstr "Hello"
132−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr "Confirm"
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr "Search"
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr "Please enter %1"
po/en_GB.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,10 +74,35 @@ msgstr ""
7474"You have now mastered the edge gestures and can start using the "
7575"phone<br><br>Tap on the screen to start"
7676
77+#: qml/Components/Lockscreen.qml:214
78+msgid "Emergency Call"
79+msgstr "Emergency Call"
80+
81+#: qml/Components/Lockscreen.qml:231
82+msgid "OK"
83+msgstr ""
84+
7785#: qml/Components/PageHeader.qml:365
7886msgid "Recent searches"
7987msgstr "Recent searches"
8088
89+#: qml/Components/PassphraseLockscreen.qml:60
90+#, qt-format
91+msgid "Hello %1"
92+msgstr "Hello %1"
93+
94+#: qml/Components/PassphraseLockscreen.qml:60
95+msgid "Hello"
96+msgstr "Hello"
97+
98+#: qml/Components/PinLockscreen.qml:198
99+msgid "CANCEL"
100+msgstr ""
101+
102+#: qml/Components/PinLockscreen.qml:216
103+msgid "DONE"
104+msgstr ""
105+
81106#: qml/Components/SeeMore.qml:35
82107msgid "See more"
83108msgstr "See more"
@@ -90,11 +115,6 @@ msgstr "See less"
90115msgid "Recent"
91116msgstr ""
92117
93−#: qml/Dash/PreviewListView.qml:52
94−#, qt-format
95−msgid "%1 Preview"
96−msgstr ""
97−
98118#: qml/Dash/Previews/PreviewActionCombo.qml:34
99119msgid "More..."
100120msgstr "More..."
@@ -103,35 +123,22 @@ msgstr "More..."
103123msgid "Less..."
104124msgstr "Less..."
105125
106−#: qml/Dash/Previews/PreviewRatingInput.qml:81
126+#: qml/Dash/Previews/PreviewRatingInput.qml:82
107127msgid "Rate this"
108128msgstr "Rate this"
109129
110−#: qml/Dash/Previews/PreviewRatingInput.qml:126
130+#: qml/Dash/Previews/PreviewRatingInput.qml:128
111131msgid "Add a review"
112132msgstr "Add a review"
113133
114−#: qml/Dash/Previews/PreviewRatingInput.qml:166
134+#: qml/Dash/Previews/PreviewRatingInput.qml:168
115135msgid "Send"
116136msgstr "Send"
117137
118−#: qml/Greeter/Greeter.qml:151
138+#: qml/Greeter/Greeter.qml:157
119139msgid "Swipe to unlock"
120140msgstr ""
121141
122−#: qml/Greeter/Lockscreen.qml:149
123−msgid "Emergency Call"
124−msgstr "Emergency Call"
125−
126−#: qml/Greeter/PassphraseLockscreen.qml:59
127−#, qt-format
128−msgid "Hello %1"
129−msgstr "Hello %1"
130−
131−#: qml/Greeter/PassphraseLockscreen.qml:59
132−msgid "Hello"
133−msgstr "Hello"
134−
135142#: qml/Hud/HudParametrizedActionsPage.qml:132
136143msgid "Confirm"
137144msgstr "Confirm"
@@ -164,7 +171,7 @@ msgstr "Please enter SIM PIN"
164171msgid "Search"
165172msgstr "Search"
166173
167−#: qml/Shell.qml:348
174+#: qml/Shell.qml:334
168175#, qt-format
169176msgid "Please enter %1"
170177msgstr "Please enter %1"
po/eo.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr ""
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr ""
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr ""
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr ""
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr ""
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
po/es.po+38−31
@@ -7,24 +7,24 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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-03-28 22:37+0000\n"
12−"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"PO-Revision-Date: 2014-06-02 06:28+0000\n"
12+"Last-Translator: benjisp94 <benjisp94@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-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
2222msgid "Lock to Launcher"
23−msgstr "Mantener en el lanzador"
23+msgstr "Fijar al lanzador"
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
2626msgid "Unlock from Launcher"
27−msgstr "No mantener en el lanzador"
27+msgstr "Quitar del lanzador"
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -77,10 +77,35 @@ msgstr ""
7777"Ahora domina los gestos de los bordes y puede usar el teléfono<br><br>Toque "
7878"la pantalla para comenzar"
7979
80+#: qml/Components/Lockscreen.qml:214
81+msgid "Emergency Call"
82+msgstr "Llamada de emergencia"
83+
84+#: qml/Components/Lockscreen.qml:231
85+msgid "OK"
86+msgstr ""
87+
8088#: qml/Components/PageHeader.qml:365
8189msgid "Recent searches"
8290msgstr "Búsquedas recientes"
8391
92+#: qml/Components/PassphraseLockscreen.qml:60
93+#, qt-format
94+msgid "Hello %1"
95+msgstr "Hola, %1"
96+
97+#: qml/Components/PassphraseLockscreen.qml:60
98+msgid "Hello"
99+msgstr "Hola"
100+
101+#: qml/Components/PinLockscreen.qml:198
102+msgid "CANCEL"
103+msgstr ""
104+
105+#: qml/Components/PinLockscreen.qml:216
106+msgid "DONE"
107+msgstr ""
108+
84109#: qml/Components/SeeMore.qml:35
85110msgid "See more"
86111msgstr "Ver más"
@@ -93,11 +118,6 @@ msgstr "Ver menos"
93118msgid "Recent"
94119msgstr "Recientes"
95120
96−#: qml/Dash/PreviewListView.qml:52
97−#, qt-format
98−msgid "%1 Preview"
99−msgstr "Previsualización de %1"
100−
101121#: qml/Dash/Previews/PreviewActionCombo.qml:34
102122msgid "More..."
103123msgstr "Más…"
@@ -106,34 +126,21 @@ msgstr "Más…"
106126msgid "Less..."
107127msgstr "Menos…"
108128
109−#: qml/Dash/Previews/PreviewRatingInput.qml:81
129+#: qml/Dash/Previews/PreviewRatingInput.qml:82
110130msgid "Rate this"
111131msgstr "Valorar esto"
112132
113−#: qml/Dash/Previews/PreviewRatingInput.qml:126
133+#: qml/Dash/Previews/PreviewRatingInput.qml:128
114134msgid "Add a review"
115135msgstr "Añadir una reseña"
116136
117−#: qml/Dash/Previews/PreviewRatingInput.qml:166
137+#: qml/Dash/Previews/PreviewRatingInput.qml:168
118138msgid "Send"
119139msgstr "Enviar"
120140
121−#: qml/Greeter/Greeter.qml:151
141+#: qml/Greeter/Greeter.qml:157
122142msgid "Swipe to unlock"
123−msgstr ""
124−
125−#: qml/Greeter/Lockscreen.qml:149
126−msgid "Emergency Call"
127−msgstr "Llamada de emergencia"
128−
129−#: qml/Greeter/PassphraseLockscreen.qml:59
130−#, qt-format
131−msgid "Hello %1"
132−msgstr "Hola, %1"
133−
134−#: qml/Greeter/PassphraseLockscreen.qml:59
135−msgid "Hello"
136−msgstr "Hola"
143+msgstr "Deslice para desbloquear"
137144
138145#: qml/Hud/HudParametrizedActionsPage.qml:132
139146msgid "Confirm"
@@ -167,7 +174,7 @@ msgstr "Escriba el PIN de la SIM"
167174msgid "Search"
168175msgstr "Buscar"
169176
170−#: qml/Shell.qml:348
177+#: qml/Shell.qml:334
171178#, qt-format
172179msgid "Please enter %1"
173180msgstr "Introduzca %1"
po/eu.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -76,10 +76,35 @@ msgstr ""
7676"Jadanik ezagutzen dituzu ertzetako keinuak, eta mugikorra erabiltzen has "
7777"zaitezke<br><br>Ukitu pantaila hasteko"
7878
79+#: qml/Components/Lockscreen.qml:214
80+msgid "Emergency Call"
81+msgstr "Larrialdi-deia"
82+
83+#: qml/Components/Lockscreen.qml:231
84+msgid "OK"
85+msgstr ""
86+
7987#: qml/Components/PageHeader.qml:365
8088msgid "Recent searches"
8189msgstr "Azken bilaketak"
8290
91+#: qml/Components/PassphraseLockscreen.qml:60
92+#, qt-format
93+msgid "Hello %1"
94+msgstr "Kaixo %1"
95+
96+#: qml/Components/PassphraseLockscreen.qml:60
97+msgid "Hello"
98+msgstr "Kaixo"
99+
100+#: qml/Components/PinLockscreen.qml:198
101+msgid "CANCEL"
102+msgstr ""
103+
104+#: qml/Components/PinLockscreen.qml:216
105+msgid "DONE"
106+msgstr ""
107+
83108#: qml/Components/SeeMore.qml:35
84109msgid "See more"
85110msgstr "Ikusi gehiago"
@@ -92,11 +117,6 @@ msgstr "Ikusi gutxiago"
92117msgid "Recent"
93118msgstr "Azkenak"
94119
95−#: qml/Dash/PreviewListView.qml:52
96−#, qt-format
97−msgid "%1 Preview"
98−msgstr "%1 aurrebista"
99−
100120#: qml/Dash/Previews/PreviewActionCombo.qml:34
101121msgid "More..."
102122msgstr "Gehiago..."
@@ -105,35 +125,22 @@ msgstr "Gehiago..."
105125msgid "Less..."
106126msgstr "Gutxiago..."
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:81
128+#: qml/Dash/Previews/PreviewRatingInput.qml:82
109129msgid "Rate this"
110130msgstr "Puntuatu hau"
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:126
132+#: qml/Dash/Previews/PreviewRatingInput.qml:128
113133msgid "Add a review"
114134msgstr "Gehitu kritika"
115135
116−#: qml/Dash/Previews/PreviewRatingInput.qml:166
136+#: qml/Dash/Previews/PreviewRatingInput.qml:168
117137msgid "Send"
118138msgstr "Bidali"
119139
120−#: qml/Greeter/Greeter.qml:151
140+#: qml/Greeter/Greeter.qml:157
121141msgid "Swipe to unlock"
122142msgstr ""
123143
124−#: qml/Greeter/Lockscreen.qml:149
125−msgid "Emergency Call"
126−msgstr "Larrialdi-deia"
127−
128−#: qml/Greeter/PassphraseLockscreen.qml:59
129−#, qt-format
130−msgid "Hello %1"
131−msgstr "Kaixo %1"
132−
133−#: qml/Greeter/PassphraseLockscreen.qml:59
134−msgid "Hello"
135−msgstr "Kaixo"
136−
137144#: qml/Hud/HudParametrizedActionsPage.qml:132
138145msgid "Confirm"
139146msgstr "Baieztatu"
@@ -166,7 +173,7 @@ msgstr "Sartu SIMaren PINa"
166173msgid "Search"
167174msgstr "Bilatu"
168175
169−#: qml/Shell.qml:348
176+#: qml/Shell.qml:334
170177#, qt-format
171178msgid "Please enter %1"
172179msgstr "Sartu %1"
po/fa.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr ""
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr ""
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr ""
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr ""
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr ""
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
po/fi.po+35−28
@@ -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-04-10 11:13-0400\n"
11−"PO-Revision-Date: 2014-04-05 09:57+0000\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"PO-Revision-Date: 2014-06-14 10:23+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-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,10 +74,35 @@ msgstr ""
7474"Hallitset nyt reunaeleet, joten voit aloittaa puhelimen "
7575"käytön<br><br>Napauta näyttöä aloittaaksesi"
7676
77+#: qml/Components/Lockscreen.qml:214
78+msgid "Emergency Call"
79+msgstr "Hätäpuhelu"
80+
81+#: qml/Components/Lockscreen.qml:231
82+msgid "OK"
83+msgstr "OK"
84+
7785#: qml/Components/PageHeader.qml:365
7886msgid "Recent searches"
7987msgstr "Viimeisimmät haut"
8088
89+#: qml/Components/PassphraseLockscreen.qml:60
90+#, qt-format
91+msgid "Hello %1"
92+msgstr "Hei %1!"
93+
94+#: qml/Components/PassphraseLockscreen.qml:60
95+msgid "Hello"
96+msgstr "Hei"
97+
98+#: qml/Components/PinLockscreen.qml:198
99+msgid "CANCEL"
100+msgstr "PERU"
101+
102+#: qml/Components/PinLockscreen.qml:216
103+msgid "DONE"
104+msgstr "VALMIS"
105+
81106#: qml/Components/SeeMore.qml:35
82107msgid "See more"
83108msgstr "Näytä lisää"
@@ -90,11 +115,6 @@ msgstr "Näytä vähemmän"
90115msgid "Recent"
91116msgstr "Viimeisimmät"
92117
93−#: qml/Dash/PreviewListView.qml:52
94−#, qt-format
95−msgid "%1 Preview"
96−msgstr "%1 esikatselu"
97−
98118#: qml/Dash/Previews/PreviewActionCombo.qml:34
99119msgid "More..."
100120msgstr "Lisää..."
@@ -103,34 +123,21 @@ msgstr "Lisää..."
103123msgid "Less..."
104124msgstr "Vähemmän..."
105125
106−#: qml/Dash/Previews/PreviewRatingInput.qml:81
126+#: qml/Dash/Previews/PreviewRatingInput.qml:82
107127msgid "Rate this"
108128msgstr "Arvioi tämä"
109129
110−#: qml/Dash/Previews/PreviewRatingInput.qml:126
130+#: qml/Dash/Previews/PreviewRatingInput.qml:128
111131msgid "Add a review"
112132msgstr "Lisää arvostelu"
113133
114−#: qml/Dash/Previews/PreviewRatingInput.qml:166
134+#: qml/Dash/Previews/PreviewRatingInput.qml:168
115135msgid "Send"
116136msgstr "Lähetä"
117137
118−#: qml/Greeter/Greeter.qml:151
138+#: qml/Greeter/Greeter.qml:157
119139msgid "Swipe to unlock"
120−msgstr ""
121−
122−#: qml/Greeter/Lockscreen.qml:149
123−msgid "Emergency Call"
124−msgstr "Hätäpuhelu"
125−
126−#: qml/Greeter/PassphraseLockscreen.qml:59
127−#, qt-format
128−msgid "Hello %1"
129−msgstr "Hei %1!"
130−
131−#: qml/Greeter/PassphraseLockscreen.qml:59
132−msgid "Hello"
133−msgstr "Hei"
140+msgstr "Avaa pyyhkäisemällä"
134141
135142#: qml/Hud/HudParametrizedActionsPage.qml:132
136143msgid "Confirm"
@@ -164,7 +171,7 @@ msgstr "Anna SIM-kortin PIN-koodi"
164171msgid "Search"
165172msgstr "Hae"
166173
167−#: qml/Shell.qml:348
174+#: qml/Shell.qml:334
168175#, qt-format
169176msgid "Please enter %1"
170177msgstr "Kirjoita %1"
po/fo.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr ""
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr ""
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr ""
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr "Vátta"
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr "Leita"
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
po/fr.po+54−38
@@ -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-04-10 11:13-0400\n"
11−"PO-Revision-Date: 2014-01-28 00:34+0000\n"
12−"Last-Translator: Pierre <Unknown>\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"PO-Revision-Date: 2014-06-08 20:45+0000\n"
12+"Last-Translator: Pierre Slamich <pierre.slamich@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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -24,7 +24,7 @@ msgstr "Conserver dans le lanceur"
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
2626msgid "Unlock from Launcher"
27−msgstr ""
27+msgstr "Retirer du lanceur"
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -37,6 +37,7 @@ msgstr "Bord droit"
3737#: qml/Components/EdgeDemo.qml:114
3838msgid "Try swiping from the right edge to unlock the phone"
3939msgstr ""
40+"Faites glisser votre doigt à partir du bord droit pour déverrouiller."
4041
4142#: qml/Components/EdgeDemo.qml:145
4243msgid "Top edge"
@@ -45,6 +46,8 @@ msgstr "Bord supérieur"
4546#: qml/Components/EdgeDemo.qml:146
4647msgid "Try swiping from the top edge to access the indicators"
4748msgstr ""
49+"Faites glisser votre doigt à partir du bord supérieur pour accéder aux "
50+"indicateurs."
4851
4952#: qml/Components/EdgeDemo.qml:171
5053msgid "Close"
@@ -53,6 +56,8 @@ msgstr "Fermer"
5356#: qml/Components/EdgeDemo.qml:172
5457msgid "Swipe up again to close the settings screen"
5558msgstr ""
59+"Faites glisser à nouveau votre doigt vers le bord supérieur pour fermer "
60+"l'écran des paramètres"
5661
5762#: qml/Components/EdgeDemo.qml:199
5863msgid "Left edge"
@@ -61,74 +66,85 @@ msgstr "Bord gauche"
6166#: qml/Components/EdgeDemo.qml:200
6267msgid "Swipe from the left to reveal the launcher for quick access to apps"
6368msgstr ""
69+"Faites glisser votre doigt à partir du bord gauche pour afficher le lanceur "
70+"d'applications."
6471
6572#: qml/Components/EdgeDemo.qml:227
6673msgid "Well done"
67−msgstr ""
74+msgstr "Félicitations"
6875
6976#: qml/Components/EdgeDemo.qml:228
7077msgid ""
7178"You have now mastered the edge gestures and can start using the "
7279"phone<br><br>Tap on the screen to start"
7380msgstr ""
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"
83+
84+#: qml/Components/Lockscreen.qml:214
85+msgid "Emergency Call"
86+msgstr "Appel d'urgence"
87+
88+#: qml/Components/Lockscreen.qml:231
89+msgid "OK"
90+msgstr "OK"
7491
7592#: qml/Components/PageHeader.qml:365
7693msgid "Recent searches"
7794msgstr "Recherches récentes"
7895
96+#: qml/Components/PassphraseLockscreen.qml:60
97+#, qt-format
98+msgid "Hello %1"
99+msgstr "Bonjour %1"
100+
101+#: qml/Components/PassphraseLockscreen.qml:60
102+msgid "Hello"
103+msgstr "Bonjour"
104+
105+#: qml/Components/PinLockscreen.qml:198
106+msgid "CANCEL"
107+msgstr "ANNULER"
108+
109+#: qml/Components/PinLockscreen.qml:216
110+msgid "DONE"
111+msgstr "TERMINÉ"
112+
79113#: qml/Components/SeeMore.qml:35
80114msgid "See more"
81−msgstr ""
115+msgstr "Voir plus"
82116
83117#: qml/Components/SeeMore.qml:58
84118msgid "See less"
85−msgstr ""
119+msgstr "Voir moins"
86120
87121#: qml/Dash/DashApps.qml:37
88122msgid "Recent"
89−msgstr ""
90−
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
123+msgstr "Récent"
95124
96125#: qml/Dash/Previews/PreviewActionCombo.qml:34
97126msgid "More..."
98−msgstr ""
127+msgstr "Plus..."
99128
100129#: qml/Dash/Previews/PreviewActionCombo.qml:34
101130msgid "Less..."
102−msgstr ""
131+msgstr "Moins..."
103132
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
133+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105134msgid "Rate this"
106135msgstr "Evaluez ceci"
107136
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
137+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109138msgid "Add a review"
110139msgstr "Ajouter un avis"
111140
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
141+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113142msgid "Send"
114143msgstr "Envoyer"
115144
116−#: qml/Greeter/Greeter.qml:151
145+#: qml/Greeter/Greeter.qml:157
117146msgid "Swipe to unlock"
118−msgstr ""
119−
120−#: qml/Greeter/Lockscreen.qml:149
121−msgid "Emergency Call"
122−msgstr "Appel d'urgence"
123−
124−#: qml/Greeter/PassphraseLockscreen.qml:59
125−#, qt-format
126−msgid "Hello %1"
127−msgstr "Bonjour %1"
128−
129−#: qml/Greeter/PassphraseLockscreen.qml:59
130−msgid "Hello"
131−msgstr "Bonjour"
147+msgstr "Faites glisser pour déverrouiller"
132148
133149#: qml/Hud/HudParametrizedActionsPage.qml:132
134150msgid "Confirm"
@@ -148,7 +164,7 @@ msgstr "Parlez maintenant…"
148164
149165#: qml/Hud/Hud.qml:94
150166msgid "Speaking..."
151−msgstr ""
167+msgstr "En cours d'écoute..."
152168
153169#: qml/Notifications/NotificationMenuItemFactory.qml:91
154170msgid "Show password"
@@ -156,13 +172,13 @@ msgstr "Afficher le mot de passe"
156172
157173#: qml/Notifications/NotificationMenuItemFactory.qml:103
158174msgid "Please enter SIM PIN"
159−msgstr ""
175+msgstr "Veuillez entrer le code PIN de votre carte SIM"
160176
161177#: qml/Panel/SearchIndicator.qml:27
162178msgid "Search"
163179msgstr "Rechercher"
164180
165−#: qml/Shell.qml:348
181+#: qml/Shell.qml:334
166182#, qt-format
167183msgid "Please enter %1"
168184msgstr "Veuillez saisir %1"
po/gd.po+46−37
@@ -7,24 +7,24 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11−"PO-Revision-Date: 2013-09-30 10:34+0000\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"PO-Revision-Date: 2014-05-17 21:08+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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
2222msgid "Lock to Launcher"
23−msgstr ""
23+msgstr "Glais ris an lòinsear"
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
2626msgid "Unlock from Launcher"
27−msgstr ""
27+msgstr "Dealaich on lòinsear"
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -77,64 +77,73 @@ msgid ""
7777"You have now mastered the edge gestures and can start using the "
7878"phone<br><br>Tap on the screen to start"
7979msgstr ""
80+"Fhuair thu air na gluasadan oire ceart a dhèanamh a-nis agus is urrainn dhut "
81+"am fòn a chleachdadh<br><br>Thoir gnogag air an sgrìn airson tòiseachadh"
82+
83+#: qml/Components/Lockscreen.qml:214
84+msgid "Emergency Call"
85+msgstr "Gairm èiginn"
86+
87+#: qml/Components/Lockscreen.qml:231
88+msgid "OK"
89+msgstr ""
8090
8191#: qml/Components/PageHeader.qml:365
8292msgid "Recent searches"
8393msgstr "Na lorg thu o chionn goirid"
8494
95+#: qml/Components/PassphraseLockscreen.qml:60
96+#, qt-format
97+msgid "Hello %1"
98+msgstr "Shin thu, %1"
99+
100+#: qml/Components/PassphraseLockscreen.qml:60
101+msgid "Hello"
102+msgstr "Shin thu"
103+
104+#: qml/Components/PinLockscreen.qml:198
105+msgid "CANCEL"
106+msgstr ""
107+
108+#: qml/Components/PinLockscreen.qml:216
109+msgid "DONE"
110+msgstr ""
111+
85112#: qml/Components/SeeMore.qml:35
86113msgid "See more"
87−msgstr ""
114+msgstr "Seall barrachd"
88115
89116#: qml/Components/SeeMore.qml:58
90117msgid "See less"
91−msgstr ""
118+msgstr "Seall nas lugha"
92119
93120#: qml/Dash/DashApps.qml:37
94121msgid "Recent"
95−msgstr ""
96−
97−#: qml/Dash/PreviewListView.qml:52
98−#, qt-format
99−msgid "%1 Preview"
100−msgstr ""
122+msgstr "O chionn goirid"
101123
102124#: qml/Dash/Previews/PreviewActionCombo.qml:34
103125msgid "More..."
104−msgstr ""
126+msgstr "Barrachd..."
105127
106128#: qml/Dash/Previews/PreviewActionCombo.qml:34
107129msgid "Less..."
108−msgstr ""
130+msgstr "Nas lugha..."
109131
110−#: qml/Dash/Previews/PreviewRatingInput.qml:81
132+#: qml/Dash/Previews/PreviewRatingInput.qml:82
111133msgid "Rate this"
112134msgstr "Rangaich seo"
113135
114−#: qml/Dash/Previews/PreviewRatingInput.qml:126
136+#: qml/Dash/Previews/PreviewRatingInput.qml:128
115137msgid "Add a review"
116138msgstr "Cuir lèirmheas ris"
117139
118−#: qml/Dash/Previews/PreviewRatingInput.qml:166
140+#: qml/Dash/Previews/PreviewRatingInput.qml:168
119141msgid "Send"
120142msgstr "Cuir"
121143
122−#: qml/Greeter/Greeter.qml:151
144+#: qml/Greeter/Greeter.qml:157
123145msgid "Swipe to unlock"
124−msgstr ""
125−
126−#: qml/Greeter/Lockscreen.qml:149
127−msgid "Emergency Call"
128−msgstr "Gairm èiginn"
129−
130−#: qml/Greeter/PassphraseLockscreen.qml:59
131−#, qt-format
132−msgid "Hello %1"
133−msgstr "Shin thu, %1"
134−
135−#: qml/Greeter/PassphraseLockscreen.qml:59
136−msgid "Hello"
137−msgstr "Shin thu"
146+msgstr "Dèan grad-shlaighdeadh gus a' ghlas a thoirt dheth"
138147
139148#: qml/Hud/HudParametrizedActionsPage.qml:132
140149msgid "Confirm"
@@ -158,17 +167,17 @@ msgstr "A' bruidhinn..."
158167
159168#: qml/Notifications/NotificationMenuItemFactory.qml:91
160169msgid "Show password"
161−msgstr ""
170+msgstr "Seall am facal-faire"
162171
163172#: qml/Notifications/NotificationMenuItemFactory.qml:103
164173msgid "Please enter SIM PIN"
165−msgstr ""
174+msgstr "Cuir a-steach SIM PIN"
166175
167176#: qml/Panel/SearchIndicator.qml:27
168177msgid "Search"
169178msgstr "Lorg"
170179
171−#: qml/Shell.qml:348
180+#: qml/Shell.qml:334
172181#, qt-format
173182msgid "Please enter %1"
174183msgstr "Cuir a-steach %1"
po/gl.po+38−31
@@ -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-04-10 11:13-0400\n"
11−"PO-Revision-Date: 2014-04-08 07:04+0000\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"PO-Revision-Date: 2014-06-07 13:26+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-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -36,7 +36,7 @@ msgstr "Bordo dereito"
3636
3737#: qml/Components/EdgeDemo.qml:114
3838msgid "Try swiping from the right edge to unlock the phone"
39−msgstr "Probe o arrastre desde o bordo dereito para desbloquear o teléfono"
39+msgstr "Probe a esvarar desde o bordo dereito para desbloquear o teléfono"
4040
4141#: qml/Components/EdgeDemo.qml:145
4242msgid "Top edge"
@@ -71,13 +71,38 @@ msgid ""
7171"You have now mastered the edge gestures and can start using the "
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
74−"Agora xa domina os xestos do bordo e pode comezar a usar o "
74+"Agora xa domina os xestos dos bordos e pode comezar a usar o "
7575"teléfono<br><br>Toque na pantalla para comezar"
7676
77+#: qml/Components/Lockscreen.qml:214
78+msgid "Emergency Call"
79+msgstr "Chamada de emerxencia"
80+
81+#: qml/Components/Lockscreen.qml:231
82+msgid "OK"
83+msgstr "Aceptar"
84+
7785#: qml/Components/PageHeader.qml:365
7886msgid "Recent searches"
7987msgstr "Buscas recentes"
8088
89+#: qml/Components/PassphraseLockscreen.qml:60
90+#, qt-format
91+msgid "Hello %1"
92+msgstr "Ola %1"
93+
94+#: qml/Components/PassphraseLockscreen.qml:60
95+msgid "Hello"
96+msgstr "Ola"
97+
98+#: qml/Components/PinLockscreen.qml:198
99+msgid "CANCEL"
100+msgstr "CANCELAR"
101+
102+#: qml/Components/PinLockscreen.qml:216
103+msgid "DONE"
104+msgstr "FEITO"
105+
81106#: qml/Components/SeeMore.qml:35
82107msgid "See more"
83108msgstr "Ver máis"
@@ -90,11 +115,6 @@ msgstr "Ver menos"
90115msgid "Recent"
91116msgstr "Recentes"
92117
93−#: qml/Dash/PreviewListView.qml:52
94−#, qt-format
95−msgid "%1 Preview"
96−msgstr "%1 previsualización"
97−
98118#: qml/Dash/Previews/PreviewActionCombo.qml:34
99119msgid "More..."
100120msgstr "Máis…"
@@ -103,34 +123,21 @@ msgstr "Máis…"
103123msgid "Less..."
104124msgstr "Menos..."
105125
106−#: qml/Dash/Previews/PreviewRatingInput.qml:81
126+#: qml/Dash/Previews/PreviewRatingInput.qml:82
107127msgid "Rate this"
108128msgstr "Valore isto"
109129
110−#: qml/Dash/Previews/PreviewRatingInput.qml:126
130+#: qml/Dash/Previews/PreviewRatingInput.qml:128
111131msgid "Add a review"
112132msgstr "Engadir unha opinión"
113133
114−#: qml/Dash/Previews/PreviewRatingInput.qml:166
134+#: qml/Dash/Previews/PreviewRatingInput.qml:168
115135msgid "Send"
116136msgstr "Enviar"
117137
118−#: qml/Greeter/Greeter.qml:151
138+#: qml/Greeter/Greeter.qml:157
119139msgid "Swipe to unlock"
120−msgstr ""
121−
122−#: qml/Greeter/Lockscreen.qml:149
123−msgid "Emergency Call"
124−msgstr "Chamada de emerxencia"
125−
126−#: qml/Greeter/PassphraseLockscreen.qml:59
127−#, qt-format
128−msgid "Hello %1"
129−msgstr "Ola %1"
130−
131−#: qml/Greeter/PassphraseLockscreen.qml:59
132−msgid "Hello"
133−msgstr "Ola"
140+msgstr "Esvare para desbloquear"
134141
135142#: qml/Hud/HudParametrizedActionsPage.qml:132
136143msgid "Confirm"
@@ -142,7 +149,7 @@ msgstr "Escriba ou diga unha orde"
142149
143150#: qml/Hud/Hud.qml:84
144151msgid "Loading. Please Wait..."
145−msgstr "Cargando. Agarde…"
152+msgstr "Cargando, agarde…"
146153
147154#: qml/Hud/Hud.qml:89
148155msgid "Speak Now..."
@@ -164,7 +171,7 @@ msgstr "Introduza o PIN da SIM"
164171msgid "Search"
165172msgstr "Buscar"
166173
167−#: qml/Shell.qml:348
174+#: qml/Shell.qml:334
168175#, qt-format
169176msgid "Please enter %1"
170177msgstr "Introduza %1"
po/he.po+43−34
@@ -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-04-10 11:13-0400\n"
11−"PO-Revision-Date: 2013-11-20 08:30+0000\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"PO-Revision-Date: 2014-06-09 07:49+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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -71,64 +71,73 @@ msgid ""
7171"You have now mastered the edge gestures and can start using the "
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
74+"ברגעים אלו סיימת את התמחותך בשימוש במחוות קצה והטלפון פתוח לשימושך<br><br>נא "
75+"לגעת במסך כדי להתחיל"
76+
77+#: qml/Components/Lockscreen.qml:214
78+msgid "Emergency Call"
79+msgstr "שיחת חירום"
80+
81+#: qml/Components/Lockscreen.qml:231
82+msgid "OK"
83+msgstr "אישור"
7484
7585#: qml/Components/PageHeader.qml:365
7686msgid "Recent searches"
7787msgstr "חיפושים אחרונים"
7888
89+#: qml/Components/PassphraseLockscreen.qml:60
90+#, qt-format
91+msgid "Hello %1"
92+msgstr "שלום %1"
93+
94+#: qml/Components/PassphraseLockscreen.qml:60
95+msgid "Hello"
96+msgstr "שלום"
97+
98+#: qml/Components/PinLockscreen.qml:198
99+msgid "CANCEL"
100+msgstr "ביטול"
101+
102+#: qml/Components/PinLockscreen.qml:216
103+msgid "DONE"
104+msgstr "בוצע"
105+
79106#: qml/Components/SeeMore.qml:35
80107msgid "See more"
81−msgstr ""
108+msgstr "לראות עוד"
82109
83110#: qml/Components/SeeMore.qml:58
84111msgid "See less"
85−msgstr ""
112+msgstr "לראות פחות"
86113
87114#: qml/Dash/DashApps.qml:37
88115msgid "Recent"
89−msgstr ""
90−
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
116+msgstr "בשימוש לאחרונה"
95117
96118#: qml/Dash/Previews/PreviewActionCombo.qml:34
97119msgid "More..."
98−msgstr ""
120+msgstr "עוד…"
99121
100122#: qml/Dash/Previews/PreviewActionCombo.qml:34
101123msgid "Less..."
102−msgstr ""
124+msgstr "פחות…"
103125
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
126+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105127msgid "Rate this"
106128msgstr "דירוג היישום"
107129
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
130+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109131msgid "Add a review"
110132msgstr "הוספת סקירה"
111133
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
134+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113135msgid "Send"
114136msgstr "שליחה"
115137
116−#: qml/Greeter/Greeter.qml:151
138+#: qml/Greeter/Greeter.qml:157
117139msgid "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 "שלום %1"
128−
129−#: qml/Greeter/PassphraseLockscreen.qml:59
130−msgid "Hello"
131−msgstr "שלום"
140+msgstr "יש להחליק לפתיחה"
132141
133142#: qml/Hud/HudParametrizedActionsPage.qml:132
134143msgid "Confirm"
@@ -156,13 +165,13 @@ msgstr "הצגת הססמה"
156165
157166#: qml/Notifications/NotificationMenuItemFactory.qml:103
158167msgid "Please enter SIM PIN"
159−msgstr ""
168+msgstr "נא להזין את קוד ה־<U+200F>SIM"
160169
161170#: qml/Panel/SearchIndicator.qml:27
162171msgid "Search"
163172msgstr "חיפוש"
164173
165−#: qml/Shell.qml:348
174+#: qml/Shell.qml:334
166175#, qt-format
167176msgid "Please enter %1"
168177msgstr "נא להזין %1"
po/hi.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr "आपातकालीन कॉल"
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr "पिछले खोजों"
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr "नमस्ते"
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr "समीक्षा दे"
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr "भेजें"
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr ""
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr "खोजें"
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
po/hr.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr "Nedavne pretrage"
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr ""
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr ""
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr "Potvrdi"
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr "Pretraživanje"
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
po/hu.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,10 +74,35 @@ msgid ""
7474"phone<br><br>Tap on the screen to start"
7575msgstr ""
7676
77+#: qml/Components/Lockscreen.qml:214
78+msgid "Emergency Call"
79+msgstr "Vészhívás"
80+
81+#: qml/Components/Lockscreen.qml:231
82+msgid "OK"
83+msgstr ""
84+
7785#: qml/Components/PageHeader.qml:365
7886msgid "Recent searches"
7987msgstr "Legutóbbi keresések"
8088
89+#: qml/Components/PassphraseLockscreen.qml:60
90+#, qt-format
91+msgid "Hello %1"
92+msgstr "Szia %1"
93+
94+#: qml/Components/PassphraseLockscreen.qml:60
95+msgid "Hello"
96+msgstr "Szia"
97+
98+#: qml/Components/PinLockscreen.qml:198
99+msgid "CANCEL"
100+msgstr ""
101+
102+#: qml/Components/PinLockscreen.qml:216
103+msgid "DONE"
104+msgstr ""
105+
81106#: qml/Components/SeeMore.qml:35
82107msgid "See more"
83108msgstr ""
@@ -90,11 +115,6 @@ msgstr ""
90115msgid "Recent"
91116msgstr ""
92117
93−#: qml/Dash/PreviewListView.qml:52
94−#, qt-format
95−msgid "%1 Preview"
96−msgstr ""
97−
98118#: qml/Dash/Previews/PreviewActionCombo.qml:34
99119msgid "More..."
100120msgstr ""
@@ -103,35 +123,22 @@ msgstr ""
103123msgid "Less..."
104124msgstr ""
105125
106−#: qml/Dash/Previews/PreviewRatingInput.qml:81
126+#: qml/Dash/Previews/PreviewRatingInput.qml:82
107127msgid "Rate this"
108128msgstr "Osztályzás"
109129
110−#: qml/Dash/Previews/PreviewRatingInput.qml:126
130+#: qml/Dash/Previews/PreviewRatingInput.qml:128
111131msgid "Add a review"
112132msgstr "Értékelés hozzáadása"
113133
114−#: qml/Dash/Previews/PreviewRatingInput.qml:166
134+#: qml/Dash/Previews/PreviewRatingInput.qml:168
115135msgid "Send"
116136msgstr "Küldés"
117137
118−#: qml/Greeter/Greeter.qml:151
138+#: qml/Greeter/Greeter.qml:157
119139msgid "Swipe to unlock"
120140msgstr ""
121141
122−#: qml/Greeter/Lockscreen.qml:149
123−msgid "Emergency Call"
124−msgstr "Vészhívás"
125−
126−#: qml/Greeter/PassphraseLockscreen.qml:59
127−#, qt-format
128−msgid "Hello %1"
129−msgstr "Szia %1"
130−
131−#: qml/Greeter/PassphraseLockscreen.qml:59
132−msgid "Hello"
133−msgstr "Szia"
134−
135142#: qml/Hud/HudParametrizedActionsPage.qml:132
136143msgid "Confirm"
137144msgstr "Megerősítés"
@@ -164,7 +171,7 @@ msgstr ""
164171msgid "Search"
165172msgstr "Keresés"
166173
167−#: qml/Shell.qml:348
174+#: qml/Shell.qml:334
168175#, qt-format
169176msgid "Please enter %1"
170177msgstr "Adja meg a következőt: %1"
po/hy.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr "Վերջին որոնումներ"
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr ""
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr ""
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr "Հաստատել"
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr "Որոնում"
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
po/id.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr ""
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr ""
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr ""
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr ""
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr ""
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
po/is.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,10 +73,35 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76+#: qml/Components/Lockscreen.qml:214
77+msgid "Emergency Call"
78+msgstr "Neyðarsímtal"
79+
80+#: qml/Components/Lockscreen.qml:231
81+msgid "OK"
82+msgstr ""
83+
7684#: qml/Components/PageHeader.qml:365
7785msgid "Recent searches"
7886msgstr "Nýlegar leitir"
7987
88+#: qml/Components/PassphraseLockscreen.qml:60
89+#, qt-format
90+msgid "Hello %1"
91+msgstr "Hæ %1"
92+
93+#: qml/Components/PassphraseLockscreen.qml:60
94+msgid "Hello"
95+msgstr "Hæ"
96+
97+#: qml/Components/PinLockscreen.qml:198
98+msgid "CANCEL"
99+msgstr ""
100+
101+#: qml/Components/PinLockscreen.qml:216
102+msgid "DONE"
103+msgstr ""
104+
80105#: qml/Components/SeeMore.qml:35
81106msgid "See more"
82107msgstr ""
@@ -89,11 +114,6 @@ msgstr ""
89114msgid "Recent"
90115msgstr ""
91116
92−#: qml/Dash/PreviewListView.qml:52
93−#, qt-format
94−msgid "%1 Preview"
95−msgstr ""
96−
97117#: qml/Dash/Previews/PreviewActionCombo.qml:34
98118msgid "More..."
99119msgstr ""
@@ -102,35 +122,22 @@ msgstr ""
102122msgid "Less..."
103123msgstr ""
104124
105−#: qml/Dash/Previews/PreviewRatingInput.qml:81
125+#: qml/Dash/Previews/PreviewRatingInput.qml:82
106126msgid "Rate this"
107127msgstr "Gefa þessu einkunn"
108128
109−#: qml/Dash/Previews/PreviewRatingInput.qml:126
129+#: qml/Dash/Previews/PreviewRatingInput.qml:128
110130msgid "Add a review"
111131msgstr "Gefa umsögn"
112132
113−#: qml/Dash/Previews/PreviewRatingInput.qml:166
133+#: qml/Dash/Previews/PreviewRatingInput.qml:168
114134msgid "Send"
115135msgstr "Senda"
116136
117−#: qml/Greeter/Greeter.qml:151
137+#: qml/Greeter/Greeter.qml:157
118138msgid "Swipe to unlock"
119139msgstr ""
120140
121−#: qml/Greeter/Lockscreen.qml:149
122−msgid "Emergency Call"
123−msgstr "Neyðarsímtal"
124−
125−#: qml/Greeter/PassphraseLockscreen.qml:59
126−#, qt-format
127−msgid "Hello %1"
128−msgstr "Hæ %1"
129−
130−#: qml/Greeter/PassphraseLockscreen.qml:59
131−msgid "Hello"
132−msgstr "Hæ"
133−
134141#: qml/Hud/HudParametrizedActionsPage.qml:132
135142msgid "Confirm"
136143msgstr "Staðfesta"
@@ -163,7 +170,7 @@ msgstr ""
163170msgid "Search"
164171msgstr "Leita"
165172
166−#: qml/Shell.qml:348
173+#: qml/Shell.qml:334
167174#, qt-format
168175msgid "Please enter %1"
169176msgstr ""
po/it.po+44−35
@@ -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-04-10 11:13-0400\n"
11−"PO-Revision-Date: 2014-01-22 09:15+0000\n"
12−"Last-Translator: Domenico <domenico.verde125@live.it>\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"PO-Revision-Date: 2014-06-10 12:08+0000\n"
12+"Last-Translator: Claudio Arseni <claudio.arseni@gmail.com>\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -76,64 +76,73 @@ msgid ""
7676"You have now mastered the edge gestures and can start using the "
7777"phone<br><br>Tap on the screen to start"
7878msgstr ""
79+"L'apprendimento dei gesti è stato completato. È ora possibile iniziare a "
80+"usare il telefono.<br><br>Toccare lo schermo per iniziare"
81+
82+#: qml/Components/Lockscreen.qml:214
83+msgid "Emergency Call"
84+msgstr "Chiamata di emergenza"
85+
86+#: qml/Components/Lockscreen.qml:231
87+msgid "OK"
88+msgstr "OK"
7989
8090#: qml/Components/PageHeader.qml:365
8191msgid "Recent searches"
8292msgstr "Ricerche recenti"
8393
94+#: qml/Components/PassphraseLockscreen.qml:60
95+#, qt-format
96+msgid "Hello %1"
97+msgstr "Ciao %1"
98+
99+#: qml/Components/PassphraseLockscreen.qml:60
100+msgid "Hello"
101+msgstr "Ciao"
102+
103+#: qml/Components/PinLockscreen.qml:198
104+msgid "CANCEL"
105+msgstr "Annulla"
106+
107+#: qml/Components/PinLockscreen.qml:216
108+msgid "DONE"
109+msgstr "Fatto"
110+
84111#: qml/Components/SeeMore.qml:35
85112msgid "See more"
86−msgstr ""
113+msgstr "Mostra di più"
87114
88115#: qml/Components/SeeMore.qml:58
89116msgid "See less"
90−msgstr ""
117+msgstr "Mostra meno"
91118
92119#: qml/Dash/DashApps.qml:37
93120msgid "Recent"
94−msgstr ""
95−
96−#: qml/Dash/PreviewListView.qml:52
97−#, qt-format
98−msgid "%1 Preview"
99−msgstr ""
121+msgstr "Recenti"
100122
101123#: qml/Dash/Previews/PreviewActionCombo.qml:34
102124msgid "More..."
103−msgstr ""
125+msgstr "Altro..."
104126
105127#: qml/Dash/Previews/PreviewActionCombo.qml:34
106128msgid "Less..."
107−msgstr ""
129+msgstr "Meno..."
108130
109−#: qml/Dash/Previews/PreviewRatingInput.qml:81
131+#: qml/Dash/Previews/PreviewRatingInput.qml:82
110132msgid "Rate this"
111133msgstr "Valuta"
112134
113−#: qml/Dash/Previews/PreviewRatingInput.qml:126
135+#: qml/Dash/Previews/PreviewRatingInput.qml:128
114136msgid "Add a review"
115137msgstr "Aggiungi una recensione"
116138
117−#: qml/Dash/Previews/PreviewRatingInput.qml:166
139+#: qml/Dash/Previews/PreviewRatingInput.qml:168
118140msgid "Send"
119141msgstr "Invia"
120142
121−#: qml/Greeter/Greeter.qml:151
143+#: qml/Greeter/Greeter.qml:157
122144msgid "Swipe to unlock"
123−msgstr ""
124−
125−#: qml/Greeter/Lockscreen.qml:149
126−msgid "Emergency Call"
127−msgstr "Chiamata di emergenza"
128−
129−#: qml/Greeter/PassphraseLockscreen.qml:59
130−#, qt-format
131−msgid "Hello %1"
132−msgstr "Ciao %1"
133−
134−#: qml/Greeter/PassphraseLockscreen.qml:59
135−msgid "Hello"
136−msgstr "Ciao"
145+msgstr "Scorrere per sbloccare"
137146
138147#: qml/Hud/HudParametrizedActionsPage.qml:132
139148msgid "Confirm"
@@ -161,13 +170,13 @@ msgstr "Mostra password"
161170
162171#: qml/Notifications/NotificationMenuItemFactory.qml:103
163172msgid "Please enter SIM PIN"
164−msgstr ""
173+msgstr "Inserire il codice PIN"
165174
166175#: qml/Panel/SearchIndicator.qml:27
167176msgid "Search"
168177msgstr "Cerca"
169178
170−#: qml/Shell.qml:348
179+#: qml/Shell.qml:334
171180#, qt-format
172181msgid "Please enter %1"
173182msgstr "Inserire %1"
po/ja.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr "最近の検索"
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr "こんにちは"
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr "送信"
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr "確認"
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr "検索"
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
po/km.po+36−29
@@ -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-04-10 11:13-0400\n"
11−"PO-Revision-Date: 2014-03-04 02:32+0000\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"PO-Revision-Date: 2014-05-19 01:42+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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -76,10 +76,35 @@ msgstr ""
7676"ឥឡូវ​អ្នក​បាន​ពិនិត្យ​កាយវិការ​គែម​ "
7777"និង​អាច​ចាប់ផ្ដើម​ប្រើ​ទូរស័ព្ទ<br><br>ប៉ះ លើ​អេក្រង់​ដើម្បី​ចាប់ផ្ដើម"
7878
79+#: qml/Components/Lockscreen.qml:214
80+msgid "Emergency Call"
81+msgstr "ការ​ហៅ​ពេល​អាសន្ន"
82+
83+#: qml/Components/Lockscreen.qml:231
84+msgid "OK"
85+msgstr ""
86+
7987#: qml/Components/PageHeader.qml:365
8088msgid "Recent searches"
8189msgstr "ការ​ស្វែងរក​ថ្មី"
8290
91+#: qml/Components/PassphraseLockscreen.qml:60
92+#, qt-format
93+msgid "Hello %1"
94+msgstr "សួស្ដី %1"
95+
96+#: qml/Components/PassphraseLockscreen.qml:60
97+msgid "Hello"
98+msgstr "សួស្តី"
99+
100+#: qml/Components/PinLockscreen.qml:198
101+msgid "CANCEL"
102+msgstr ""
103+
104+#: qml/Components/PinLockscreen.qml:216
105+msgid "DONE"
106+msgstr ""
107+
83108#: qml/Components/SeeMore.qml:35
84109msgid "See more"
85110msgstr "មើល​ច្រើន​ទៀត"
@@ -90,12 +115,7 @@ msgstr "មើល​តិច​ជាង"
90115
91116#: qml/Dash/DashApps.qml:37
92117msgid "Recent"
93−msgstr ""
94−
95−#: qml/Dash/PreviewListView.qml:52
96−#, qt-format
97−msgid "%1 Preview"
98−msgstr ""
118+msgstr "បច្ចុប្បន្ន"
99119
100120#: qml/Dash/Previews/PreviewActionCombo.qml:34
101121msgid "More..."
@@ -105,34 +125,21 @@ msgstr "ច្រើនជាង​..."
105125msgid "Less..."
106126msgstr "តិច​ជាង..."
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:81
128+#: qml/Dash/Previews/PreviewRatingInput.qml:82
109129msgid "Rate this"
110130msgstr "វាយតម្លៃ​វា"
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:126
132+#: qml/Dash/Previews/PreviewRatingInput.qml:128
113133msgid "Add a review"
114134msgstr "បន្ថែម​ការ​ពិនិត្យ"
115135
116−#: qml/Dash/Previews/PreviewRatingInput.qml:166
136+#: qml/Dash/Previews/PreviewRatingInput.qml:168
117137msgid "Send"
118138msgstr "ផ្ញើ"
119139
120−#: qml/Greeter/Greeter.qml:151
140+#: qml/Greeter/Greeter.qml:157
121141msgid "Swipe to unlock"
122−msgstr ""
123−
124−#: qml/Greeter/Lockscreen.qml:149
125−msgid "Emergency Call"
126−msgstr "ការ​ហៅ​ពេល​អាសន្ន"
127−
128−#: qml/Greeter/PassphraseLockscreen.qml:59
129−#, qt-format
130−msgid "Hello %1"
131−msgstr "សួស្ដី %1"
132−
133−#: qml/Greeter/PassphraseLockscreen.qml:59
134−msgid "Hello"
135−msgstr "សួស្តី"
142+msgstr "អូស​ដើម្បី​ដោះសោ"
136143
137144#: qml/Hud/HudParametrizedActionsPage.qml:132
138145msgid "Confirm"
@@ -166,7 +173,7 @@ msgstr "បញ្ចូល​កូដ PIN របស់​ស៊ីមកាត"
166173msgid "Search"
167174msgstr "ស្វែង​រក"
168175
169−#: qml/Shell.qml:348
176+#: qml/Shell.qml:334
170177#, qt-format
171178msgid "Please enter %1"
172179msgstr "សូម​បញ្ចូល %1"
po/kn.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr "ಇತ್ತೀಚಿನ ಹುಡುಕಾಟಗಳು"
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr ""
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr ""
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr "ಖಚಿತಪಡಿಸು"
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr "ಹುಡುಕು"
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
po/ko.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr "최근 검색"
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr ""
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr ""
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr ""
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr "검색"
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
po/ky.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr "Соңку издөөлөр"
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr ""
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr ""
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr "Аныктоо"
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr "Издөө"
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
po/lo.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr ""
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr "ສະບາຍດີ %1"
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr "ສະບາຍດີ"
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr "ສົ່ງ"
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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 "ສະບາຍດີ %1"
128−
129−#: qml/Greeter/PassphraseLockscreen.qml:59
130−msgid "Hello"
131−msgstr "ສະບາຍດີ"
132−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr "ຢືນຢັນ"
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr "ຊອກຫາ"
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr "ກະລູນາປ້ອນ %1"
po/lt.po+40−33
@@ -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-04-10 11:13-0400\n"
11−"PO-Revision-Date: 2014-01-15 12:42+0000\n"
12−"Last-Translator: Gediminas Paulauskas <menesis@pov.lt>\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"PO-Revision-Date: 2014-05-19 17:15+0000\n"
12+"Last-Translator: Mantas Kriaučiūnas <mantas@akl.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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,10 +75,35 @@ msgid ""
7575"phone<br><br>Tap on the screen to start"
7676msgstr ""
7777
78+#: qml/Components/Lockscreen.qml:214
79+msgid "Emergency Call"
80+msgstr "Pagalbos skambutis"
81+
82+#: qml/Components/Lockscreen.qml:231
83+msgid "OK"
84+msgstr ""
85+
7886#: qml/Components/PageHeader.qml:365
7987msgid "Recent searches"
8088msgstr "Paskiausios paieškos"
8189
90+#: qml/Components/PassphraseLockscreen.qml:60
91+#, qt-format
92+msgid "Hello %1"
93+msgstr "Laba diena, %1"
94+
95+#: qml/Components/PassphraseLockscreen.qml:60
96+msgid "Hello"
97+msgstr "Sveiki"
98+
99+#: qml/Components/PinLockscreen.qml:198
100+msgid "CANCEL"
101+msgstr ""
102+
103+#: qml/Components/PinLockscreen.qml:216
104+msgid "DONE"
105+msgstr ""
106+
82107#: qml/Components/SeeMore.qml:35
83108msgid "See more"
84109msgstr ""
@@ -89,49 +114,31 @@ msgstr ""
89114
90115#: qml/Dash/DashApps.qml:37
91116msgid "Recent"
92−msgstr ""
93−
94−#: qml/Dash/PreviewListView.qml:52
95−#, qt-format
96−msgid "%1 Preview"
97−msgstr ""
117+msgstr "Paskiausieji"
98118
99119#: qml/Dash/Previews/PreviewActionCombo.qml:34
100120msgid "More..."
101−msgstr ""
121+msgstr "Daugiau..."
102122
103123#: qml/Dash/Previews/PreviewActionCombo.qml:34
104124msgid "Less..."
105−msgstr ""
125+msgstr "Mažiau..."
106126
107−#: qml/Dash/Previews/PreviewRatingInput.qml:81
127+#: qml/Dash/Previews/PreviewRatingInput.qml:82
108128msgid "Rate this"
109129msgstr "Įvertinkite tai"
110130
111−#: qml/Dash/Previews/PreviewRatingInput.qml:126
131+#: qml/Dash/Previews/PreviewRatingInput.qml:128
112132msgid "Add a review"
113133msgstr "Pridėkite apžvalgą"
114134
115−#: qml/Dash/Previews/PreviewRatingInput.qml:166
135+#: qml/Dash/Previews/PreviewRatingInput.qml:168
116136msgid "Send"
117137msgstr "Siųsti"
118138
119−#: qml/Greeter/Greeter.qml:151
139+#: qml/Greeter/Greeter.qml:157
120140msgid "Swipe to unlock"
121−msgstr ""
122−
123−#: qml/Greeter/Lockscreen.qml:149
124−msgid "Emergency Call"
125−msgstr "Pagalbos skambutis"
126−
127−#: qml/Greeter/PassphraseLockscreen.qml:59
128−#, qt-format
129−msgid "Hello %1"
130−msgstr "Laba diena, %1"
131−
132−#: qml/Greeter/PassphraseLockscreen.qml:59
133−msgid "Hello"
134−msgstr "Sveiki"
141+msgstr "Braukite ir atrakinsite"
135142
136143#: qml/Hud/HudParametrizedActionsPage.qml:132
137144msgid "Confirm"
@@ -159,13 +166,13 @@ msgstr "Rodyti slaptažodį"
159166
160167#: qml/Notifications/NotificationMenuItemFactory.qml:103
161168msgid "Please enter SIM PIN"
162−msgstr ""
169+msgstr "Įveskite SIM kortelės PIN kodą"
163170
164171#: qml/Panel/SearchIndicator.qml:27
165172msgid "Search"
166173msgstr "Paieška"
167174
168−#: qml/Shell.qml:348
175+#: qml/Shell.qml:334
169176#, qt-format
170177msgid "Please enter %1"
171178msgstr "Prašom įvesti %1"
po/lv.po+51−44
@@ -7,28 +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-04-10 11:13-0400\n"
11−"PO-Revision-Date: 2014-01-11 16:48+0000\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"PO-Revision-Date: 2014-05-31 14:54+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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
2222msgid "Lock to Launcher"
23−msgstr ""
23+msgstr "Pieslēgt palaidējam"
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
2626msgid "Unlock from Launcher"
27−msgstr ""
27+msgstr "Atslēgt no palaidēja"
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
31−msgstr ""
31+msgstr "Izlaist Intro"
3232
3333#: qml/Components/EdgeDemo.qml:113
3434msgid "Right edge"
@@ -36,7 +36,7 @@ msgstr "Labā mala"
3636
3737#: qml/Components/EdgeDemo.qml:114
3838msgid "Try swiping from the right edge to unlock the phone"
39−msgstr ""
39+msgstr "Mēģiniet iesvelt no labās malas, lai atbloķētu tālruni"
4040
4141#: qml/Components/EdgeDemo.qml:145
4242msgid "Top edge"
@@ -44,7 +44,7 @@ msgstr "Augšējā mala"
4444
4545#: qml/Components/EdgeDemo.qml:146
4646msgid "Try swiping from the top edge to access the indicators"
47−msgstr ""
47+msgstr "Mēģiniet iesvelt no augšējās malas, lai piekļūt pie indikatoriem"
4848
4949#: qml/Components/EdgeDemo.qml:171
5050msgid "Close"
@@ -64,7 +64,7 @@ msgstr ""
6464
6565#: qml/Components/EdgeDemo.qml:227
6666msgid "Well done"
67−msgstr ""
67+msgstr "Ļoti labi!"
6868
6969#: qml/Components/EdgeDemo.qml:228
7070msgid ""
@@ -72,64 +72,71 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr "Neatliekamās Palīdzības zvans"
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr "Nesen veiktās meklēšanas"
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr "Sveiki, %1"
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr "Sveiki"
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81−msgstr ""
106+msgstr "Redzēt vairāk"
82107
83108#: qml/Components/SeeMore.qml:58
84109msgid "See less"
85−msgstr ""
110+msgstr "Redzēt mazāk"
86111
87112#: qml/Dash/DashApps.qml:37
88113msgid "Recent"
89−msgstr ""
90−
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
114+msgstr "Nesens"
95115
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98−msgstr ""
118+msgstr "Vairāk..."
99119
100120#: qml/Dash/Previews/PreviewActionCombo.qml:34
101121msgid "Less..."
102−msgstr ""
122+msgstr "Mazāk..."
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106−msgstr ""
126+msgstr "Novērtēt šo"
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110−msgstr ""
130+msgstr "Komentēt"
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114−msgstr ""
134+msgstr "Sūtīt"
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr "Apstiprināt"
@@ -152,17 +159,17 @@ msgstr "Runa..."
152159
153160#: qml/Notifications/NotificationMenuItemFactory.qml:91
154161msgid "Show password"
155−msgstr ""
162+msgstr "Rādīt paroli"
156163
157164#: qml/Notifications/NotificationMenuItemFactory.qml:103
158165msgid "Please enter SIM PIN"
159−msgstr ""
166+msgstr "Lūdzu ievadiet SIM PIN"
160167
161168#: qml/Panel/SearchIndicator.qml:27
162169msgid "Search"
163170msgstr "Meklēt"
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168−msgstr ""
175+msgstr "Lūdzu ievadiet %1"
po/ml.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
1111"PO-Revision-Date: 2013-11-23 11:44+0000\n"
1212"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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,10 +74,35 @@ msgid ""
7474"phone<br><br>Tap on the screen to start"
7575msgstr ""
7676
77+#: qml/Components/Lockscreen.qml:214
78+msgid "Emergency Call"
79+msgstr "അടിയന്തിര വിളി"
80+
81+#: qml/Components/Lockscreen.qml:231
82+msgid "OK"
83+msgstr ""
84+
7785#: qml/Components/PageHeader.qml:365
7886msgid "Recent searches"
7987msgstr "സമീപകാല തിരയലുകള്‍"
8088
89+#: qml/Components/PassphraseLockscreen.qml:60
90+#, qt-format
91+msgid "Hello %1"
92+msgstr "ഹലോ %1"
93+
94+#: qml/Components/PassphraseLockscreen.qml:60
95+msgid "Hello"
96+msgstr "ഹലോ"
97+
98+#: qml/Components/PinLockscreen.qml:198
99+msgid "CANCEL"
100+msgstr ""
101+
102+#: qml/Components/PinLockscreen.qml:216
103+msgid "DONE"
104+msgstr ""
105+
81106#: qml/Components/SeeMore.qml:35
82107msgid "See more"
83108msgstr ""
@@ -90,11 +115,6 @@ msgstr ""
90115msgid "Recent"
91116msgstr ""
92117
93−#: qml/Dash/PreviewListView.qml:52
94−#, qt-format
95−msgid "%1 Preview"
96−msgstr ""
97−
98118#: qml/Dash/Previews/PreviewActionCombo.qml:34
99119msgid "More..."
100120msgstr ""
@@ -103,35 +123,22 @@ msgstr ""
103123msgid "Less..."
104124msgstr ""
105125
106−#: qml/Dash/Previews/PreviewRatingInput.qml:81
126+#: qml/Dash/Previews/PreviewRatingInput.qml:82
107127msgid "Rate this"
108128msgstr "ഇത് അവലോകനം ചെയ്യുക"
109129
110−#: qml/Dash/Previews/PreviewRatingInput.qml:126
130+#: qml/Dash/Previews/PreviewRatingInput.qml:128
111131msgid "Add a review"
112132msgstr "ഒരു അവലോകനം ചേര്‍ക്കുക"
113133
114−#: qml/Dash/Previews/PreviewRatingInput.qml:166
134+#: qml/Dash/Previews/PreviewRatingInput.qml:168
115135msgid "Send"
116136msgstr "അയയ്‌ക്കുക"
117137
118−#: qml/Greeter/Greeter.qml:151
138+#: qml/Greeter/Greeter.qml:157
119139msgid "Swipe to unlock"
120140msgstr ""
121141
122−#: qml/Greeter/Lockscreen.qml:149
123−msgid "Emergency Call"
124−msgstr "അടിയന്തിര വിളി"
125−
126−#: qml/Greeter/PassphraseLockscreen.qml:59
127−#, qt-format
128−msgid "Hello %1"
129−msgstr "ഹലോ %1"
130−
131−#: qml/Greeter/PassphraseLockscreen.qml:59
132−msgid "Hello"
133−msgstr "ഹലോ"
134−
135142#: qml/Hud/HudParametrizedActionsPage.qml:132
136143msgid "Confirm"
137144msgstr "സ്ഥിരീകരിക്കുക"
@@ -164,7 +171,7 @@ msgstr ""
164171msgid "Search"
165172msgstr "തിരയുക"
166173
167−#: qml/Shell.qml:348
174+#: qml/Shell.qml:334
168175#, qt-format
169176msgid "Please enter %1"
170177msgstr "ദയവായി %1 നല്‍കുക"
po/mr.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr ""
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr ""
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr ""
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr ""
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr ""
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
po/ms.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr "panggilan Kecemasan"
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr "Gelintar baru-baru ini"
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr "Hai %1"
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr "Hello"
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr "Kadar ini"
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr "Tambah ulasan"
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr "Hantar"
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
120−#: qml/Greeter/Lockscreen.qml:149
121−msgid "Emergency Call"
122−msgstr "panggilan Kecemasan"
123−
124−#: qml/Greeter/PassphraseLockscreen.qml:59
125−#, qt-format
126−msgid "Hello %1"
127−msgstr "Hai %1"
128−
129−#: qml/Greeter/PassphraseLockscreen.qml:59
130−msgid "Hello"
131−msgstr "Hello"
132−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr "Sahkan"
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr "Gelintar"
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr "Sila masukkan %1"
po/my.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr "အရေးပေါ်ခေါ်မည်"
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr "မကြာသေးခင်က ရှာဖွေခြင်း"
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr "ဟဲလို %1"
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr "ဟဲလို"
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr "ဒီဟာကိုအမှတ်ပေးမည်"
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr "ပို့မည်"
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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 "ဟဲလို %1"
128−
129−#: qml/Greeter/PassphraseLockscreen.qml:59
130−msgid "Hello"
131−msgstr "ဟဲလို"
132−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr "အတည်ပြုပါ"
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr "ရှာဖွေ"
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr "%1ကိုရိုက်ထည့်ပါ"
po/nb.po+62−53
@@ -7,128 +7,137 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11−"PO-Revision-Date: 2013-06-27 07:02+0000\n"
12−"Last-Translator: Joakim Langvand <jlangvand@gmail.com>\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"PO-Revision-Date: 2014-06-11 06:36+0000\n"
12+"Last-Translator: Åka Sikrom <Unknown>\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
2222msgid "Lock to Launcher"
23−msgstr ""
23+msgstr "Lås til oppstarter"
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
2626msgid "Unlock from Launcher"
27−msgstr ""
27+msgstr "Lås opp fra oppstarter"
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
31−msgstr ""
31+msgstr "Hopp over introduksjon"
3232
3333#: qml/Components/EdgeDemo.qml:113
3434msgid "Right edge"
35−msgstr ""
35+msgstr "Høyre kant"
3636
3737#: qml/Components/EdgeDemo.qml:114
3838msgid "Try swiping from the right edge to unlock the phone"
39−msgstr ""
39+msgstr "Prøv å sveipe fra høyre side for å låse opp telefonen"
4040
4141#: qml/Components/EdgeDemo.qml:145
4242msgid "Top edge"
43−msgstr ""
43+msgstr "Øvre kant"
4444
4545#: qml/Components/EdgeDemo.qml:146
4646msgid "Try swiping from the top edge to access the indicators"
47−msgstr ""
47+msgstr "Prøv å sveipe fra toppen for å få tilgang til innstillingene"
4848
4949#: qml/Components/EdgeDemo.qml:171
5050msgid "Close"
51−msgstr ""
51+msgstr "Lukk"
5252
5353#: qml/Components/EdgeDemo.qml:172
5454msgid "Swipe up again to close the settings screen"
55−msgstr ""
55+msgstr "Sveip opp igjen for å lukke innstillingsmenyen"
5656
5757#: qml/Components/EdgeDemo.qml:199
5858msgid "Left edge"
59−msgstr ""
59+msgstr "Venstre kant"
6060
6161#: qml/Components/EdgeDemo.qml:200
6262msgid "Swipe from the left to reveal the launcher for quick access to apps"
63−msgstr ""
63+msgstr "Sveip fra venstre for å få tilgang til programoppstarteren"
6464
6565#: qml/Components/EdgeDemo.qml:227
6666msgid "Well done"
67−msgstr ""
67+msgstr "Bra jobba"
6868
6969#: qml/Components/EdgeDemo.qml:228
7070msgid ""
7171"You have now mastered the edge gestures and can start using the "
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
74+"Du har nå mestret kantbevegelsene, og er klar til å bruke "
75+"telefonen<br><br>Trykk på skjermen for å begynne"
76+
77+#: qml/Components/Lockscreen.qml:214
78+msgid "Emergency Call"
79+msgstr "Nødanrop"
80+
81+#: qml/Components/Lockscreen.qml:231
82+msgid "OK"
83+msgstr "OK"
7484
7585#: qml/Components/PageHeader.qml:365
7686msgid "Recent searches"
77−msgstr "Siste søk"
87+msgstr "Nylige søk"
88+
89+#: qml/Components/PassphraseLockscreen.qml:60
90+#, qt-format
91+msgid "Hello %1"
92+msgstr "Hei, %1"
93+
94+#: qml/Components/PassphraseLockscreen.qml:60
95+msgid "Hello"
96+msgstr "Hei"
97+
98+#: qml/Components/PinLockscreen.qml:198
99+msgid "CANCEL"
100+msgstr "AVBRYT"
101+
102+#: qml/Components/PinLockscreen.qml:216
103+msgid "DONE"
104+msgstr "FERDIG"
78105
79106#: qml/Components/SeeMore.qml:35
80107msgid "See more"
81−msgstr ""
108+msgstr "Vis mer"
82109
83110#: qml/Components/SeeMore.qml:58
84111msgid "See less"
85−msgstr ""
112+msgstr "Vis mindre"
86113
87114#: qml/Dash/DashApps.qml:37
88115msgid "Recent"
89−msgstr ""
90−
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
116+msgstr "Nylig"
95117
96118#: qml/Dash/Previews/PreviewActionCombo.qml:34
97119msgid "More..."
98−msgstr ""
120+msgstr "Mer …"
99121
100122#: qml/Dash/Previews/PreviewActionCombo.qml:34
101123msgid "Less..."
102−msgstr ""
124+msgstr "Mindre …"
103125
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
126+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105127msgid "Rate this"
106−msgstr ""
128+msgstr "Vurder dette"
107129
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
130+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109131msgid "Add a review"
110−msgstr ""
132+msgstr "Skriv en anmeldelse"
111133
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
134+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113135msgid "Send"
114−msgstr ""
136+msgstr "Send"
115137
116−#: qml/Greeter/Greeter.qml:151
138+#: qml/Greeter/Greeter.qml:157
117139msgid "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 ""
140+msgstr "Sveip for å låse opp"
132141
133142#: qml/Hud/HudParametrizedActionsPage.qml:132
134143msgid "Confirm"
@@ -152,17 +161,17 @@ msgstr "Snakker …"
152161
153162#: qml/Notifications/NotificationMenuItemFactory.qml:91
154163msgid "Show password"
155−msgstr ""
164+msgstr "Vis passord"
156165
157166#: qml/Notifications/NotificationMenuItemFactory.qml:103
158167msgid "Please enter SIM PIN"
159−msgstr ""
168+msgstr "Skriv inn PIN-koden til SIM-kortet"
160169
161170#: qml/Panel/SearchIndicator.qml:27
162171msgid "Search"
163172msgstr "Søk"
164173
165−#: qml/Shell.qml:348
174+#: qml/Shell.qml:334
166175#, qt-format
167176msgid "Please enter %1"
168−msgstr ""
177+msgstr "Skriv inn %1"
po/nl.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr "Noodoproep"
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr "Recente zoekopdrachten"
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr "Hallo %1"
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr "Hallo"
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr "Beoordeel dit"
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr "Voeg recensie toe"
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr "Versturen"
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
120−#: qml/Greeter/Lockscreen.qml:149
121−msgid "Emergency Call"
122−msgstr "Noodoproep"
123−
124−#: qml/Greeter/PassphraseLockscreen.qml:59
125−#, qt-format
126−msgid "Hello %1"
127−msgstr "Hallo %1"
128−
129−#: qml/Greeter/PassphraseLockscreen.qml:59
130−msgid "Hello"
131−msgstr "Hallo"
132−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr "Bevestigen"
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr "Zoeken"
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr "Voer %1 in"
po/pl.po+44−35
@@ -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-04-10 11:13-0400\n"
11−"PO-Revision-Date: 2014-01-10 11:38+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"PO-Revision-Date: 2014-05-27 15:20+0000\n"
12+"Last-Translator: GTriderXC <gtriderxc@yahoo.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−"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,64 +73,73 @@ msgid ""
7373"You have now mastered the edge gestures and can start using the "
7474"phone<br><br>Tap on the screen to start"
7575msgstr ""
76+"Wydawanie poleceń krawędzi zostało opanowane. Urządzenie gotowe do "
77+"pracy.<br><br>Dotknij ekranu by rozpocząć"
78+
79+#: qml/Components/Lockscreen.qml:214
80+msgid "Emergency Call"
81+msgstr "Telefon ratunkowy"
82+
83+#: qml/Components/Lockscreen.qml:231
84+msgid "OK"
85+msgstr ""
7686
7787#: qml/Components/PageHeader.qml:365
7888msgid "Recent searches"
7989msgstr "Ostatnie wyszukiwania"
8090
91+#: qml/Components/PassphraseLockscreen.qml:60
92+#, qt-format
93+msgid "Hello %1"
94+msgstr "Witaj %1"
95+
96+#: qml/Components/PassphraseLockscreen.qml:60
97+msgid "Hello"
98+msgstr "Witaj"
99+
100+#: qml/Components/PinLockscreen.qml:198
101+msgid "CANCEL"
102+msgstr ""
103+
104+#: qml/Components/PinLockscreen.qml:216
105+msgid "DONE"
106+msgstr ""
107+
81108#: qml/Components/SeeMore.qml:35
82109msgid "See more"
83−msgstr ""
110+msgstr "Zobacz więcej"
84111
85112#: qml/Components/SeeMore.qml:58
86113msgid "See less"
87−msgstr ""
114+msgstr "Zobacz mniej"
88115
89116#: qml/Dash/DashApps.qml:37
90117msgid "Recent"
91−msgstr ""
92−
93−#: qml/Dash/PreviewListView.qml:52
94−#, qt-format
95−msgid "%1 Preview"
96−msgstr ""
118+msgstr "Ostatnio używane"
97119
98120#: qml/Dash/Previews/PreviewActionCombo.qml:34
99121msgid "More..."
100−msgstr ""
122+msgstr "Więcej..."
101123
102124#: qml/Dash/Previews/PreviewActionCombo.qml:34
103125msgid "Less..."
104−msgstr ""
126+msgstr "Mniej..."
105127
106−#: qml/Dash/Previews/PreviewRatingInput.qml:81
128+#: qml/Dash/Previews/PreviewRatingInput.qml:82
107129msgid "Rate this"
108130msgstr "Oceń to"
109131
110−#: qml/Dash/Previews/PreviewRatingInput.qml:126
132+#: qml/Dash/Previews/PreviewRatingInput.qml:128
111133msgid "Add a review"
112134msgstr "Dodaj recenzję"
113135
114−#: qml/Dash/Previews/PreviewRatingInput.qml:166
136+#: qml/Dash/Previews/PreviewRatingInput.qml:168
115137msgid "Send"
116138msgstr "Wyślij"
117139
118−#: qml/Greeter/Greeter.qml:151
140+#: qml/Greeter/Greeter.qml:157
119141msgid "Swipe to unlock"
120−msgstr ""
121−
122−#: qml/Greeter/Lockscreen.qml:149
123−msgid "Emergency Call"
124−msgstr "Telefon ratunkowy"
125−
126−#: qml/Greeter/PassphraseLockscreen.qml:59
127−#, qt-format
128−msgid "Hello %1"
129−msgstr "Witaj %1"
130−
131−#: qml/Greeter/PassphraseLockscreen.qml:59
132−msgid "Hello"
133−msgstr "Witaj"
142+msgstr "Przeciągnij aby odblokować"
134143
135144#: qml/Hud/HudParametrizedActionsPage.qml:132
136145msgid "Confirm"
@@ -158,13 +167,13 @@ msgstr "Wyświetl hasło"
158167
159168#: qml/Notifications/NotificationMenuItemFactory.qml:103
160169msgid "Please enter SIM PIN"
161−msgstr ""
170+msgstr "Wprowadź kod PIN karty SIM"
162171
163172#: qml/Panel/SearchIndicator.qml:27
164173msgid "Search"
165174msgstr "Szukaj"
166175
167−#: qml/Shell.qml:348
176+#: qml/Shell.qml:334
168177#, qt-format
169178msgid "Please enter %1"
170179msgstr "Wprowadź %1"
po/pt.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr ""
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr ""
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr ""
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr ""
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr ""
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
po/pt_BR.po+44−35
@@ -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-04-10 11:13-0400\n"
11−"PO-Revision-Date: 2014-01-18 23:24+0000\n"
12−"Last-Translator: Fábio Nogueira <deb-user-ba@ubuntu.com>\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"PO-Revision-Date: 2014-05-15 14:31+0000\n"
12+"Last-Translator: Rafael Neri <Unknown>\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−"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,64 +73,73 @@ msgid ""
7373"You have now mastered the edge gestures and can start using the "
7474"phone<br><br>Tap on the screen to start"
7575msgstr ""
76+"Agora você já domina os gestos das bordas e pode começar a usar o "
77+"telefone<br><br>Toque na tela para iniciar"
78+
79+#: qml/Components/Lockscreen.qml:214
80+msgid "Emergency Call"
81+msgstr "Chamada de emergência"
82+
83+#: qml/Components/Lockscreen.qml:231
84+msgid "OK"
85+msgstr ""
7686
7787#: qml/Components/PageHeader.qml:365
7888msgid "Recent searches"
7989msgstr "Pesquisas recentes"
8090
91+#: qml/Components/PassphraseLockscreen.qml:60
92+#, qt-format
93+msgid "Hello %1"
94+msgstr "Olá %1"
95+
96+#: qml/Components/PassphraseLockscreen.qml:60
97+msgid "Hello"
98+msgstr "Olá"
99+
100+#: qml/Components/PinLockscreen.qml:198
101+msgid "CANCEL"
102+msgstr ""
103+
104+#: qml/Components/PinLockscreen.qml:216
105+msgid "DONE"
106+msgstr ""
107+
81108#: qml/Components/SeeMore.qml:35
82109msgid "See more"
83−msgstr ""
110+msgstr "Ver mais"
84111
85112#: qml/Components/SeeMore.qml:58
86113msgid "See less"
87−msgstr ""
114+msgstr "Ver menos"
88115
89116#: qml/Dash/DashApps.qml:37
90117msgid "Recent"
91−msgstr ""
92−
93−#: qml/Dash/PreviewListView.qml:52
94−#, qt-format
95−msgid "%1 Preview"
96−msgstr ""
118+msgstr "Recentes"
97119
98120#: qml/Dash/Previews/PreviewActionCombo.qml:34
99121msgid "More..."
100−msgstr ""
122+msgstr "Mais..."
101123
102124#: qml/Dash/Previews/PreviewActionCombo.qml:34
103125msgid "Less..."
104−msgstr ""
126+msgstr "Menos..."
105127
106−#: qml/Dash/Previews/PreviewRatingInput.qml:81
128+#: qml/Dash/Previews/PreviewRatingInput.qml:82
107129msgid "Rate this"
108130msgstr "Avaliar isto"
109131
110−#: qml/Dash/Previews/PreviewRatingInput.qml:126
132+#: qml/Dash/Previews/PreviewRatingInput.qml:128
111133msgid "Add a review"
112134msgstr "Adicionar uma análise"
113135
114−#: qml/Dash/Previews/PreviewRatingInput.qml:166
136+#: qml/Dash/Previews/PreviewRatingInput.qml:168
115137msgid "Send"
116138msgstr "Enviar"
117139
118−#: qml/Greeter/Greeter.qml:151
140+#: qml/Greeter/Greeter.qml:157
119141msgid "Swipe to unlock"
120−msgstr ""
121−
122−#: qml/Greeter/Lockscreen.qml:149
123−msgid "Emergency Call"
124−msgstr "Chamada de emergência"
125−
126−#: qml/Greeter/PassphraseLockscreen.qml:59
127−#, qt-format
128−msgid "Hello %1"
129−msgstr "Olá %1"
130−
131−#: qml/Greeter/PassphraseLockscreen.qml:59
132−msgid "Hello"
133−msgstr "Olá"
142+msgstr "Deslizar para desbloquear"
134143
135144#: qml/Hud/HudParametrizedActionsPage.qml:132
136145msgid "Confirm"
@@ -158,13 +167,13 @@ msgstr "Exibir senha"
158167
159168#: qml/Notifications/NotificationMenuItemFactory.qml:103
160169msgid "Please enter SIM PIN"
161−msgstr ""
170+msgstr "Por favor, digite o PIN do cartão SIM"
162171
163172#: qml/Panel/SearchIndicator.qml:27
164173msgid "Search"
165174msgstr "Pesquisar"
166175
167−#: qml/Shell.qml:348
176+#: qml/Shell.qml:334
168177#, qt-format
169178msgid "Please enter %1"
170179msgstr "Por favor, digite %1"
po/ro.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr "Căutări recente"
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr ""
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr ""
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr "Confirmați"
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr "Căutare"
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
po/ru.po+35−28
@@ -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-04-10 11:13-0400\n"
11−"PO-Revision-Date: 2014-04-03 13:07+0000\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"PO-Revision-Date: 2014-05-15 12:57+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-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -79,10 +79,35 @@ msgstr ""
7979"Вы научились пользоваться Ubuntu и можете начать использовать свой "
8080"телефон<br><br>Нажмите на экран"
8181
82+#: qml/Components/Lockscreen.qml:214
83+msgid "Emergency Call"
84+msgstr "Экстренный вызов"
85+
86+#: qml/Components/Lockscreen.qml:231
87+msgid "OK"
88+msgstr ""
89+
8290#: qml/Components/PageHeader.qml:365
8391msgid "Recent searches"
8492msgstr "Последние поисковые запросы"
8593
94+#: qml/Components/PassphraseLockscreen.qml:60
95+#, qt-format
96+msgid "Hello %1"
97+msgstr "Привет, %1"
98+
99+#: qml/Components/PassphraseLockscreen.qml:60
100+msgid "Hello"
101+msgstr "Привет"
102+
103+#: qml/Components/PinLockscreen.qml:198
104+msgid "CANCEL"
105+msgstr ""
106+
107+#: qml/Components/PinLockscreen.qml:216
108+msgid "DONE"
109+msgstr ""
110+
86111#: qml/Components/SeeMore.qml:35
87112msgid "See more"
88113msgstr "Подробнее"
@@ -95,11 +120,6 @@ msgstr "Вкратце"
95120msgid "Recent"
96121msgstr "Недавние"
97122
98−#: qml/Dash/PreviewListView.qml:52
99−#, qt-format
100−msgid "%1 Preview"
101−msgstr "Просмотр %1"
102−
103123#: qml/Dash/Previews/PreviewActionCombo.qml:34
104124msgid "More..."
105125msgstr "Ещё..."
@@ -108,34 +128,21 @@ msgstr "Ещё..."
108128msgid "Less..."
109129msgstr "Меньше..."
110130
111−#: qml/Dash/Previews/PreviewRatingInput.qml:81
131+#: qml/Dash/Previews/PreviewRatingInput.qml:82
112132msgid "Rate this"
113133msgstr "Оцените это"
114134
115−#: qml/Dash/Previews/PreviewRatingInput.qml:126
135+#: qml/Dash/Previews/PreviewRatingInput.qml:128
116136msgid "Add a review"
117137msgstr "Добавьте отзыв"
118138
119−#: qml/Dash/Previews/PreviewRatingInput.qml:166
139+#: qml/Dash/Previews/PreviewRatingInput.qml:168
120140msgid "Send"
121141msgstr "Отправить"
122142
123−#: qml/Greeter/Greeter.qml:151
143+#: qml/Greeter/Greeter.qml:157
124144msgid "Swipe to unlock"
125−msgstr ""
126−
127−#: qml/Greeter/Lockscreen.qml:149
128−msgid "Emergency Call"
129−msgstr "Экстренный вызов"
130−
131−#: qml/Greeter/PassphraseLockscreen.qml:59
132−#, qt-format
133−msgid "Hello %1"
134−msgstr "Привет, %1"
135−
136−#: qml/Greeter/PassphraseLockscreen.qml:59
137−msgid "Hello"
138−msgstr "Привет"
145+msgstr "Смахните, чтобы разблокировать"
139146
140147#: qml/Hud/HudParametrizedActionsPage.qml:132
141148msgid "Confirm"
@@ -169,7 +176,7 @@ msgstr "Введите PIN код"
169176msgid "Search"
170177msgstr "Поиск"
171178
172−#: qml/Shell.qml:348
179+#: qml/Shell.qml:334
173180#, qt-format
174181msgid "Please enter %1"
175182msgstr "Пожалуйста, введите %1"
po/shn.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr ""
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr ""
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr ""
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr ""
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr ""
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
po/si.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr ""
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr ""
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr ""
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr ""
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr ""
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
po/sl.po+36−29
@@ -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-04-10 11:13-0400\n"
11−"PO-Revision-Date: 2014-02-21 16:38+0000\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"PO-Revision-Date: 2014-05-22 14:07+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−"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -76,10 +76,35 @@ msgstr ""
7676"Sedaj, ko ste osvojili poteze robov, lahko začnete uporabljati "
7777"telefon<br><br>Tapnite na zaslon za začetek"
7878
79+#: qml/Components/Lockscreen.qml:214
80+msgid "Emergency Call"
81+msgstr "Klic v sili"
82+
83+#: qml/Components/Lockscreen.qml:231
84+msgid "OK"
85+msgstr ""
86+
7987#: qml/Components/PageHeader.qml:365
8088msgid "Recent searches"
8189msgstr "Nedavna iskanja"
8290
91+#: qml/Components/PassphraseLockscreen.qml:60
92+#, qt-format
93+msgid "Hello %1"
94+msgstr "Pozdravljeni, %1"
95+
96+#: qml/Components/PassphraseLockscreen.qml:60
97+msgid "Hello"
98+msgstr "Pozdravljeni"
99+
100+#: qml/Components/PinLockscreen.qml:198
101+msgid "CANCEL"
102+msgstr ""
103+
104+#: qml/Components/PinLockscreen.qml:216
105+msgid "DONE"
106+msgstr ""
107+
83108#: qml/Components/SeeMore.qml:35
84109msgid "See more"
85110msgstr "Pokaži več"
@@ -90,12 +115,7 @@ msgstr "Pokaži manj"
90115
91116#: qml/Dash/DashApps.qml:37
92117msgid "Recent"
93−msgstr ""
94−
95−#: qml/Dash/PreviewListView.qml:52
96−#, qt-format
97−msgid "%1 Preview"
98−msgstr ""
118+msgstr "Nedavno"
99119
100120#: qml/Dash/Previews/PreviewActionCombo.qml:34
101121msgid "More..."
@@ -105,34 +125,21 @@ msgstr "Več ..."
105125msgid "Less..."
106126msgstr "Manj ..."
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:81
128+#: qml/Dash/Previews/PreviewRatingInput.qml:82
109129msgid "Rate this"
110130msgstr "Ocenite"
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:126
132+#: qml/Dash/Previews/PreviewRatingInput.qml:128
113133msgid "Add a review"
114134msgstr "Dodaj oceno"
115135
116−#: qml/Dash/Previews/PreviewRatingInput.qml:166
136+#: qml/Dash/Previews/PreviewRatingInput.qml:168
117137msgid "Send"
118138msgstr "Pošlji"
119139
120−#: qml/Greeter/Greeter.qml:151
140+#: qml/Greeter/Greeter.qml:157
121141msgid "Swipe to unlock"
122−msgstr ""
123−
124−#: qml/Greeter/Lockscreen.qml:149
125−msgid "Emergency Call"
126−msgstr "Klic v sili"
127−
128−#: qml/Greeter/PassphraseLockscreen.qml:59
129−#, qt-format
130−msgid "Hello %1"
131−msgstr "Pozdravljeni, %1"
132−
133−#: qml/Greeter/PassphraseLockscreen.qml:59
134−msgid "Hello"
135−msgstr "Pozdravljeni"
142+msgstr "Podrsajte za odklenitev"
136143
137144#: qml/Hud/HudParametrizedActionsPage.qml:132
138145msgid "Confirm"
@@ -166,7 +173,7 @@ msgstr "Vnesite PIN kartice SIM"
166173msgid "Search"
167174msgstr "Iskanje"
168175
169−#: qml/Shell.qml:348
176+#: qml/Shell.qml:334
170177#, qt-format
171178msgid "Please enter %1"
172179msgstr "Vnesite %1"
po/sq.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:50+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,10 +73,35 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76+#: qml/Components/Lockscreen.qml:214
77+msgid "Emergency Call"
78+msgstr ""
79+
80+#: qml/Components/Lockscreen.qml:231
81+msgid "OK"
82+msgstr ""
83+
7684#: qml/Components/PageHeader.qml:365
7785msgid "Recent searches"
7886msgstr ""
7987
88+#: qml/Components/PassphraseLockscreen.qml:60
89+#, qt-format
90+msgid "Hello %1"
91+msgstr ""
92+
93+#: qml/Components/PassphraseLockscreen.qml:60
94+msgid "Hello"
95+msgstr ""
96+
97+#: qml/Components/PinLockscreen.qml:198
98+msgid "CANCEL"
99+msgstr ""
100+
101+#: qml/Components/PinLockscreen.qml:216
102+msgid "DONE"
103+msgstr ""
104+
80105#: qml/Components/SeeMore.qml:35
81106msgid "See more"
82107msgstr ""
@@ -89,11 +114,6 @@ msgstr ""
89114msgid "Recent"
90115msgstr ""
91116
92−#: qml/Dash/PreviewListView.qml:52
93−#, qt-format
94−msgid "%1 Preview"
95−msgstr ""
96−
97117#: qml/Dash/Previews/PreviewActionCombo.qml:34
98118msgid "More..."
99119msgstr ""
@@ -102,35 +122,22 @@ msgstr ""
102122msgid "Less..."
103123msgstr ""
104124
105−#: qml/Dash/Previews/PreviewRatingInput.qml:81
125+#: qml/Dash/Previews/PreviewRatingInput.qml:82
106126msgid "Rate this"
107127msgstr "Vlerësoje këtë"
108128
109−#: qml/Dash/Previews/PreviewRatingInput.qml:126
129+#: qml/Dash/Previews/PreviewRatingInput.qml:128
110130msgid "Add a review"
111131msgstr "Shto një rishikim"
112132
113−#: qml/Dash/Previews/PreviewRatingInput.qml:166
133+#: qml/Dash/Previews/PreviewRatingInput.qml:168
114134msgid "Send"
115135msgstr ""
116136
117−#: qml/Greeter/Greeter.qml:151
137+#: qml/Greeter/Greeter.qml:157
118138msgid "Swipe to unlock"
119139msgstr ""
120140
121−#: qml/Greeter/Lockscreen.qml:149
122−msgid "Emergency Call"
123−msgstr ""
124−
125−#: qml/Greeter/PassphraseLockscreen.qml:59
126−#, qt-format
127−msgid "Hello %1"
128−msgstr ""
129−
130−#: qml/Greeter/PassphraseLockscreen.qml:59
131−msgid "Hello"
132−msgstr ""
133−
134141#: qml/Hud/HudParametrizedActionsPage.qml:132
135142msgid "Confirm"
136143msgstr ""
@@ -163,7 +170,7 @@ msgstr ""
163170msgid "Search"
164171msgstr ""
165172
166−#: qml/Shell.qml:348
173+#: qml/Shell.qml:334
167174#, qt-format
168175msgid "Please enter %1"
169176msgstr ""
po/sr.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr "Скорашње претраге"
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr ""
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr ""
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr "Потврди"
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr "Претрага"
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
po/sv.po+49−42
@@ -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-04-10 11:13-0400\n"
11−"PO-Revision-Date: 2013-06-26 22:36+0000\n"
12−"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"PO-Revision-Date: 2014-06-07 19:14+0000\n"
12+"Last-Translator: mikasjoman <Unknown>\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−"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -32,15 +32,15 @@ msgstr ""
3232
3333#: qml/Components/EdgeDemo.qml:113
3434msgid "Right edge"
35−msgstr ""
35+msgstr "Högerkant"
3636
3737#: qml/Components/EdgeDemo.qml:114
3838msgid "Try swiping from the right edge to unlock the phone"
39−msgstr ""
39+msgstr "Dra med fingret från höger för att låsa upp telefonen"
4040
4141#: qml/Components/EdgeDemo.qml:145
4242msgid "Top edge"
43−msgstr ""
43+msgstr "Överkant"
4444
4545#: qml/Components/EdgeDemo.qml:146
4646msgid "Try swiping from the top edge to access the indicators"
@@ -48,7 +48,7 @@ msgstr ""
4848
4949#: qml/Components/EdgeDemo.qml:171
5050msgid "Close"
51−msgstr ""
51+msgstr "Stäng"
5252
5353#: qml/Components/EdgeDemo.qml:172
5454msgid "Swipe up again to close the settings screen"
@@ -56,7 +56,7 @@ msgstr ""
5656
5757#: qml/Components/EdgeDemo.qml:199
5858msgid "Left edge"
59−msgstr ""
59+msgstr "Vänsterkant"
6060
6161#: qml/Components/EdgeDemo.qml:200
6262msgid "Swipe from the left to reveal the launcher for quick access to apps"
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr "Nödsamtal"
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr ""
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr ""
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,58 +121,45 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110−msgstr ""
130+msgstr "Lägg till en recension"
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr ""
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135−msgstr ""
142+msgstr "Bekräfta"
136143
137144#: qml/Hud/Hud.qml:61 qml/Hud/Hud.qml:99 qml/Hud/Hud.qml:372
138145msgid "Type or say a command"
139−msgstr ""
146+msgstr "Skriv eller tala in ett kommando"
140147
141148#: qml/Hud/Hud.qml:84
142149msgid "Loading. Please Wait..."
143−msgstr ""
150+msgstr "Laddar. Var god vänta..."
144151
145152#: qml/Hud/Hud.qml:89
146153msgid "Speak Now..."
147−msgstr ""
154+msgstr "Tala nu..."
148155
149156#: qml/Hud/Hud.qml:94
150157msgid "Speaking..."
151−msgstr ""
158+msgstr "Talar..."
152159
153160#: qml/Notifications/NotificationMenuItemFactory.qml:91
154161msgid "Show password"
155−msgstr ""
162+msgstr "Visa lösenord"
156163
157164#: qml/Notifications/NotificationMenuItemFactory.qml:103
158165msgid "Please enter SIM PIN"
@@ -160,9 +167,9 @@ msgstr ""
160167
161168#: qml/Panel/SearchIndicator.qml:27
162169msgid "Search"
163−msgstr ""
170+msgstr "Sök"
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168−msgstr ""
175+msgstr "Vänligen fyll i %1"
po/sw.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr ""
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr ""
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr "Tuma"
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr "Thibitisha"
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr "Tafuta"
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
po/ta.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
1111"PO-Revision-Date: 2013-10-24 11:36+0000\n"
1212"Last-Translator: Arun Kumar - அருண் குமார் <thangam.arunx@gmail.com>\n"
1313"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\n"
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-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919"Language: ta\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
@@ -75,10 +75,35 @@ msgid ""
7575"phone<br><br>Tap on the screen to start"
7676msgstr ""
7777
78+#: qml/Components/Lockscreen.qml:214
79+msgid "Emergency Call"
80+msgstr "அவசர அழைப்பு"
81+
82+#: qml/Components/Lockscreen.qml:231
83+msgid "OK"
84+msgstr ""
85+
7886#: qml/Components/PageHeader.qml:365
7987msgid "Recent searches"
8088msgstr "கடையாக தேடப்பட்டவைகள்"
8189
90+#: qml/Components/PassphraseLockscreen.qml:60
91+#, qt-format
92+msgid "Hello %1"
93+msgstr "வணக்கம் %1"
94+
95+#: qml/Components/PassphraseLockscreen.qml:60
96+msgid "Hello"
97+msgstr "வணக்கம்"
98+
99+#: qml/Components/PinLockscreen.qml:198
100+msgid "CANCEL"
101+msgstr ""
102+
103+#: qml/Components/PinLockscreen.qml:216
104+msgid "DONE"
105+msgstr ""
106+
82107#: qml/Components/SeeMore.qml:35
83108msgid "See more"
84109msgstr ""
@@ -91,11 +116,6 @@ msgstr ""
91116msgid "Recent"
92117msgstr ""
93118
94−#: qml/Dash/PreviewListView.qml:52
95−#, qt-format
96−msgid "%1 Preview"
97−msgstr ""
98−
99119#: qml/Dash/Previews/PreviewActionCombo.qml:34
100120msgid "More..."
101121msgstr ""
@@ -104,35 +124,22 @@ msgstr ""
104124msgid "Less..."
105125msgstr ""
106126
107−#: qml/Dash/Previews/PreviewRatingInput.qml:81
127+#: qml/Dash/Previews/PreviewRatingInput.qml:82
108128msgid "Rate this"
109129msgstr "இதை மதிப்பிடு"
110130
111−#: qml/Dash/Previews/PreviewRatingInput.qml:126
131+#: qml/Dash/Previews/PreviewRatingInput.qml:128
112132msgid "Add a review"
113133msgstr "ஒரு பரிசீலனையை சேர்"
114134
115−#: qml/Dash/Previews/PreviewRatingInput.qml:166
135+#: qml/Dash/Previews/PreviewRatingInput.qml:168
116136msgid "Send"
117137msgstr "அனுப்பு"
118138
119−#: qml/Greeter/Greeter.qml:151
139+#: qml/Greeter/Greeter.qml:157
120140msgid "Swipe to unlock"
121141msgstr ""
122142
123−#: qml/Greeter/Lockscreen.qml:149
124−msgid "Emergency Call"
125−msgstr "அவசர அழைப்பு"
126−
127−#: qml/Greeter/PassphraseLockscreen.qml:59
128−#, qt-format
129−msgid "Hello %1"
130−msgstr "வணக்கம் %1"
131−
132−#: qml/Greeter/PassphraseLockscreen.qml:59
133−msgid "Hello"
134−msgstr "வணக்கம்"
135−
136143#: qml/Hud/HudParametrizedActionsPage.qml:132
137144msgid "Confirm"
138145msgstr "உறுதிப்படுத்து"
@@ -165,7 +172,7 @@ msgstr ""
165172msgid "Search"
166173msgstr "தெடு"
167174
168−#: qml/Shell.qml:348
175+#: qml/Shell.qml:334
169176#, qt-format
170177msgid "Please enter %1"
171178msgstr "தயவுச்செய்து %1 உள்ளிடு"
po/te.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr ""
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr ""
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr ""
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr ""
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr ""
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
po/tr.po+37−30
@@ -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-04-10 11:13-0400\n"
11−"PO-Revision-Date: 2014-03-05 08:54+0000\n"
12−"Last-Translator: Muhammed Yüce <muhammedyuceee@gmail.com>\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"PO-Revision-Date: 2014-05-19 12:52+0000\n"
12+"Last-Translator: Volkan Gezer <Unknown>\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−"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,10 +75,35 @@ msgstr ""
7575"Kenar haraketlerini öğrendiniz ve telefonu kullanmaya "
7676"başlayabilirsiniz<br><br>Başlamak için ekrana dokunun"
7777
78+#: qml/Components/Lockscreen.qml:214
79+msgid "Emergency Call"
80+msgstr "Acil Arama"
81+
82+#: qml/Components/Lockscreen.qml:231
83+msgid "OK"
84+msgstr ""
85+
7886#: qml/Components/PageHeader.qml:365
7987msgid "Recent searches"
8088msgstr "Son aramalar"
8189
90+#: qml/Components/PassphraseLockscreen.qml:60
91+#, qt-format
92+msgid "Hello %1"
93+msgstr "Merhaba %1"
94+
95+#: qml/Components/PassphraseLockscreen.qml:60
96+msgid "Hello"
97+msgstr "Merhaba"
98+
99+#: qml/Components/PinLockscreen.qml:198
100+msgid "CANCEL"
101+msgstr ""
102+
103+#: qml/Components/PinLockscreen.qml:216
104+msgid "DONE"
105+msgstr ""
106+
82107#: qml/Components/SeeMore.qml:35
83108msgid "See more"
84109msgstr "Daha fazlası"
@@ -89,12 +114,7 @@ msgstr "Daha azını gör"
89114
90115#: qml/Dash/DashApps.qml:37
91116msgid "Recent"
92−msgstr ""
93−
94−#: qml/Dash/PreviewListView.qml:52
95−#, qt-format
96−msgid "%1 Preview"
97−msgstr ""
117+msgstr "En son"
98118
99119#: qml/Dash/Previews/PreviewActionCombo.qml:34
100120msgid "More..."
@@ -104,34 +124,21 @@ msgstr "Daha fazlası..."
104124msgid "Less..."
105125msgstr "Daha az.."
106126
107−#: qml/Dash/Previews/PreviewRatingInput.qml:81
127+#: qml/Dash/Previews/PreviewRatingInput.qml:82
108128msgid "Rate this"
109129msgstr "Oyla"
110130
111−#: qml/Dash/Previews/PreviewRatingInput.qml:126
131+#: qml/Dash/Previews/PreviewRatingInput.qml:128
112132msgid "Add a review"
113133msgstr "Bir inceleme ekle"
114134
115−#: qml/Dash/Previews/PreviewRatingInput.qml:166
135+#: qml/Dash/Previews/PreviewRatingInput.qml:168
116136msgid "Send"
117137msgstr "Gönder"
118138
119−#: qml/Greeter/Greeter.qml:151
139+#: qml/Greeter/Greeter.qml:157
120140msgid "Swipe to unlock"
121−msgstr ""
122−
123−#: qml/Greeter/Lockscreen.qml:149
124−msgid "Emergency Call"
125−msgstr "Acil Arama"
126−
127−#: qml/Greeter/PassphraseLockscreen.qml:59
128−#, qt-format
129−msgid "Hello %1"
130−msgstr "Merhaba %1"
131−
132−#: qml/Greeter/PassphraseLockscreen.qml:59
133−msgid "Hello"
134−msgstr "Merhaba"
141+msgstr "Açmak için kaydırın"
135142
136143#: qml/Hud/HudParametrizedActionsPage.qml:132
137144msgid "Confirm"
@@ -165,7 +172,7 @@ msgstr "Lütfen SIM PIN'inizi girin"
165172msgid "Search"
166173msgstr "Ara"
167174
168−#: qml/Shell.qml:348
175+#: qml/Shell.qml:334
169176#, qt-format
170177msgid "Please enter %1"
171178msgstr "Lütfen %1 girin"
po/ug.po+40−33
@@ -1,21 +1,21 @@
11# Uyghur translation for unity
22# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
33# This file is distributed under the same license as the unity package.
4−# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
4+# Gheyret Kenji <gheyret@gmail.com>, 2013.
55#
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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-22 05:46+0000\n"
12−"Last-Translator: abdurahman <Unknown>\n"
13−"Language-Team: Uyghur <ug@li.org>\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"PO-Revision-Date: 2014-06-13 21:07+0000\n"
12+"Last-Translator: Gheyret T.Kenji <Unknown>\n"
13+"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\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-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -71,13 +71,38 @@ msgid ""
7171"You have now mastered the edge gestures and can start using the "
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
74−"ئېكراننى چېكىپ باشلاڭ<br><br>سىز ھازىر گىرۋەك بارماق ئىشارەتلىرىنى ئىگەللەپ "
74+"ئېكراننى چېكىپ باشلاڭ<br><br>سىز ھازىر گىرۋەك بارماق ئىشارەتلىرىنى ئىگىلەپ "
7575"بولدىڭىز،ئەمدى تېلېفوننى ئىشلىتىشنى باشلىسىڭىز بولىدۇ"
7676
77+#: qml/Components/Lockscreen.qml:214
78+msgid "Emergency Call"
79+msgstr "جىددىي تېلېفون"
80+
81+#: qml/Components/Lockscreen.qml:231
82+msgid "OK"
83+msgstr "تامام"
84+
7785#: qml/Components/PageHeader.qml:365
7886msgid "Recent searches"
7987msgstr "يېقىنقى ئىزدەشلەر"
8088
89+#: qml/Components/PassphraseLockscreen.qml:60
90+#, qt-format
91+msgid "Hello %1"
92+msgstr "سالام %1"
93+
94+#: qml/Components/PassphraseLockscreen.qml:60
95+msgid "Hello"
96+msgstr "ئەسسالامۇئەلەيكۇم"
97+
98+#: qml/Components/PinLockscreen.qml:198
99+msgid "CANCEL"
100+msgstr "ۋاز كەچ"
101+
102+#: qml/Components/PinLockscreen.qml:216
103+msgid "DONE"
104+msgstr "تامام"
105+
81106#: qml/Components/SeeMore.qml:35
82107msgid "See more"
83108msgstr "جىقراق كۆرۈش"
@@ -90,11 +115,6 @@ msgstr "ئازراق كۆرۈش"
90115msgid "Recent"
91116msgstr "يېقىنقى"
92117
93−#: qml/Dash/PreviewListView.qml:52
94−#, qt-format
95−msgid "%1 Preview"
96−msgstr "%1 ئالدىن كۆرۈپ بىقىش"
97−
98118#: qml/Dash/Previews/PreviewActionCombo.qml:34
99119msgid "More..."
100120msgstr "تېخىمۇ كۆپ…"
@@ -103,34 +123,21 @@ msgstr "تېخىمۇ كۆپ…"
103123msgid "Less..."
104124msgstr "ئازراق..."
105125
106−#: qml/Dash/Previews/PreviewRatingInput.qml:81
126+#: qml/Dash/Previews/PreviewRatingInput.qml:82
107127msgid "Rate this"
108128msgstr "بۇنى باھالاڭ"
109129
110−#: qml/Dash/Previews/PreviewRatingInput.qml:126
130+#: qml/Dash/Previews/PreviewRatingInput.qml:128
111131msgid "Add a review"
112132msgstr "باھا قوشۇش"
113133
114−#: qml/Dash/Previews/PreviewRatingInput.qml:166
134+#: qml/Dash/Previews/PreviewRatingInput.qml:168
115135msgid "Send"
116136msgstr "ئەۋەت"
117137
118−#: qml/Greeter/Greeter.qml:151
138+#: qml/Greeter/Greeter.qml:157
119139msgid "Swipe to unlock"
120−msgstr ""
121−
122−#: qml/Greeter/Lockscreen.qml:149
123−msgid "Emergency Call"
124−msgstr "جىددىي تېلېفون"
125−
126−#: qml/Greeter/PassphraseLockscreen.qml:59
127−#, qt-format
128−msgid "Hello %1"
129−msgstr "سالام %1"
130−
131−#: qml/Greeter/PassphraseLockscreen.qml:59
132−msgid "Hello"
133−msgstr "سالام"
140+msgstr "سىيرىسىڭىز قۇلۇپسىزلىنىدۇ"
134141
135142#: qml/Hud/HudParametrizedActionsPage.qml:132
136143msgid "Confirm"
@@ -158,13 +165,13 @@ msgstr "ئىم كۆرسەت"
158165
159166#: qml/Notifications/NotificationMenuItemFactory.qml:103
160167msgid "Please enter SIM PIN"
161−msgstr "پارولىنى كىرگۈزۈڭPINكارتىڭىزنىڭ SIM"
168+msgstr "سىم(SIM) كارتىڭىزنىڭ PIN نومۇرىنى كىرگۈزۈڭ"
162169
163170#: qml/Panel/SearchIndicator.qml:27
164171msgid "Search"
165172msgstr "ئىزدە"
166173
167−#: qml/Shell.qml:348
174+#: qml/Shell.qml:334
168175#, qt-format
169176msgid "Please enter %1"
170177msgstr "%1 نى كىرگۈزۈڭ"
po/uk.po+44−35
@@ -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-04-10 11:13-0400\n"
11−"PO-Revision-Date: 2013-11-23 12:37+0000\n"
12−"Last-Translator: Ignat Kizenko <Unknown>\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"PO-Revision-Date: 2014-06-08 19:09+0000\n"
12+"Last-Translator: Yuri Chornoivan <yurchor@gmail.com>\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−"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,64 +74,73 @@ msgid ""
7474"You have now mastered the edge gestures and can start using the "
7575"phone<br><br>Tap on the screen to start"
7676msgstr ""
77+"Вами налаштовано дії у відповідь на дотики на краях екрана. Тепер телефоном "
78+"можна користуватися.<br><br>Торкніться екрана, щоб розпочати."
79+
80+#: qml/Components/Lockscreen.qml:214
81+msgid "Emergency Call"
82+msgstr "Терміновий виклик"
83+
84+#: qml/Components/Lockscreen.qml:231
85+msgid "OK"
86+msgstr "Гаразд"
7787
7888#: qml/Components/PageHeader.qml:365
7989msgid "Recent searches"
8090msgstr "Нещодавні пошуки"
8191
92+#: qml/Components/PassphraseLockscreen.qml:60
93+#, qt-format
94+msgid "Hello %1"
95+msgstr "Привіт, %1"
96+
97+#: qml/Components/PassphraseLockscreen.qml:60
98+msgid "Hello"
99+msgstr "Привіт!"
100+
101+#: qml/Components/PinLockscreen.qml:198
102+msgid "CANCEL"
103+msgstr "Скасувати"
104+
105+#: qml/Components/PinLockscreen.qml:216
106+msgid "DONE"
107+msgstr "Виконано"
108+
82109#: qml/Components/SeeMore.qml:35
83110msgid "See more"
84−msgstr ""
111+msgstr "Докладніше"
85112
86113#: qml/Components/SeeMore.qml:58
87114msgid "See less"
88−msgstr ""
115+msgstr "Стисліше"
89116
90117#: qml/Dash/DashApps.qml:37
91118msgid "Recent"
92−msgstr ""
93−
94−#: qml/Dash/PreviewListView.qml:52
95−#, qt-format
96−msgid "%1 Preview"
97−msgstr ""
119+msgstr "Нещодавні"
98120
99121#: qml/Dash/Previews/PreviewActionCombo.qml:34
100122msgid "More..."
101−msgstr ""
123+msgstr "Більше…"
102124
103125#: qml/Dash/Previews/PreviewActionCombo.qml:34
104126msgid "Less..."
105−msgstr ""
127+msgstr "Менше..."
106128
107−#: qml/Dash/Previews/PreviewRatingInput.qml:81
129+#: qml/Dash/Previews/PreviewRatingInput.qml:82
108130msgid "Rate this"
109131msgstr "Оцінити"
110132
111−#: qml/Dash/Previews/PreviewRatingInput.qml:126
133+#: qml/Dash/Previews/PreviewRatingInput.qml:128
112134msgid "Add a review"
113135msgstr "Додати рецензію"
114136
115−#: qml/Dash/Previews/PreviewRatingInput.qml:166
137+#: qml/Dash/Previews/PreviewRatingInput.qml:168
116138msgid "Send"
117139msgstr "Надіслати"
118140
119−#: qml/Greeter/Greeter.qml:151
141+#: qml/Greeter/Greeter.qml:157
120142msgid "Swipe to unlock"
121−msgstr ""
122−
123−#: qml/Greeter/Lockscreen.qml:149
124−msgid "Emergency Call"
125−msgstr "Терміновий виклик"
126−
127−#: qml/Greeter/PassphraseLockscreen.qml:59
128−#, qt-format
129−msgid "Hello %1"
130−msgstr "Привіт, %1"
131−
132−#: qml/Greeter/PassphraseLockscreen.qml:59
133−msgid "Hello"
134−msgstr "Привіт!"
143+msgstr "Проведіть пальцем, щоб розблокувати"
135144
136145#: qml/Hud/HudParametrizedActionsPage.qml:132
137146msgid "Confirm"
@@ -159,13 +168,13 @@ msgstr "Показати пароль"
159168
160169#: qml/Notifications/NotificationMenuItemFactory.qml:103
161170msgid "Please enter SIM PIN"
162−msgstr ""
171+msgstr "Введіть PIN-код SIM-картки"
163172
164173#: qml/Panel/SearchIndicator.qml:27
165174msgid "Search"
166175msgstr "Пошук"
167176
168−#: qml/Shell.qml:348
177+#: qml/Shell.qml:334
169178#, qt-format
170179msgid "Please enter %1"
171180msgstr "Будь ласка, введіть %1"
po/unity8.pot+31−24
@@ -8,7 +8,7 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity8\n"
1010"Report-Msgid-Bugs-To: \n"
11−"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11+"POT-Creation-Date: 2014-06-13 09:55+0200\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"
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr ""
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr ""
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr ""
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr ""
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr ""
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
po/vi.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr ""
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr ""
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr ""
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr ""
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr ""
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
po/xh.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr ""
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr ""
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr ""
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr ""
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr ""
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr ""
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr ""
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr ""
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr ""
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
po/zh_CN.po+60−53
@@ -7,128 +7,135 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11−"PO-Revision-Date: 2013-10-09 13:51+0000\n"
12−"Last-Translator: Aron Xu <Unknown>\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"PO-Revision-Date: 2014-06-12 08:55+0000\n"
12+"Last-Translator: Shengjing Zhu <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−"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
2222msgid "Lock to Launcher"
23−msgstr ""
23+msgstr "固定到启动器"
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
2626msgid "Unlock from Launcher"
27−msgstr ""
27+msgstr "从启动器移除"
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
31−msgstr ""
31+msgstr "跳过简介"
3232
3333#: qml/Components/EdgeDemo.qml:113
3434msgid "Right edge"
35−msgstr ""
35+msgstr "右边缘"
3636
3737#: qml/Components/EdgeDemo.qml:114
3838msgid "Try swiping from the right edge to unlock the phone"
39−msgstr ""
39+msgstr "从右边滑动可以解锁"
4040
4141#: qml/Components/EdgeDemo.qml:145
4242msgid "Top edge"
43−msgstr ""
43+msgstr "上边缘"
4444
4545#: qml/Components/EdgeDemo.qml:146
4646msgid "Try swiping from the top edge to access the indicators"
47−msgstr ""
47+msgstr "从上边缘划入可以访问指示器"
4848
4949#: qml/Components/EdgeDemo.qml:171
5050msgid "Close"
51−msgstr ""
51+msgstr "关闭"
5252
5353#: qml/Components/EdgeDemo.qml:172
5454msgid "Swipe up again to close the settings screen"
55−msgstr ""
55+msgstr "再次向上划动可以关闭设置界面"
5656
5757#: qml/Components/EdgeDemo.qml:199
5858msgid "Left edge"
59−msgstr ""
59+msgstr "左边缘"
6060
6161#: qml/Components/EdgeDemo.qml:200
6262msgid "Swipe from the left to reveal the launcher for quick access to apps"
63−msgstr ""
63+msgstr "从左边划入展开启动器可以快速打开应用"
6464
6565#: qml/Components/EdgeDemo.qml:227
6666msgid "Well done"
67−msgstr ""
67+msgstr "做得好"
6868
6969#: qml/Components/EdgeDemo.qml:228
7070msgid ""
7171"You have now mastered the edge gestures and can start using the "
7272"phone<br><br>Tap on the screen to start"
73−msgstr ""
73+msgstr "您现在已经掌握了边缘滑动手势,可以开始使用手机了<br><br>请点击屏幕开始使用"
74+
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr "紧急电话"
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr "确定"
7482
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr "近期搜索"
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr "你好,%1"
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr "你好"
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr "取消"
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr "完成"
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81−msgstr ""
106+msgstr "了解更多"
82107
83108#: qml/Components/SeeMore.qml:58
84109msgid "See less"
85−msgstr ""
110+msgstr "显示更少"
86111
87112#: qml/Dash/DashApps.qml:37
88113msgid "Recent"
89−msgstr ""
90−
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
114+msgstr "最近使用过的"
95115
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98−msgstr ""
118+msgstr "更多..."
99119
100120#: qml/Dash/Previews/PreviewActionCombo.qml:34
101121msgid "Less..."
102−msgstr ""
122+msgstr "更少..."
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106−msgstr ""
126+msgstr "评分"
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110−msgstr ""
130+msgstr "添加评论"
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114−msgstr ""
134+msgstr "发送"
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "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 "你好,%1"
128−
129−#: qml/Greeter/PassphraseLockscreen.qml:59
130−msgid "Hello"
131−msgstr "你好"
138+msgstr "滑动解锁"
132139
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
@@ -152,17 +159,17 @@ msgstr "讲话中..."
152159
153160#: qml/Notifications/NotificationMenuItemFactory.qml:91
154161msgid "Show password"
155−msgstr ""
162+msgstr "显示密码"
156163
157164#: qml/Notifications/NotificationMenuItemFactory.qml:103
158165msgid "Please enter SIM PIN"
159−msgstr ""
166+msgstr "请输入 SIM PIN"
160167
161168#: qml/Panel/SearchIndicator.qml:27
162169msgid "Search"
163170msgstr "搜索"
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168−msgstr ""
175+msgstr "请输入 %1"
po/zh_HK.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr "緊急電話"
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr "最近的搜尋"
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr "您好 %1"
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr "您好"
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr "評價"
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr "新增評論"
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr "傳送"
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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 "您好 %1"
128−
129−#: qml/Greeter/PassphraseLockscreen.qml:59
130−msgid "Hello"
131−msgstr "您好"
132−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr "確認"
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr "搜尋"
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr "請輸入 %1"
po/zh_TW.po+33−26
@@ -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-04-10 11:13-0400\n"
10+"POT-Creation-Date: 2014-06-13 09:55+0200\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−"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16985)\n"
17+"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18+"X-Generator: Launchpad (build 17045)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,10 +72,35 @@ msgid ""
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
7474
75+#: qml/Components/Lockscreen.qml:214
76+msgid "Emergency Call"
77+msgstr "緊急連絡"
78+
79+#: qml/Components/Lockscreen.qml:231
80+msgid "OK"
81+msgstr ""
82+
7583#: qml/Components/PageHeader.qml:365
7684msgid "Recent searches"
7785msgstr "最近搜尋"
7886
87+#: qml/Components/PassphraseLockscreen.qml:60
88+#, qt-format
89+msgid "Hello %1"
90+msgstr "%1 您好"
91+
92+#: qml/Components/PassphraseLockscreen.qml:60
93+msgid "Hello"
94+msgstr "您好"
95+
96+#: qml/Components/PinLockscreen.qml:198
97+msgid "CANCEL"
98+msgstr ""
99+
100+#: qml/Components/PinLockscreen.qml:216
101+msgid "DONE"
102+msgstr ""
103+
79104#: qml/Components/SeeMore.qml:35
80105msgid "See more"
81106msgstr ""
@@ -88,11 +113,6 @@ msgstr ""
88113msgid "Recent"
89114msgstr ""
90115
91−#: qml/Dash/PreviewListView.qml:52
92−#, qt-format
93−msgid "%1 Preview"
94−msgstr ""
95−
96116#: qml/Dash/Previews/PreviewActionCombo.qml:34
97117msgid "More..."
98118msgstr ""
@@ -101,35 +121,22 @@ msgstr ""
101121msgid "Less..."
102122msgstr ""
103123
104−#: qml/Dash/Previews/PreviewRatingInput.qml:81
124+#: qml/Dash/Previews/PreviewRatingInput.qml:82
105125msgid "Rate this"
106126msgstr "對此評比"
107127
108−#: qml/Dash/Previews/PreviewRatingInput.qml:126
128+#: qml/Dash/Previews/PreviewRatingInput.qml:128
109129msgid "Add a review"
110130msgstr "新增回覆"
111131
112−#: qml/Dash/Previews/PreviewRatingInput.qml:166
132+#: qml/Dash/Previews/PreviewRatingInput.qml:168
113133msgid "Send"
114134msgstr "發送"
115135
116−#: qml/Greeter/Greeter.qml:151
136+#: qml/Greeter/Greeter.qml:157
117137msgid "Swipe to unlock"
118138msgstr ""
119139
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 "%1 您好"
128−
129−#: qml/Greeter/PassphraseLockscreen.qml:59
130−msgid "Hello"
131−msgstr "您好"
132−
133140#: qml/Hud/HudParametrizedActionsPage.qml:132
134141msgid "Confirm"
135142msgstr "確認"
@@ -162,7 +169,7 @@ msgstr ""
162169msgid "Search"
163170msgstr "搜尋"
164171
165−#: qml/Shell.qml:348
172+#: qml/Shell.qml:334
166173#, qt-format
167174msgid "Please enter %1"
168175msgstr ""
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/FilterGrid.qml+2−2
@@ -52,8 +52,8 @@ Item {
5252 property alias delegate: iconTileGrid.delegate
5353 property alias cellWidth: iconTileGrid.cellWidth
5454 property alias cellHeight: iconTileGrid.cellHeight
55− property alias delegateCreationBegin: iconTileGrid.delegateCreationBegin
56− property alias delegateCreationEnd: iconTileGrid.delegateCreationEnd
55+ property alias displayMarginBeginning: iconTileGrid.displayMarginBeginning
56+ property alias displayMarginEnd: iconTileGrid.displayMarginEnd
5757 readonly property alias originY: iconTileGrid.originY
5858 readonly property alias flicking: iconTileGrid.flicking
5959 readonly property alias moving: iconTileGrid.moving
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/Greeter/Lockscreen.qml → qml/Components/Lockscreen.qmlrenamed+91−8
@@ -15,8 +15,8 @@
1515 */
1616
1717import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import "../Components"
18+import Ubuntu.Components 1.0
19+import Ubuntu.Components.Popups 1.0
2020
2121Showable {
2222 id: root
@@ -26,19 +26,34 @@ Showable {
2626
2727 // Placeholder text
2828 property string placeholderText: ""
29+ // Placeholder text while shaking (e.g. Incorrect passprase)
30+ property string wrongPlaceholderText: ""
31+ // Retries text (e.g. 3 retries left)
32+ property string retryText: ""
33+
34+ // Informational text. (e.g. some text to tell which domain this is pin is entered for.
35+ property string infoText: ""
2936
3037 // In case the Lockscreen can show a greeter message, this is the username
3138 property string username: ""
3239
33− // Set this to a value greater 0 to enable auto-confirm behavior for the lockscreen.
34− // This is ignored by the alphaNumeric lockscreen as that one is confirmed with pressing enter on the OSK.
35− property int pinLength: -1
40+ // Set those to a value greater 0 to restrict the pin length.
41+ // If both are unset, the Lockscreen will show a confirm button and allow typing any length of pin before
42+ // confirming. If minPinLength is set to a value > 0, the confirm button will only become active when the
43+ // entered pin is at least that long. If maxPinLength is set, the lockscreen won't allow entering any
44+ // more numbers than that. If both are set to the same value, the lockscreen will enter auto confirming
45+ // behavior, hiding the confirmation button and triggering that automatically when the entered pin reached
46+ // that length. This is ignored by the alphaNumeric lockscreen as that one is always confirmed by pressing
47+ // enter on the OSK.
48+ property int minPinLength: -1
49+ property int maxPinLength: -1
3650
3751 property url background: ""
3852
3953 signal entered(string passphrase)
4054 signal cancel()
4155 signal emergencyCall()
56+ signal infoPopupConfirmed()
4257
4358 onRequiredChanged: {
4459 if (required && pinPadLoader.item) {
@@ -56,6 +71,10 @@ Showable {
5671 pinPadLoader.item.clear(showAnimation);
5772 }
5873
74+ function showInfoPopup(title, text) {
75+ PopupUtils.open(infoPopupComponent, root, {title: title, text: text})
76+ }
77+
5978 Rectangle {
6079 // In case background fails to load or is undefined
6180 id: backgroundBackup
@@ -68,7 +87,6 @@ Showable {
6887 objectName: "lockscreenBackground"
6988 anchors {
7089 fill: parent
71− topMargin: backgroundTopMargin
7290 }
7391 source: root.required ? root.background : ""
7492 fillMode: Image.PreserveAspectCrop
@@ -78,6 +96,43 @@ Showable {
7896 anchors.fill: root
7997 }
8098
99+ Column {
100+ spacing: units.gu(2)
101+ anchors {
102+ left: parent.left
103+ right: parent.right
104+ bottom: pinPadLoader.top
105+ bottomMargin: units.gu(2)
106+ }
107+ Label {
108+ objectName: "retryCountLabel"
109+ anchors {
110+ left: parent.left
111+ right: parent.right
112+ }
113+ text: root.retryText
114+ horizontalAlignment: Text.AlignHCenter
115+ color: "#f3f3e7"
116+ opacity: 0.6
117+ visible: root.retryText.length > 0
118+ }
119+ Label {
120+ id: infoTextLabel
121+ objectName: "infoTextLabel"
122+ anchors {
123+ left: parent.left
124+ right: parent.right
125+ }
126+ text: root.infoText
127+ horizontalAlignment: Text.AlignHCenter
128+ color: "#f3f3e7"
129+ opacity: 0.6
130+ visible: root.infoText.length > 0
131+ }
132+ }
133+
134+
135+
81136 Loader {
82137 id: pinPadLoader
83138 objectName: "pinPadLoader"
@@ -105,14 +160,24 @@ Showable {
105160
106161 Binding {
107162 target: pinPadLoader.item
108− property: "pinLength"
109− value: root.pinLength
163+ property: "minPinLength"
164+ value: root.minPinLength
165+ }
166+ Binding {
167+ target: pinPadLoader.item
168+ property: "maxPinLength"
169+ value: root.maxPinLength
110170 }
111171 Binding {
112172 target: pinPadLoader.item
113173 property: "placeholderText"
114174 value: root.placeholderText
115175 }
176+ Binding {
177+ target: pinPadLoader.item
178+ property: "wrongPlaceholderText"
179+ value: root.wrongPlaceholderText
180+ }
116181 Binding {
117182 target: pinPadLoader.item
118183 property: "username"
@@ -153,4 +218,22 @@ Showable {
153218 anchors.horizontalCenter: parent.horizontalCenter
154219 }
155220 }
221+
222+ Component {
223+ id: infoPopupComponent
224+ Dialog {
225+ id: dialog
226+ objectName: "infoPopup"
227+ modal: true
228+
229+ Button {
230+ objectName: "infoPopupOkButton"
231+ text: i18n.tr("OK")
232+ onClicked: {
233+ PopupUtils.close(dialog)
234+ root.infoPopupConfirmed();
235+ }
236+ }
237+ }
238+ }
156239}
qml/Components/PageHeader.qml+1−1
@@ -25,7 +25,7 @@ Item {
2525 property bool searchEntryEnabled: false
2626 property alias searchQuery: searchField.text
2727 property ListModel searchHistory
28− property Scope scope
28+ property var scope: null
2929 property alias childItem: itemContainer.children
3030 property alias showBackButton: backButton.visible
3131
qml/Greeter/PassphraseLockscreen.qml → qml/Components/PassphraseLockscreen.qmlrenamed+6−2
@@ -22,7 +22,8 @@ Item {
2222 id: root
2323 height: highlightItem.height
2424
25− property alias placeholderText: pinentryField.placeholderText
25+ property string placeholderText
26+ property string wrongPlaceholderText
2627 property string username: ""
2728
2829 signal entered(string passphrase)
@@ -73,9 +74,12 @@ Item {
7374 echoMode: TextInput.Password
7475 opacity: 0.9
7576 hasClearButton: false
77+ placeholderText: wrongPasswordAnimation.running ? root.wrongPlaceholderText : root.placeholderText
7678
7779 onAccepted: {
78− root.entered(pinentryField.text);
80+ if (pinentryField.text) {
81+ root.entered(pinentryField.text);
82+ }
7983 }
8084 }
8185 }
qml/Greeter/PinLockscreen.qml → qml/Components/PinLockscreen.qmlrenamed+30−12
@@ -25,9 +25,11 @@ Column {
2525 spacing: units.gu(3.5)
2626
2727 property alias placeholderText: pinentryField.placeholderText
28+ property alias wrongPlaceholderText: pinentryField.wrongPlaceholderText
2829 property int padWidth: units.gu(34)
2930 property int padHeight: units.gu(28)
30− property int pinLength: -1
31+ property int minPinLength: -1
32+ property int maxPinLength: -1
3133
3234 signal entered(string passphrase)
3335 signal cancel()
@@ -41,6 +43,10 @@ Column {
4143 }
4244 }
4345
46+ QtObject {
47+ id: priv
48+ property bool autoConfirm: root.minPinLength == root.maxPinLength && root.minPinLength != -1
49+ }
4450
4551 UbuntuShape {
4652 id: pinentryField
@@ -52,12 +58,20 @@ Column {
5258 radius: "medium"
5359 property string text: ""
5460 property string placeholderText: ""
61+ property string wrongPlaceholderText: ""
62+
63+ function appendChar(character) {
64+ if (root.maxPinLength == -1 || pinentryField.text.length < root.maxPinLength) {
65+ pinentryField.text = pinentryField.text + character;
66+ }
67+ }
68+
5569 onTextChanged: {
5670 pinentryFieldLabel.text = "";
5771 for (var i = 0; i < text.length; ++i) {
5872 pinentryFieldLabel.text += "•";
5973 }
60− if (text.length === root.pinLength) {
74+ if (priv.autoConfirm && text.length === root.maxPinLength) {
6175 root.entered(text);
6276 }
6377 }
@@ -74,9 +88,11 @@ Column {
7488 }
7589 Label {
7690 id: pinentryFieldPlaceHolder
91+ objectName: "pinentryFieldPlaceHolder"
7792 anchors.centerIn: parent
78− color: "grey"
79− text: parent.placeholderText
93+ color: "#f3f3e7"
94+ opacity: 0.6
95+ text: wrongPasswordAnimation.running ? parent.wrongPlaceholderText : parent.placeholderText
8096 visible: pinentryFieldLabel.text.length == 0
8197 }
8298
@@ -91,9 +107,11 @@ Column {
91107 bottom: parent.bottom
92108 bottomMargin: units.gu(1)
93109 }
94− visible: root.pinLength == -1
110+ visible: !priv.autoConfirm
95111 width: height
96112 name: "erase"
113+ color: "#f3f3e7"
114+ opacity: 0.6
97115 MouseArea {
98116 anchors.fill: parent
99117 onClicked: pinentryField.text = pinentryField.text.substring(0, pinentryField.text.length-1);
@@ -168,7 +186,7 @@ Column {
168186 enabled: entryEnabled
169187
170188 onClicked: {
171− pinentryField.text = pinentryField.text + text;
189+ pinentryField.appendChar(text);
172190 }
173191 }
174192 }
@@ -177,7 +195,7 @@ Column {
177195 objectName: "pinPadButtonBack"
178196 width: root.padWidth / 3
179197 height: root.padHeight / 4
180− subText: "CANCEL"
198+ subText: i18n.tr("CANCEL")
181199 onClicked: root.cancel();
182200 }
183201
@@ -186,7 +204,7 @@ Column {
186204 width: root.padWidth / 3
187205 height: root.padHeight / 4
188206 text: "0"
189− onClicked: pinentryField.text = pinentryField.text + text
207+ onClicked: pinentryField.appendChar(text);
190208 enabled: entryEnabled
191209 }
192210
@@ -194,16 +212,16 @@ Column {
194212 objectName: "pinPadButtonErase"
195213 width: root.padWidth / 3
196214 height: root.padHeight / 4
197− iconName: root.pinLength == -1 ? "" : "erase"
198− subText: root.pinLength == -1 ? "DONE" : ""
215+ iconName: priv.autoConfirm ? "erase" : ""
216+ subText: priv.autoConfirm ? "" : i18n.tr("DONE")
199217 onClicked: {
200− if (root.pinLength !== -1) {
218+ if (priv.autoConfirm) {
201219 pinentryField.text = pinentryField.text.substring(0, pinentryField.text.length-1);
202220 } else {
203221 root.entered(pinentryField.text);
204222 }
205223 }
206− enabled: entryEnabled
224+ enabled: priv.autoConfirm ? entryEnabled : pinentryField.text.length >= root.minPinLength
207225 }
208226 }
209227 }
qml/Components/PinPadButton.qml+2−1
@@ -19,6 +19,7 @@ import Ubuntu.Components 0.1
1919
2020Item {
2121 id: root
22+ opacity: enabled ? 1 : 0.6
2223
2324 property alias text: label.text
2425 property alias subText: subTextLabel.text
@@ -62,7 +63,7 @@ Item {
6263 Label {
6364 id: subTextLabel
6465 fontSize: "small"
65− color: "grey"
66+ color: "#f3f3e7"
6667 anchors.horizontalCenter: parent.horizontalCenter
6768 visible: text.length > 0
6869 }
qml/Components/ResponsiveGridView.qml+3−3
@@ -14,7 +14,7 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 */
1616
17−import QtQuick 2.0
17+import QtQuick 2.3
1818import Ubuntu.Components 0.1
1919
2020/*
@@ -41,8 +41,8 @@ Item {
4141 readonly property alias moving: gridView.moving
4242 readonly property alias pressDelay: gridView.pressDelay
4343 readonly property alias originY: gridView.originY
44− property alias delegateCreationBegin: gridView.delegateCreationBegin
45− property alias delegateCreationEnd: gridView.delegateCreationEnd
44+ property alias displayMarginBeginning: gridView.displayMarginBeginning
45+ property alias displayMarginEnd: gridView.displayMarginEnd
4646 property alias highlightIndex: gridView.highlightIndex
4747 readonly property alias currentItem: gridView.currentItem
4848
qml/Components/Revealer.qmldeleted−241
@@ -1,241 +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: revealer
22−
23− property Showable target
24− property var hintingAnimation: hintingAnimation
25− property string boundProperty: orientation == Qt.Vertical ? "y" : "x"
26− property int orientation: Qt.Vertical
27− property int direction: Qt.LeftToRight
28− property real openedValue: orientation == Qt.Vertical ? y : x
29− property real closedValue: orientation == Qt.Vertical ? y + (direction == Qt.LeftToRight ? -height : height) : x + (direction == Qt.LeftToRight ? -width : width)
30− property real hintDisplacement: 0
31− property real handleSize: units.gu(2)
32− property real dragVelocity: draggingArea.dragVelocity != 0 ? Math.abs(draggingArea.dragVelocity) : -1
33− property real dragVelocityThreshold: units.gu(5)
34− property bool dragging: false
35− property bool pressed: draggingArea.pressed
36− property int lateralPosition: draggingArea.lateralPosition
37− property real dragPosition
38− property bool openOnPress: true
39−
40− signal openPressed(int mouseX, int mouseY)
41− signal openReleased(int mouseX, int mouseY)
42− signal closePressed
43− signal openClicked
44− signal closeClicked
45−
46− dragPosition: {
47− var value
48− if (orientation == Qt.Vertical) {
49− value = draggingArea.dragValue + draggingArea.y
50− if (direction == Qt.RightToLeft) {
51− value += draggingArea.height - height
52− }
53− } else {
54− value = draggingArea.dragValue + draggingArea.x
55− if (direction == Qt.RightToLeft) {
56− value += draggingArea.width - width
57− }
58− }
59− if (__opened) {
60− if (direction == Qt.LeftToRight) {
61− value += handleSize
62− } else {
63− value -= handleSize
64− }
65− } else if (dragging) {
66− if (direction == Qt.LeftToRight) {
67− value += hintDisplacement
68− } else {
69− value -= hintDisplacement
70− }
71− }
72−
73− return value
74− }
75− property var draggingArea: leftDraggingArea.enabled ? leftDraggingArea : rightDraggingArea
76−
77− property real __hintValue: closedValue + (direction == Qt.LeftToRight ? hintDisplacement : -hintDisplacement)
78−
79− function dragToValue(dragPosition) {
80− return dragPosition + closedValue
81− }
82−
83− property bool __opened: target.shown
84− enabled: target.available
85−
86− // Can be replaced with a fake implementation during tests
87− // property var __getCurrentTimeMs: function () { return new Date().getTime() }
88− property var __dateTime: new function() {
89− this.getCurrentTimeMs = function() {return new Date().getTime()}
90− }
91−
92− Component.onCompleted: target[boundProperty] = __opened ? openedValue : closedValue
93− onOpenedValueChanged: if (__opened && !dragging) target[boundProperty] = openedValue
94− onClosedValueChanged: if (!__opened && !dragging) target[boundProperty] = closedValue
95−
96− function __computeValue(dragPosition) {
97− return MathUtils.clamp(dragToValue(dragPosition), __hintValue, openedValue)
98− }
99−
100− function __open() {
101− hintingAnimation.stop()
102− target.show()
103− }
104−
105− function __close() {
106− hintingAnimation.stop()
107− target.hide()
108− }
109−
110− function __hint() {
111− target.showAnimation.stop()
112− target.hideAnimation.stop()
113− hintingAnimation.restart()
114− }
115−
116− function __settle() {
117− hintingAnimation.stop()
118− if (__opened) target.show()
119− else target.hide()
120− }
121−
122− function __startDragging() {
123− hintingAnimation.stop()
124− dragging = true
125− }
126−
127− function __endDragging(dragVelocity) {
128− dragging = false
129− if (revealer.direction == Qt.RightToLeft) {
130− dragVelocity = -dragVelocity
131− }
132− if (Math.abs(dragVelocity) >= dragVelocityThreshold) {
133− if (dragVelocity > 0) __open()
134− else __close()
135− } else {
136− __settle()
137− }
138− }
139−
140− Binding {
141− id: dragBinding
142−
143− target: revealer.target
144− property: revealer.boundProperty
145− value: __computeValue(dragPosition)
146− when: dragging
147− }
148−
149− SmoothedAnimation {
150− id: hintingAnimation
151−
152− target: revealer.target
153− property: revealer.boundProperty
154− duration: 150
155− to: revealer.__hintValue
156− }
157−
158− DraggingArea {
159− id: leftDraggingArea
160−
161− property bool isOpeningArea: revealer.direction == Qt.LeftToRight
162−
163− height: orientation == Qt.Vertical ? handleSize : parent.height
164− width: orientation == Qt.Horizontal ? handleSize : parent.width
165− orientation: revealer.orientation
166− enabled: isOpeningArea ? !revealer.__opened : revealer.__opened
167−
168− __dateTime: revealer.__dateTime
169−
170− onPressed: {
171− if (isOpeningArea) {
172− if (revealer.openOnPress) {
173− revealer.openPressed(mouseX, mouseY)
174− __hint()
175− }
176− } else {
177− revealer.closePressed()
178− }
179− }
180− onReleased: {
181− if (isOpeningArea && revealer.openOnPress) {
182− revealer.openReleased(mouseX, mouseY)
183− __settle()
184− }
185− }
186− onDragStart: __startDragging()
187− onDragEnd: __endDragging(dragVelocity)
188− onClicked: {
189− if (clickValidated) {
190− if (isOpeningArea) {
191− if (revealer.openOnPress) revealer.openClicked()
192− } else {
193− revealer.closeClicked()
194− }
195− }
196− }
197− }
198−
199− DraggingArea {
200− id: rightDraggingArea
201−
202− property bool isOpeningArea: revealer.direction == Qt.RightToLeft
203−
204− x: orientation == Qt.Vertical ? 0 : parent.width - width
205− y: orientation == Qt.Vertical ? parent.height - height : 0
206− height: orientation == Qt.Vertical ? handleSize : parent.height
207− width: orientation == Qt.Horizontal ? handleSize : parent.width
208− orientation: revealer.orientation
209− enabled: isOpeningArea ? !revealer.__opened : revealer.__opened
210−
211− __dateTime: revealer.__dateTime
212−
213− onPressed: {
214− if (isOpeningArea) {
215− if (revealer.openOnPress) {
216− revealer.openPressed(mouseX, mouseY)
217− __hint()
218− }
219− } else {
220− revealer.closePressed()
221− }
222− }
223− onReleased: {
224− if (isOpeningArea && revealer.openOnPress) {
225− revealer.openReleased(mouseX, mouseY)
226− __settle()
227− }
228− }
229− onDragStart: __startDragging()
230− onDragEnd: __endDragging(dragVelocity)
231− onClicked: {
232− if (clickValidated) {
233− if (isOpeningArea) {
234− if (revealer.openOnPress) revealer.openClicked()
235− } else {
236− revealer.closeClicked()
237− }
238− }
239− }
240− }
241−}
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.qmldeleted−236
@@ -1,236 +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−// For image://albumart and image://thumbnailer image providers
20−import Ubuntu.Thumbnailer 0.1
21−
22−AbstractButton {
23− id: root
24− property var template
25− property var components
26− property var cardData
27−
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"] || ""
33−
34− property bool showHeader: true
35−
36− implicitWidth: childrenRect.width
37− implicitHeight: summary.y + summary.height + (summary.text && backgroundLoader.active ? units.gu(1) : 0)
38−
39− Loader {
40− id: backgroundLoader
41− objectName: "backgroundLoader"
42−
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
46−
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− }
64− }
65−
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− }
75− }
76− }
77−
78− UbuntuShape {
79− id: artShape
80− radius: "medium"
81− objectName: "artShape"
82− anchors.horizontalCenter: template && template["card-layout"] === "horizontal" ? undefined : parent.horizontalCenter
83− anchors.left: template && template["card-layout"] === "horizontal" ? parent.left : undefined
84− visible: cardData && cardData["art"] || false
85−
86− readonly property real aspect: components !== undefined ? components["art"]["aspect-ratio"] : 1
87− readonly property bool aspectSmallerThanImageAspect: aspect < image.aspect
88−
89− Component.onCompleted: updateWidthHeightBindings();
90− onAspectSmallerThanImageAspectChanged: updateWidthHeightBindings();
91−
92− function updateWidthHeightBindings() {
93− if (aspectSmallerThanImageAspect) {
94− width = Qt.binding(function() { return !visible ? 0 : image.width });
95− height = Qt.binding(function() { return !visible ? 0 : image.fillMode === Image.PreserveAspectCrop ? image.height : width / image.aspect });
96− } else {
97− width = Qt.binding(function() { return !visible ? 0 : image.fillMode === Image.PreserveAspectCrop ? image.width : height * image.aspect });
98− height = Qt.binding(function() { return !visible ? 0 : image.height });
99− }
100− }
101−
102− image: Image {
103− objectName: "artImage"
104− source: cardData && cardData["art"] || ""
105− cache: true
106− // FIXME uncomment when having investigated / fixed the crash
107− //sourceSize.width: width > height ? width : 0
108− //sourceSize.height: height > width ? height : 0
109− fillMode: components && components["art"]["fill-mode"] === "fit" ? Image.PreserveAspectFit: Image.PreserveAspectCrop
110−
111− readonly property real aspect: implicitWidth / implicitHeight
112− readonly property bool isHorizontal: template && template["card-layout"] === "horizontal"
113−
114− Component.onCompleted: updateWidthHeightBindings();
115− onIsHorizontalChanged: updateWidthHeightBindings();
116−
117− function updateWidthHeightBindings() {
118− if (isHorizontal) {
119− width = Qt.binding(function() { return height * artShape.aspect });
120− height = Qt.binding(function() { return root.headerHeight });
121− } else {
122− width = Qt.binding(function() { return root.width });
123− height = Qt.binding(function() { return width / artShape.aspect });
124− }
125− }
126− }
127− }
128−
129− Loader {
130− id: overlayLoader
131− anchors {
132− left: artShape.left
133− right: artShape.right
134− bottom: artShape.bottom
135− }
136− active: template && template["overlay"] && artShape.visible && artShape.image.status === Image.Ready || false
137−
138− sourceComponent: ShaderEffect {
139− id: overlay
140−
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− }
151−
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− }
171− }
172−
173− Loader {
174− id: headerLoader
175− objectName: "cardHeaderLoader"
176−
177− anchors {
178− top: {
179− if (template) {
180− if (template["overlay"]) return overlayLoader.top;
181− if (template["card-layout"] === "horizontal") return artShape.top;
182− }
183− return artShape.bottom;
184− }
185− left: {
186− if (template) {
187− if (!template["overlay"] && template["card-layout"] === "horizontal") return artShape.right;
188− }
189− return parent.left;
190− }
191− right: parent.right
192− }
193− active: cardData && cardData["title"] || cardData && cardData["mascot"] || false
194−
195− sourceComponent: CardHeader {
196− id: header
197− objectName: "cardHeader"
198−
199− mascot: cardData && cardData["mascot"] || ""
200− title: root.title
201− subtitle: cardData && cardData["subtitle"] || ""
202−
203− titleWeight: components && components["subtitle"] ? Font.DemiBold : Font.Normal
204−
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
212−
213− Behavior on opacity { NumberAnimation { duration: UbuntuAnimation.SnapDuration } }
214− }
215− }
216−
217− Label {
218− id: summary
219− objectName: "summaryLabel"
220− anchors {
221− top: headerLoader.active ? headerLoader.bottom : artShape.bottom
222− left: parent.left
223− right: parent.right
224− margins: backgroundLoader.active ? units.gu(1) : 0
225− topMargin: 0
226− }
227− wrapMode: Text.Wrap
228− maximumLineCount: 5
229− elide: Text.ElideRight
230− text: cardData && cardData["summary"] || ""
231− height: text ? implicitHeight : 0
232− fontSize: "small"
233− // TODO karni: Change "grey" to Ubuntu.Components.Palette color once updated.
234− color: backgroundLoader.active && backgroundLoader.item.luminance < 0.7 ? "white" : "grey"
235− }
236−}
qml/Dash/CardCarousel.qml+26−14
@@ -18,7 +18,6 @@ import QtQuick 2.0
1818import Ubuntu.Components 0.1
1919import "../Components"
2020
21−
2221DashRenderer {
2322 id: cardCarousel
2423
@@ -35,7 +34,7 @@ DashRenderer {
3534 Carousel {
3635 id: carousel
3736 anchors.fill: parent
38− tileAspectRatio: cardCarousel.components && cardCarousel.components["art"]["aspect-ratio"] || 1.0
37+ tileAspectRatio: cardTool.components && cardTool.components["art"]["aspect-ratio"] || 1.0
3938 // FIXME we need to "reverse" the carousel to make the selected item the size
4039 // and push others back.
4140 minimumTileWidth: cardTool.cardWidth / selectedItemScaleFactor
@@ -43,27 +42,40 @@ DashRenderer {
4342 cacheBuffer: 1404 // 18px * 13gu * 6
4443 model: cardCarousel.model
4544
46− onClicked: cardCarousel.clicked(index, itemY)
47− onPressAndHold: cardCarousel.pressAndHold(index, itemY)
45+ onClicked: cardCarousel.clicked(index, null)
46+ onPressAndHold: cardCarousel.pressAndHold(index)
4847
4948 property real fontScale: 1 / selectedItemScaleFactor
5049 property real headerHeight: cardTool.headerHeight / selectedItemScaleFactor
5150
52− itemComponent: Card {
53− id: card
54− objectName: "carouselDelegate" + index
55− fixedHeaderHeight: carousel.headerHeight
56− cardData: model
57− template: cardTool.template
58− components: cardTool.components
51+ itemComponent: Loader {
52+ id: loader
5953
6054 property bool explicitlyScaled
6155 property var model
62−
6356 enabled: false
64− showHeader: explicitlyScaled
6557
66− fontScale: carousel.fontScale
58+ sourceComponent: cardTool.cardComponent
59+ onLoaded: {
60+ item.objectName = "carouselDelegate" + index;
61+ item.fixedHeaderHeight = Qt.binding(function() { return carousel.headerHeight; });
62+ item.height = Qt.binding(function() { return cardTool.cardHeight; });
63+ item.cardData = Qt.binding(function() { return model; });
64+ item.template = Qt.binding(function() { return cardTool.template; });
65+ item.components = Qt.binding(function() { return cardTool.components; });
66+ item.fontScale = Qt.binding(function() { return carousel.fontScale; });
67+ item.showHeader = Qt.binding(function() { return loader.explicitlyScaled; });
68+ item.artShapeBorderSource = "none";
69+ }
70+
71+ BorderImage {
72+ anchors {
73+ fill: parent
74+ margins: -units.gu(1)
75+ }
76+ z: -1
77+ source: "graphics/carousel_dropshadow.sci"
78+ }
6779 }
6880 }
6981}
qml/Dash/CardFilterGrid.qml+21−18
@@ -43,27 +43,30 @@ DashRenderer {
4343 verticalSpacing: genericFilterGrid.verticalSpacing
4444 model: genericFilterGrid.model
4545 collapsedRowCount: Math.min(2, cardTool && cardTool.template && cardTool.template["collapsed-rows"] || 2)
46− delegateCreationBegin: genericFilterGrid.delegateCreationBegin
47− delegateCreationEnd: genericFilterGrid.delegateCreationEnd
48− delegate: Loader {
49− asynchronous: true
46+ displayMarginBeginning: genericFilterGrid.displayMarginBeginning
47+ displayMarginEnd: genericFilterGrid.displayMarginEnd
48+ delegate: Item {
5049 width: filterGrid.cellWidth
5150 height: filterGrid.cellHeight
52− Card {
53− id: card
54− width: cardTool.cardWidth
55− height: cardTool.cardHeight
56− fixedHeaderHeight: cardTool.headerHeight
51+ Loader {
52+ id: loader
53+ sourceComponent: cardTool.cardComponent
5754 anchors.horizontalCenter: parent.horizontalCenter
58− objectName: "delegate" + index
59− cardData: model
60− template: cardTool.template
61− components: cardTool.components
62−
63− headerAlignment: cardTool.headerAlignment
64−
65− onClicked: genericFilterGrid.clicked(index, card.y)
66− onPressAndHold: genericFilterGrid.pressAndHold(index, card.y)
55+ onLoaded: {
56+ item.objectName = "delegate" + index;
57+ item.width = Qt.binding(function() { return cardTool.cardWidth; });
58+ item.height = Qt.binding(function() { return cardTool.cardHeight; });
59+ item.fixedArtShapeSize = Qt.binding(function() { return cardTool.artShapeSize; });
60+ item.cardData = Qt.binding(function() { return model; });
61+ item.template = Qt.binding(function() { return cardTool.template; });
62+ item.components = Qt.binding(function() { return cardTool.components; });
63+ item.headerAlignment = Qt.binding(function() { return cardTool.headerAlignment; });
64+ }
65+ Connections {
66+ target: loader.item
67+ onClicked: genericFilterGrid.clicked(index, result)
68+ onPressAndHold: genericFilterGrid.pressAndHold(index)
69+ }
6770 }
6871 }
6972 }
qml/Dash/CardHeader.qmldeleted−126
@@ -1,126 +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: root
22− property url mascot: ""
23− property alias title: titleLabel.text
24− property var subtitle
25−
26− property alias titleWeight: titleLabel.font.weight
27− property alias titleSize: titleLabel.fontSize
28−
29− // FIXME: Saviq, used to scale fonts down in Carousel
30− property real fontScale: 1.0
31−
32− property alias headerAlignment: titleLabel.horizontalAlignment
33−
34− property bool inOverlay: false
35− property bool useMascotShape: true
36− property color fontColor: Theme.palette.selected.backgroundText
37−
38− visible: mascot != "" || title
39− implicitHeight: row.height > 0 ? row.height + row.margins * 2 : 0
40−
41− Row {
42− id: row
43− objectName: "outerRow"
44−
45− property real margins: units.gu(1)
46−
47− spacing: mascotShapeLoader.active || mascotImageLoader.active || inOverlay ? margins : 0
48− anchors {
49− top: parent.top; left: parent.left; right: parent.right
50− margins: margins
51− leftMargin: spacing
52− rightMargin: spacing
53− }
54−
55− Loader {
56− id: mascotShapeLoader
57− objectName: "mascotShapeLoader"
58−
59− active: useMascotShape && mascotImageLoader.item && mascotImageLoader.item.status === Image.Ready
60− visible: active
61− anchors.verticalCenter: parent.verticalCenter
62− // TODO karni: Icon aspect-ratio is 8:7.5. Revisit these values to avoid fraction of pixels.
63− width: units.gu(6)
64− height: units.gu(5.625)
65− readonly property int maxSize: Math.max(width, height) * 4
66−
67− sourceComponent: UbuntuShape {
68− image: mascotImageLoader.item
69− }
70− }
71−
72− Loader {
73− id: mascotImageLoader
74− active: root.mascot != ""
75− visible: active && !useMascotShape && item.status === Image.Ready
76− anchors.verticalCenter: parent.verticalCenter
77− sourceComponent: Image {
78− objectName: "mascotImage"
79−
80− source: root.mascot
81− width: source ? mascotShapeLoader.width : 0
82− height: mascotShapeLoader.height
83−
84− sourceSize { width: mascotShapeLoader.maxSize; height: mascotShapeLoader.maxSize }
85− fillMode: Image.PreserveAspectCrop
86− horizontalAlignment: Image.AlignHCenter
87− verticalAlignment: Image.AlignVCenter
88− }
89− }
90−
91− Column {
92− objectName: "column"
93− width: parent.width - x
94− spacing: units.dp(2)
95− anchors.verticalCenter: parent.verticalCenter
96−
97− Label {
98− id: titleLabel
99− objectName: "titleLabel"
100− anchors { left: parent.left; right: parent.right }
101− elide: Text.ElideRight
102− font.weight: Font.Normal
103− fontSize: "small"
104− wrapMode: Text.Wrap
105− maximumLineCount: 2
106− font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale)
107− color: fontColor
108− }
109−
110− Loader {
111− active: titleLabel.text && root.subtitle
112− anchors { left: parent.left; right: parent.right }
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− }
123− }
124− }
125− }
126−}
qml/Dash/CardTool.qml+30−22
@@ -15,6 +15,7 @@
1515 */
1616
1717import QtQuick 2.0
18+import Dash 0.1
1819
1920/*!
2021 \brief Tool for introspecting Card properties.
@@ -65,6 +66,8 @@ Item {
6566 return layout;
6667 }
6768
69+ property var cardComponent: CardCreatorCache.getCardComponent(cardTool.template, cardTool.components);
70+
6871 // FIXME: Saviq
6972 // Only way for the card below to actually be laid out completely.
7073 // If invisible or in "data" array, some components are not taken into account.
@@ -108,7 +111,7 @@ Item {
108111 if (template["card-size"] >= 12 && template["card-size"] <= 38) return units.gu(template["card-size"]);
109112 return units.gu(18.5);
110113 case "grid":
111− return card.implicitHeight
114+ return cardLoader.item ? cardLoader.item.implicitHeight : 0
112115 case "carousel":
113116 return cardWidth / (components ? components["art"]["aspect-ratio"] : 1)
114117 case undefined:
@@ -122,7 +125,8 @@ Item {
122125 /*!
123126 type:real \brief Height of the card's header.
124127 */
125− readonly property alias headerHeight: card.headerHeight
128+ readonly property int headerHeight: cardLoader.item ? cardLoader.item.headerHeight : 0
129+ readonly property size artShapeSize: cardLoader.item ? cardLoader.item.artShapeSize : 0
126130
127131 /*!
128132 \brief Desired alignment of header components.
@@ -161,15 +165,8 @@ Item {
161165 }
162166 }
163167
164− Card {
165− id: card
166− objectName: "cardToolCard"
167− template: cardTool.template
168− components: cardTool.components
169−
170− width: cardTool.cardWidth || implicitWidth
171− height: cardTool.cardHeight || implicitHeight
172−
168+ Loader {
169+ id: cardLoader
173170 property var fields: ["art", "mascot", "title", "subtitle", "summary"]
174171 property var maxData: {
175172 "art": Qt.resolvedUrl("graphics/checkers.png"),
@@ -178,19 +175,30 @@ Item {
178175 "subtitle": "—",
179176 "summary": "—\n—\n—\n—\n—"
180177 }
181−
182− onComponentsChanged: {
183− var data = {};
184− for (var k in fields) {
185− var component = components[fields[k]];
186− var key = fields[k];
187− if ((typeof component === "string" && component.length > 0) ||
188− (typeof component === "object" && component !== null
189− && typeof component["field"] === "string" && component["field"].length > 0)) {
190− data[key] = maxData[key];
178+ sourceComponent: cardTool.cardComponent
179+ onLoaded: {
180+ item.objectName = "cardToolCard";
181+ item.asynchronous = false;
182+ item.template = Qt.binding(function() { return cardTool.template; });
183+ item.components = Qt.binding(function() { return cardTool.components; });
184+ item.width = Qt.binding(function() { return cardTool.cardWidth || item.implicitWidth; });
185+ item.height = Qt.binding(function() { return cardTool.cardHeight || item.implicitHeight; });
186+ }
187+ Connections {
188+ target: cardLoader.item
189+ onComponentsChanged: {
190+ var data = {};
191+ for (var k in cardLoader.fields) {
192+ var component = cardLoader.item.components[cardLoader.fields[k]];
193+ var key = cardLoader.fields[k];
194+ if ((typeof component === "string" && component.length > 0) ||
195+ (typeof component === "object" && component !== null
196+ && typeof component["field"] === "string" && component["field"].length > 0)) {
197+ data[key] = cardLoader.maxData[key];
198+ }
191199 }
200+ cardLoader.item.cardData = data;
192201 }
193− cardData = data;
194202 }
195203 }
196204}
qml/Dash/DashContent.qml+19−11
@@ -17,6 +17,7 @@
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
1919import Unity 0.2
20+import Utils 0.1
2021import "../Components"
2122
2223Item {
@@ -137,7 +138,7 @@ Item {
137138
138139 readonly property bool moving: item ? item.moving : false
139140 readonly property var categoryView: item ? item.categoryView : null
140− readonly property Scope theScope: scope
141+ readonly property var theScope: scope
141142
142143 // these are needed for autopilot tests
143144 readonly property string scopeId: scope.id
@@ -183,23 +184,30 @@ Item {
183184 width: parent.width
184185 style: DashContentTabBarStyle {}
185186
186− model: dashContentList.model
187+ SortFilterProxyModel {
188+ id: tabBarModel
187189
188− onSelectedIndexChanged: {
189− if (dashContentList.currentIndex == -1 && tabBar.selectedIndex != -1) {
190− // TODO This together with the Timer below
191− // are a workaround for the first tab sometimes not showing the text.
192− // But Tabs are going away in the future so not sure if makes
193− // sense invetigating what's the problem at this stage
194− selectionModeTimer.restart();
190+ model: dashContentList.model
191+
192+ property int selectedIndex: -1
193+ onSelectedIndexChanged: {
194+ if (dashContentList.currentIndex == -1 && tabBar.selectedIndex != -1) {
195+ // TODO This together with the Timer below
196+ // are a workaround for the first tab sometimes not showing the text.
197+ // But Tabs are going away in the future so not sure if makes
198+ // sense invetigating what's the problem at this stage
199+ selectionModeTimer.restart();
200+ }
201+ dashContentList.currentIndex = selectedIndex;
195202 }
196− dashContentList.currentIndex = selectedIndex;
197203 }
198204
205+ model: tabBarModel.count > 0 ? tabBarModel : null
206+
199207 Connections {
200208 target: dashContentList
201209 onCurrentIndexChanged: {
202− tabBar.selectedIndex = dashContentList.currentIndex
210+ tabBarModel.selectedIndex = dashContentList.currentIndex
203211 }
204212 }
205213
qml/Dash/DashRenderer.qml+5−6
@@ -29,9 +29,9 @@ Item {
2929
3030 property int uncollapsedHeight: height
3131
32− property var delegateCreationBegin: undefined
32+ property int displayMarginBeginning: 0
3333
34− property var delegateCreationEnd: undefined
34+ property int displayMarginEnd: 0
3535
3636 property real originY: 0
3737
@@ -50,13 +50,12 @@ Item {
5050
5151 /// Emitted when the user clicked on an item
5252 /// @param index is the index of the clicked item
53− /// @param itemY is y of the clicked delegate
54− signal clicked(int index, real itemY)
53+ /// @param result result model of the cliked item, used for activation
54+ signal clicked(int index, var result)
5555
5656 /// Emitted when the user pressed and held on an item
5757 /// @param index is the index of the held item
58− /// @param itemY is y of the held delegate
59− signal pressAndHold(int index, real itemY)
58+ signal pressAndHold(int index)
6059
6160 function setFilter(filter, animate) {
6261 }
qml/Dash/GenericScopeView.qml+14−12
@@ -25,7 +25,7 @@ import "../Components/ListItems" as ListItems
2525FocusScope {
2626 id: scopeView
2727
28− property Scope scope: null
28+ property var scope: null
2929 property SortFilterProxyModel categories: categoryFilter
3030 property bool isCurrent: false
3131 property alias moving: categoryView.moving
@@ -128,7 +128,7 @@ FocusScope {
128128
129129 CardTool {
130130 id: cardTool
131−
131+ objectName: "cardTool"
132132 count: results.count
133133 template: model.renderer
134134 components: model.components
@@ -141,6 +141,7 @@ FocusScope {
141141 top: parent.top
142142 left: parent.left
143143 right: parent.right
144+ topMargin: hasSectionHeader ? 0 : units.gu(2)
144145 }
145146
146147 source: {
@@ -183,12 +184,11 @@ FocusScope {
183184 Connections {
184185 target: rendererLoader.item
185186 onClicked: {
186− if (scopeView.scope.id === "scopes" || (scopeView.scope.id == "clickscope" && categoryId == "local")) {
187+ if (scopeView.scope.id === "scopes" || (scopeView.scope.id == "clickscope" && (categoryId == "local" || categoryId == "store"))) {
187188 // TODO Technically it is possible that calling activate() will make the scope emit
188189 // previewRequested so that we show a preview but there's no scope that does that yet
189190 // so it's not implemented
190− var item = target.model.get(index);
191− scopeView.scope.activate(item.result)
191+ scopeView.scope.activate(result)
192192 } else {
193193 previewListView.model = target.model;
194194 previewListView.currentIndex = -1
@@ -244,18 +244,20 @@ FocusScope {
244244 }
245245 }
246246
247− if (item && item.hasOwnProperty("delegateCreationBegin")) {
247+ if (item && item.hasOwnProperty("displayMarginBeginning")) {
248+ // TODO do we need item.originY here, test 1300302 once we have a silo
249+ // and we can run it on the phone
248250 if (baseItem.y + baseItem.height <= 0) {
249251 // Not visible (item at top of the list viewport)
250− item.delegateCreationBegin = item.originY + baseItem.height
251− item.delegateCreationEnd = item.originY + baseItem.height
252+ item.displayMarginBeginning = -baseItem.height;
253+ item.displayMarginEnd = 0;
252254 } else if (baseItem.y >= categoryView.height) {
253255 // Not visible (item at bottom of the list viewport)
254− item.delegateCreationBegin = item.originY
255− item.delegateCreationEnd = item.originY
256+ item.displayMarginBeginning = 0;
257+ item.displayMarginEnd = -baseItem.height;
256258 } else {
257− item.delegateCreationBegin = item.originY + Math.max(-baseItem.y, 0)
258− item.delegateCreationEnd = item.originY + Math.min(categoryView.height + item.delegateCreationBegin, baseItem.height)
259+ item.displayMarginBeginning = -Math.max(-baseItem.y, 0);
260+ item.displayMarginEnd = -Math.max(baseItem.height - categoryView.height + baseItem.y, 0)
259261 }
260262 }
261263 }
qml/Dash/PreviewListView.qml+3−3
@@ -23,7 +23,7 @@ import "Previews" as Previews
2323Item {
2424 id: root
2525
26− property Scope scope: null
26+ property var scope: null
2727 property var pageHeader: null
2828
2929 property alias open: previewListView.open
@@ -49,7 +49,7 @@ Item {
4949 right: parent.right
5050 verticalCenter: parent.verticalCenter
5151 }
52− text: scope ? i18n.tr("%1 Preview").arg(scope.name) : ""
52+ text: scope ? scope.name : ""
5353 // TODO Saviq: These should come from updated Ubuntu Palette.
5454 color: "#888888"
5555 font.family: "Ubuntu"
@@ -116,7 +116,7 @@ Item {
116116
117117 previewModel: {
118118 var previewStack = root.scope.preview(result);
119− return previewStack.get(0);
119+ return previewStack.getPreviewModel(0);
120120 }
121121 }
122122
qml/Dash/Previews/PreviewHeader.qml+89−9
@@ -15,9 +15,10 @@
1515 */
1616
1717import QtQuick 2.0
18+import Ubuntu.Components 0.1
1819import "../"
1920
20−/*! This preview widget shows a header that is the same as the card header
21+/*! This preview widget shows a header
2122 * The title comes in widgetData["title"]
2223 * The mascot comes in widgetData["mascot"]
2324 * The subtitle comes in widgetData["subtitle"]
@@ -28,15 +29,94 @@ PreviewWidget {
2829
2930 height: childrenRect.height
3031
31− CardHeader {
32− objectName: "cardHeader"
33− mascot: root.widgetData["mascot"] || ""
34− title: root.widgetData["title"] || ""
35− subtitle: root.widgetData["subtitle"] || ""
32+ Item {
33+ id: headerRoot
34+ objectName: "innerPreviewHeader"
35+ readonly property url mascot: root.widgetData["mascot"] || ""
36+ readonly property string title: root.widgetData["title"] || ""
37+ readonly property string subtitle: root.widgetData["subtitle"] || ""
38+ readonly property color fontColor: "grey"
39+
40+ implicitHeight: row.height + row.margins * 2
3641 width: parent.width
3742
38− titleSize: "large"
39− // TODO Change "grey" to Ubuntu.Components.Palette color once updated.
40− fontColor: "grey"
43+ Row {
44+ id: row
45+ objectName: "outerRow"
46+
47+ property real margins: units.gu(1)
48+
49+ spacing: mascotShapeLoader.active ? margins : 0
50+ anchors {
51+ top: parent.top; left: parent.left; right: parent.right
52+ margins: margins
53+ leftMargin: spacing
54+ rightMargin: spacing
55+ }
56+
57+ Loader {
58+ id: mascotShapeLoader
59+ objectName: "mascotShapeLoader"
60+ active: headerRoot.mascot != ""
61+ visible: active
62+
63+ anchors.verticalCenter: parent.verticalCenter
64+ // TODO karni: Icon aspect-ratio is 8:7.5. Revisit these values to avoid fraction of pixels.
65+ width: units.gu(6)
66+ height: units.gu(5.625)
67+ readonly property int maxSize: Math.max(width, height) * 4
68+ asynchronous: true
69+
70+ sourceComponent: UbuntuShape {
71+ objectName: "mascotShape"
72+ visible: image.status === Image.Ready
73+ image: Image {
74+ source: headerRoot.mascot
75+ width: source ? mascotShapeLoader.width : 0
76+ height: mascotShapeLoader.height
77+
78+ sourceSize { width: mascotShapeLoader.maxSize; height: mascotShapeLoader.maxSize }
79+ fillMode: Image.PreserveAspectCrop
80+ horizontalAlignment: Image.AlignHCenter
81+ verticalAlignment: Image.AlignVCenter
82+ }
83+ }
84+ }
85+
86+ Column {
87+ objectName: "column"
88+ width: parent.width - x
89+ spacing: units.dp(2)
90+ anchors.verticalCenter: parent.verticalCenter
91+
92+ Label {
93+ id: titleLabel
94+ objectName: "titleLabel"
95+ anchors { left: parent.left; right: parent.right }
96+ elide: Text.ElideRight
97+ font.weight: Font.Normal
98+ fontSize: "large"
99+ wrapMode: Text.Wrap
100+ maximumLineCount: 2
101+ color: headerRoot.fontColor
102+ text: headerRoot.title
103+ }
104+
105+ Loader {
106+ active: titleLabel.text && headerRoot.subtitle
107+ anchors { left: parent.left; right: parent.right }
108+ sourceComponent: Label {
109+ id: subtitleLabel
110+ objectName: "subtitleLabel"
111+ elide: Text.ElideRight
112+ fontSize: "small"
113+ font.weight: Font.Light
114+ color: headerRoot.fontColor
115+ text: headerRoot.subtitle
116+ }
117+ }
118+ }
119+ }
41120 }
121+
42122}
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/PreviewTextSummary.qml+4−2
@@ -37,6 +37,7 @@ PreviewWidget {
3737 left: parent.left
3838 right: parent.right
3939 }
40+ height: visible ? implicitHeight : 0
4041 fontSize: "large"
4142 // TODO karni: Yet another fix requiring Palette update.
4243 color: "grey" //Theme.palette.selected.backgroundText
@@ -68,7 +69,7 @@ PreviewWidget {
6869 wrapMode: Text.Wrap
6970
7071 Behavior on height {
71− UbuntuNumberAnimation {}
72+ UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration }
7273 }
7374 }
7475
@@ -79,8 +80,9 @@ PreviewWidget {
7980 left: parent.left
8081 right: parent.right
8182 top: textLabel.bottom
82− topMargin: units.gu(1)
83+ topMargin: visible ? units.gu(1) : 0
8384 }
85+ height: visible ? implicitHeight : 0
8486 visible: textLabel.lineCount > textLabel.maximumCollapsedLineCount
8587 }
8688}
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/ScopeListView.qml+1−1
@@ -15,7 +15,7 @@
1515 */
1616
1717import QtQuick 2.0
18−import DashViews 0.1
18+import Dash 0.1
1919
2020ListViewWithPageHeader {
2121 maximumFlickVelocity: height * 10
qml/Dash/graphics/carousel_dropshadow@27.pngnew file

Binary file not shown.

qml/Dash/graphics/carousel_dropshadow@27.scinew file+5
@@ -0,0 +1,5 @@
1+border.left: 108
2+border.top: 108
3+border.bottom: 108
4+border.right: 108
5+source: carousel_dropshadow@27.png
qml/Greeter/LoginList.qml+1
@@ -193,6 +193,7 @@ Item {
193193 }
194194
195195 onAccepted: {
196+ if (text == "") return; // Might be useful anyway, but mainly workaround for LP 1324159
196197 if (!enabled)
197198 return;
198199 root.focus = true; // so that it can handle Escape presses for us
qml/Notifications/NotificationMenuItemFactory.qml−1
@@ -20,7 +20,6 @@
2020import QtQuick 2.0
2121import Ubuntu.Components 0.1
2222import "../Components"
23−import "../Greeter"
2423
2524Loader {
2625 id: menuFactory
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/Panel/Panel.qml+1−1
@@ -62,7 +62,7 @@ Item {
6262 height: __panelMinusSeparatorLineHeight
6363 y: 0
6464
65− Behavior on y { StandardAnimation { duration: UbuntuAnimation.FastDuration } }
65+ Behavior on y { StandardAnimation { duration: 500 } }
6666 }
6767
6868 PanelSeparatorLine {
qml/ScopeTool.qml+1−1
@@ -74,7 +74,7 @@ Rectangle {
7474
7575 model: filteredScopes
7676 searchHistory: SearchHistoryModel { }
77− property Scope scope: scopes.get(currentIndex)
77+ property var scope: scopes.getScope(currentIndex)
7878
7979 anchors {
8080 top: parent.top
qml/Shell.qml+27−59
@@ -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
@@ -119,15 +117,6 @@ FocusScope {
119117 // through the translucent parts of the shell surface.
120118 visible: !fullyCovered && !applicationSurfaceShouldBeSeen
121119
122− CrossFadeImage {
123− id: backgroundImage
124− objectName: "backgroundImage"
125−
126− anchors.fill: parent
127− source: shell.background
128− fillMode: Image.PreserveAspectCrop
129− }
130−
131120 Rectangle {
132121 anchors.fill: parent
133122 color: "black"
@@ -308,7 +297,7 @@ FocusScope {
308297
309298 readonly property int backgroundTopMargin: -panel.panelHeight
310299
311− hides: [launcher, panel.indicators, hud]
300+ hides: [launcher, panel.indicators]
312301 shown: false
313302 enabled: true
314303 showAnimation: StandardAnimation { property: "opacity"; to: 1 }
@@ -318,7 +307,8 @@ FocusScope {
318307 width: parent.width
319308 height: parent.height - panel.panelHeight
320309 background: shell.background
321− pinLength: 4
310+ minPinLength: 4
311+ maxPinLength: 4
322312
323313 onEntered: LightDM.Greeter.respond(passphrase);
324314 onCancel: greeter.show()
@@ -372,7 +362,10 @@ FocusScope {
372362 width: parent.width
373363 height: parent.height - panel.panelHeight
374364
375− Behavior on x {SmoothedAnimation{velocity: 600}}
365+ Behavior on x {
366+ enabled: !launcher.dashSwipe
367+ StandardAnimation {}
368+ }
376369
377370 readonly property real showProgress: MathUtils.clamp((1 - x/width) + greeter.showProgress - 1, 0, 1)
378371
@@ -381,7 +374,7 @@ FocusScope {
381374 objectName: "greeter"
382375
383376 available: true
384− hides: [launcher, panel.indicators, hud]
377+ hides: [launcher, panel.indicators]
385378 shown: true
386379
387380 defaultBackground: shell.background
@@ -424,7 +417,7 @@ FocusScope {
424417 InputFilterArea {
425418 anchors.fill: parent
426419 blockInput: ApplicationManager.focusedApplicationId.length === 0 || greeter.shown || lockscreen.shown || launcher.shown
427− || panel.indicators.shown || hud.shown
420+ || panel.indicators.shown
428421 }
429422
430423 Connections {
@@ -488,47 +481,6 @@ FocusScope {
488481 }
489482 }
490483
491− Hud {
492− id: hud
493−
494− width: parent.width > units.gu(60) ? units.gu(40) : parent.width
495− height: parent.height
496−
497− available: !greeter.shown && !panel.indicators.shown && !lockscreen.shown && edgeDemo.dashEnabled
498− shown: false
499− showAnimation: StandardAnimation { property: "y"; duration: hud.showableAnimationDuration; to: 0; easing.type: Easing.Linear }
500− hideAnimation: StandardAnimation { property: "y"; duration: hud.showableAnimationDuration; to: hudRevealer.closedValue; easing.type: Easing.Linear }
501−
502− Connections {
503− target: ApplicationManager
504− onFocusedApplicationIdChanged: hud.hide()
505− }
506− }
507−
508− Revealer {
509− id: hudRevealer
510−
511− enabled: hud.shown
512− width: hud.width
513− anchors.left: hud.left
514− height: parent.height
515− target: hud.revealerTarget
516− closedValue: height
517− openedValue: 0
518− direction: Qt.RightToLeft
519− orientation: Qt.Vertical
520− handleSize: hud.handleHeight
521− onCloseClicked: target.hide()
522− }
523−
524− Bottombar {
525− id: bottombar
526− theHud: hud
527− anchors.fill: parent
528− enabled: hud.available
529− applicationIsOnForeground: ApplicationManager.focusedApplicationId
530− }
531−
532484 InputFilterArea {
533485 blockInput: launcher.shown
534486 anchors {
@@ -576,12 +528,28 @@ FocusScope {
576528 onShownChanged: {
577529 if (shown) {
578530 panel.indicators.hide()
579− hud.hide()
580− bottombar.hide()
581531 }
582532 }
583533 }
584534
535+ Rectangle {
536+ id: modalNotificationBackground
537+
538+ visible: notifications.useModal && !greeter.shown && (notifications.state == "narrow")
539+ color: "#000000"
540+ anchors.fill: parent
541+ opacity: 0.5
542+
543+ MouseArea {
544+ anchors.fill: parent
545+ }
546+
547+ InputFilterArea {
548+ anchors.fill: parent
549+ blockInput: modalNotificationBackground.visible
550+ }
551+ }
552+
585553 Notifications {
586554 id: notifications
587555
tests/mocks/Unity/iconutils.h → qml/Stages/Dot.qmlrenamed+9−13
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -12,18 +12,14 @@
1212 *
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Michal Hruby <michal.hruby@canonical.com>
1815 */
1916
20−#ifndef ICONUTILS_H
21−#define ICONUTILS_H
22−
23−#include <QString>
24−#include <QVariant>
25−
26−QString gIconToDeclarativeImageProviderString(QString const &giconString);
27−QString uriToThumbnailerProviderString(QString const &uri, QString const &mimetype, QVariantHash const &metadata);
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
2819
29−#endif
20+Rectangle {
21+ radius: width
22+ width: units.dp(6)
23+ height: width
24+ color: UbuntuColors.orange
25+}
qml/Stages/PhoneStage.qml+5−2
@@ -214,7 +214,7 @@ Item {
214214 Rectangle {
215215 id: appSplash2
216216 anchors.fill: parent
217− color: "white"
217+ color: "black"
218218 visible: priv.secondApplicationStarting
219219 }
220220 Image {
@@ -228,8 +228,11 @@ Item {
228228 Rectangle {
229229 id: appSplash
230230 anchors.fill: parent
231− color: "white"
231+ color: "black"
232232 visible: priv.applicationStarting
233+
234+ WaitingDots {
235+ }
233236 }
234237 Image {
235238 id: mainScreenshotImage
qml/Stages/StageWithSideStage.qml+8−2
@@ -282,7 +282,10 @@ Item {
282282 id: mainStageSplash
283283 anchors.fill: root
284284 anchors.rightMargin: root.width - sideStageImage.x
285− color: "white"
285+ color: "black"
286+
287+ WaitingDots {
288+ }
286289 }
287290
288291 SidestageHandle {
@@ -402,6 +405,9 @@ Item {
402405 id: sideStageSplash
403406 anchors.fill: parent
404407 anchors.leftMargin: sideStageImage.x
405− color: "white"
408+ color: "black"
409+
410+ WaitingDots {
411+ }
406412 }
407413}
qml/Stages/WaitingDots.qmlnew file+76
@@ -0,0 +1,76 @@
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.2
18+import Ubuntu.Components 0.1
19+
20+Item {
21+ id: waitingDots
22+
23+ // center in parent; waitingDots has no size therefore anchors.centerIn cannot be used
24+ x: parent.width / 2
25+ y: parent.height / 2
26+
27+ property var dots: [dot1, dot2, dot3]
28+ property var vertices: [[-units.gu(1), -units.gu(1)],
29+ [units.gu(1), -units.gu(1)],
30+ [0, units.gu(1)]]
31+ property int shift: 0
32+
33+ function cycle () {
34+ var n = vertices.length;
35+ shift = (shift + 1) % n;
36+
37+ for (var i = 0; i < n; i++) {
38+ dots[i].x = vertices[(i+shift) % n][0];
39+ dots[i].y = vertices[(i+shift) % n][1];
40+ }
41+ }
42+
43+ Timer {
44+ interval: 800
45+ running: waitingDots.visible
46+ repeat: true
47+ triggeredOnStart: true
48+ onTriggered: waitingDots.cycle()
49+ }
50+
51+
52+ Dot {
53+ id: dot1
54+ x: vertices[0][0]
55+ y: vertices[0][1]
56+ Behavior on x {XAnimator {duration: UbuntuAnimation.BriskDuration; easing: UbuntuAnimation.StandardEasing}}
57+ Behavior on y {YAnimator {duration: UbuntuAnimation.BriskDuration; easing: UbuntuAnimation.StandardEasing}}
58+ }
59+
60+ Dot {
61+ id: dot2
62+ x: vertices[1][0]
63+ y: vertices[1][1]
64+ Behavior on x {XAnimator {duration: UbuntuAnimation.BriskDuration; easing: UbuntuAnimation.StandardEasing}}
65+ Behavior on y {YAnimator {duration: UbuntuAnimation.BriskDuration; easing: UbuntuAnimation.StandardEasing}}
66+
67+ }
68+
69+ Dot {
70+ id: dot3
71+ x: vertices[2][0]
72+ y: vertices[2][1]
73+ Behavior on x {XAnimator {duration: UbuntuAnimation.BriskDuration; easing: UbuntuAnimation.StandardEasing}}
74+ Behavior on y {YAnimator {duration: UbuntuAnimation.BriskDuration; easing: UbuntuAnimation.StandardEasing}}
75+ }
76+}
run → run.shrenamed+1−1
@@ -84,6 +84,6 @@ else
8484 echo "Unity8 is already running, please stop it first"
8585 exit 1
8686 fi
87− /sbin/initctl start unity8 BINARY="`readlink -f $QML_PHONE_SHELL_PATH` $QML_PHONE_SHELL_ARGS $@"
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
8888 tailf -n 0 ~/.cache/upstart/unity8.log
8989fi
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}
src/ApplicationArguments.h+4−8
@@ -28,14 +28,10 @@ class ApplicationArguments : public QObject
2828{
2929 Q_OBJECT
3030public:
31− ApplicationArguments(const QStringList& args) {
32− if (args.contains(QLatin1String("-windowgeometry")) && args.size() > args.indexOf(QLatin1String("-windowgeometry")) + 1) {
33− QStringList geometryArg = args.at(args.indexOf(QLatin1String("-windowgeometry")) + 1).split('x');
34− if (geometryArg.size() == 2) {
35− m_size.rwidth() = geometryArg.at(0).toInt();
36− m_size.rheight() = geometryArg.at(1).toInt();
37− }
38− }
31+ // Not exposed to the app as setSize isn't invokable
32+ void setSize(int width, int height) {
33+ m_size.rwidth() = width;
34+ m_size.rheight() = height;
3935 }
4036
4137 Q_INVOKABLE bool hasGeometry() const { return m_size.isValid(); }
src/main.cpp+43−6
@@ -18,6 +18,7 @@
1818 */
1919
2020// Qt
21+#include <QCommandLineParser>
2122#include <QtQuick/QQuickView>
2223#include <QtGui/QGuiApplication>
2324#include <QtQml/QQmlEngine>
@@ -43,6 +44,32 @@ int startShell(int argc, const char** argv, void* server)
4344
4445 QGuiApplication::setApplicationName("Unity 8");
4546 QGuiApplication *application;
47+
48+ QCommandLineParser parser;
49+ parser.setApplicationDescription("Description: Unity 8 Shell");
50+ parser.addHelpOption();
51+
52+ QCommandLineOption fullscreenOption("fullscreen",
53+ "Run in fullscreen");
54+ parser.addOption(fullscreenOption);
55+
56+ QCommandLineOption framelessOption("frameless",
57+ "Run without window borders");
58+ parser.addOption(framelessOption);
59+
60+ QCommandLineOption mousetouchOption("mousetouch",
61+ "Allow the mouse to provide touch input");
62+ parser.addOption(mousetouchOption);
63+
64+ QCommandLineOption windowGeometryOption(QStringList() << "windowgeometry",
65+ "Specify the window geometry as [<width>x<height>]", "windowgeometry", "1");
66+ parser.addOption(windowGeometryOption);
67+
68+ QCommandLineOption testabilityOption("testability",
69+ "DISCOURAGED: Please set QT_LOAD_TESTABILITY instead. \n \
70+Load the testability driver");
71+ parser.addOption(testabilityOption);
72+
4673 if (isUbuntuMirServer) {
4774 QLibrary unityMir("unity-mir", 1);
4875 unityMir.load();
@@ -59,6 +86,11 @@ int startShell(int argc, const char** argv, void* server)
5986 application = new QGuiApplication(argc, (char**)argv);
6087 }
6188
89+ // Treat args with single dashes the same as arguments with two dashes
90+ // Ex: -fullscreen == --fullscreen
91+ parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions);
92+ parser.process(*application);
93+
6294 QString indicatorProfile = qgetenv("UNITY_INDICATOR_PROFILE");
6395 if (indicatorProfile.isEmpty()) {
6496 indicatorProfile = "phone";
@@ -66,12 +98,17 @@ int startShell(int argc, const char** argv, void* server)
6698
6799 resolveIconTheme();
68100
69− QStringList args = application->arguments();
70− ApplicationArguments qmlArgs(args);
101+ ApplicationArguments qmlArgs;
102+ if (parser.isSet(windowGeometryOption) &&
103+ parser.value(windowGeometryOption).split('x').size() == 2)
104+ {
105+ QStringList geom = parser.value(windowGeometryOption).split('x');
106+ qmlArgs.setSize(geom.at(0).toInt(), geom.at(1).toInt());
107+ }
71108
72109 // The testability driver is only loaded by QApplication but not by QGuiApplication.
73110 // However, QApplication depends on QWidget which would add some unneeded overhead => Let's load the testability driver on our own.
74− if (args.contains(QLatin1String("-testability")) || getenv("QT_LOAD_TESTABILITY")) {
111+ if (parser.isSet(testabilityOption) || getenv("QT_LOAD_TESTABILITY")) {
75112 QLibrary testLib(QLatin1String("qttestability"));
76113 if (testLib.load()) {
77114 typedef void (*TasInitialize)(void);
@@ -94,14 +131,14 @@ int startShell(int argc, const char** argv, void* server)
94131 view->engine()->setBaseUrl(QUrl::fromLocalFile(::qmlDirectory()));
95132 view->rootContext()->setContextProperty("applicationArguments", &qmlArgs);
96133 view->rootContext()->setContextProperty("indicatorProfile", indicatorProfile);
97− if (args.contains(QLatin1String("-frameless"))) {
134+ if (parser.isSet(framelessOption)) {
98135 view->setFlags(Qt::FramelessWindowHint);
99136 }
100137
101138 // You will need this if you want to interact with touch-only components using a mouse
102139 // Needed only when manually testing on a desktop.
103140 MouseTouchAdaptor *mouseTouchAdaptor = 0;
104− if (args.contains(QLatin1String("-mousetouch"))) {
141+ if (parser.isSet(mousetouchOption)) {
105142 mouseTouchAdaptor = new MouseTouchAdaptor;
106143 application->installNativeEventFilter(mouseTouchAdaptor);
107144 }
@@ -125,7 +162,7 @@ int startShell(int argc, const char** argv, void* server)
125162 view->setSource(source);
126163 view->setColor("transparent");
127164
128− if (qgetenv("QT_QPA_PLATFORM") == "ubuntu" || isUbuntuMirServer || args.contains(QLatin1String("-fullscreen"))) {
165+ if (qgetenv("QT_QPA_PLATFORM") == "ubuntu" || isUbuntuMirServer || parser.isSet(fullscreenOption)) {
129166 view->showFullScreen();
130167 } else {
131168 view->show();
tests/autopilot/unity8/process_helpers.py+11−4
@@ -17,12 +17,19 @@
1717# along with this program. If not, see <http://www.gnu.org/licenses/>.
1818#
1919
20−from autopilot.introspection import (
21− get_proxy_object_for_existing_process,
22− ProcessSearchError,
23−)
2420import logging
2521import subprocess
22+import sys
23+
24+# This has to work in both python 3 (ap 1.5) and py2 (ap legacy 1.4.1) so we
25+# pick the correct location in each case. Remove the py2 branch once we no
26+# longer need to support python 2.
27+if sys.version >= '3':
28+ from autopilot.exceptions import ProcessSearchError
29+else:
30+ from autopilot.introspection import ProcessSearchError
31+from autopilot.introspection import get_proxy_object_for_existing_process
32+
2633from unity8.shell import emulators
2734from unity8.shell.emulators import main_window as main_window_emulator
2835
tests/autopilot/unity8/shell/emulators/dash.py+3−4
@@ -161,7 +161,7 @@ class GenericScopeView(emulators.UnityEmulatorBase):
161161
162162 """
163163 category_element = self._get_category_element(category)
164− icon = category_element.select_single('Card', title=app_name)
164+ icon = category_element.select_single('AbstractButton', title=app_name)
165165 # FIXME some categories need a long press in order to see the preview.
166166 # Some categories do not show previews, like recent apps.
167167 # --elopio - 2014-1-14
@@ -191,7 +191,7 @@ class DashApps(GenericScopeView):
191191
192192 """
193193 category_element = self._get_category_element(category)
194− application_cards = category_element.select_many('Card')
194+ application_cards = category_element.select_many('AbstractButton')
195195
196196 # sort by y, x
197197 application_cards = sorted(
@@ -201,8 +201,7 @@ class DashApps(GenericScopeView):
201201 result = []
202202 for card in application_cards:
203203 if card.objectName != 'cardToolCard':
204− card_header = card.select_single('CardHeader')
205− result.append(card_header.title)
204+ result.append(card.title)
206205 return result
207206
208207
tests/autopilot/unity8/shell/emulators/main_window.py−4
@@ -114,10 +114,6 @@ class QQuickView(emulators.UnityEmulatorBase):
114114 self.wait_select_single('Indicators', fullyOpened=True)
115115 return self._get_indicator_page(indicator_name)
116116
117− def get_shell_background(self):
118− return self.select_single(
119− "CrossFadeImage", objectName="backgroundImage")
120−
121117 @autopilot_logging.log_action(logger.info)
122118 def show_dash_swiping(self):
123119 """Show the dash swiping from the left."""
tests/autopilot/unity8/shell/tests/test_notifications.py+83
@@ -211,6 +211,89 @@ class InteractiveNotificationBase(NotificationsBase):
211211 self.touch.tap_object(notification.select_single(objectName="button4"))
212212 self.assert_notification_action_id_was_called("action_decline_4")
213213
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+
214297 def _create_interactive_notification(
215298 self,
216299 summary="",
tests/mocks/AccountsService/CMakeLists.txt+1−12
@@ -7,15 +7,4 @@ add_library(MockAccountsService-qml MODULE
77
88qt5_use_modules(MockAccountsService-qml DBus Qml)
99
10−# copy files into build directory for shadow builds
11−file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/qmldir"
12− DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
13− )
14−
15−install(TARGETS MockAccountsService-qml
16− DESTINATION ${SHELL_INSTALL_QML}/mocks/AccountsService
17− )
18−
19−install(FILES qmldir
20− DESTINATION ${SHELL_INSTALL_QML}/mocks/AccountsService
21− )
10+add_unity8_mock(AccountsService 0.1 AccountsService TARGETS MockAccountsService-qml)
tests/mocks/AccountsService/qmldir+1
@@ -1,2 +1,3 @@
11module AccountsService
22plugin MockAccountsService-qml
3+typeinfo AccountsService.qmltypes
tests/mocks/CMakeLists.txt+30
@@ -1,3 +1,33 @@
1+include(QmlPlugins)
2+
3+# Set up and optionally install a mock plugin for unity8.
4+#
5+# add_unity8_mock(plugin version path
6+# [PREFIX string] # Install the plugin to the specified prefix under unity8 private plugin directory
7+# [...] # See export_qmlfiles and export_qmlplugin documentation for more options
8+# )
9+
10+macro(add_unity8_mock PLUGIN VERSION PATH)
11+ set(single PREFIX)
12+ cmake_parse_arguments(MOCK "" "${single}" "" ${ARGN})
13+
14+ if(MOCK_PREFIX)
15+ export_qmlfiles(${PLUGIN} ${PATH}
16+ DESTINATION ${SHELL_INSTALL_QML}/${MOCK_PREFIX}
17+ TARGET_PREFIX ${MOCK_PREFIX}-Mock
18+ ${MOCK_UNPARSED_ARGUMENTS}
19+ )
20+ export_qmlplugin(${PLUGIN} ${VERSION} ${PATH}
21+ DESTINATION ${SHELL_INSTALL_QML}/${MOCK_PREFIX}
22+ TARGET_PREFIX ${MOCK_PREFIX}-Mock
23+ ${MOCK_UNPARSED_ARGUMENTS}
24+ )
25+ else()
26+ export_qmlfiles(${PLUGIN} ${PATH} TARGET_PREFIX Mock ${MOCK_UNPARSED_ARGUMENTS})
27+ export_qmlplugin(${PLUGIN} ${VERSION} ${PATH} TARGET_PREFIX Mock ${MOCK_UNPARSED_ARGUMENTS})
28+ endif()
29+endmacro()
30+
131add_subdirectory(AccountsService)
232add_subdirectory(GSettings.1.0)
333add_subdirectory(HudClient)
tests/mocks/GSettings.1.0/CMakeLists.txt+1−4
@@ -17,7 +17,4 @@ target_link_libraries(FakeGSettingsQml
1717
1818qt5_use_modules(FakeGSettingsQml Qml)
1919
20−# copy qmldir file into build directory for shadow builds
21−file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/qmldir"
22− DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
23− )
20+add_unity8_mock(GSettings 1.0 GSettings.1.0 TARGETS FakeGSettingsQml)
tests/mocks/GSettings.1.0/qmldir+1
@@ -1,2 +1,3 @@
11module GSettings
22plugin FakeGSettingsQml
3+typeinfo GSettings.qmltypes
tests/mocks/HudClient/CMakeLists.txt+1−4
@@ -35,7 +35,4 @@ target_link_libraries(FakeHudClientQml
3535
3636qt5_use_modules(FakeHudClientQml Qml)
3737
38−# copy qmldir file into build directory for shadow builds
39−file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/qmldir"
40− DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
41− )
38+add_unity8_mock(HudClient 0.1 HudClient TARGETS FakeHudClientQml)
tests/mocks/HudClient/qmldir+2
@@ -1 +1,3 @@
1+module HudClient
12plugin FakeHudClientQml
3+typeinfo HudClient.qmltypes
tests/mocks/LightDM/CMakeLists.txt+5−12
@@ -43,15 +43,8 @@ target_link_libraries(MockLightDM-qml
4343
4444qt5_use_modules(MockLightDM-qml DBus Gui Qml)
4545
46−# copy qmldir file into build directory for shadow builds
47−file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/qmldir"
48− DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
49− )
50−
51−install(TARGETS MockLightDM-qml
52− DESTINATION ${SHELL_INSTALL_QML}/mocks/LightDM
53− )
54−
55−install(FILES qmldir
56− DESTINATION ${SHELL_INSTALL_QML}/mocks/LightDM
57− )
46+add_unity8_mock(LightDM 0.1 LightDM
47+ PREFIX mocks
48+ TARGETS MockLightDM-qml
49+ ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_CURRENT_BINARY_DIR}/full"
50+)
tests/mocks/LightDM/qmldir+1
@@ -1,2 +1,3 @@
11module LightDM
22plugin MockLightDM-qml
3+typeinfo LightDM.qmltypes
tests/mocks/Powerd/CMakeLists.txt+1−12
@@ -7,15 +7,4 @@ add_library(MockPowerd-qml MODULE
77
88qt5_use_modules(MockPowerd-qml Qml)
99
10−# copy qmldir file into build directory for shadow builds
11−file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/qmldir"
12− DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
13− )
14−
15−install(TARGETS MockPowerd-qml
16− DESTINATION ${SHELL_INSTALL_QML}/mocks/Powerd
17− )
18−
19−install(FILES qmldir
20− DESTINATION ${SHELL_INSTALL_QML}/mocks/Powerd
21− )
10+add_unity8_mock(Powerd 0.1 Powerd TARGETS MockPowerd-qml)
tests/mocks/Powerd/qmldir+1
@@ -1,2 +1,3 @@
11module Powerd
22plugin MockPowerd-qml
3+typeinfo Powerd.qmltypes
tests/mocks/QMenuModel/CMakeLists.txt+2−12
@@ -1,15 +1,3 @@
1−file(GLOB QMLFILES
2− *.qml
3− *.js
4− qmldir
5−)
6−
7−# copy files into build directory for shadow builds
8−add_custom_target(QMenuModelQmlFiles ALL
9− COMMAND cp ${QMLFILES} ${CMAKE_CURRENT_BINARY_DIR}
10− DEPENDS ${QMLFILES}
11−)
12−
131include_directories(
142 ${Qt5Core_INCLUDE_DIRS}
153 ${Qt5Quick_INCLUDE_DIRS}
@@ -32,3 +20,5 @@ qt5_use_modules(QMenuModelQml Core Quick)
3220set_target_properties(QMenuModelQml PROPERTIES
3321 OUTPUT_NAME qmenumodel
3422 VERSION 0)
23+
24+add_unity8_mock(QMenuModel 0.1 QMenuModel TARGETS QMenuModelQml)
tests/mocks/QMenuModel/qmldir+1
@@ -1,5 +1,6 @@
11module QMenuModel
22plugin qmenumodel
3+typeinfo QMenuModel.qmltypes
34
45QDBusActionGroup 0.1 QDBusActionGroup.qml
56UnityMenuAction 0.1 UnityMenuAction.qml
tests/mocks/QtMultimedia/CMakeLists.txt+1−12
@@ -5,15 +5,4 @@ add_library(QtMultimedia-qml MODULE
55
66qt5_use_modules(QtMultimedia-qml Qml)
77
8−# copy qmldir file into build directory for shadow builds
9−file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/qmldir"
10− DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
11− )
12−
13−install(TARGETS QtMultimedia-qml
14− DESTINATION ${SHELL_INSTALL_QML}/mocks/QtMultimedia
15− )
16−
17−install(FILES qmldir
18− DESTINATION ${SHELL_INSTALL_QML}/mocks/QtMultimedia
19− )
8+add_unity8_mock(QtMultimedia 5.0 QtMultimedia TARGETS QtMultimedia-qml)
tests/mocks/QtMultimedia/qmldir+1
@@ -1,2 +1,3 @@
11module QtMultimedia
22plugin QtMultimedia-qml
3+typeinfo QtMultimedia.qmltypes
tests/mocks/Ubuntu/DownloadDaemonListener/CMakeLists.txt+1−9
@@ -7,12 +7,4 @@ add_library(FakeUbuntuDownloadDaemonListenerQml MODULE ${FakeUbuntuDownloadDaemo
77
88qt5_use_modules(FakeUbuntuDownloadDaemonListenerQml Core Quick)
99
10−# copy files into build directory for shadow builds
11−add_custom_target(UbuntuDownloadQmlDirFile ALL
12− COMMAND cp "${CMAKE_CURRENT_SOURCE_DIR}/qmldir" ${CMAKE_CURRENT_BINARY_DIR}
13− DEPENDS qmldir
14−)
15−
16−install(TARGETS FakeUbuntuDownloadDaemonListenerQml
17− DESTINATION ${SHELL_INSTALL_QML}/mocks/Ubuntu/DownloadDaemonListener
18− )
10+add_unity8_mock(Ubuntu.DownloadDaemonListener 0.1 Ubuntu/DownloadDaemonListener TARGETS FakeUbuntuDownloadDaemonListenerQml)
tests/mocks/Ubuntu/DownloadDaemonListener/qmldir+1
@@ -1,2 +1,3 @@
11module Ubuntu.DownloadDaemonListener
22plugin FakeUbuntuDownloadDaemonListenerQml
3+typeinfo DownloadDaemonListener.qmltypes
tests/mocks/Ubuntu/Thumbnailer/CMakeLists.txt+1−7
@@ -1,7 +1 @@
1−# copy files into build directory for shadow builds
2−add_custom_target(UbuntuThumbnailerQmlDirFile ALL
3− COMMAND cp "${CMAKE_CURRENT_SOURCE_DIR}/qmldir" ${CMAKE_CURRENT_BINARY_DIR}
4− DEPENDS qmldir
5−)
6−
7−install(FILES qmldir DESTINATION ${SHELL_INSTALL_QML}/mocks/Ubuntu/Thumbnailer)
1+add_unity8_mock(Ubuntu.Thumbnailer 0.1 Ubuntu/Thumbnailer)
tests/mocks/Ubuntu/Thumbnailer/qmldir+2
@@ -1,2 +1,4 @@
11module Ubuntu.Thumbnailer
2+typeinfo Thumbnailer.qmltypes
3+
24Dummy 0.1 Dummy.qml
tests/mocks/Unity/Application/CMakeLists.txt+9−35
@@ -12,40 +12,14 @@ set(FakeUnityApplicationQml_SOURCES
1212
1313add_library(FakeUnityApplicationQml MODULE ${FakeUnityApplicationQml_SOURCES})
1414
15−qt5_use_modules(FakeUnityApplicationQml Core Quick)
16−
17−# copy files into build directory for shadow builds
18−add_custom_target(UnityAppQmlDirFile ALL
19− COMMAND cp "${CMAKE_CURRENT_SOURCE_DIR}/qmldir" ${CMAKE_CURRENT_BINARY_DIR}
20− DEPENDS qmldir
21−)
22−add_custom_target(InputFilterAreaQmlFile ALL
23− COMMAND cp "${CMAKE_CURRENT_SOURCE_DIR}/InputFilterArea.qml" ${CMAKE_CURRENT_BINARY_DIR}
24− DEPENDS InputFilterArea.qml
25−)
26−add_custom_target(OSKControllerQmlFile ALL
27− COMMAND cp "${CMAKE_CURRENT_SOURCE_DIR}/OSKController.qml" ${CMAKE_CURRENT_BINARY_DIR}
28− DEPENDS OSKController.qml
29−)
15+add_library(NonMirUnityApplicationQml MODULE ${FakeUnityApplicationQml_SOURCES})
16+set_target_properties(NonMirUnityApplicationQml PROPERTIES OUTPUT_NAME FakeUnityApplicationQml)
3017
31−install(TARGETS FakeUnityApplicationQml
32− DESTINATION ${SHELL_INSTALL_QML}/mocks/Unity/Application
33− )
34−
35−install(FILES qmldir InputFilterArea.qml OSKController.qml
36− DESTINATION ${SHELL_INSTALL_QML}/mocks/Unity/Application
37− )
38−
39−# Duplicate the mock to nonmirplugins
40−# In shadow builds we just link it, in real installs we also install it to the other path
41−add_custom_target(OSKControllerQmlFile2 ALL
42− COMMAND mkdir -p ${CMAKE_BINARY_DIR}/nonmirplugins/Unity && rm -f ${CMAKE_BINARY_DIR}/nonmirplugins/Unity/Application && ln -s ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_BINARY_DIR}/nonmirplugins/Unity
43− DEPENDS qmldir
44−)
45−install(TARGETS FakeUnityApplicationQml
46− DESTINATION ${SHELL_INSTALL_QML}/nonmirplugins/Unity/Application
47− )
18+qt5_use_modules(FakeUnityApplicationQml Core Quick)
19+qt5_use_modules(NonMirUnityApplicationQml Core Quick)
4820
49−install(FILES qmldir InputFilterArea.qml OSKController.qml
50− DESTINATION ${SHELL_INSTALL_QML}/nonmirplugins/Unity/Application
51− )
21+add_unity8_mock(Unity.Application 0.1 Unity/Application PREFIX mocks TARGETS FakeUnityApplicationQml)
22+add_unity8_mock(Unity.Application 0.1 Unity/Application
23+ PREFIX nonmirplugins
24+ TARGETS NonMirUnityApplicationQml
25+ BINARY_DIR ${CMAKE_BINARY_DIR}/nonmirplugins)
tests/mocks/Unity/Application/qmldir+2
@@ -1,4 +1,6 @@
11module Unity.Application
22plugin FakeUnityApplicationQml
3+typeinfo Application.qmltypes
4+
35InputFilterArea 0.1 InputFilterArea.qml
46OSKController 0.1 OSKController.qml
tests/mocks/Unity/CMakeLists.txt+9−13
@@ -6,6 +6,7 @@ add_subdirectory(Notifications)
66pkg_search_module(DEE dee-1.0 REQUIRED)
77pkg_search_module(GOBJECT gobject-2.0 REQUIRED)
88pkg_search_module(DEEQT libdee-qt5 REQUIRED)
9+pkg_check_modules(SCOPES_API REQUIRED unity-shell-scopes=1)
910
1011include_directories(
1112 ${CMAKE_CURRENT_BINARY_DIR}
@@ -18,7 +19,6 @@ include_directories(
1819add_definitions(-DQT_NO_KEYWORDS)
1920
2021set(UnityQML_SOURCES
21− iconutils.cpp
2222 fake_scope.cpp
2323 fake_scopes.cpp
2424 fake_categories.cpp
@@ -27,6 +27,13 @@ set(UnityQML_SOURCES
2727 fake_previewstack.cpp
2828 fake_previewwidgetmodel.cpp
2929 fake_unity_plugin.cpp
30+ ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/CategoriesInterface.h
31+ ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/PreviewModelInterface.h
32+ ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/PreviewStackInterface.h
33+ ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/PreviewWidgetModelInterface.h
34+ ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/ResultsModelInterface.h
35+ ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/ScopeInterface.h
36+ ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/ScopesInterface.h
3037)
3138
3239add_library(FakeUnityQml MODULE ${UnityQML_SOURCES})
@@ -39,15 +46,4 @@ target_link_libraries(FakeUnityQml
3946
4047qt5_use_modules(FakeUnityQml Qml)
4148
42−# copy qmldir file into build directory for shadow builds
43−file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/qmldir"
44− DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
45− )
46−
47−install(TARGETS FakeUnityQml
48− DESTINATION ${SHELL_INSTALL_QML}/scopefakes/Unity
49− )
50−
51−install(FILES qmldir
52− DESTINATION ${SHELL_INSTALL_QML}/scopefakes/Unity
53− )
49+add_unity8_mock(Unity 0.2 Unity PREFIX scopefakes TARGETS FakeUnityQml)
tests/mocks/Unity/Indicators/CMakeLists.txt+1−14
@@ -37,17 +37,4 @@ target_link_libraries(IndicatorsFakeQml)
3737
3838qt5_use_modules(IndicatorsFakeQml Core Qml Quick)
3939
40−file(GLOB IndicatorsFake_QMLFILES
41− *.qml
42− qml/FakeMenuPage.qml
43−)
44−
45−# copy qmldir file into build directory for shadow builds
46−file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/qmldir"
47− DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
48−)
49−
50−# copy qmldir file into build directory for shadow builds
51−file(COPY ${IndicatorsFake_QMLFILES}
52− DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
53−)
40+add_unity8_mock(Unity.Indicators 0.1 Unity/Indicators TARGETS IndicatorsFakeQml)
tests/mocks/Unity/Indicators/qml/FakeMenuPage.qml → tests/mocks/Unity/Indicators/FakeMenuPage.qmlrenamed

The content is the same.

tests/mocks/Unity/Indicators/qmldir+1
@@ -1,5 +1,6 @@
11module Unity.Indicators
22plugin IndicatorsFakeQml
3+typeinfo Indicators.qmltypes
34
45CachedUnityMenuModel 0.1 CachedUnityMenuModel.qml
56IndicatorBase 0.1 IndicatorBase.qml
tests/mocks/Unity/Launcher/CMakeLists.txt+1−5
@@ -20,8 +20,4 @@ add_library(MockLauncherPlugin MODULE ${MockLauncherModel_SOURCES})
2020
2121qt5_use_modules(MockLauncherPlugin Core Quick)
2222
23−# copy files into build directory for shadow builds
24−add_custom_target(LauncherPluginQmlDirFile ALL
25− COMMAND cp "${CMAKE_CURRENT_SOURCE_DIR}/qmldir" ${CMAKE_CURRENT_BINARY_DIR}
26− DEPENDS qmldir
27−)
23+add_unity8_mock(Unity.Launcher 0.1 Unity/Launcher TARGETS MockLauncherPlugin)
tests/mocks/Unity/Launcher/MockLauncherModel.cpp+5
@@ -183,6 +183,11 @@ void MockLauncherModel::setUser(const QString &username)
183183 // TODO: implement this...
184184}
185185
186+QString MockLauncherModel::getUrlForAppId(const QString &appId) const
187+{
188+ return "application:///" + appId + ".desktop";
189+}
190+
186191void MockLauncherModel::setApplicationManager(unity::shell::application::ApplicationManagerInterface *applicationManager)
187192{
188193 Q_UNUSED(applicationManager)
tests/mocks/Unity/Launcher/MockLauncherModel.h+1
@@ -44,6 +44,7 @@ public:
4444 Q_INVOKABLE void requestRemove(const QString &appId);
4545 Q_INVOKABLE void quickListActionInvoked(const QString &appId, int actionIndex);
4646 Q_INVOKABLE void setUser(const QString &username);
47+ Q_INVOKABLE QString getUrlForAppId(const QString &appId) const;
4748
4849 unity::shell::application::ApplicationManagerInterface *applicationManager() const;
4950 void setApplicationManager(unity::shell::application::ApplicationManagerInterface *applicationManager);
tests/mocks/Unity/Launcher/qmldir+1
@@ -1,2 +1,3 @@
11module Unity.Launcher
22plugin MockLauncherPlugin
3+typeinfo Launcher.qmltypes
tests/mocks/Unity/Notifications/CMakeLists.txt+1−11
@@ -1,11 +1 @@
1−file(GLOB QMLFILES
2− *.qml
3− *.js
4− qmldir
5−)
6−
7−# copy files into build directory for shadow builds
8−add_custom_target(NotificationsQmlFiles ALL
9− COMMAND cp ${QMLFILES} ${CMAKE_CURRENT_BINARY_DIR}
10− DEPENDS ${QMLFILES}
11−)
1+add_unity8_mock(Unity.Notifications 1.0 Unity/Notifications)
tests/mocks/Unity/Notifications/qmldir+1
@@ -1,2 +1,3 @@
11module Unity.Notifications
22Notification 1.0 notification.js
3+typeinfo Notifications.qmltypes
tests/mocks/Unity/fake_categories.cpp+26−25
@@ -22,24 +22,9 @@
2222#include "fake_resultsmodel.h"
2323
2424Categories::Categories(int category_count, QObject* parent)
25− : QAbstractListModel(parent)
25+ : unity::shell::scopes::CategoriesInterface(parent)
2626 , m_category_count(category_count)
2727{
28− m_roles[Categories::RoleCategoryId] = "categoryId";
29− m_roles[Categories::RoleName] = "name";
30− m_roles[Categories::RoleIcon] = "icon";
31− m_roles[Categories::RoleRawRendererTemplate] = "rawRendererTemplate";
32− m_roles[Categories::RoleRenderer] = "renderer";
33− m_roles[Categories::RoleComponents] = "components";
34− m_roles[Categories::RoleProgressSource] = "progressSource";
35− m_roles[Categories::RoleResults] = "results";
36− m_roles[Categories::RoleCount] = "count";
37−}
38−
39−QHash<int, QByteArray>
40−Categories::roleNames() const
41−{
42− return m_roles;
4328}
4429
4530int Categories::rowCount(const QModelIndex& /*parent*/) const
@@ -65,6 +50,11 @@ void Categories::addSpecialCategory(QString const& categoryId, QString const& na
6550 }
6651}
6752
53+bool Categories::overrideCategoryJson(QString const& categoryId, QString const& json)
54+{
55+ qFatal("Using un-implemented Categories::overrideCategoryJson");
56+}
57+
6858void Categories::countChanged()
6959{
7060 QObject* countObject = sender();
@@ -108,7 +98,12 @@ Categories::data(const QModelIndex& index, int role) const
10898 case RoleRenderer:
10999 {
110100 QVariantMap map;
111− map["category-layout"] = index.row() % 2 == 0 ? "grid" : "carousel";
101+ if (index.row() % 2 == 0) {
102+ map["category-layout"] = "grid";
103+ } else {
104+ map["category-layout"] = "carousel";
105+ map["overlay"] = true;
106+ }
112107 map["card-size"] = "small";
113108 return map;
114109 }
@@ -121,9 +116,6 @@ Categories::data(const QModelIndex& index, int role) const
121116 map["title"] = "HOLA";
122117 return map;
123118 }
124− case RoleProgressSource:
125− qFatal("Using un-implemented RoleProgressSource Categories role");
126− return QVariant();
127119 case RoleResults:
128120 return QVariant();
129121 case RoleCount:
@@ -146,22 +138,31 @@ Categories::data(const QModelIndex& index, int role) const
146138 case RoleRenderer:
147139 {
148140 QVariantMap map;
149− map["category-layout"] = index.row() % 2 == 0 ? "grid" : "carousel";
141+ if (index.row() % 2 == 0) {
142+ map["category-layout"] = "grid";
143+ } else {
144+ map["category-layout"] = "carousel";
145+ map["card-size"] = "medium";
146+ map["collapsed-rows"] = 2;
147+ map["overlay"] = true;
148+ }
150149 map["card-size"] = "small";
151150 return map;
152151 }
153152 case RoleComponents:
154153 {
155154 QVariantMap map, artMap;
156− artMap["aspect-ratio"] = "1.0";
155+ if (index.row() % 2 != 0) {
156+ artMap["aspect-ratio"] = QString("1.%1").arg(index.row());
157+ } else {
158+ artMap["aspect-ratio"] = "1.0";
159+ }
157160 artMap["field"] = "art";
158161 map["art"] = artMap;
159162 map["title"] = "HOLA";
163+ map["subtitle"] = "HOLA";
160164 return map;
161165 }
162− case RoleProgressSource:
163− qFatal("Using un-implemented RoleProgressSource Categories role");
164− return QVariant();
165166 case RoleResults:
166167 return QVariant::fromValue(resultsModel);
167168 case RoleCount:
tests/mocks/Unity/fake_categories.h+5−18
@@ -17,44 +17,31 @@
1717#ifndef FAKE_CATEGORIES_H
1818#define FAKE_CATEGORIES_H
1919
20+#include <unity/shell/scopes/CategoriesInterface.h>
21+
2022// Qt
21−#include <QAbstractListModel>
2223#include <QList>
2324
2425class ResultsModel;
2526
26−class Categories : public QAbstractListModel
27+class Categories : public unity::shell::scopes::CategoriesInterface
2728{
2829 Q_OBJECT
2930
30− Q_ENUMS(Roles)
31−
3231public:
3332 Categories(int category_count, QObject* parent = 0);
34− enum Roles {
35− RoleCategoryId,
36− RoleName,
37− RoleIcon,
38− RoleRawRendererTemplate,
39− RoleRenderer,
40− RoleComponents,
41− RoleProgressSource, // maybe
42− RoleResults,
43− RoleCount
44− };
4533
4634 QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
47− QHash<int, QByteArray> roleNames() const override;
4835 int rowCount(const QModelIndex& parent = QModelIndex()) const override;
4936
50− Q_INVOKABLE void addSpecialCategory(QString const& categoryId, QString const& name, QString const& icon, QString const& rawTemplate, QObject* countObject);
37+ Q_INVOKABLE void addSpecialCategory(QString const& categoryId, QString const& name, QString const& icon, QString const& rawTemplate, QObject* countObject) override;
38+ Q_INVOKABLE bool overrideCategoryJson(QString const& categoryId, QString const& json) override;
5139
5240private Q_SLOTS:
5341 void countChanged();
5442
5543private:
5644 mutable QHash<int, ResultsModel*> m_resultsModels;
57− QHash<int, QByteArray> m_roles;
5845 int m_category_count;
5946
6047 struct CategoryData {
tests/mocks/Unity/fake_previewmodel.cpp+2−15
@@ -27,22 +27,14 @@
2727// Qt
2828#include <QDebug>
2929
30−PreviewModel::PreviewModel(QObject* parent) : QAbstractListModel(parent)
30+PreviewModel::PreviewModel(QObject* parent)
31+ : unity::shell::scopes::PreviewModelInterface(parent)
3132{
3233 // we have one column by default
3334 PreviewWidgetModel* columnModel = new PreviewWidgetModel(this);
3435 m_previewWidgetModels.append(columnModel);
3536}
3637
37−QHash<int, QByteArray> PreviewModel::roleNames() const
38−{
39− QHash<int, QByteArray> roles;
40−
41− roles[Roles::RoleColumnModel] = "columnModel";
42−
43− return roles;
44−}
45−
4638void PreviewModel::setWidgetColumnCount(int count)
4739{
4840 if (count != 1) {
@@ -65,11 +57,6 @@ bool PreviewModel::processingAction() const
6557 return false;
6658}
6759
68−void PreviewModel::setProcessingAction(bool /*processing*/)
69−{
70− qFatal("PreviewModel::setProcessingAction not implemented");
71−}
72−
7360int PreviewModel::rowCount(const QModelIndex&) const
7461{
7562 return m_previewWidgetModels.size();
tests/mocks/Unity/fake_previewmodel.h+7−25
@@ -18,47 +18,29 @@
1818#ifndef FAKE_PREVIEWMODEL_H
1919#define FAKE_PREVIEWMODEL_H
2020
21−#include <QAbstractListModel>
21+#include <unity/shell/scopes/PreviewModelInterface.h>
22+
2223#include <QSharedPointer>
2324#include <QVariantMap>
2425
2526class PreviewWidgetModel;
2627
27−class PreviewModel : public QAbstractListModel
28+class PreviewModel : public unity::shell::scopes::PreviewModelInterface
2829{
2930 Q_OBJECT
3031
31− Q_ENUMS(Roles)
32−
33− Q_PROPERTY(int widgetColumnCount READ widgetColumnCount WRITE setWidgetColumnCount NOTIFY widgetColumnCountChanged)
34− Q_PROPERTY(bool loaded READ loaded NOTIFY loadedChanged)
35− Q_PROPERTY(bool processingAction READ processingAction NOTIFY processingActionChanged)
36−
3732public:
3833 explicit PreviewModel(QObject* parent = 0);
3934
40− enum Roles {
41− RoleColumnModel
42− };
43−
4435 QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
45− QHash<int, QByteArray> roleNames() const override;
4636 int rowCount(const QModelIndex& parent = QModelIndex()) const override;
4737
48− void setWidgetColumnCount(int count);
49− int widgetColumnCount() const;
50− bool loaded() const;
51− bool processingAction() const;
52− void setProcessingAction(bool processing);
53−
54−Q_SIGNALS:
55− void widgetColumnCountChanged();
56− void loadedChanged();
57− void processingActionChanged();
58− void triggered(QString const&, QString const&, QVariantMap const&);
38+ void setWidgetColumnCount(int count) override;
39+ int widgetColumnCount() const override;
40+ bool loaded() const override;
41+ bool processingAction() const override;
5942
6043private:
61− QHash<int, QByteArray> m_roles;
6244 QList<PreviewWidgetModel*> m_previewWidgetModels;
6345};
6446
tests/mocks/Unity/fake_previewstack.cpp+3−11
@@ -21,7 +21,8 @@
2121#include "fake_previewmodel.h"
2222#include "fake_scope.h"
2323
24−PreviewStack::PreviewStack(QObject* parent) : QAbstractListModel(parent)
24+PreviewStack::PreviewStack(QObject* parent)
25+ : unity::shell::scopes::PreviewStackInterface(parent)
2526{
2627 m_previews << new PreviewModel(this);
2728}
@@ -30,15 +31,6 @@ PreviewStack::~PreviewStack()
3031{
3132}
3233
33−QHash<int, QByteArray> PreviewStack::roleNames() const
34−{
35− QHash<int, QByteArray> roles;
36−
37− roles[Roles::RolePreviewModel] = "previewModel";
38−
39− return roles;
40−}
41−
4234void PreviewStack::setWidgetColumnCount(int columnCount)
4335{
4436 if (columnCount != 1) {
@@ -56,7 +48,7 @@ int PreviewStack::rowCount(const QModelIndex&) const
5648 return m_previews.size();
5749}
5850
59−PreviewModel* PreviewStack::get(int index) const
51+unity::shell::scopes::PreviewModelInterface* PreviewStack::getPreviewModel(int index) const
6052{
6153 if (index >= m_previews.size()) {
6254 return nullptr;
tests/mocks/Unity/fake_previewstack.h+6−17
@@ -18,39 +18,28 @@
1818#ifndef FAKE_PREVIEWSTACK_H
1919#define FAKE_PREVIEWSTACK_H
2020
21−#include <QAbstractListModel>
21+#include <unity/shell/scopes/PreviewStackInterface.h>
22+
2223#include <QSharedPointer>
2324#include <QVariantMap>
2425
2526class PreviewModel;
2627
27−class PreviewStack : public QAbstractListModel
28+class PreviewStack : public unity::shell::scopes::PreviewStackInterface
2829{
2930 Q_OBJECT
3031
31− Q_ENUMS(Roles)
32−
33− Q_PROPERTY(int widgetColumnCount READ widgetColumnCount WRITE setWidgetColumnCount NOTIFY widgetColumnCountChanged)
34−
3532public:
3633 explicit PreviewStack(QObject* parent = 0);
3734 virtual ~PreviewStack();
3835
39− enum Roles {
40− RolePreviewModel
41− };
42−
4336 QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
44− QHash<int, QByteArray> roleNames() const override;
4537 int rowCount(const QModelIndex& parent = QModelIndex()) const override;
4638
47− Q_INVOKABLE PreviewModel* get(int index) const;
48−
49− void setWidgetColumnCount(int columnCount);
50− int widgetColumnCount() const;
39+ Q_INVOKABLE unity::shell::scopes::PreviewModelInterface* getPreviewModel(int index) const override;
5140
52−Q_SIGNALS:
53− void widgetColumnCountChanged();
41+ void setWidgetColumnCount(int columnCount) override;
42+ int widgetColumnCount() const override;
5443
5544private:
5645 QList<PreviewModel*> m_previews;
tests/mocks/Unity/fake_previewwidgetmodel.cpp+2−10
@@ -35,12 +35,9 @@ struct PreviewData
3535 }
3636};
3737
38−PreviewWidgetModel::PreviewWidgetModel(QObject* parent) : QAbstractListModel(parent)
38+PreviewWidgetModel::PreviewWidgetModel(QObject* parent)
39+ : unity::shell::scopes::PreviewWidgetModelInterface(parent)
3940{
40− m_roles[Roles::RoleWidgetId] = "widgetId";
41− m_roles[Roles::RoleType] = "type";
42− m_roles[Roles::RoleProperties] = "properties";
43−
4441 populateWidgets();
4542}
4643
@@ -60,11 +57,6 @@ void PreviewWidgetModel::populateWidgets()
6057
6158}
6259
63−QHash<int, QByteArray> PreviewWidgetModel::roleNames() const
64−{
65− return m_roles;
66−}
67−
6860int PreviewWidgetModel::rowCount(const QModelIndex&) const
6961{
7062 return m_previewWidgets.size();
tests/mocks/Unity/fake_previewwidgetmodel.h+3−12
@@ -18,33 +18,24 @@
1818#ifndef FAKE_PREVIEWWIDGETMODEL_H
1919#define FAKE_PREVIEWWIDGETMODEL_H
2020
21−#include <QAbstractListModel>
21+#include <unity/shell/scopes/PreviewWidgetModelInterface.h>
22+
2223#include <QSharedPointer>
2324#include <QVariantMap>
2425
2526class PreviewData;
2627
27−class PreviewWidgetModel : public QAbstractListModel
28+class PreviewWidgetModel : public unity::shell::scopes::PreviewWidgetModelInterface
2829{
2930 Q_OBJECT
3031
31− Q_ENUMS(Roles)
32−
3332public:
3433 explicit PreviewWidgetModel(QObject* parent = 0);
3534
36− enum Roles {
37− RoleWidgetId,
38− RoleType,
39− RoleProperties
40− };
41−
4235 QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
43− QHash<int, QByteArray> roleNames() const override;
4436 int rowCount(const QModelIndex& parent = QModelIndex()) const override;
4537
4638private:
47− QHash<int, QByteArray> m_roles;
4839 QList<QSharedPointer<PreviewData>> m_previewWidgets;
4940
5041 void populateWidgets();
tests/mocks/Unity/fake_resultsmodel.cpp+2−44
@@ -23,25 +23,10 @@
2323#include <paths.h>
2424
2525ResultsModel::ResultsModel(int result_count, int categoryId, QObject* parent)
26− : QAbstractListModel(parent)
26+ : unity::shell::scopes::ResultsModelInterface(parent)
2727 , m_result_count(result_count)
2828 , m_categoryId(categoryId)
2929{
30− m_roles[ResultsModel::RoleUri] = "uri";
31− m_roles[ResultsModel::RoleCategoryId] = "categoryId";
32− m_roles[ResultsModel::RoleDndUri] = "dndUri";
33− m_roles[ResultsModel::RoleResult] = "result";
34− m_roles[ResultsModel::RoleTitle] = "title";
35− m_roles[ResultsModel::RoleArt] = "art";
36− m_roles[ResultsModel::RoleSubtitle] = "subtitle";
37− m_roles[ResultsModel::RoleMascot] = "mascot";
38− m_roles[ResultsModel::RoleEmblem] = "emblem";
39− m_roles[ResultsModel::RoleOldPrice] = "oldPrice";
40− m_roles[ResultsModel::RolePrice] = "price";
41− m_roles[ResultsModel::RoleAltPrice] = "altPrice";
42− m_roles[ResultsModel::RoleRating] = "rating";
43− m_roles[ResultsModel::RoleAltRating] = "altRating";
44− m_roles[ResultsModel::RoleSummary] = "summary";
4530}
4631
4732QString ResultsModel::categoryId() const
@@ -54,12 +39,6 @@ void ResultsModel::setCategoryId(QString const& /*id*/)
5439 qFatal("Calling un-implemented ResultsModel::setCategoryId");
5540}
5641
57−QHash<int, QByteArray>
58−ResultsModel::roleNames() const
59−{
60− return m_roles;
61−}
62−
6342int ResultsModel::rowCount(const QModelIndex& parent) const
6443{
6544 Q_UNUSED(parent);
@@ -72,23 +51,6 @@ int ResultsModel::count() const
7251 return rowCount();
7352}
7453
75−QVariant ResultsModel::get(int row) const
76−{
77− if (row >= m_result_count || row < 0) return QVariantMap();
78−
79− QVariantMap result;
80− QModelIndex modelIndex(index(row));
81− QHashIterator<int, QByteArray> it(roleNames());
82− while (it.hasNext()) {
83− it.next();
84− QVariant val(data(modelIndex, it.key()));
85− if (val.isNull()) continue;
86− result[it.value()] = val;
87− }
88−
89− return result;
90−}
91−
9254QVariant
9355ResultsModel::data(const QModelIndex& index, int role) const
9456{
@@ -103,13 +65,9 @@ ResultsModel::data(const QModelIndex& index, int role) const
10365 case RoleArt:
10466 return qmlDirectory() + "graphics/applicationIcons/dash.png";
10567 case RoleSubtitle:
68+ return QString("Subtitle.%1.%2").arg(m_categoryId).arg(index.row());
10669 case RoleMascot:
10770 case RoleEmblem:
108− case RoleOldPrice:
109− case RolePrice:
110− case RoleAltPrice:
111− case RoleRating:
112− case RoleAltRating:
11371 case RoleSummary:
11472 default:
11573 return QVariant();
tests/mocks/Unity/fake_resultsmodel.h+5−37
@@ -21,58 +21,26 @@
2121#ifndef FAKE_RESULTS_MODEL_H
2222#define FAKE_RESULTS_MODEL_H
2323
24−#include <QAbstractListModel>
24+#include <unity/shell/scopes/ResultsModelInterface.h>
2525
26−class ResultsModel : public QAbstractListModel
26+class ResultsModel : public unity::shell::scopes::ResultsModelInterface
2727{
2828 Q_OBJECT
2929
30− Q_ENUMS(Roles)
31−
32− Q_PROPERTY(QString categoryId READ categoryId WRITE setCategoryId NOTIFY categoryIdChanged)
33− Q_PROPERTY(int count READ count NOTIFY countChanged)
34−
3530public:
3631 explicit ResultsModel(int result_count, int categoryId, QObject* parent = 0);
3732
38− enum Roles {
39− RoleUri,
40− RoleCategoryId,
41− RoleDndUri,
42− RoleResult,
43− // card components
44− RoleTitle,
45− RoleArt,
46− RoleSubtitle,
47− RoleMascot,
48− RoleEmblem,
49− RoleOldPrice,
50− RolePrice,
51− RoleAltPrice,
52− RoleRating,
53− RoleAltRating,
54− RoleSummary
55− };
56−
5733 int rowCount(const QModelIndex& parent = QModelIndex()) const override;
58− QHash<int, QByteArray> roleNames() const override;
5934 QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
6035
61− Q_INVOKABLE QVariant get(int row) const;
62−
6336 /* getters */
64− QString categoryId() const;
65− int count() const;
37+ QString categoryId() const override;
38+ int count() const override;
6639
6740 /* setters */
68− void setCategoryId(QString const& id);
69−
70−Q_SIGNALS:
71− void categoryIdChanged();
72− void countChanged();
41+ void setCategoryId(QString const& id) override;
7342
7443private:
75− QHash<int, QByteArray> m_roles;
7644 int m_result_count;
7745 int m_categoryId;
7846};
tests/mocks/Unity/fake_scope.cpp+3−14
@@ -22,7 +22,7 @@ Scope::Scope(QObject* parent) : Scope(QString(), QString(), false, parent)
2222}
2323
2424Scope::Scope(QString const& id, QString const& name, bool visible, QObject* parent)
25− : QObject(parent)
25+ : unity::shell::scopes::ScopeInterface(parent)
2626 , m_id(id)
2727 , m_name(name)
2828 , m_visible(visible)
@@ -61,15 +61,11 @@ QString Scope::shortcut() const {
6161 return QString("");
6262}
6363
64−bool Scope::connected() const {
65− return true;
66−}
67−
6864bool Scope::searchInProgress() const {
6965 return m_searching;
7066}
7167
72−Categories* Scope::categories() const {
68+unity::shell::scopes::CategoriesInterface* Scope::categories() const {
7369 return m_categories;
7470}
7571
@@ -89,13 +85,6 @@ bool Scope::isActive() const {
8985 return m_isActive;
9086}
9187
92−void Scope::setName(const QString &str) {
93− if (str != m_name) {
94− m_name = str;
95− Q_EMIT nameChanged(m_name);
96− }
97−}
98−
9988void Scope::setSearchQuery(const QString &str) {
10089 if (str != m_searchQuery) {
10190 m_searchQuery = str;
@@ -149,7 +138,7 @@ void Scope::cancelActivation()
149138{
150139}
151140
152−void Scope::closeScope(Scope* /*scope*/)
141+void Scope::closeScope(unity::shell::scopes::ScopeInterface* /*scope*/)
153142{
154143 qFatal("Scope::closeScope is not implemented");
155144}
tests/mocks/Unity/fake_scope.h+26−72
@@ -17,93 +17,47 @@
1717#ifndef FAKE_SCOPE_H
1818#define FAKE_SCOPE_H
1919
20+#include <unity/shell/scopes/ScopeInterface.h>
21+
2022#include "fake_categories.h"
2123#include "fake_previewstack.h"
2224
23−#include <QObject>
2425#include <QTimer>
2526
26−class Preview;
27−
28−class Scope : public QObject
27+class Scope : public unity::shell::scopes::ScopeInterface
2928{
3029 Q_OBJECT
3130
32− Q_PROPERTY(QString id READ id NOTIFY idChanged)
33− Q_PROPERTY(QString name READ name NOTIFY nameChanged)
34− Q_PROPERTY(QString iconHint READ iconHint NOTIFY iconHintChanged)
35− Q_PROPERTY(QString description READ description NOTIFY descriptionChanged)
36− Q_PROPERTY(QString searchHint READ searchHint NOTIFY searchHintChanged)
37− Q_PROPERTY(bool searchInProgress READ searchInProgress WRITE setSearchInProgress NOTIFY searchInProgressChanged)
38− Q_PROPERTY(bool visible READ visible NOTIFY visibleChanged)
39− Q_PROPERTY(QString shortcut READ shortcut NOTIFY shortcutChanged)
40− Q_PROPERTY(Categories* categories READ categories NOTIFY categoriesChanged)
41− //Q_PROPERTY(Filters* filters READ filters NOTIFY filtersChanged)
42−
43− Q_PROPERTY(QString searchQuery READ searchQuery WRITE setSearchQuery NOTIFY searchQueryChanged)
44− Q_PROPERTY(QString noResultsHint READ noResultsHint WRITE setNoResultsHint NOTIFY noResultsHintChanged)
45− Q_PROPERTY(QString formFactor READ formFactor WRITE setFormFactor NOTIFY formFactorChanged)
46− Q_PROPERTY(bool isActive READ isActive WRITE setActive NOTIFY isActiveChanged)
47−
4831public:
4932 Scope(QObject* parent = 0);
5033 Scope(QString const& id, QString const& name, bool visible, QObject* parent = 0);
5134
5235 /* getters */
53− QString id() const;
54− QString name() const;
55− QString iconHint() const;
56− QString description() const;
57− QString searchHint() const;
58− bool visible() const;
59− QString shortcut() const;
60− bool connected() const;
61− bool searchInProgress() const;
62− Categories* categories() const;
63− QString searchQuery() const;
64− QString noResultsHint() const;
65− QString formFactor() const;
66− bool isActive() const;
36+ QString id() const override;
37+ QString name() const override;
38+ QString iconHint() const override;
39+ QString description() const override;
40+ QString searchHint() const override;
41+ bool visible() const override;
42+ QString shortcut() const override;
43+ bool searchInProgress() const override;
44+ unity::shell::scopes::CategoriesInterface* categories() const override;
45+ QString searchQuery() const override;
46+ QString noResultsHint() const override;
47+ QString formFactor() const override;
48+ bool isActive() const override;
6749
6850 /* setters */
69− void setName(const QString& name);
70− void setSearchQuery(const QString& search_query);
71− void setNoResultsHint(const QString& hint);
72− void setFormFactor(const QString& form_factor);
73− void setActive(const bool);
74− void setSearchInProgress(const bool inProg);
75−
76− Q_INVOKABLE void activate(QVariant const& result);
77− Q_INVOKABLE PreviewStack* preview(QVariant const& result);
78− Q_INVOKABLE void cancelActivation();
79− Q_INVOKABLE void closeScope(Scope* scope);
80−
81−Q_SIGNALS:
82− void idChanged();
83− void nameChanged(const QString&);
84− void iconHintChanged(const QString&);
85− void descriptionChanged(const QString&);
86− void searchHintChanged(const QString&);
87− void searchInProgressChanged();
88− void visibleChanged(bool);
89− void shortcutChanged(const QString&);
90− void categoriesChanged();
91− //void filtersChanged();
92− void searchQueryChanged();
93− void noResultsHintChanged();
94− void formFactorChanged();
95− void isActiveChanged(bool);
96−
97− // signals triggered by activate(..) or preview(..) requests.
98− void showDash();
99− void hideDash();
100− void gotoUri(const QString &uri);
101− void activated();
102− void previewRequested(QVariant const& result);
103− void gotoScope(QString const& scopeId);
104− void openScope(Scope* scope);
105−
106− void activateApplication(const QString &desktop);
51+ void setSearchQuery(const QString& search_query) override;
52+ void setNoResultsHint(const QString& hint) override;
53+ void setFormFactor(const QString& form_factor) override;
54+ void setActive(const bool) override;
55+ Q_INVOKABLE void setSearchInProgress(const bool inProg); // This is not invokable in the Interface, here for testing benefits
56+
57+ Q_INVOKABLE void activate(QVariant const& result) override;
58+ Q_INVOKABLE PreviewStack* preview(QVariant const& result) override;
59+ Q_INVOKABLE void cancelActivation() override;
60+ Q_INVOKABLE void closeScope(unity::shell::scopes::ScopeInterface* scope) override;
10761
10862protected:
10963
tests/mocks/Unity/fake_scopes.cpp+11−26
@@ -25,19 +25,10 @@
2525#include <QTimer>
2626
2727Scopes::Scopes(QObject *parent)
28−: QAbstractListModel(parent)
29−, m_loaded(false)
30−, timer(this)
28+ : unity::shell::scopes::ScopesInterface(parent)
29+ , m_loaded(false)
30+ , timer(this)
3131{
32− m_roles[Scopes::RoleScope] = "scope";
33− m_roles[Scopes::RoleId] = "id";
34− m_roles[Scopes::RoleVisible] = "visible";
35− m_roles[Scopes::RoleTitle] = "title";
36−
37− QObject::connect(this, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SIGNAL(countChanged()));
38− QObject::connect(this, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SIGNAL(countChanged()));
39− QObject::connect(this, SIGNAL(modelReset()), this, SIGNAL(countChanged()));
40−
4132 timer.setSingleShot(true);
4233 timer.setInterval(100);
4334 QObject::connect(&timer, SIGNAL(timeout()), this, SLOT(updateScopes()));
@@ -83,11 +74,6 @@ void Scopes::load()
8374 timer.start();
8475}
8576
86−QHash<int, QByteArray> Scopes::roleNames() const
87−{
88− return m_roles;
89−}
90−
9177int Scopes::rowCount(const QModelIndex&) const
9278{
9379 return m_scopes.count();
@@ -114,14 +100,18 @@ QVariant Scopes::data(const QModelIndex& index, int role) const
114100 }
115101}
116102
117−QVariant Scopes::get(int row) const
103+unity::shell::scopes::ScopeInterface* Scopes::getScope(int row) const
118104{
119− return data(QAbstractListModel::index(row), 0);
105+ if (row < 0 || row >= m_scopes.size()) {
106+ return nullptr;
107+ }
108+
109+ return m_scopes[row];
120110}
121111
122−QVariant Scopes::get(QString const&) const
112+unity::shell::scopes::ScopeInterface* Scopes::getScope(QString const&) const
123113{
124− return QVariant();
114+ return nullptr;
125115}
126116
127117QModelIndex Scopes::parent(const QModelIndex&) const
@@ -134,11 +124,6 @@ bool Scopes::loaded() const
134124 return m_loaded;
135125}
136126
137−int Scopes::count() const
138−{
139− return rowCount();
140−}
141−
142127void Scopes::addScope(Scope* scope)
143128{
144129 int index = rowCount();
tests/mocks/Unity/fake_scopes.h+7−24
@@ -19,36 +19,27 @@
1919#ifndef FAKE_SCOPES_H
2020#define FAKE_SCOPES_H
2121
22+#include <unity/shell/scopes/ScopesInterface.h>
23+
2224// Local
2325#include "fake_scope.h"
2426
2527// Qt
26−#include <QAbstractListModel>
2728#include <QList>
2829#include <QTimer>
2930
30−class Scopes : public QAbstractListModel
31+class Scopes : public unity::shell::scopes::ScopesInterface
3132{
3233 Q_OBJECT
33− Q_ENUMS(Roles)
34− Q_PROPERTY(bool loaded READ loaded NOTIFY loadedChanged)
35− Q_PROPERTY(int count READ count NOTIFY countChanged)
3634
3735public:
3836 explicit Scopes(QObject *parent = 0);
3937 ~Scopes();
4038
41− enum Roles {
42− RoleScope,
43− RoleId,
44− RoleVisible,
45− RoleTitle
46− };
47−
48− Q_INVOKABLE int rowCount(const QModelIndex& parent = QModelIndex()) const;
39+ Q_INVOKABLE int rowCount(const QModelIndex& parent = QModelIndex()) const override;
4940
50− Q_INVOKABLE QVariant get(int row) const;
51− Q_INVOKABLE QVariant get(const QString& scope_id) const;
41+ Q_INVOKABLE unity::shell::scopes::ScopeInterface* getScope(int row) const override;
42+ Q_INVOKABLE unity::shell::scopes::ScopeInterface* getScope(const QString& scope_id) const override;
5243
5344 Q_INVOKABLE void addScope(Scope* scope);
5445
@@ -56,23 +47,15 @@ public:
5647 Q_INVOKABLE void load();
5748
5849 QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
59− QHash<int, QByteArray> roleNames() const;
6050 QModelIndex parent ( const QModelIndex & index ) const;
6151
62− bool loaded() const;
63− int count() const;
64−
65−Q_SIGNALS:
66− void activateScopeRequested(const QString& scope_id);
67− void loadedChanged(bool);
68− void countChanged();
52+ bool loaded() const override;
6953
7054private Q_SLOTS:
7155 void updateScopes();
7256
7357private:
7458 QList<Scope*> m_scopes;
75− QHash<int, QByteArray> m_roles;
7659 bool m_loaded;
7760 QTimer timer;
7861};
tests/mocks/Unity/fake_unity_plugin.cpp+3−2
@@ -40,8 +40,9 @@ void FakeUnityPlugin::registerTypes(const char *uri)
4040 Q_ASSERT(uri == QLatin1String("Unity"));
4141
4242 qmlRegisterType<Scopes>(uri, 0, 2, "Scopes");
43− qmlRegisterType<Scope>(uri, 0, 2, "Scope");
44− qmlRegisterUncreatableType<Categories>(uri, 0, 2, "Categories", "Can't create Categories object in QML.");
43+ qmlRegisterType<Scope>(uri, 0, 2, "MockScope");
44+ qmlRegisterUncreatableType<unity::shell::scopes::ScopeInterface>(uri, 0, 2, "Scope", "Can't create Scope object in QML.");
45+ qmlRegisterUncreatableType<unity::shell::scopes::CategoriesInterface>(uri, 0, 2, "Categories", "Can't create Categories object in QML.");
4546 qmlRegisterUncreatableType<ResultsModel>(uri, 0, 2, "ResultsModel", "Can't create ResultsModel object in QML.");
4647 qmlRegisterType<PreviewModel>(uri, 0, 2, "FakePreviewModel");
4748 qmlRegisterUncreatableType<PreviewWidgetModel>(uri, 0, 2, "PreviewWidgetModel", "Can't create new PreviewWidgetModel in QML. Get them from PreviewModel instance.");
tests/mocks/Unity/iconutils.cppdeleted−124
@@ -1,124 +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− * Authors:
17− * Michal Hruby <michal.hruby@canonical.com>
18− */
19−
20−#include "iconutils.h"
21−
22−#include <gio/gio.h>
23−
24−#include <QStringList>
25−#include <QUrl>
26−#include <QUrlQuery>
27−
28−#define BASE_THEME_ICON_URI "image://theme/"
29−#define BASE_THUMBNAILER_URI "image://thumbnailer/"
30−#define BASE_ALBUMART_URI "image://albumart/"
31−
32−QString gIconToDeclarativeImageProviderString(QString const &giconString)
33−{
34− if (giconString.isEmpty()) return giconString;
35−
36− if (giconString.startsWith('/') || giconString.startsWith(QLatin1String("http")) ||
37− giconString.startsWith(QLatin1String("file:")) || giconString.startsWith(QLatin1String("image:"))) {
38− return giconString;
39− }
40−
41− if (!giconString.startsWith(QLatin1String(". "))) {
42− // must be a themed icon
43− QString themedIcon(BASE_THEME_ICON_URI);
44− themedIcon.append(giconString);
45− return themedIcon;
46− }
47−
48− // special case annotated icon
49− if (giconString.startsWith(QLatin1String(". UnityProtocolAnnotatedIcon "))) {
50− QString annotatedIcon;
51− QString serializedData(QUrl::fromPercentEncoding(giconString.mid(29).toUtf8()));
52− GVariant *variant = g_variant_parse(G_VARIANT_TYPE_VARDICT, serializedData.toUtf8().constData(), NULL, NULL, NULL);
53− gchar *baseUri;
54− if (variant != NULL && g_variant_lookup(variant, "base-icon", "&s", &baseUri)) {
55− annotatedIcon = gIconToDeclarativeImageProviderString(QString(baseUri));
56− // FIXME: enclose in image://annotated/... once unity supports that
57− }
58− if (variant != NULL) g_variant_unref(variant);
59−
60− return annotatedIcon;
61− }
62−
63− // handle real gicon strings
64− QString result;
65− GError *error = NULL;
66− GIcon *icon = g_icon_new_for_string(giconString.toLocal8Bit().constData(), &error);
67− if (error != NULL || icon == NULL) {
68− qWarning("Unable to deserialize icon: %s", giconString.toLocal8Bit().constData());
69− g_clear_error(&error);
70− return result;
71− }
72−
73− if (G_IS_THEMED_ICON(icon)) {
74− QString themedIcon(BASE_THEME_ICON_URI);
75− QStringList list;
76− const char* const *iconNames = g_themed_icon_get_names(G_THEMED_ICON(icon));
77− if (iconNames != NULL) {
78− for (const char * const *iter = iconNames; *iter != NULL; ++iter) {
79− list << QLatin1String(*iter);
80− }
81− }
82− themedIcon.append(list.join(QString(",")));
83− result = themedIcon;
84− } else if (G_IS_FILE_ICON(icon)) {
85− GFile *file = g_file_icon_get_file(G_FILE_ICON(icon));
86− gchar *uri = g_file_get_uri(file);
87− QString iconUri(uri);
88− g_free(uri);
89− result = iconUri;
90− }
91−
92− g_object_unref(icon);
93−
94− return result;
95−}
96−
97−QString uriToThumbnailerProviderString(QString const &uri, QString const &mimetype, QVariantHash const &metadata)
98−{
99− if (uri.startsWith(QLatin1String("file:///"))) {
100− bool isAudio = mimetype.startsWith(QLatin1String("audio/"));
101− QString thumbnailerUri;
102− if (isAudio) {
103− thumbnailerUri = BASE_ALBUMART_URI;
104− if (metadata.contains("content")) {
105− QVariantHash contentHash = metadata["content"].toHash();
106− if (contentHash.contains("content")) { // nested content in Home?
107− contentHash = contentHash["content"].toHash();
108− }
109− if (contentHash.contains("album") && contentHash.contains("artist")) {
110− QUrlQuery query;
111− query.addQueryItem(QStringLiteral("artist"), contentHash["artist"].toString());
112− query.addQueryItem(QStringLiteral("album"), contentHash["album"].toString());
113− thumbnailerUri.append(query.toString());
114− }
115− }
116− } else {
117− thumbnailerUri = BASE_THUMBNAILER_URI;
118− thumbnailerUri.append(uri.midRef(7));
119− }
120− return thumbnailerUri;
121− }
122−
123− return QString::null;
124−}
tests/mocks/Unity/qmldir+1
@@ -1,2 +1,3 @@
11module Unity
22plugin FakeUnityQml
3+typeinfo Unity.qmltypes
tests/plugins/CMakeLists.txt+1−1
@@ -1,6 +1,6 @@
11add_subdirectory(AccountsService)
22add_subdirectory(LightDM)
3−add_subdirectory(DashViews)
3+add_subdirectory(Dash)
44add_subdirectory(Ubuntu)
55add_subdirectory(Unity)
66add_subdirectory(Utils)
tests/plugins/DashViews/CMakeLists.txt → tests/plugins/Dash/CMakeLists.txtrenamed+16−9
@@ -16,7 +16,7 @@ include_directories(
1616 ${Qt5Quick_INCLUDE_DIRS}
1717 ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
1818 ${Qt5V8_PRIVATE_INCLUDE_DIR}
19− ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews
19+ ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/Dash
2020 ${CMAKE_CURRENT_BINARY_DIR}
2121 )
2222
@@ -28,11 +28,11 @@ add_definitions(-DBUILT_PLUGINS_DIR="${CMAKE_BINARY_DIR}/plugins")
2828macro(add_lvwph_test FILENAME TESTNAME)
2929 add_executable(${TESTNAME}TestExec
3030 ${FILENAME}test.cpp
31− ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/listviewwithpageheader.cpp)
31+ ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/Dash/listviewwithpageheader.cpp)
3232 qt5_use_modules(${TESTNAME}TestExec Test Core Qml)
3333 target_link_libraries(${TESTNAME}TestExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
3434
35− add_binary_qml_test(${TESTNAME} "" "DashViews-qml")
35+ add_binary_qml_test(${TESTNAME} "" "Dash-qml")
3636endmacro()
3737
3838add_lvwph_test(listviewwithpageheader ListViewWithPageHeader)
@@ -42,24 +42,24 @@ add_lvwph_test(listviewwithpageheadersectionexternalmodel ListViewWithPageHeader
4242macro(add_dashview_try_test FILENAME TESTNAME)
4343 add_executable(${TESTNAME}TestExec
4444 ${FILENAME}test.cpp
45− ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/${FILENAME}.cpp
46− ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/abstractdashview.cpp
45+ ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/Dash/${FILENAME}.cpp
46+ ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/Dash/abstractdashview.cpp
4747 )
4848 qt5_use_modules(${TESTNAME}TestExec Test Core Qml)
4949 target_link_libraries(${TESTNAME}TestExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
5050
51− add_binary_qml_test(${TESTNAME} "" "DashViews-qml")
51+ add_binary_qml_test(${TESTNAME} "" "Dash-qml")
5252
5353 add_executable(${TESTNAME}tryExec
5454 ${FILENAME}try.cpp
55− ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/${FILENAME}.cpp
56− ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/abstractdashview.cpp
55+ ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/Dash/${FILENAME}.cpp
56+ ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/Dash/abstractdashview.cpp
5757 )
5858 qt5_use_modules(${TESTNAME}tryExec Test Core Qml)
5959 target_link_libraries(${TESTNAME}tryExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
6060 add_custom_target(try${TESTNAME}
6161 ${CMAKE_CURRENT_BINARY_DIR}/${TESTNAME}tryExec
62− DEPENDS ${TESTNAME}tryExec DashViews-qml
62+ DEPENDS ${TESTNAME}tryExec Dash-qml
6363 )
6464endmacro()
6565
@@ -67,6 +67,13 @@ add_dashview_try_test(verticaljournal VerticalJournal)
6767add_dashview_try_test(horizontaljournal HorizontalJournal)
6868add_dashview_try_test(organicgrid OrganicGrid)
6969
70+# CardCreator test
71+add_executable(CardCreatorTestExec cardcreatortest.cpp)
72+qt5_use_modules(CardCreatorTestExec Test Core Qml)
73+target_link_libraries(CardCreatorTestExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
74+add_binary_qml_test(CardCreator "" "Dash-qml")
75+
76+# plain qml test
7077set(qmltest_DEFAULT_TARGETS qmluitests)
7178set(qmltest_DEFAULT_NO_ADD_TEST TRUE)
7279add_qml_test(. ListViewWithPageHeaderQML IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
tests/plugins/Dash/cardcreator/1.resnew file+79
@@ -0,0 +1,79 @@
1+AbstractButton {
2+ id: root;
3+ property var template;
4+ property var components;
5+ property var cardData;
6+ property var artShapeBorderSource: undefined;
7+ property real fontScale: 1.0;
8+ property int headerAlignment: Text.AlignLeft;
9+ property int fixedHeaderHeight: -1;
10+ property size fixedArtShapeSize: Qt.size(-1, -1);
11+ readonly property string title: cardData && cardData["title"] || "";
12+ property bool asynchronous: true;
13+ property bool showHeader: true;
14+ implicitWidth: childrenRect.width;
15+onArtShapeBorderSourceChanged: { if (artShapeBorderSource !== undefined && artShapeLoader.item) artShapeLoader.item.borderSource = artShapeBorderSource; }
16+readonly property size artShapeSize: artShapeLoader.item ? Qt.size(artShapeLoader.item.width, artShapeLoader.item.height) : Qt.size(-1, -1);
17+Item {
18+ id: artShapeHolder;
19+ height: root.fixedArtShapeSize.height != -1 ? root.fixedArtShapeSize.height : artShapeLoader.height;
20+ width: root.fixedArtShapeSize.width != -1 ? root.fixedArtShapeSize.width : artShapeLoader.width;
21+ anchors { horizontalCenter: parent.horizontalCenter; }
22+ Loader {
23+ id: artShapeLoader;
24+ objectName: "artShapeLoader";
25+ active: cardData && cardData["art"] || false;
26+ asynchronous: root.asynchronous;
27+ visible: status == Loader.Ready;
28+ sourceComponent: UbuntuShape {
29+ id: artShape;
30+ objectName: "artShape";
31+ radius: "medium";
32+ readonly property real aspect: components !== undefined ? components["art"]["aspect-ratio"] : 1;
33+ readonly property bool aspectSmallerThanImageAspect: aspect < image.aspect;
34+ Component.onCompleted: { updateWidthHeightBindings(); if (artShapeBorderSource !== undefined) borderSource = artShapeBorderSource; }
35+ onAspectSmallerThanImageAspectChanged: updateWidthHeightBindings();
36+ visible: image.status == Image.Ready;
37+ function updateWidthHeightBindings() {
38+ if (aspectSmallerThanImageAspect) {
39+ width = Qt.binding(function() { return !visible ? 0 : image.width });
40+ height = Qt.binding(function() { return !visible ? 0 : image.fillMode === Image.PreserveAspectCrop ? image.height : width / image.aspect });
41+ } else {
42+ width = Qt.binding(function() { return !visible ? 0 : image.fillMode === Image.PreserveAspectCrop ? image.width : height * image.aspect });
43+ height = Qt.binding(function() { return !visible ? 0 : image.height });
44+ }
45+ }
46+ image: Image {
47+ objectName: "artImage";
48+ source: cardData && cardData["art"] || "";
49+ cache: true;
50+ asynchronous: root.asynchronous;
51+ fillMode: components && components["art"]["fill-mode"] === "fit" ? Image.PreserveAspectFit: Image.PreserveAspectCrop;
52+ readonly property real aspect: implicitWidth / implicitHeight;
53+ width: root.width;
54+ height: width / artShape.aspect;
55+ }
56+ }
57+ }
58+ }
59+readonly property int headerHeight: titleLabel.height + titleLabel.anchors.topMargin * 2;
60+Label {
61+ id: titleLabel;
62+ objectName: "titleLabel";
63+ anchors { right: parent.right;left: parent.left;
64+top: artShapeHolder.bottom;
65+ topMargin: units.gu(1);
66+ }
67+ elide: Text.ElideRight;
68+ fontSize: "small";
69+ wrapMode: Text.Wrap;
70+ maximumLineCount: 2;
71+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
72+ color: "grey";
73+ visible: showHeader ;
74+ text: root.title;
75+ font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
76+ horizontalAlignment: root.headerAlignment;
77+ }
78+implicitHeight: titleLabel.y + titleLabel.height + units.gu(1);
79+}
tests/plugins/Dash/cardcreator/1.tstnew file+3
@@ -0,0 +1,3 @@
1+template: {"card-layout":"vertical","card-size":"small","category-layout":"grid","collapsed-rows":2}
2+components: {"art":{"aspect-ratio":1.6,"field":"art","fill-mode":"fit"},"title":{"field":"title"}}
3+result: 1.res
tests/plugins/Dash/cardcreator/2.resnew file+116
@@ -0,0 +1,116 @@
1+AbstractButton {
2+ id: root;
3+ property var template;
4+ property var components;
5+ property var cardData;
6+ property var artShapeBorderSource: undefined;
7+ property real fontScale: 1.0;
8+ property int headerAlignment: Text.AlignLeft;
9+ property int fixedHeaderHeight: -1;
10+ property size fixedArtShapeSize: Qt.size(-1, -1);
11+ readonly property string title: cardData && cardData["title"] || "";
12+ property bool asynchronous: true;
13+ property bool showHeader: true;
14+ implicitWidth: childrenRect.width;
15+Loader {
16+ id: backgroundLoader;
17+ objectName: "backgroundLoader";
18+ anchors.fill: parent;
19+ asynchronous: root.asynchronous;
20+ visible: status == Loader.Ready;
21+ sourceComponent: UbuntuShape {
22+ objectName: "background";
23+ radius: "medium";
24+ color: getColor(0) || "white";
25+ gradientColor: getColor(1) || color;
26+ anchors.fill: parent;
27+ image: backgroundImage.source ? backgroundImage : null;
28+ property real luminance: 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b;
29+ property Image backgroundImage: Image {
30+ objectName: "backgroundImage";
31+ source: {
32+ if (cardData && typeof cardData["background"] === "string") return cardData["background"];
33+ else if (template && typeof template["card-background"] === "string") return template["card-background"];
34+ else return "";
35+ }
36+ }
37+ function getColor(index) {
38+ if (cardData && typeof cardData["background"] === "object"
39+ && (cardData["background"]["type"] === "color" || cardData["background"]["type"] === "gradient")) {
40+ return cardData["background"]["elements"][index];
41+ } else if (template && typeof template["card-background"] === "object"
42+ && (template["card-background"]["type"] === "color" || template["card-background"]["type"] === "gradient")) {
43+ return template["card-background"]["elements"][index];
44+ } else return undefined;
45+ }
46+ }
47+ }
48+readonly property size artShapeSize: Qt.size(-1, -1);
49+readonly property int headerHeight: row.height + row.margins * 2;
50+Row {
51+ id: row;
52+ objectName: "outerRow";
53+ property real margins: units.gu(1);
54+ spacing: margins;
55+ anchors { top: parent.top;
56+ topMargin: units.gu(1);
57+ left: parent.left;
58+}
59+ anchors.right: parent.right;
60+ anchors.margins: margins;
61+data: [ Image {
62+ id: mascotImage;
63+ objectName: "mascotImage";
64+ anchors { verticalCenter: parent.verticalCenter; }
65+ readonly property int maxSize: Math.max(width, height) * 4;
66+ source: cardData && cardData["mascot"];
67+ width: units.gu(6);
68+ height: units.gu(5.625);
69+ sourceSize { width: maxSize; height: maxSize }
70+ fillMode: Image.PreserveAspectCrop;
71+ horizontalAlignment: Image.AlignHCenter;
72+ verticalAlignment: Image.AlignVCenter;
73+ visible: showHeader;
74+ }
75+,
76+Column {
77+ anchors.verticalCenter: parent.verticalCenter;
78+ spacing: units.dp(2);
79+ width: parent.width - x;
80+ data: [
81+Label {
82+ id: titleLabel;
83+ objectName: "titleLabel";
84+ anchors { left: parent.left; right: parent.right }
85+ elide: Text.ElideRight;
86+ fontSize: "small";
87+ wrapMode: Text.Wrap;
88+ maximumLineCount: 2;
89+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
90+ color: backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < 0.7 ? "white" : "grey";
91+ visible: showHeader ;
92+ text: root.title;
93+ font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
94+ horizontalAlignment: root.headerAlignment;
95+ }
96+,
97+Label {
98+ id: subtitleLabel;
99+ objectName: "subtitleLabel";
100+ anchors { left: parent.left; right: parent.right }
101+
102+ elide: Text.ElideRight;
103+ fontSize: "small";
104+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
105+ color: backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < 0.7 ? "white" : "grey";
106+ visible: titleLabel.visible && titleLabel.text;
107+ text: cardData && cardData["subtitle"] || "";
108+ font.weight: Font.Light;
109+ horizontalAlignment: root.headerAlignment;
110+ }
111+]
112+}
113+]
114+}
115+implicitHeight: row.y + row.height + units.gu(1);
116+}
tests/plugins/Dash/cardcreator/2.tstnew file+3
@@ -0,0 +1,3 @@
1+template: {"card-background":{"elements":["#E9E9E9"],"type":"color"},"card-layout":"vertical","card-size":"medium","category-layout":"grid","collapsed-rows":2}
2+components: {"art":{"aspect-ratio":1,"fill-mode":"crop"},"background":{"field":"background"},"mascot":{"field":"icon"},"subtitle":{"field":"author"},"title":{"field":"title"}}
3+result: 2.res
tests/plugins/Dash/cardcreator/3.resnew file+96
@@ -0,0 +1,96 @@
1+AbstractButton {
2+ id: root;
3+ property var template;
4+ property var components;
5+ property var cardData;
6+ property var artShapeBorderSource: undefined;
7+ property real fontScale: 1.0;
8+ property int headerAlignment: Text.AlignLeft;
9+ property int fixedHeaderHeight: -1;
10+ property size fixedArtShapeSize: Qt.size(-1, -1);
11+ readonly property string title: cardData && cardData["title"] || "";
12+ property bool asynchronous: true;
13+ property bool showHeader: true;
14+ implicitWidth: childrenRect.width;
15+onArtShapeBorderSourceChanged: { if (artShapeBorderSource !== undefined && artShapeLoader.item) artShapeLoader.item.borderSource = artShapeBorderSource; }
16+readonly property size artShapeSize: artShapeLoader.item ? Qt.size(artShapeLoader.item.width, artShapeLoader.item.height) : Qt.size(-1, -1);
17+Item {
18+ id: artShapeHolder;
19+ height: root.fixedArtShapeSize.height != -1 ? root.fixedArtShapeSize.height : artShapeLoader.height;
20+ width: root.fixedArtShapeSize.width != -1 ? root.fixedArtShapeSize.width : artShapeLoader.width;
21+ anchors { horizontalCenter: parent.horizontalCenter; }
22+ Loader {
23+ id: artShapeLoader;
24+ objectName: "artShapeLoader";
25+ active: cardData && cardData["art"] || false;
26+ asynchronous: root.asynchronous;
27+ visible: status == Loader.Ready;
28+ sourceComponent: UbuntuShape {
29+ id: artShape;
30+ objectName: "artShape";
31+ radius: "medium";
32+ readonly property real aspect: components !== undefined ? components["art"]["aspect-ratio"] : 1;
33+ readonly property bool aspectSmallerThanImageAspect: aspect < image.aspect;
34+ Component.onCompleted: { updateWidthHeightBindings(); if (artShapeBorderSource !== undefined) borderSource = artShapeBorderSource; }
35+ onAspectSmallerThanImageAspectChanged: updateWidthHeightBindings();
36+ visible: image.status == Image.Ready;
37+ function updateWidthHeightBindings() {
38+ if (aspectSmallerThanImageAspect) {
39+ width = Qt.binding(function() { return !visible ? 0 : image.width });
40+ height = Qt.binding(function() { return !visible ? 0 : image.fillMode === Image.PreserveAspectCrop ? image.height : width / image.aspect });
41+ } else {
42+ width = Qt.binding(function() { return !visible ? 0 : image.fillMode === Image.PreserveAspectCrop ? image.width : height * image.aspect });
43+ height = Qt.binding(function() { return !visible ? 0 : image.height });
44+ }
45+ }
46+ image: Image {
47+ objectName: "artImage";
48+ source: cardData && cardData["art"] || "";
49+ cache: true;
50+ asynchronous: root.asynchronous;
51+ fillMode: components && components["art"]["fill-mode"] === "fit" ? Image.PreserveAspectFit: Image.PreserveAspectCrop;
52+ readonly property real aspect: implicitWidth / implicitHeight;
53+ width: root.width;
54+ height: width / artShape.aspect;
55+ }
56+ }
57+ }
58+ }
59+readonly property int headerHeight: titleLabel.height + titleLabel.anchors.topMargin * 2 + subtitleLabel.height + subtitleLabel.anchors.topMargin;
60+Label {
61+ id: titleLabel;
62+ objectName: "titleLabel";
63+ anchors { right: parent.right;left: parent.left;
64+top: artShapeHolder.bottom;
65+ topMargin: units.gu(1);
66+}
67+ elide: Text.ElideRight;
68+ fontSize: "small";
69+ wrapMode: Text.Wrap;
70+ maximumLineCount: 2;
71+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
72+ color: "grey";
73+ visible: showHeader ;
74+ text: root.title;
75+ font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
76+ horizontalAlignment: root.headerAlignment;
77+ }
78+Label {
79+ id: subtitleLabel;
80+ objectName: "subtitleLabel";
81+ anchors { left: titleLabel.left;
82+ leftMargin: titleLabel.leftMargin;
83+ right: titleLabel.right;
84+ top: titleLabel.bottom;
85+ topMargin: units.dp(2); }
86+ elide: Text.ElideRight;
87+ fontSize: "small";
88+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
89+ color: "grey";
90+ visible: titleLabel.visible && titleLabel.text;
91+ text: cardData && cardData["subtitle"] || "";
92+ font.weight: Font.Light;
93+ horizontalAlignment: root.headerAlignment;
94+ }
95+implicitHeight: subtitleLabel.y + subtitleLabel.height + units.gu(1);
96+}
tests/plugins/Dash/cardcreator/3.tstnew file+3
@@ -0,0 +1,3 @@
1+template: {"card-layout":"vertical","card-size":"small","category-layout":"grid","collapsed-rows":2}
2+components: {"art":{"aspect-ratio":0.75,"field":"art","fill-mode":"crop"},"subtitle":{"field":"price"},"title":{"field":"title"}}
3+result: 3.res
tests/plugins/Dash/cardcreator/4.resnew file+96
@@ -0,0 +1,96 @@
1+AbstractButton {
2+ id: root;
3+ property var template;
4+ property var components;
5+ property var cardData;
6+ property var artShapeBorderSource: undefined;
7+ property real fontScale: 1.0;
8+ property int headerAlignment: Text.AlignLeft;
9+ property int fixedHeaderHeight: -1;
10+ property size fixedArtShapeSize: Qt.size(-1, -1);
11+ readonly property string title: cardData && cardData["title"] || "";
12+ property bool asynchronous: true;
13+ property bool showHeader: true;
14+ implicitWidth: childrenRect.width;
15+readonly property size artShapeSize: Qt.size(-1, -1);
16+readonly property int headerHeight: row.height + row.margins * 2;
17+Row {
18+ id: row;
19+ objectName: "outerRow";
20+ property real margins: units.gu(1);
21+ spacing: margins;
22+ anchors { top: parent.top;
23+ topMargin: units.gu(1);
24+ left: parent.left;
25+}
26+ anchors.right: parent.right;
27+ anchors.margins: margins;
28+data: [ Loader {
29+ id: mascotShapeLoader;
30+ objectName: "mascotShapeLoader";
31+ asynchronous: root.asynchronous;
32+ active: mascotImage.status === Image.Ready;
33+ visible: showHeader && active && status == Loader.Ready;
34+ width: units.gu(6);
35+ height: units.gu(5.625);
36+ sourceComponent: UbuntuShape { image: mascotImage }
37+ anchors { verticalCenter: parent.verticalCenter; }
38+ }
39+
40+,
41+Image {
42+ id: mascotImage;
43+ objectName: "mascotImage";
44+ anchors { verticalCenter: parent.verticalCenter; }
45+ readonly property int maxSize: Math.max(width, height) * 4;
46+ source: cardData && cardData["mascot"];
47+ width: units.gu(6);
48+ height: units.gu(5.625);
49+ sourceSize { width: maxSize; height: maxSize }
50+ fillMode: Image.PreserveAspectCrop;
51+ horizontalAlignment: Image.AlignHCenter;
52+ verticalAlignment: Image.AlignVCenter;
53+ visible: false;
54+ }
55+
56+,
57+Column {
58+ anchors.verticalCenter: parent.verticalCenter;
59+ spacing: units.dp(2);
60+ width: parent.width - x;
61+data: [ Label {
62+ id: titleLabel;
63+ objectName: "titleLabel";
64+ anchors { left: parent.left; right: parent.right }
65+ elide: Text.ElideRight;
66+ fontSize: "small";
67+ wrapMode: Text.Wrap;
68+ maximumLineCount: 2;
69+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
70+ color: "grey";
71+ visible: showHeader ;
72+ text: root.title;
73+ font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
74+ horizontalAlignment: root.headerAlignment;
75+ }
76+,
77+Label {
78+ id: subtitleLabel;
79+ objectName: "subtitleLabel";
80+ anchors { left: parent.left; right: parent.right }
81+
82+ elide: Text.ElideRight;
83+ fontSize: "small";
84+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
85+ color: "grey";
86+ visible: titleLabel.visible && titleLabel.text;
87+ text: cardData && cardData["subtitle"] || "";
88+ font.weight: Font.Light;
89+ horizontalAlignment: root.headerAlignment;
90+ }
91+]
92+}
93+]
94+}
95+implicitHeight: row.y + row.height + units.gu(1);
96+}
tests/plugins/Dash/cardcreator/4.tstnew file+3
@@ -0,0 +1,3 @@
1+template: {"card-layout":"horizontal","card-size":"large","category-layout":"grid","collapsed-rows":2}
2+components: {"art":{"aspect-ratio":1,"fill-mode":"crop"},"mascot":{"field":"mascot"},"subtitle":{"field":"domain"},"title":{"field":"title"}}
3+result: 4.res
tests/plugins/Dash/cardcreator/5.resnew file+139
@@ -0,0 +1,139 @@
1+AbstractButton {
2+ id: root;
3+ property var template;
4+ property var components;
5+ property var cardData;
6+ property var artShapeBorderSource: undefined;
7+ property real fontScale: 1.0;
8+ property int headerAlignment: Text.AlignLeft;
9+ property int fixedHeaderHeight: -1;
10+ property size fixedArtShapeSize: Qt.size(-1, -1);
11+ readonly property string title: cardData && cardData["title"] || "";
12+ property bool asynchronous: true;
13+ property bool showHeader: true;
14+ implicitWidth: childrenRect.width;
15+onArtShapeBorderSourceChanged: { if (artShapeBorderSource !== undefined && artShapeLoader.item) artShapeLoader.item.borderSource = artShapeBorderSource; }
16+readonly property size artShapeSize: artShapeLoader.item ? Qt.size(artShapeLoader.item.width, artShapeLoader.item.height) : Qt.size(-1, -1);
17+Item {
18+ id: artShapeHolder;
19+ height: root.fixedArtShapeSize.height != -1 ? root.fixedArtShapeSize.height : artShapeLoader.height;
20+ width: root.fixedArtShapeSize.width != -1 ? root.fixedArtShapeSize.width : artShapeLoader.width;
21+ anchors { horizontalCenter: parent.horizontalCenter; }
22+ Loader {
23+ id: artShapeLoader;
24+ objectName: "artShapeLoader";
25+ active: cardData && cardData["art"] || false;
26+ asynchronous: root.asynchronous;
27+ visible: status == Loader.Ready;
28+ sourceComponent: UbuntuShape {
29+ id: artShape;
30+ objectName: "artShape";
31+ radius: "medium";
32+ readonly property real aspect: components !== undefined ? components["art"]["aspect-ratio"] : 1;
33+ readonly property bool aspectSmallerThanImageAspect: aspect < image.aspect;
34+ Component.onCompleted: { updateWidthHeightBindings(); if (artShapeBorderSource !== undefined) borderSource = artShapeBorderSource; }
35+ onAspectSmallerThanImageAspectChanged: updateWidthHeightBindings();
36+ visible: image.status == Image.Ready;
37+ function updateWidthHeightBindings() {
38+ if (aspectSmallerThanImageAspect) {
39+ width = Qt.binding(function() { return !visible ? 0 : image.width });
40+ height = Qt.binding(function() { return !visible ? 0 : image.fillMode === Image.PreserveAspectCrop ? image.height : width / image.aspect });
41+ } else {
42+ width = Qt.binding(function() { return !visible ? 0 : image.fillMode === Image.PreserveAspectCrop ? image.width : height * image.aspect });
43+ height = Qt.binding(function() { return !visible ? 0 : image.height });
44+ }
45+ }
46+ image: Image {
47+ objectName: "artImage";
48+ source: cardData && cardData["art"] || "";
49+ cache: true;
50+ asynchronous: root.asynchronous;
51+ fillMode: components && components["art"]["fill-mode"] === "fit" ? Image.PreserveAspectFit: Image.PreserveAspectCrop;
52+ readonly property real aspect: implicitWidth / implicitHeight;
53+ width: root.width;
54+ height: width / artShape.aspect;
55+ }
56+ }
57+ }
58+ }
59+Loader {
60+ id: overlayLoader;
61+ anchors {
62+ left: artShapeHolder.left;
63+ right: artShapeHolder.right;
64+ bottom: artShapeHolder.bottom;
65+ }
66+ active: artShapeLoader.active && artShapeLoader.item && artShapeLoader.item.image.status === Image.Ready || false;
67+ asynchronous: root.asynchronous;
68+ visible: showHeader && status == Loader.Ready;
69+ sourceComponent: ShaderEffect {
70+ id: overlay;
71+ height: fixedHeaderHeight != -1 ? fixedHeaderHeight : headerHeight;
72+ opacity: 0.6;
73+ property var source: ShaderEffectSource {
74+ id: shaderSource;
75+ sourceItem: artShapeLoader.item;
76+ onVisibleChanged: if (visible) scheduleUpdate();
77+ live: false;
78+ sourceRect: Qt.rect(0, artShapeLoader.height - overlay.height, artShapeLoader.width, overlay.height);
79+ }
80+ vertexShader: "
81+ uniform highp mat4 qt_Matrix;
82+ attribute highp vec4 qt_Vertex;
83+ attribute highp vec2 qt_MultiTexCoord0;
84+ varying highp vec2 coord;
85+ void main() {
86+ coord = qt_MultiTexCoord0;
87+ gl_Position = qt_Matrix * qt_Vertex;
88+ }";
89+ fragmentShader: "
90+ varying highp vec2 coord;
91+ uniform sampler2D source;
92+ uniform lowp float qt_Opacity;
93+ void main() {
94+ lowp vec4 tex = texture2D(source, coord);
95+ gl_FragColor = vec4(0, 0, 0, tex.a) * qt_Opacity;
96+ }";
97+ }
98+ }
99+readonly property int headerHeight: titleLabel.height + titleLabel.anchors.topMargin * 2 + subtitleLabel.height + subtitleLabel.anchors.topMargin;
100+Label {
101+ id: titleLabel;
102+ objectName: "titleLabel";
103+ anchors { left: parent.left;
104+ leftMargin: units.gu(1);
105+ right: parent.right;
106+ top: overlayLoader.top;
107+ topMargin: units.gu(1);
108+}
109+ elide: Text.ElideRight;
110+ fontSize: "small";
111+ wrapMode: Text.Wrap;
112+ maximumLineCount: 2;
113+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
114+ color: "white";
115+ visible: showHeader && overlayLoader.active;
116+ text: root.title;
117+ font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
118+ horizontalAlignment: root.headerAlignment;
119+ }
120+Label {
121+ id: subtitleLabel;
122+ objectName: "subtitleLabel";
123+ anchors { left: titleLabel.left;
124+ leftMargin: titleLabel.leftMargin;
125+ right: titleLabel.right;
126+ top: titleLabel.bottom;
127+ topMargin: units.dp(2);
128+ }
129+ elide: Text.ElideRight;
130+ fontSize: "small";
131+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
132+ color: "white";
133+ visible: titleLabel.visible && titleLabel.text;
134+ text: cardData && cardData["subtitle"] || "";
135+ font.weight: Font.Light;
136+ horizontalAlignment: root.headerAlignment;
137+ }
138+implicitHeight: subtitleLabel.y + subtitleLabel.height + units.gu(1);
139+}
tests/plugins/Dash/cardcreator/5.tstnew file+3
@@ -0,0 +1,3 @@
1+template: {"card-layout":"vertical","card-size":"medium","category-layout":"carousel","collapsed-rows":2,"overlay":true}
2+components: {"art":{"aspect-ratio":1,"field":"art","fill-mode":"crop"},"subtitle":{"field":"artist"},"title":{"field":"title"}}
3+result: 5.res
tests/plugins/Dash/cardcreatortest.cppnew file+91
@@ -0,0 +1,91 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include <QDir>
18+#include <QQmlEngine>
19+#include <QQuickItem>
20+#include <QQuickView>
21+#include <QtTestGui>
22+
23+class CardCreatorTest : public QObject
24+{
25+ Q_OBJECT
26+
27+private Q_SLOTS:
28+
29+ void initTestCase()
30+ {
31+ }
32+
33+ void init()
34+ {
35+ view = new QQuickView();
36+ view->engine()->addImportPath(BUILT_PLUGINS_DIR);
37+ view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/cardcreatortest.qml"));
38+ view->show();
39+ QTest::qWaitForWindowExposed(view);
40+ }
41+
42+ void cleanup()
43+ {
44+ delete view;
45+ }
46+
47+ void testKnownCases()
48+ {
49+ const QString templateString("template: ");
50+ const QString componentsString("components: ");
51+ const QString resultString("result: ");
52+
53+ const QString testDirPath = DASHVIEWSTEST_FOLDER "/cardcreator/";
54+ QDir d(testDirPath);
55+ const QStringList testFiles = d.entryList(QStringList() << "*.tst");
56+ foreach(const QString &testFileName, testFiles) {
57+ qDebug() << testFileName;
58+ QFile testFile(testDirPath + testFileName);
59+ QVERIFY(testFile.open(QIODevice::ReadOnly));
60+ QTextStream ts(&testFile);
61+ const QStringList lines = ts.readAll().split("\n");
62+
63+ QVERIFY(lines[0].startsWith(templateString));
64+ QVERIFY(lines[1].startsWith(componentsString));
65+ QVERIFY(lines[2].startsWith(resultString));
66+ const QString templateJSON = lines[0].mid(templateString.length());
67+ const QString componentsJSON = lines[1].mid(componentsString.length());
68+ const QString resultFileName = lines[2].mid(resultString.length());
69+
70+ QVariant cardStringResult;
71+ QMetaObject::invokeMethod(view->rootObject(), "cardString", Q_RETURN_ARG(QVariant, cardStringResult), Q_ARG(QVariant, templateJSON), Q_ARG(QVariant, componentsJSON));
72+
73+ QFile testResultFile(testDirPath + resultFileName);
74+ QVERIFY(testResultFile.open(QIODevice::ReadOnly));
75+ QTextStream ts2(&testResultFile);
76+ const QString expectedResult = ts2.readAll();
77+ QCOMPARE(cardStringResult.toString().simplified(), expectedResult.simplified());
78+
79+ QVariant createCardComponentResult;
80+ QMetaObject::invokeMethod(view->rootObject(), "createCardComponent", Q_RETURN_ARG(QVariant, createCardComponentResult), Q_ARG(QVariant, templateJSON), Q_ARG(QVariant, componentsJSON));
81+ QVERIFY(createCardComponentResult.toBool());
82+ }
83+ }
84+
85+private:
86+ QQuickView *view;
87+};
88+
89+QTEST_MAIN(CardCreatorTest)
90+
91+#include "cardcreatortest.moc"
tests/plugins/Dash/cardcreatortest.qmlnew file+29
@@ -0,0 +1,29 @@
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.2
18+import "../../../plugins/Dash/CardCreator.js" as CardCreator
19+
20+Item {
21+ id: root
22+ function cardString(template, components) {
23+ return CardCreator.cardString(JSON.parse(template), JSON.parse(components));
24+ }
25+
26+ function createCardComponent(template, components) {
27+ return CardCreator.createCardComponent(root, JSON.parse(template), JSON.parse(components)) !== null;
28+ }
29+}
tests/plugins/DashViews/horizontaljournaltest.cpp → tests/plugins/Dash/horizontaljournaltest.cpprenamed+6−6
@@ -258,8 +258,8 @@ private Q_SLOTS:
258258
259259 void testDelegateCreationRanges()
260260 {
261− hj->setDelegateCreationBegin(300);
262− hj->setDelegateCreationEnd(view->height());
261+ hj->setDisplayMarginBeginning(-300);
262+ hj->setDisplayMarginEnd(-(hj->height() - view->height()));
263263
264264 QTRY_COMPARE(hj->m_firstVisibleIndex, 6);
265265 QTRY_COMPARE(hj->m_visibleItems.count(), 7);
@@ -274,8 +274,8 @@ private Q_SLOTS:
274274 QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 7], 210.);
275275 QTRY_COMPARE(hj->m_lastInRowIndexPosition[12], 305.);
276276
277− hj->resetDelegateCreationBegin();
278− hj->resetDelegateCreationEnd();
277+ hj->setDisplayMarginBeginning(0);
278+ hj->setDisplayMarginEnd(0);
279279
280280 // This is exactly the same block as the first again
281281 checkInitialPositions();
@@ -469,8 +469,8 @@ private Q_SLOTS:
469469
470470 void testNegativeDelegateCreationRange()
471471 {
472− hj->setDelegateCreationBegin(0);
473− hj->setDelegateCreationEnd(-100);
472+ hj->setDisplayMarginBeginning(0);
473+ hj->setDisplayMarginEnd(-(hj->height() + 100));
474474
475475 QStringList widthList;
476476 widthList << "100" << "50" << "50" << "30";
tests/plugins/DashViews/horizontaljournaltest.qml → tests/plugins/Dash/horizontaljournaltest.qmlrenamed+1−1
@@ -15,7 +15,7 @@
1515 */
1616
1717import QtQuick 2.1
18−import DashViews 0.1
18+import Dash 0.1
1919
2020Item {
2121
tests/plugins/DashViews/horizontaljournaltry.cpp → tests/plugins/Dash/horizontaljournaltry.cpprenamed

The content is the same.

tests/plugins/DashViews/horizontaljournaltry.qml → tests/plugins/Dash/horizontaljournaltry.qmlrenamed+24−3
@@ -15,7 +15,7 @@
1515 */
1616
1717import QtQuick 2.1
18−import DashViews 0.1
18+import Dash 0.1
1919
2020Item {
2121 id: root
@@ -29,14 +29,35 @@ Item {
2929 width: parent.width - controls.width
3030
3131 delegate: HorizontalJournal {
32+ id: hj
3233 model: vjModel
3334 rowHeight: 100
3435 columnSpacing: 10
3536 rowSpacing: 10
3637 width: parent.width
3738 height: implicitHeight > 100 ? implicitHeight : 100
38− delegateCreationBegin: lvwph.contentY
39− delegateCreationEnd: lvwph.contentY + lvwph.height
39+ displayMarginBeginning: {
40+ if (hj.y + hj.height <= 0) {
41+ // Not visible (item at top of the list viewport)
42+ return -hj.height;
43+ } else if (hj.y >= lvwph.height) {
44+ // Not visible (item at bottom of the list viewport)
45+ return 0;
46+ } else {
47+ return -Math.max(-hj.y, 0);
48+ }
49+ }
50+ displayMarginEnd: {
51+ if (hj.y + hj.height <= 0) {
52+ // Not visible (item at top of the list viewport)
53+ return 0;
54+ } else if (hj.y >= lvwph.height) {
55+ // Not visible (item at bottom of the list viewport)
56+ return -hj.height;
57+ } else {
58+ return -Math.max(hj.height - lvwph.height + hj.y, 0)
59+ }
60+ }
4061
4162 delegate: Rectangle {
4263 height: 100
tests/plugins/DashViews/listviewwithpageheadersectionexternalmodeltest.cpp → tests/plugins/Dash/listviewwithpageheadersectionexternalmodeltest.cpprenamed+3−7
@@ -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
@@ -86,10 +82,10 @@ private:
8682 QTRY_COMPARE(lvwph->m_visibleItems[visibleIndex]->y(), pos);
8783 QTRY_COMPARE(lvwph->m_visibleItems[visibleIndex]->height(), height);
8884 QCOMPARE(QQuickItemPrivate::get(lvwph->m_visibleItems[visibleIndex]->m_item)->culled, culled);
89− QCOMPARE(section(lvwph->m_visibleItems[visibleIndex]->m_sectionItem), sectionHeader);
85+ QCOMPARE(section(lvwph->m_visibleItems[visibleIndex]->sectionItem()), sectionHeader);
9086 if (!sectionHeader.isNull()) {
91− QCOMPARE(QQuickItemPrivate::get(lvwph->m_visibleItems[visibleIndex]->m_sectionItem)->culled, sectionHeaderCulled);
92− QCOMPARE(sectionDelegateIndex(lvwph->m_visibleItems[visibleIndex]->m_sectionItem), lvwph->m_firstVisibleIndex + visibleIndex);
87+ QCOMPARE(QQuickItemPrivate::get(lvwph->m_visibleItems[visibleIndex]->sectionItem())->culled, sectionHeaderCulled);
88+ QCOMPARE(sectionDelegateIndex(lvwph->m_visibleItems[visibleIndex]->sectionItem()), lvwph->m_firstVisibleIndex + visibleIndex);
9389 }
9490 }
9591
tests/plugins/DashViews/listviewwithpageheadersectiontest.cpp → tests/plugins/Dash/listviewwithpageheadersectiontest.cpprenamed+11−17
@@ -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
@@ -43,10 +39,11 @@ private:
4339 QTRY_COMPARE(lvwph->m_visibleItems[visibleIndex]->y(), pos);
4440 QTRY_COMPARE(lvwph->m_visibleItems[visibleIndex]->height(), height);
4541 QCOMPARE(QQuickItemPrivate::get(lvwph->m_visibleItems[visibleIndex]->m_item)->culled, culled);
46− QCOMPARE(section(lvwph->m_visibleItems[visibleIndex]->m_sectionItem), sectionHeader);
42+ QCOMPARE(section(lvwph->m_visibleItems[visibleIndex]->sectionItem()), sectionHeader);
43+ QTRY_COMPARE(hasSectionHeaderProperty(lvwph->m_visibleItems[visibleIndex]->m_item), !sectionHeader.isNull());
4744 if (!sectionHeader.isNull()) {
48− QCOMPARE(QQuickItemPrivate::get(lvwph->m_visibleItems[visibleIndex]->m_sectionItem)->culled, sectionHeaderCulled);
49− QCOMPARE(sectionDelegateIndex(lvwph->m_visibleItems[visibleIndex]->m_sectionItem), lvwph->m_firstVisibleIndex + visibleIndex);
45+ QCOMPARE(QQuickItemPrivate::get(lvwph->m_visibleItems[visibleIndex]->sectionItem())->culled, sectionHeaderCulled);
46+ QCOMPARE(sectionDelegateIndex(lvwph->m_visibleItems[visibleIndex]->sectionItem()), lvwph->m_firstVisibleIndex + visibleIndex);
5047 }
5148 }
5249
@@ -113,12 +110,17 @@ private:
113110 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
114111 }
115112
116− QString section(QQuickItem *item)
113+ bool hasSectionHeaderProperty(QQuickItem *item) const
114+ {
115+ return item ? QQmlEngine::contextForObject(item)->parentContext()->contextProperty(QLatin1String("hasSectionHeader")).toBool() : false;
116+ }
117+
118+ QString section(QQuickItem *item) const
117119 {
118120 return item ? QQmlEngine::contextForObject(item)->parentContext()->contextProperty(QLatin1String("section")).toString() : QString();
119121 }
120122
121− int sectionDelegateIndex(QQuickItem *item)
123+ int sectionDelegateIndex(QQuickItem *item) const
122124 {
123125 return item ? QQmlEngine::contextForObject(item)->parentContext()->contextProperty(QLatin1String("delegateIndex")).toInt() : -1;
124126 }
@@ -135,11 +137,7 @@ private Q_SLOTS:
135137 view->engine()->addImportPath(BUILT_PLUGINS_DIR);
136138 view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/listviewwithpageheadertestsection.qml"));
137139 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
141140 model = view->rootObject()->findChild<QQmlListModel*>();
142−#endif
143141 otherDelegate = view->rootObject()->findChild<QQmlComponent*>();
144142 QVERIFY(lvwph);
145143 QVERIFY(model);
@@ -2156,11 +2154,7 @@ private Q_SLOTS:
21562154private:
21572155 QQuickView *view;
21582156 ListViewWithPageHeader *lvwph;
2159−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
2160− QQuickListModel *model;
2161−#else
21622157 QQmlListModel *model;
2163−#endif
21642158 QQmlComponent *otherDelegate;
21652159};
21662160
tests/plugins/DashViews/listviewwithpageheadertest.cpp → tests/plugins/Dash/listviewwithpageheadertest.cpprenamed−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/listviewwithpageheadertest.qml → tests/plugins/Dash/listviewwithpageheadertest.qmlrenamed+1−1
@@ -15,7 +15,7 @@
1515 */
1616
1717import QtQuick 2.0
18−import DashViews 0.1
18+import Dash 0.1
1919
2020Rectangle {
2121 width: 300
tests/plugins/DashViews/listviewwithpageheadertestsection.qml → tests/plugins/Dash/listviewwithpageheadertestsection.qmlrenamed+1−1
@@ -15,7 +15,7 @@
1515 */
1616
1717import QtQuick 2.0
18−import DashViews 0.1
18+import Dash 0.1
1919
2020Rectangle {
2121 width: 300
tests/plugins/DashViews/listviewwithpageheadertestsectionexternalmodel.qml → tests/plugins/Dash/listviewwithpageheadertestsectionexternalmodel.qmlrenamed+1−1
@@ -15,7 +15,7 @@
1515 */
1616
1717import QtQuick 2.0
18−import DashViews 0.1
18+import Dash 0.1
1919
2020Rectangle {
2121 width: 300
tests/plugins/DashViews/organicgridtest.cpp → tests/plugins/Dash/organicgridtest.cpprenamed+7−5
@@ -499,17 +499,14 @@ private Q_SLOTS:
499499 QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
500500 QTRY_COMPARE(grid->m_visibleItems.count(), 198);
501501
502− grid->setDelegateCreationBegin(300);
503− grid->setDelegateCreationEnd(400);
502+ grid->setDisplayMarginBeginning(-300);
503+ grid->setDisplayMarginEnd(-(grid->height() - 400));
504504 checkImplicitHeight(2290);
505505
506506 QTRY_COMPARE(grid->m_firstVisibleIndex, 36);
507507 QTRY_COMPARE(grid->m_visibleItems.count(), 54);
508508 checkImplicitHeight(2290);
509509
510− grid->resetDelegateCreationBegin();
511− grid->resetDelegateCreationEnd();
512−
513510 view->resize(470, 470);
514511
515512 grid->setSmallDelegateSize(QSizeF(90, 90));
@@ -517,6 +514,11 @@ private Q_SLOTS:
517514
518515 model->setCount(21);
519516
517+ QTRY_COMPARE(grid->m_visibleItems.count(), 0);
518+
519+ grid->setDisplayMarginBeginning(0);
520+ grid->setDisplayMarginEnd(0);
521+
520522 // This is exactly the same block as the first again
521523 checkInitialPositions();
522524 }
tests/plugins/DashViews/organicgridtest.qml → tests/plugins/Dash/organicgridtest.qmlrenamed+1−1
@@ -15,7 +15,7 @@
1515 */
1616
1717import QtQuick 2.1
18−import DashViews 0.1
18+import Dash 0.1
1919
2020Item {
2121
tests/plugins/DashViews/organicgridtry.cpp → tests/plugins/Dash/organicgridtry.cpprenamed

The content is the same.

tests/plugins/DashViews/organicgridtry.qml → tests/plugins/Dash/organicgridtry.qmlrenamed+23−3
@@ -15,7 +15,7 @@
1515 */
1616
1717import QtQuick 2.1
18−import DashViews 0.1
18+import Dash 0.1
1919
2020Item {
2121 id: root
@@ -37,8 +37,28 @@ Item {
3737 rowSpacing: 10
3838 width: parent.width
3939 height: implicitHeight > 100 ? implicitHeight : 100
40− delegateCreationBegin: lvwph.contentY
41− delegateCreationEnd: lvwph.contentY + lvwph.height
40+ displayMarginBeginning: {
41+ if (grid.y + grid.height <= 0) {
42+ // Not visible (item at top of the list viewport)
43+ return -grid.height;
44+ } else if (grid.y >= lvwph.height) {
45+ // Not visible (item at bottom of the list viewport)
46+ return 0;
47+ } else {
48+ return -Math.max(-grid.y, 0);
49+ }
50+ }
51+ displayMarginEnd: {
52+ if (grid.y + grid.height <= 0) {
53+ // Not visible (item at top of the list viewport)
54+ return 0;
55+ } else if (grid.y >= lvwph.height) {
56+ // Not visible (item at bottom of the list viewport)
57+ return -grid.height;
58+ } else {
59+ return -Math.max(grid.height - lvwph.height + grid.y, 0)
60+ }
61+ }
4262
4363 delegate: Rectangle {
4464 width: 100
tests/plugins/DashViews/tst_ListViewWithPageHeaderQML.qml → tests/plugins/Dash/tst_ListViewWithPageHeaderQML.qmlrenamed+1−1
@@ -16,7 +16,7 @@
1616
1717import QtQuick 2.0
1818import QtTest 1.0
19−import DashViews 0.1
19+import Dash 0.1
2020
2121Rectangle {
2222 width: 300
tests/plugins/DashViews/verticaljournaltest.cpp → tests/plugins/Dash/verticaljournaltest.cpprenamed+6−6
@@ -263,8 +263,8 @@ private Q_SLOTS:
263263
264264 void testDelegateCreationRanges()
265265 {
266− vj->setDelegateCreationBegin(200);
267− vj->setDelegateCreationEnd(view->height());
266+ vj->setDisplayMarginBeginning(-200);
267+ vj->setDisplayMarginEnd(-(vj->height() - view->height()));
268268
269269 QTRY_COMPARE(vj->m_columnVisibleItems.count(), 3);
270270 QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 4);
@@ -286,8 +286,8 @@ private Q_SLOTS:
286286 verifyItem(vj->m_columnVisibleItems[1][3], 15, 160, 430, false);
287287 QCOMPARE(vj->implicitHeight(), 690. + 4. * 690. / 16.);
288288
289− vj->resetDelegateCreationBegin();
290− vj->resetDelegateCreationEnd();
289+ vj->setDisplayMarginBeginning(0);
290+ vj->setDisplayMarginEnd(0);
291291
292292 // This is exactly the same block as the first again
293293 checkInitialPositions();
@@ -478,8 +478,8 @@ private Q_SLOTS:
478478
479479 void testNegativeDelegateCreationRange()
480480 {
481− vj->setDelegateCreationBegin(0);
482− vj->setDelegateCreationEnd(-100);
481+ vj->setDisplayMarginBeginning(0);
482+ vj->setDisplayMarginEnd(-(vj->height() + 100));
483483
484484 QStringList heightList;
485485 heightList << "100" << "50" << "50" << "30";
tests/plugins/DashViews/verticaljournaltest.qml → tests/plugins/Dash/verticaljournaltest.qmlrenamed+1−1
@@ -15,7 +15,7 @@
1515 */
1616
1717import QtQuick 2.1
18−import DashViews 0.1
18+import Dash 0.1
1919
2020Item {
2121
tests/plugins/DashViews/verticaljournaltry.cpp → tests/plugins/Dash/verticaljournaltry.cpprenamed

The content is the same.

tests/plugins/DashViews/verticaljournaltry.qml → tests/plugins/Dash/verticaljournaltry.qmlrenamed+24−3
@@ -15,7 +15,7 @@
1515 */
1616
1717import QtQuick 2.1
18−import DashViews 0.1
18+import Dash 0.1
1919
2020Item {
2121 id: root
@@ -36,8 +36,29 @@ Item {
3636 rowSpacing: 10
3737 width: parent.width
3838 height: implicitHeight > 100 ? implicitHeight : 100
39− delegateCreationBegin: lvwph.contentY
40− delegateCreationEnd: lvwph.contentY + lvwph.height
39+
40+ displayMarginBeginning: {
41+ if (vj.y + vj.height <= 0) {
42+ // Not visible (item at top of the list viewport)
43+ return -vj.height;
44+ } else if (vj.y >= lvwph.height) {
45+ // Not visible (item at bottom of the list viewport)
46+ return 0;
47+ } else {
48+ return -Math.max(-vj.y, 0);
49+ }
50+ }
51+ displayMarginEnd: {
52+ if (vj.y + vj.height <= 0) {
53+ // Not visible (item at top of the list viewport)
54+ return 0;
55+ } else if (vj.y >= lvwph.height) {
56+ // Not visible (item at bottom of the list viewport)
57+ return -vj.height;
58+ } else {
59+ return -Math.max(vj.height - lvwph.height + vj.y, 0)
60+ }
61+ }
4162
4263 delegate: Rectangle {
4364 width: 100
tests/plugins/Unity/Indicators/rootactionstatetest.cpp+37
@@ -21,6 +21,7 @@
2121
2222#include <unitymenumodel.h>
2323#include <QtTest>
24+#include <gio/gio.h>
2425
2526class RootActionStateTest : public QObject
2627{
@@ -52,6 +53,42 @@ private Q_SLOTS:
5253 QVERIFY(rootState->menu() == NULL);
5354 delete rootState;
5455 }
56+
57+ void testToQVariantIcons()
58+ {
59+ GVariantBuilder builderIcons;
60+ g_variant_builder_init(&builderIcons, G_VARIANT_TYPE("av"));
61+ for (int i = 0; i < 3; i ++) {
62+
63+ GIcon* icon = NULL;
64+ icon = g_icon_new_for_string (QString("testIcon%1").arg(i).toUtf8().constData(), NULL);
65+
66+ g_variant_builder_add(&builderIcons,
67+ "v",
68+ g_icon_serialize (icon));
69+ g_object_unref(icon);
70+ }
71+
72+ GVariantBuilder builderParams;
73+ g_variant_builder_init(&builderParams, G_VARIANT_TYPE_ARRAY);
74+ GVariant* icons = g_variant_builder_end (&builderIcons);
75+ g_variant_ref_sink (icons);
76+ g_variant_builder_add (&builderParams, "{sv}", g_strdup ("icons"), icons, NULL);
77+
78+ GVariant* params = g_variant_builder_end (&builderParams);
79+
80+ RootActionState rootState;
81+ QVariant result = rootState.toQVariant(params);
82+ g_variant_unref(params);
83+
84+ QVariantMap paramResult = result.toMap();
85+ QVERIFY(paramResult.contains("icons"));
86+
87+ QStringList serializedIcons = paramResult["icons"].toStringList();
88+ QVERIFY(serializedIcons[0] == "image://theme/testIcon0");
89+ QVERIFY(serializedIcons[1] == "image://theme/testIcon1");
90+ QVERIFY(serializedIcons[2] == "image://theme/testIcon2");
91+ }
5592};
5693
5794QTEST_GUILESS_MAIN(RootActionStateTest)
tests/plugins/Unity/Launcher/CMakeLists.txt+4−4
@@ -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
@@ -49,7 +49,7 @@ add_executable(launchermodeltestExec
4949 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
5050 ${LAUNCHER_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
5151 )
52−target_link_libraries(launchermodeltestExec ${GSETTINGS_QT_LDFLAGS} )
52+target_link_libraries(launchermodeltestExec ${GSETTINGS_QT_LDFLAGS})
5353qt5_use_modules(launchermodeltestExec Test Core DBus)
5454
5555# copy .desktop files into build directory for shadow builds
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/Unity/Launcher/launchermodeltest.cpp+9
@@ -274,6 +274,15 @@ private Q_SLOTS:
274274 QCOMPARE(launcherModel->rowCount(QModelIndex()), 1);
275275 QCOMPARE(launcherModel->get(0)->appId(), QLatin1String("abs-icon"));
276276 }
277+
278+ void testGetUrlForAppId() {
279+ QCOMPARE(launcherModel->getUrlForAppId(QString()), QString());
280+ QCOMPARE(launcherModel->getUrlForAppId(""), QString());
281+ QCOMPARE(launcherModel->getUrlForAppId("no-name"), QString("application:///no-name.desktop"));
282+ QCOMPARE(launcherModel->getUrlForAppId("com.test.good"), QString("appid://com.test.good/first-listed-app/current-user-version"));
283+ QCOMPARE(launcherModel->getUrlForAppId("com.test.good_application"), QString("appid://com.test.good/application/current-user-version"));
284+ QCOMPARE(launcherModel->getUrlForAppId("com.test.good_application_1.2.3"), QString("appid://com.test.good/application/current-user-version"));
285+ }
277286};
278287
279288QTEST_GUILESS_MAIN(LauncherModelTest)
tests/qmltests/CMakeLists.txt+36−46
@@ -4,6 +4,7 @@ include(QmlTest)
44add_subdirectory(Components)
55
66set(qmltest_DEFAULT_IMPORT_PATHS
7+ ${CMAKE_BINARY_DIR}/plugins
78 ${CMAKE_BINARY_DIR}/tests/utils/modules
89 ${CMAKE_BINARY_DIR}/tests/mocks
910)
@@ -23,63 +24,52 @@ add_qml_test(. Shell IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_
2324add_qml_test(Components Carousel)
2425add_qml_test(Components DraggingArea)
2526add_qml_test(Components EdgeDemoOverlay)
26−add_qml_test(Components FilterGrid IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
27+add_qml_test(Components FilterGrid)
2728add_qml_test(Components LazyImage)
2829add_qml_test(Components Rating)
2930add_qml_test(Components ResponsiveFlowView)
3031add_qml_test(Components ResponsiveGridView)
31−add_qml_test(Components Revealer)
3232add_qml_test(Components SeeMore)
3333add_qml_test(Components Showable)
3434add_qml_test(Components PageHeaderLabel)
35−add_qml_test(Dash Dash IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
36−add_qml_test(Dash DashContent IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
35+add_qml_test(Components ZoomableImage)
36+add_qml_test(Dash Dash)
37+add_qml_test(Dash DashContent)
3738add_qml_test(Dash Card)
3839add_qml_benchmark(Dash CardBenchmark 1000)
39−add_qml_test(Dash CardHeader)
4040add_qml_test(Dash CardTool)
41−add_qml_test(Dash GenericScopeView IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
42−add_qml_test(Dash/Apps RunningApplicationsGrid IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS}
43− ${CMAKE_BINARY_DIR}/tests/mocks
44− ${CMAKE_BINARY_DIR}/plugins)
45−add_qml_test(Dash/Previews Preview IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
46−add_qml_test(Dash/Previews PreviewActions IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
47−add_qml_test(Dash/Previews PreviewAudioPlayback IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
48−add_qml_test(Dash/Previews PreviewHeader IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
49−add_qml_test(Dash/Previews PreviewImageGallery IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
50−add_qml_test(Dash/Previews PreviewProgress IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
51−add_qml_test(Dash/Previews PreviewRatingDisplay IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
52−add_qml_test(Dash/Previews PreviewRatingInput IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
53−add_qml_test(Dash/Previews PreviewTextSummary IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
54−add_qml_test(Dash/Previews PreviewVideoPlayback IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
55−add_qml_test(Dash/Previews PreviewWidgetFactory IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
56−add_qml_test(Dash/Previews PreviewZoomableImage IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
57−add_qml_test(Greeter Lockscreen IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS}
58− PROPERTIES ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
59−add_qml_test(Greeter Tablet IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS}
60− ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
61−add_qml_test(Greeter Phone IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS}
62− ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
63−add_qml_test(Greeter Infographics IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS}
64− ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
65−add_qml_test(Greeter Clock IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS}
66− ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
41+add_qml_test(Dash GenericScopeView)
42+add_qml_test(Dash/Apps RunningApplicationsGrid)
43+add_qml_test(Dash/Previews Preview)
44+add_qml_test(Dash/Previews PreviewActions)
45+add_qml_test(Dash/Previews PreviewAudioPlayback)
46+add_qml_test(Dash/Previews PreviewHeader)
47+add_qml_test(Dash/Previews PreviewImageGallery)
48+add_qml_test(Dash/Previews PreviewProgress)
49+add_qml_test(Dash/Previews PreviewRatingDisplay)
50+add_qml_test(Dash/Previews PreviewRatingInput)
51+add_qml_test(Dash/Previews PreviewTextSummary)
52+add_qml_test(Dash/Previews PreviewVideoPlayback)
53+add_qml_test(Dash/Previews PreviewWidgetFactory)
54+add_qml_test(Dash/Previews PreviewZoomableImage)
55+add_qml_test(Greeter Lockscreen ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
56+add_qml_test(Greeter MultiGreeter ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
57+add_qml_test(Greeter SingleGreeter ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
58+add_qml_test(Greeter Infographics ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
59+add_qml_test(Greeter Clock ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
6760add_qml_test(Hud Hud)
6861add_qml_test(Hud Result)
69−add_qml_test(Launcher Launcher IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
70−add_qml_test(Notifications Notifications IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
71−add_qml_test(Notifications VisualSnapDecisionsQueue IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
62+add_qml_test(Launcher Launcher)
63+add_qml_test(Notifications Notifications)
64+add_qml_test(Notifications VisualSnapDecisionsQueue)
7265add_qml_test(Panel IndicatorRow)
73−add_qml_test(Panel Indicators IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
74−add_qml_test(Panel MenuContent IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
75−add_qml_test(Panel Panel IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
66+add_qml_test(Panel Indicators)
67+add_qml_test(Panel MenuContent)
68+add_qml_test(Panel Panel)
7669add_qml_test(Panel SearchIndicator)
77−add_qml_test(Panel/Indicators DefaultIndicatorWidget IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS}
78− ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
79−add_qml_test(Panel/Indicators DefaultIndicatorPage IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS}
80− ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
81−add_qml_test(Panel/Indicators MenuItemFactory IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
82−add_qml_test(Panel/Indicators MessageMenuItemFactory IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
83−add_qml_test(Stages PhoneStage IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS}
84− ${CMAKE_BINARY_DIR}/tests/mocks
85− ${CMAKE_BINARY_DIR}/plugins)
70+add_qml_test(Panel/Indicators DefaultIndicatorWidget ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
71+add_qml_test(Panel/Indicators DefaultIndicatorPage ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
72+# These MenuItemFactory tests need the test/mocks/ to come before plugins/
73+add_qml_test(Panel/Indicators MenuItemFactory IMPORT_PATHS ${CMAKE_BINARY_DIR}/tests/mocks ${qmltest_DEFAULT_IMPORT_PATHS})
74+add_qml_test(Panel/Indicators MessageMenuItemFactory IMPORT_PATHS ${CMAKE_BINARY_DIR}/tests/mocks ${qmltest_DEFAULT_IMPORT_PATHS})
75+add_qml_test(Stages PhoneStage)
tests/qmltests/Components/RevealingRectangle.qmldeleted−78
@@ -1,78 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import "../../../qml/Components"
20−
21−Item {
22− id: revealingRectangle
23−
24− property int orientation: Qt.Vertical
25− property int direction: Qt.LeftToRight
26− property Revealer revealer: __revealer
27− property Showable showable: __showable
28−
29− Revealer {
30− id: __revealer
31−
32− target: __showable
33− width: target.width
34− height: target.height
35− x: orientation == Qt.Vertical ? 0 : direction == Qt.LeftToRight ? 0 : parent.width - width
36− y: orientation == Qt.Horizontal ? 0 : direction == Qt.LeftToRight ? 0 : parent.height - height
37− handleSize: orientation == Qt.Vertical ? handle.height : handle.width
38− hintDisplacement: handleSize
39− orientation: revealingRectangle.orientation
40− direction: revealingRectangle.direction
41− }
42−
43− Showable {
44− id: __showable
45−
46− width: orientation == Qt.Horizontal ? units.gu(24) : parent.width
47− height: orientation == Qt.Vertical ? units.gu(24) : parent.height
48−
49− shown: false
50− showAnimation: SmoothedAnimation {
51− property: orientation == Qt.Horizontal ? "x" : "y"
52− velocity: __revealer.dragVelocity
53− duration: 200
54− to: __revealer.openedValue
55− }
56− hideAnimation: SmoothedAnimation {
57− property: orientation == Qt.Horizontal ? "x" : "y"
58− velocity: __revealer.dragVelocity
59− duration: 200
60− to: __revealer.closedValue
61− }
62−
63− Rectangle {
64− anchors.fill: parent
65− color: "red"
66− }
67−
68− Rectangle {
69− id: handle
70−
71− x: orientation == Qt.Vertical ? 0 : direction == Qt.LeftToRight ? parent.width - width : 0
72− y: orientation == Qt.Horizontal ? 0 : direction == Qt.LeftToRight ? parent.height - height : 0
73− width: orientation == Qt.Horizontal ? units.gu(2) : parent.width
74− height: orientation == Qt.Vertical ? units.gu(2) : parent.height
75− color: "black"
76− }
77− }
78−}
tests/qmltests/Components/tst_LazyImage.qml+1−1
@@ -113,7 +113,7 @@ Rectangle {
113113 }
114114
115115 UT.UnityTestCase {
116− name: "Stage"
116+ name: "LazyImage"
117117 when: windowShown
118118
119119 function cleanup() {
tests/qmltests/Components/tst_PageHeaderLabel.qml+4−4
@@ -26,7 +26,7 @@ Item {
2626 width: units.gu(110)
2727 height: units.gu(30)
2828
29− Scope {
29+ MockScope {
3030 id: scopeMock
3131 }
3232
@@ -148,17 +148,17 @@ Item {
148148
149149 pageHeader.triggerSearch()
150150
151− scopeMock.searchInProgress = false
151+ scopeMock.setSearchInProgress(false);
152152 compare(searchIndicator.running, false, "Search indicator is running.")
153153 tryCompare(primaryImage, "visible", true)
154154
155− scopeMock.searchInProgress = true
155+ scopeMock.setSearchInProgress(true);
156156 compare(searchIndicator.running, true, "Search indicator isn't running.")
157157 tryCompare(primaryImage, "visible", false)
158158 }
159159
160160 function cleanup() {
161− scopeMock.searchInProgress = false;
161+ scopeMock.setSearchInProgress(false);
162162 pageHeader.resetSearch();
163163 }
164164
tests/qmltests/Components/tst_Revealer.qmldeleted−262
@@ -1,262 +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 Unity.Test 0.1 as UT
20−import ".."
21−
22−/*
23− There's a revealer on each window edge. If you press and hold any edge you
24− should see a black bar appearing from that edge. If you them slide the
25− pointer/finger towards the opposite edge, that black bar should follow
26− the movement up to around the center of the window. Next to the black bar,
27− which represents the "handle" area of the Revealer, You should see a red rectangle,
28− which is the main body of the Showable concrolled by the Revealer (Showable = red
29− + black rects).
30− */
31−Item {
32− width: units.gu(75)
33− height: units.gu(50)
34−
35− RevealingRectangle {
36− id: topRevealingRectangle
37− anchors.fill: parent
38− orientation: Qt.Vertical
39− direction: Qt.LeftToRight
40− }
41−
42− RevealingRectangle {
43− id: bottomRevealingRectangle
44− anchors.fill: parent
45− orientation: Qt.Vertical
46− direction: Qt.RightToLeft
47− }
48−
49− RevealingRectangle {
50− id: leftRevealingRectangle
51− anchors.fill: parent
52− orientation: Qt.Horizontal
53− direction: Qt.LeftToRight
54− }
55−
56− RevealingRectangle {
57− id: rightRevealingRectangle
58− anchors.fill: parent
59− orientation: Qt.Horizontal
60− direction: Qt.RightToLeft
61− }
62−
63− UT.UnityTestCase {
64− name: "Revealer"
65− when: windowShown
66−
67− /*
68− A bit of the showable should be displayed when you press over the
69− handle area of the Revealer.
70−
71− Once released, it should go out of sight again.
72− */
73− function test_showHintOnPress() {
74− var revealer = topRevealingRectangle.revealer
75− var showable = topRevealingRectangle.showable
76−
77− // It starts out of sight
78− compare(showable.y, -showable.height)
79−
80− // (item, x, y, button, modifiers, delay)
81− mousePress(revealer,
82− revealer.width/2,
83− revealer.handleSize/2,
84− Qt.LeftButton, Qt.NoModifier, 0);
85−
86− tryCompare(showable, "y", -showable.height + revealer.handleSize)
87−
88− // (item, x, y, button, modifiers, delay)
89− mouseRelease(revealer,
90− revealer.width/2,
91− revealer.handleSize/2,
92− Qt.LeftButton, Qt.NoModifier, 0);
93−
94− tryCompare(showable, "y", -showable.height)
95− }
96−
97− /*
98− Press over the handle area of the Revealer and drag it to pull
99− its target Showable. Release it half-way and the Showable will
100− continue moving by itself until it's completely shown.
101−
102−
103− Press over the handle area and drag it back to hide the Showable.
104− Release it half-way and it will continue moving by itself until it's
105− completely hidden again.
106− */
107− function test_dragToRevealAndDragBackToHide_top() {
108− var revealer = topRevealingRectangle.revealer
109− var showable = topRevealingRectangle.showable
110− revealer.__dateTime = fakeDateTime
111−
112− // It starts out of sight
113− compare(showable.y, -showable.height)
114−
115− mouseFlick(revealer,
116− revealer.width/2, // from_x
117− revealer.handleSize/2, // from_y
118− revealer.width/2, // to_x
119− showable.height/2); // to_y
120−
121− // Should eventually get fully extended
122− tryCompare(showable, "y", 0)
123−
124− // Now drag it back to get it hidden
125−
126− mouseFlick(revealer,
127− revealer.width/2,
128− showable.height - (revealer.handleSize/2),
129− revealer.width/2,
130− showable.height/2)
131−
132− // Should eventually be completely out of sight
133− tryCompare(showable, "y", -showable.height)
134− }
135−
136− function test_dragToRevealAndDragBackToHide_bottom() {
137− var revealer = bottomRevealingRectangle.revealer
138− var showable = bottomRevealingRectangle.showable
139− var revRect = bottomRevealingRectangle
140− revealer.__dateTime = fakeDateTime
141−
142− // It starts out of sight
143− compare(showable.y, revRect.height)
144−
145− mouseFlick(revealer,
146− revealer.width/2, // from_x
147− revealer.height - revealer.handleSize/2, // from_y
148− revealer.width/2, // to_x
149− revealer.height - showable.height/2); // to_y
150−
151− // Should eventually get fully extended
152− tryCompare(showable, "y", revRect.height - showable.height)
153−
154− // Now drag it back to get it hidden
155−
156− mouseFlick(revealer,
157− revealer.width/2,
158− revealer.handleSize/2,
159− revealer.width/2,
160− revealer.height - showable.height/2)
161−
162− // Should eventually be completely out of sight
163− tryCompare(showable, "y", revRect.height)
164− }
165−
166− function test_dragToRevealAndDragBackToHide_left() {
167− var revealer = leftRevealingRectangle.revealer
168− var showable = leftRevealingRectangle.showable
169− revealer.__dateTime = fakeDateTime
170−
171− // It starts out of sight
172− compare(showable.x, -showable.width)
173−
174− mouseFlick(revealer,
175− revealer.handleSize/2, // from_x
176− revealer.height/2, // from_y
177− showable.width/2, // to_x
178− revealer.height/2) // to_y
179−
180− // Should eventually get fully extended
181− tryCompare(showable, "x", 0)
182−
183− // Now drag it back to get it hidden
184−
185− mouseFlick(revealer,
186− showable.width - (revealer.handleSize/2),
187− revealer.height/2,
188− showable.width/2,
189− revealer.height/2)
190−
191− // Should eventually be completely out of sight
192− tryCompare(showable, "x", -showable.width)
193− }
194−
195− function test_dragToRevealAndDragBackToHide_right() {
196− var revealer = rightRevealingRectangle.revealer
197− var showable = rightRevealingRectangle.showable
198− var revRect = rightRevealingRectangle
199− revealer.__dateTime = fakeDateTime
200−
201− // It starts out of sight
202− compare(showable.x, revRect.width)
203−
204− mouseFlick(revealer,
205− revealer.width - revealer.handleSize/2, // from_x
206− revealer.height/2, // from_y
207− revealer.width - showable.width/2, // to_x
208− revealer.height/2) // to_y
209−
210− // Should eventually get fully extended
211− tryCompare(showable, "x", revRect.width - showable.width)
212−
213− // Now drag it back to get it hidden
214−
215− mouseFlick(revealer,
216− revealer.handleSize/2,
217− revealer.height/2,
218− revealer.width - showable.width/2,
219− revealer.height/2)
220−
221− // Should eventually be completely out of sight
222− tryCompare(showable, "x", revRect.width)
223− }
224−
225− /*
226− Start dragging down (pulling the showable into view) and then,
227− midway, drag a bit upwards and release it.
228− The showable should keep moving away, ending up hidden again.
229− */
230− function test_dragForthAndBackReturnsOriginalState() {
231− var revealer = topRevealingRectangle.revealer
232− var showable = topRevealingRectangle.showable
233− revealer.__dateTime = fakeDateTime
234−
235− // It starts out of sight
236− compare(showable.y, -showable.height)
237−
238− mouseFlick(revealer,
239− revealer.width/2, // from_x
240− revealer.handleSize/2, // from_y
241− revealer.width/2, // to_x
242− showable.height/2, // to_y
243− true /* do press */, false /* don't release */);
244−
245− // Should be about half-extended
246− verify(showable.y > -showable.height*3/4)
247− verify(showable.y < -showable.height*1/4)
248−
249−
250− // Now drag it back a bit
251− mouseFlick(revealer,
252− revealer.width/2, // from_x
253− showable.height/2, // from_y
254− revealer.width/2, // to_x
255− showable.height/4, // to_y
256− false /* don't press */, true /* do release */);
257−
258− // Should eventually be completely out of sight again
259− tryCompare(showable, "y", -showable.height)
260− }
261− }
262−}
tests/qmltests/Components/tst_ZoomableImage.qmlnew file+194
@@ -0,0 +1,194 @@
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+ var oldScale = image.scale;
102+ // Test Zoom-in Zoom-out twice.
103+ for (var c=0; c<2; c++) {
104+ // zoom in
105+ for (var i=0; i<10; i++) {
106+ mouseWheel(zoomableImage, zoomableImage.width / 2, zoomableImage.height / 2, 0, 10);
107+ tryCompare(image, "scale", oldScale + (i + 1) * 0.1);
108+ compare(flickable.contentWidth, Math.max(lazyImage.width * image.scale, flickable.width));
109+ compare(flickable.contentHeight, Math.max(lazyImage.height * image.scale, flickable.height));
110+ }
111+
112+ // zoom out
113+ for (var i=0; i<10; i++) {
114+ mouseWheel(zoomableImage, zoomableImage.width / 2, zoomableImage.height / 2, 0, -10);
115+ tryCompare(image, "scale", oldScale + 1.0 - (i + 1) * 0.1);
116+ compare(flickable.contentWidth, Math.max(lazyImage.width * image.scale, flickable.width));
117+ compare(flickable.contentHeight, Math.max(lazyImage.height * image.scale, flickable.height));
118+ }
119+ }
120+ }
121+
122+ function test_pinch_data() {
123+ return [ { source:widgetData2["source"],
124+ zoomable:false,
125+ answer1: true,
126+ answer2: false,
127+ answer3: true },
128+ { source:widgetData2["source"],
129+ zoomable:true,
130+ answer1: false,
131+ answer2: true,
132+ answer3: false }
133+ ]
134+ }
135+
136+ function test_pinch(data) {
137+ var image = findChild(zoomableImage, "image");
138+ var lazyImage = findChild(zoomableImage, "lazyImage");
139+ var flickable = findChild(zoomableImage, "flickable");
140+
141+ signalSpy.signalName = "onScaleChanged";
142+ signalSpy.target = image;
143+ signalSpy.clear();
144+
145+ zoomableImage.source = data.source;
146+ zoomableImage.zoomable = data.zoomable;
147+ waitForRendering(zoomableImage);
148+
149+ tryCompare(zoomableImage, "imageState", "ready");
150+ tryCompareFunction(function() { return get_filename(lazyImage.source.toString()) === get_filename(data.source); }, true);
151+ waitForRendering(image);
152+
153+ var x1Start = zoomableImage.width * 2 / 6;
154+ var y1Start = zoomableImage.height * 2 / 6;
155+ var x1End = zoomableImage.width * 1 / 6;
156+ var y1End = zoomableImage.height * 1 / 6;
157+ var x2Start = zoomableImage.width * 4 / 6;
158+ var y2Start = zoomableImage.height * 4 / 6;
159+ var x2End = zoomableImage.width * 5 / 6;
160+ var y2End = zoomableImage.height * 5 / 6;
161+
162+ var oldScale = image.scale;
163+ var newScale = -1;
164+ // move mouse to center
165+ mouseMove(zoomableImage, zoomableImage.width / 2, zoomableImage.height / 2);
166+
167+ // Test Zoom-in Zoom-out twice.
168+ for (var c=0; c<2; c++) {
169+ wait(3000); // have to delay between two consequent pinch event.
170+ // pinch zoom-in
171+ touchPinch(zoomableImage, x1Start, y1Start, x1End, y1End, x2Start, y2Start, x2End, y2End);
172+ waitForRendering(image);
173+
174+ if (newScale == -1) {
175+ newScale = image.scale;
176+ }
177+ tryCompare(image, "scale", newScale);
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(image.scale, newScale, "scale factor error");
182+ compare(flickable.contentWidth, Math.max(lazyImage.width * image.scale, flickable.width));
183+ compare(flickable.contentHeight, Math.max(lazyImage.height * image.scale, flickable.height));
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", oldScale);
189+ compare(flickable.contentWidth, Math.max(lazyImage.width * image.scale, flickable.width));
190+ compare(flickable.contentHeight, Math.max(lazyImage.height * image.scale, flickable.height));
191+ }
192+ }
193+ }
194+}
tests/qmltests/Dash/Previews/tst_Preview.qml+1−1
@@ -23,7 +23,7 @@ import Unity 0.2 as Unity
2323Rectangle {
2424 id: root
2525 width: units.gu(60)
26− height: units.gu(80)
26+ height: units.gu(60)
2727 color: Theme.palette.selected.background
2828
2929 Item {
tests/qmltests/Dash/Previews/tst_PreviewHeader.qml+71−4
@@ -24,6 +24,12 @@ Rectangle {
2424 width: units.gu(60)
2525 height: units.gu(80)
2626
27+ property var origHeaderjson: {
28+ "title": "THE TITLE",
29+ "subtitle": "Something catchy",
30+ "mascot": "../graphics/play_button.png"
31+ }
32+
2733 property var headerjson: {
2834 "title": "THE TITLE",
2935 "subtitle": "Something catchy",
@@ -43,14 +49,75 @@ Rectangle {
4349 }
4450
4551 UT.UnityTestCase {
52+ id: testCase
4653 name: "PreviewHeaderTest"
4754 when: windowShown
4855
56+ property Item mascotShapeLoader: findChild(previewHeader, "mascotShapeLoader")
57+ property Item outerRow: findChild(previewHeader, "outerRow")
58+ property Item column: findChild(previewHeader, "column")
59+
60+ function initTestCase() {
61+ verify(typeof testCase.mascotShapeLoader === "object", "Couldn't find mascot loader object.");
62+ verify(typeof testCase.outerRow === "object", "Couldn't find outerRow object.");
63+ verify(typeof testCase.column === "object", "Couldn't find column object.");
64+
65+ headerjson.mascot = "";
66+ headerjson.title = "";
67+ headerjson.subtitle = "";
68+ previewHeader.widgetData = headerjson;
69+ }
70+
71+ function test_mascot_data() {
72+ return [
73+ { tag: "Empty", source: "", loaderVisible: false, visible: false },
74+ { tag: "Invalid", source: "bad_path", loaderVisible: true, visible: false },
75+ { tag: "Valid", source: "../graphics/play_button.png", loaderVisible: true, visible: true },
76+ ]
77+ }
78+
79+ function test_mascot(data) {
80+ headerjson.mascot = data.source;
81+ previewHeader.widgetData = headerjson;
82+
83+ tryCompare(testCase.mascotShapeLoader, "visible", data.loaderVisible);
84+ if (data.loaderVisible) {
85+ tryCompareFunction(function() { return findChild(previewHeader, "mascotShape") != null }, true);
86+ var mascot = findChild(previewHeader, "mascotShape")
87+ tryCompare(mascot, "visible", data.visible);
88+ }
89+ }
90+
91+ function test_dimensions_data() {
92+ return [
93+ { tag: "Column width with mascot", object: column, width: previewHeader.width - mascotShapeLoader.width - outerRow.margins * 3, mascot: "artwork/avatar.png" },
94+ { tag: "Header height", object: previewHeader, height: function() { return outerRow.height + outerRow.margins * 2 } },
95+ ]
96+ }
97+
98+ function test_dimensions(data) {
99+ if (data.hasOwnProperty("mascot")) {
100+ headerjson.mascot = data.mascot;
101+ }
102+ previewHeader.widgetData = headerjson;
103+
104+ if (data.hasOwnProperty("width")) {
105+ tryCompare(data.object, "width", data.width);
106+ }
107+
108+ if (data.hasOwnProperty("height")) {
109+ tryCompareFunction(function() { return data.object.height === data.height() }, true);
110+ }
111+ }
112+
49113 function test_json() {
50− var cardHeader = findChild(previewHeader, "cardHeader");
51− compare(cardHeader.title, "THE TITLE");
52− compare(cardHeader.subtitle, "Something catchy");
53− compare(cardHeader.mascot.toString().slice(-24), "graphics/play_button.png");
114+ headerjson = origHeaderjson;
115+ previewHeader.widgetData = headerjson;
116+
117+ var innerPreviewHeader = findChild(previewHeader, "innerPreviewHeader");
118+ compare(innerPreviewHeader.title, "THE TITLE");
119+ compare(innerPreviewHeader.subtitle, "Something catchy");
120+ compare(innerPreviewHeader.mascot.toString().slice(-24), "graphics/play_button.png");
54121 }
55122 }
56123}
tests/qmltests/Dash/Previews/tst_PreviewTextSummary.qml+5−5
@@ -42,7 +42,7 @@ Rectangle {
4242
4343 PreviewTextSummary {
4444 id: previewTextSummary
45− anchors.fill: parent
45+ anchors { left: parent.left; right: parent.right }
4646 widgetData: widgetDataComplete
4747 }
4848
@@ -51,6 +51,7 @@ Rectangle {
5151 when: windowShown
5252
5353 property var textLabel: findChild(previewTextSummary, "textLabel")
54+ property var titleLabel: findChild(previewTextSummary, "titleLabel")
5455
5556 function init() {
5657 verify(typeof textLabel === "object", "TextLabel object could not be found.")
@@ -61,16 +62,14 @@ Rectangle {
6162 }
6263
6364 function test_optional_title() {
64− var titleLabel = findChild(previewTextSummary, "titleLabel")
65−
6665 // verify titleLabel is visible and textLabel is anchored below it
6766 compare(titleLabel.visible, true)
68− compare(textLabel.y, titleLabel.height)
67+ tryCompare(textLabel, "y", titleLabel.height)
6968
7069 // verify titleLabel disappears and textLabel moves up
7170 previewTextSummary.widgetData = widgetDataNoTitle
7271 compare(titleLabel.visible, false)
73− compare(textLabel.y, 0)
72+ tryCompare(textLabel, "y", 0)
7473 }
7574
7675 function test_see_more() {
@@ -96,6 +95,7 @@ Rectangle {
9695 verify(textLabel.lineCount <= textLabel.maximumCollapsedLineCount)
9796 compare(seeMore.visible, false)
9897 tryCompare(textLabel, "height", textLabel.contentHeight)
98+ tryCompare(previewTextSummary, "height", titleLabel.height + textLabel.height)
9999 }
100100 }
101101}
tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml+11−6
@@ -26,17 +26,18 @@ Rectangle {
2626 color: "lightgrey"
2727
2828 property var widgetData0: {
29− "source": ""
29+ "source": Qt.resolvedUrl("../artwork/checkers.png"),
30+ "zoomable": false
3031 }
3132
3233 property var widgetData1: {
33− "source": Qt.resolvedUrl("../artwork/checkers.png"),
34− "zoomable": false
34+ "source": ""
3535 }
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,14 @@ Rectangle {
4748 var image = findChild(zoomableImage, "image");
4849
4950 zoomableImage.widgetData = widgetData0;
50− tryCompare(image, "state", "default");
51+ waitForRendering(zoomableImage);
52+ waitForRendering(image);
53+ tryCompare(image, "imageState", "ready");
5154
5255 zoomableImage.widgetData = widgetData1;
53− tryCompare(image, "state", "ready");
56+ waitForRendering(zoomableImage);
57+ waitForRendering(image);
58+ tryCompare(image, "imageState", "default");
5459 }
5560 }
5661}
tests/qmltests/Dash/tst_Card.qml+78−92
@@ -29,8 +29,8 @@ Rectangle {
2929
3030 property string cardData: '
3131 {
32− "art": "../../tests/qmltests/Dash/artwork/music-player-design.png",
33− "mascot": "../../tests/qmltests/Dash/artwork/avatar.png",
32+ "art": "../../../tests/qmltests/Dash/artwork/music-player-design.png",
33+ "mascot": "../../../tests/qmltests/Dash/artwork/avatar.png",
3434 "title": "foo",
3535 "subtitle": "bar",
3636 "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."
@@ -98,21 +98,26 @@ Rectangle {
9898
9999 CardTool {
100100 id: cardTool
101− template: card.template
102− components: card.components
101+ template: Helpers.update(JSON.parse(Helpers.defaultLayout), Helpers.tryParse(layoutArea.text, layoutError))['template'];
102+ components: Helpers.update(JSON.parse(Helpers.defaultLayout), Helpers.tryParse(layoutArea.text, layoutError))['components'];
103103 viewWidth: units.gu(48)
104104 }
105105
106− Card {
107− id: card
108− anchors { top: parent.top; left: parent.left; margins: units.gu(1) }
106+ readonly property var card: loader.item
109107
110− width: cardTool.cardWidth || implicitWidth
111− height: cardTool.cardHeight || implicitHeight
108+ Loader {
109+ id: loader
110+ anchors { top: parent.top; left: parent.left; margins: units.gu(1) }
112111
113− template: Helpers.update(JSON.parse(Helpers.defaultLayout), Helpers.tryParse(layoutArea.text, layoutError))['template'];
114− components: Helpers.update(JSON.parse(Helpers.defaultLayout), Helpers.tryParse(layoutArea.text, layoutError))['components'];
115− cardData: Helpers.mapData(dataArea.text, components, dataError)
112+ sourceComponent: cardTool.cardComponent
113+ onLoaded: {
114+ item.template = Qt.binding(function() { return cardTool.template; });
115+ item.components = Qt.binding(function() { return cardTool.components; });
116+ item.cardData = Qt.binding(function() { return Helpers.mapData(dataArea.text, cardTool.components, dataError); });
117+ item.width = Qt.binding(function() { return cardTool.cardWidth || item.implicitWidth; });
118+ item.height = Qt.binding(function() { return cardTool.cardHeight || item.implicitHeight; });
119+ item.fixedHeaderHeight = Qt.binding(function() { return cardTool.headerHeight; });
120+ }
116121 }
117122
118123 Rectangle {
@@ -181,60 +186,45 @@ Rectangle {
181186
182187 when: windowShown
183188
184− property Item header: findChild(card, "cardHeader")
185− property Item headerLoader: findChild(card, "cardHeaderLoader")
186− property Item title: findChild(header, "titleLabel")
187− property Item art: findChild(card, "artShape")
189+ property Item title: findChild(card, "titleLabel")
190+ property Item subtitle: findChild(card, "subtitleLabel")
191+ property var headerRow: findChild(card, "outerRow")
192+ property var art: findChild(card, "artShape")
188193 property Item artImage: findChild(card, "artImage")
189194 property Item summary: findChild(card, "summaryLabel")
190195 property Item background: findChild(card, "background")
191196 property Item backgroundLoader: findChild(card, "backgroundLoader")
192197 property Item backgroundImage: findChild(card, "backgroundImage")
193−
194− function initTestCase() {
195− verify(typeof testCase.header === "object", "Couldn't find header object.");
196− verify(typeof testCase.art === "object", "Couldn't find art object.");
197− verify(typeof testCase.artImage === "object", "Couldn't find artImage object.");
198− verify(typeof testCase.summary === "object", "Couldn't find summary object.");
199− verify(typeof testCase.artImage === "object", "Couldn't find background object.");
200− verify(typeof testCase.summary === "object", "Couldn't find backgroundImage object.");
201− }
198+ property Item mascotImage: findChild(card, "mascotImage");
202199
203200 function cleanup() {
204201 selector.selectedIndex = -1;
205202 }
206203
207−
208− function test_header_binding_data() {
209− return [
210− { tag: "Mascot", property: "mascot", value: Qt.resolvedUrl("artwork/avatar.png"), index: 0 },
211− { tag: "Title", property: "title", value: "foo", index: 0 },
212− { tag: "Subtitle", property: "subtitle", value: "bar", index: 0 },
213− ];
214− }
215−
216− function test_header_binding(data) {
217− selector.selectedIndex = data.index;
218− tryCompare(testCase.header, data.property, data.value);
219− }
220−
221204 function test_card_binding_data() {
222205 return [
223− { tag: "Art", object: artImage, property: "source", value: Qt.resolvedUrl("artwork/music-player-design.png"), index: 0 },
224− { tag: "Summary", object: summary, property: "text", field: "summary", index: 0 },
225− { tag: "Fit", object: art, fill: Image.PreserveAspectFit, index: 4 },
206+ { tag: "Art", object: "artImage", property: "source", value: Qt.resolvedUrl("artwork/music-player-design.png"), index: 0 },
207+ { tag: "Summary", object: "summary", property: "text", field: "summary", index: 0 },
208+ { tag: "Fit", object: "art", fill: Image.PreserveAspectFit, index: 4 },
209+ { tag: "Mascot", object: "mascotImage", property: "source", value: Qt.resolvedUrl("artwork/avatar.png"), index: 0 },
210+ { tag: "Title", object: "title", property: "text", value: "foo", index: 0 },
211+ { tag: "Subtitle", object: "subtitle", property: "text", value: "bar", index: 0 },
226212 ];
227213 }
228214
229215 function test_card_binding(data) {
230216 selector.selectedIndex = data.index;
217+ waitForRendering(card);
218+
219+ tryCompareFunction(function() { return testCase[data.object] !== null }, true);
220+ var object = testCase[data.object];
231221
232222 if (data.hasOwnProperty('value')) {
233− tryCompare(data.object, data.property, data.value);
223+ tryCompare(object, data.property, data.value);
234224 }
235225
236226 if (data.hasOwnProperty('field')) {
237− tryCompare(data.object, data.property, card.cardData[data.field]);
227+ tryCompare(object, data.property, card.cardData[data.field]);
238228 }
239229 }
240230
@@ -243,31 +233,21 @@ Rectangle {
243233 { tag: "Medium", width: units.gu(18.5), index: 0 },
244234 { tag: "Small", width: units.gu(12), index: 1 },
245235 { tag: "Large", width: units.gu(38), index: 2 },
246− { tag: "Wide", width: units.gu(18.5), aspect: 0.5, index: 0 },
236+ { tag: "Wide", width: units.gu(18.5), index: 0 },
247237 { tag: "Horizontal", width: units.gu(38), index: 5 },
248238 // Make sure card ends with header when there's no summary
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 },
239+ { tag: "NoSummary", height: function() { var cardToolRow = findChild(cardTool, "outerRow");
240+ return cardToolRow.y + cardToolRow.height + units.gu(1) }, index: 6 },
241+ { tag: "HorizontalNoSummary", height: function() { return headerRow.height + units.gu(2) }, card_layout: "horizontal", index: 6 },
251242 ]
252243 }
253244
254245 function test_card_size(data) {
255− waitForRendering(card);
256246 selector.selectedIndex = data.index;
257247
258− if (data.hasOwnProperty("size")) {
259− card.template['card-size'] = data.size;
260− card.templateChanged();
261− }
262−
263248 if (data.hasOwnProperty("card_layout")) {
264− card.template['card-layout'] = data.card_layout;
265− card.templateChanged();
266− }
267−
268− if (data.hasOwnProperty("aspect")) {
269− card.components['art']['aspect-ratio'] = data.aspect;
270− card.componentsChanged();
249+ cardTool.template['card-layout'] = data.card_layout;
250+ cardTool.templateChanged();
271251 }
272252
273253 if (data.hasOwnProperty("width")) {
@@ -288,25 +268,26 @@ Rectangle {
288268 { tag: "Large", width: units.gu(38), index: 2 },
289269 { tag: "Wide", height: units.gu(19), size: "large", index: 3 },
290270 { tag: "Fit", height: units.gu(38), size: "large", width: units.gu(19), index: 4 },
291− { tag: "VerticalWidth", width: function() { return header.width }, index: 0 },
292− { tag: "HorizontalHeight", height: function() { return header.height }, index: 5 },
293− { tag: "HorizontalWidth", width: function() { return headerLoader.x }, index: 5 },
271+ { tag: "VerticalWidth", width: function() { return headerRow.width + units.gu(1) * 2 }, index: 0 },
272+ { tag: "HorizontalHeight", height: function() { return headerRow.height + units.gu(1) * 2 }, index: 5 },
273+ { tag: "HorizontalWidth", width: function() { return headerRow.x - units.gu(1) }, index: 5 },
294274 ]
295275 }
296276
297277 function test_art_size(data) {
298278 selector.selectedIndex = data.index;
299−
300279 if (data.hasOwnProperty("size")) {
301− card.template['card-size'] = data.size;
302− card.templateChanged();
280+ cardTool.template['card-size'] = data.size;
281+ cardTool.templateChanged();
303282 }
304283
305284 if (data.hasOwnProperty("aspect")) {
306− card.components['art']['aspect-ratio'] = data.aspect;
307− card.componentsChanged();
285+ cardTool.components['art']['aspect-ratio'] = data.aspect;
286+ cardTool.componentsChanged();
308287 }
309288
289+ waitForRendering(card);
290+
310291 if (data.hasOwnProperty("width")) {
311292 if (typeof data.width === "function") {
312293 tryCompareFunction(function() { return art.width === data.width() }, true);
@@ -326,38 +307,40 @@ Rectangle {
326307
327308 function test_art_layout_data() {
328309 return [
329− { tag: "Vertical", left: function() { return 0 }, index: 0},
330− { tag: "Horizontal", left: function() { return art.width }, index: 5 },
310+ { tag: "Vertical", left: function() { return units.gu(1); }, index: 0},
311+ { tag: "Horizontal", left: function() { return art.width + units.gu(1); }, index: 5 },
331312 ];
332313 }
333314
334315 function test_art_layout(data) {
335316 selector.selectedIndex = data.index;
317+ waitForRendering(card);
336318
337− tryCompare(testCase.headerLoader, "x", data.left());
319+ tryCompare(headerRow, "x", data.left());
338320 }
339321
340322 function test_header_layout_data() {
341323 return [
342− { tag: "Vertical", top: function() { return art.y + art.height },
343− left: function() { return art.x }, index: 0 },
344− { tag: "Horizontal", top: function() { return art.y },
345− left: function() { return art.x + art.width }, index: 5 },
346− { tag: "Overlay", top: function() { return art.y + art.height - header.height },
347− left: function() { return art.x }, index: 9 },
324+ { tag: "Vertical", top: function() { return art.y + art.height + units.gu(1) },
325+ left: function() { return art.x + units.gu(1) }, index: 0 },
326+ { tag: "Horizontal", top: function() { return art.y + units.gu(1) },
327+ left: function() { return art.x + art.width + units.gu(1) }, index: 5 },
328+ { tag: "Overlay", top: function() { return art.y + art.height - headerRow.height - units.gu(1) },
329+ left: function() { return art.x + units.gu(1) }, index: 9 },
348330 ]
349331 }
350332
351333 function test_header_layout(data) {
352334 selector.selectedIndex = data.index;
335+ waitForRendering(card);
353336
354− tryCompareFunction(function() { return testCase.headerLoader.y === data.top() }, true);
355− tryCompareFunction(function() { return testCase.headerLoader.x === data.left() }, true);
337+ tryCompareFunction(function() { return testCase.headerRow.y === data.top() }, true);
338+ tryCompareFunction(function() { return testCase.headerRow.x === data.left() }, true);
356339 }
357340
358341 function test_summary_layout_data() {
359342 return [
360− { tag: "With header", top: function() { return headerLoader.y + headerLoader.height }, index: 0 },
343+ { tag: "With header", top: function() { return headerRow.y + headerRow.height + units.gu(1); }, index: 0 },
361344 { tag: "Without header", top: function() { return art.y + art.height }, index: 7 },
362345 ]
363346 }
@@ -365,16 +348,16 @@ Rectangle {
365348 function test_summary_layout(data) {
366349 selector.selectedIndex = data.index;
367350
351+ waitForRendering(card);
352+
368353 tryCompareFunction(function() { return testCase.summary.y === data.top() }, true);
369354 }
370355
371356 function test_art_visibility() {
372357 selector.selectedIndex = 8;
373358
374− tryCompare(testCase.artImage, "source", "");
375− compare(testCase.art.visible, false);
376− compare(testCase.art.height, 0);
377− compare(testCase.art.width, 0);
359+ compare(testCase.artImage, null);
360+ compare(testCase.art, null);
378361 }
379362
380363 function test_background_data() {
@@ -402,7 +385,11 @@ Rectangle {
402385
403386 waitForRendering(card);
404387
405− tryCompare(backgroundLoader, "active", data.visible);
388+ if (data.visible) {
389+ tryCompare(backgroundLoader, "active", true);
390+ } else {
391+ compare(backgroundLoader, null);
392+ }
406393
407394 if (data.hasOwnProperty("color")) {
408395 tryCompare(background, "color", data.color);
@@ -449,13 +436,15 @@ Rectangle {
449436
450437 function test_fontColor(data) {
451438 selector.selectedIndex = 10;
439+ waitForRendering(card);
452440
453441 background.color = data.tag;
454442
455443 var fontColor = data.dark ? "grey" : "white";
456444
457445 tryCompareFunction(function() { return Qt.colorEqual(summary.color, fontColor); }, true);
458− tryCompareFunction(function() { return Qt.colorEqual(header.fontColor, fontColor); }, true);
446+ tryCompareFunction(function() { return Qt.colorEqual(title.color, fontColor); }, true);
447+ tryCompareFunction(function() { return Qt.colorEqual(subtitle.color, fontColor); }, true);
459448 }
460449
461450 function test_mascotShape_data() {
@@ -468,15 +457,12 @@ Rectangle {
468457
469458 function test_mascotShape(data) {
470459 selector.selectedIndex = data.index;
460+ waitForRendering(card);
471461
472462 var shape = findChild(card, "mascotShapeLoader");
473− var image = findChild(card, "mascotImage");
474−
475− verify(shape, "Could not find shape.");
476− verify(image, "Could not find image.");
477463
478− tryCompare(shape, "active", data.shape);
479− tryCompare(image, "visible", !data.shape);
464+ compare(shape !== null, data.shape);
465+ tryCompare(mascotImage, "visible", !data.shape);
480466 }
481467 }
482468}
tests/qmltests/Dash/tst_CardBenchmark.qml+10−7
@@ -54,13 +54,16 @@ Rectangle {
5454 Repeater {
5555 id: cardRepeater
5656 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)
57+ Loader {
58+ sourceComponent: cardTool.cardComponent
59+ onLoaded: {
60+ item.objectName = "delegate" + index;
61+ item.width = Qt.binding(function() { return cardTool.cardWidth || implicitWidth; });
62+ item.height = Qt.binding(function() { return cardTool.cardHeight || implicitHeight; });
63+ item.cardData = Qt.binding(function() { return Helpers.mapData(root.cardData, cardTool.components); });
64+ item.template = Qt.binding(function() { return cardTool.template; });
65+ item.components = Qt.binding(function() { return cardTool.components; });
66+ }
6467 }
6568 }
6669
tests/qmltests/Dash/tst_CardHeader.qmldeleted−116
@@ -1,116 +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 QtTest 1.0
19−import Ubuntu.Components 0.1
20−import Unity.Test 0.1 as UT
21−import "../../../qml/Dash"
22−
23−
24−Rectangle {
25− width: units.gu(40)
26− height: units.gu(72)
27− color: "lightgrey"
28−
29− CardHeader {
30− id: cardHeader
31− anchors { left: parent.left; right: parent.right }
32− }
33−
34− Rectangle {
35− anchors.fill: cardHeader
36− color: "lightblue"
37− opacity: 0.5
38− }
39−
40− UT.UnityTestCase {
41− id: testCase
42− name: "CardHeader"
43−
44− when: windowShown
45−
46− property Item mascot: findChild(cardHeader, "mascotShapeLoader")
47− property Item titleLabel: findChild(cardHeader, "titleLabel")
48− property Item subtitleLabel: findChild(cardHeader, "subtitleLabel")
49− property Item oldPriceLabel: findChild(cardHeader, "oldPriceLabel")
50− property Item outerRow: findChild(cardHeader, "outerRow")
51− property Item column: findChild(cardHeader, "column")
52−
53− function initTestCase() {
54− verify(typeof testCase.mascot === "object", "Couldn't find mascot object.");
55− verify(typeof testCase.titleLabel === "object", "Couldn't find titleLabel object.");
56− verify(typeof testCase.subtitleLabel === "object", "Couldn't find subtitleLabel object.");
57− verify(typeof testCase.oldPriceLabel === "object", "Couldn't find oldPriceLabel object.");
58− }
59−
60− function cleanup() {
61− cardHeader.mascot = "";
62− cardHeader.title = "";
63− cardHeader.subtitle = "";
64− }
65−
66− function test_mascot_data() {
67− return [
68− { tag: "Empty", source: "", visible: false },
69− { tag: "Invalid", source: "bad_path", visible: false },
70− { tag: "Valid", source: Qt.resolvedUrl("artwork/avatar.png"), visible: true },
71− ]
72− }
73−
74− function test_mascot(data) {
75− cardHeader.mascot = data.source;
76− tryCompare(testCase.mascot, "visible", data.visible);
77− }
78−
79− function test_labels_data() {
80− return [
81− { tag: "Empty", visible: false },
82− { tag: "Title only", title: "Foo", visible: true },
83− { tag: "Subtitle only", subtitle: "Bar", visible: false },
84− { tag: "Both", title: "Foo", subtitle: "Bar", visible: true },
85− ]
86− }
87−
88− function test_labels(data) {
89− cardHeader.title = data.title !== undefined ? data.title : "";
90− cardHeader.subtitle = data.subtitle !== undefined ? data.subtitle : "";
91− tryCompare(cardHeader, "visible", data.visible);
92− }
93−
94− function test_dimensions_data() {
95− return [
96− { tag: "Column width", object: column, width: cardHeader.width },
97− { tag: "Column width with mascot", object: column, width: cardHeader.width - mascot.width - outerRow.margins * 3, mascot: "artwork/avatar.png" },
98− { tag: "Header height", object: cardHeader, height: function() { return outerRow.height + outerRow.margins * 2 } },
99− ]
100− }
101−
102− function test_dimensions(data) {
103− if (data.hasOwnProperty("mascot")) {
104− cardHeader.mascot = data.mascot;
105− }
106−
107− if (data.hasOwnProperty("width")) {
108− tryCompare(data.object, "width", data.width);
109− }
110−
111− if (data.hasOwnProperty("height")) {
112− tryCompareFunction(function() { return data.object.height === data.height() }, true);
113− }
114− }
115− }
116−}
tests/qmltests/Dash/tst_CardTool.qml+11−31
@@ -127,26 +127,6 @@ Rectangle {
127127 }
128128 }
129129 }
130−
131− Card {
132− id: card
133− template: cardTool.template;
134− components: cardTool.components;
135− cardData: Helpers.mapData(dataArea.text, components, dataError)
136−
137− width: cardTool.cardWidth || implicitWidth
138− height: cardTool.cardHeight || implicitHeight
139−
140− clip: true
141− headerAlignment: cardTool.headerAlignment
142−
143− Rectangle {
144− anchors.fill: parent
145− color: "transparent"
146− border.width: 1
147− border.color: "green"
148− }
149− }
150130 }
151131
152132 Rectangle {
@@ -257,7 +237,7 @@ Rectangle {
257237 id: testCase
258238 name: "Card"
259239
260− property Card internalCard: findChild(cardTool, "cardToolCard")
240+ property var internalCard: findChild(cardTool, "cardToolCard")
261241
262242 when: windowShown
263243
@@ -272,16 +252,16 @@ Rectangle {
272252
273253 function test_card_size_data() {
274254 return [
275− { tag: "Medium", width: units.gu(18.5), height: function() { return card.height }, index: 0 },
276− { tag: "No art", width: units.gu(18.5), height: function() { return card.height }, index: 1 },
277− { tag: "No summary", width: units.gu(18.5), height: function() { return card.height }, index: 2 },
278− { tag: "Just header", width: units.gu(18.5), height: function() { return card.height }, index: 3 },
279− { tag: "Just title", width: units.gu(18.5), height: function() { return card.height }, index: 4 },
280− { tag: "Title and subtitle", width: units.gu(18.5), height: function() { return card.height }, index: 5 },
281− { tag: "Title and mascot", width: units.gu(18.5), height: function() { return card.height }, index: 6 },
282− { tag: "Small", width: units.gu(12), height: function() { return card.height }, index: 7 },
283− { tag: "Large", width: units.gu(38), height: function() { return card.height }, index: 8 },
284− { tag: "Horizontal", width: units.gu(38), height: function() { return card.height }, index: 9 },
255+ { tag: "Medium", width: units.gu(18.5), height: function() { return internalCard ? internalCard.height : 0 }, index: 0 },
256+ { tag: "No art", width: units.gu(18.5), height: function() { return internalCard ? internalCard.height : 0 }, index: 1 },
257+ { tag: "No summary", width: units.gu(18.5), height: function() { return internalCard ? internalCard.height : 0 }, index: 2 },
258+ { tag: "Just header", width: units.gu(18.5), height: function() { return internalCard ? internalCard.height : 0 }, index: 3 },
259+ { tag: "Just title", width: units.gu(18.5), height: function() { return internalCard ? internalCard.height : 0 }, index: 4 },
260+ { tag: "Title and subtitle", width: units.gu(18.5), height: function() { return internalCard ? internalCard.height : 0 }, index: 5 },
261+ { tag: "Title and mascot", width: units.gu(18.5), height: function() { return internalCard ? internalCard.height : 0 }, index: 6 },
262+ { tag: "Small", width: units.gu(12), height: function() { return internalCard ? internalCard.height : 0 }, index: 7 },
263+ { tag: "Large", width: units.gu(38), height: function() { return internalCard ? internalCard.height : 0 }, index: 8 },
264+ { tag: "Horizontal", width: units.gu(38), height: function() { return internalCard ? internalCard.height : 0 }, index: 9 },
285265 { tag: "OrganicGrid", width: undefined, height: undefined, index: 0, layout_index: 1},
286266 { tag: "Journal", width: undefined, height: units.gu(20), size: 20, index: 0, layout_index: 2 },
287267 { tag: "OversizedJournal", width: undefined, height: units.gu(18.5), size: 40, index: 0, layout_index: 2 },
tests/qmltests/Dash/tst_Dash.qml+1−1
@@ -127,7 +127,7 @@ Item {
127127 var dashContent = findChild(dash, "dashContent");
128128 var current_index = dashContent.currentIndex;
129129
130− tabbar.selectedIndex = data.visualIndex;
130+ tabbar.model.selectedIndex = data.visualIndex;
131131 compare(dashContent.currentIndex, data.shouldBeVisible ? data.visualIndex : current_index);
132132 }
133133 }
tests/qmltests/Dash/tst_DashContent.qml+34−19
@@ -67,13 +67,17 @@ Item {
6767 name: "DashContent"
6868 when: scopesModel.loaded && windowShown
6969
70− function init() {
71− scopesModel.clear();
70+ function loadScopes() {
7271 scopeLoadedSpy.clear();
7372 scopesModel.load();
7473 tryCompare(scopeLoadedSpy, "count", 4);
7574 }
7675
76+ function init() {
77+ scopesModel.clear();
78+ loadScopes();
79+ }
80+
7781 function cleanup() {
7882 movementStartedSpy.clear();
7983 dashContent.visible = true;
@@ -93,9 +97,7 @@ Item {
9397 compare(dashContentList.count, 0, "DashContent should have 0 items when it starts");
9498 tryCompare(dashContentList, "currentIndex", -1);
9599
96− scopeLoadedSpy.clear();
97− scopesModel.load();
98− tryCompare(scopeLoadedSpy, "count", 4);
100+ loadScopes();
99101
100102 verify(dashContentList.currentIndex >= 0);
101103 }
@@ -109,9 +111,7 @@ Item {
109111 // pretend we're running after a model reset
110112 dashContentList.currentIndex = 27;
111113
112− scopeLoadedSpy.clear();
113− scopesModel.load();
114− tryCompare(scopeLoadedSpy, "count", 4);
114+ loadScopes();
115115
116116 verify(dashContentList.currentIndex >= 0 && dashContentList.currentIndex < 5);
117117 }
@@ -166,7 +166,7 @@ Item {
166166
167167 // test greater than scope count.
168168 var currentScopeIndex = dashContent.currentIndex;
169− dashContent.setCurrentScopeAtIndex(scopesModel.count, true, false);
169+ dashContent.setCurrentScopeAtIndex(8, true, false);
170170 compare(dashContent.currentIndex, currentScopeIndex, "Scope should not change if changing to greater index than count");
171171 }
172172
@@ -195,7 +195,7 @@ Item {
195195 dashContent.setCurrentScopeAtIndex(data.index, true, false);
196196 tryCompareFunction(get_current_item_object_name, data.objectName)
197197 var pageHeader = findChild(dashContent, "pageHeader");
198− compare(pageHeader.scope, scopesModel.get(data.index));
198+ compare(pageHeader.scope, scopesModel.getScope(data.index));
199199 }
200200
201201 function test_is_active_data() {
@@ -212,9 +212,9 @@ Item {
212212 dashContent.setCurrentScopeAtIndex(data.select, true, false);
213213 dashContent.visible = data.visible;
214214
215− tryCompare(scopesModel.get(0), "isActive", data.active0);
216− tryCompare(scopesModel.get(1), "isActive", data.active1);
217− tryCompare(scopesModel.get(2), "isActive", data.active2);
215+ tryCompare(scopesModel.getScope(0), "isActive", data.active0);
216+ tryCompare(scopesModel.getScope(1), "isActive", data.active1);
217+ tryCompare(scopesModel.getScope(2), "isActive", data.active2);
218218 }
219219
220220 function doFindMusicButton(parent) {
@@ -326,8 +326,6 @@ Item {
326326 }
327327
328328 function test_previewOpenClose() {
329− tryCompare(scopeLoadedSpy, "count", 4);
330−
331329 var previewListView = findChild(dashContent, "dashContentPreviewList");
332330 tryCompare(previewListView, "open", false);
333331
@@ -352,8 +350,6 @@ Item {
352350 },
353351 true);
354352
355− tryCompare(scopeLoadedSpy, "count", 4);
356−
357353 var previewListView = findChild(dashContent, "dashContentPreviewList");
358354 tryCompare(previewListView, "open", false);
359355
@@ -368,8 +364,6 @@ Item {
368364 }
369365
370366 function test_previewCycle() {
371− tryCompare(scopeLoadedSpy, "count", 4);
372−
373367 var categoryListView = findChild(dashContent, "categoryListView");
374368 categoryListView.positionAtBeginning();
375369
@@ -392,5 +386,26 @@ Item {
392386 }
393387 closePreview();
394388 }
389+
390+ function test_carouselAspectRatio() {
391+ tryCompareFunction(function() {
392+ var scope = findChild(dashContent, "MockScope1 loader");
393+ if (scope != null) {
394+ var dashCategory1 = findChild(scope, "dashCategory1");
395+ if (dashCategory1 != null) {
396+ var tile = findChild(dashCategory1, "carouselDelegate1");
397+ return tile != null;
398+ }
399+ }
400+ return false;
401+ },
402+ true);
403+
404+ var scope = findChild(dashContent, "MockScope1 loader");
405+ var dashCategory1 = findChild(scope, "dashCategory1");
406+ var cardTool = findChild(dashCategory1, "cardTool");
407+ var carouselLV = findChild(dashCategory1, "listView");
408+ verify(carouselLV.tileWidth / carouselLV.tileHeight == cardTool.components["art"]["aspect-ratio"]);
409+ }
395410 }
396411}
tests/qmltests/Dash/tst_GenericScopeView.qml+12−11
@@ -39,7 +39,7 @@ Item {
3939 id: scopes
4040
4141 onLoadedChanged: {
42− genericScopeView.scope = scopes.get(2)
42+ genericScopeView.scope = scopes.getScope(2)
4343 }
4444 }
4545
@@ -67,7 +67,7 @@ Item {
6767 when: scopes.loaded && windowShown
6868
6969 function init() {
70− genericScopeView.scope = scopes.get(2)
70+ genericScopeView.scope = scopes.getScope(2)
7171 shell.width = units.gu(120)
7272 genericScopeView.categoryView.positionAtBeginning();
7373 tryCompare(genericScopeView.categoryView, "contentY", 0)
@@ -96,36 +96,37 @@ Item {
9696
9797 function test_showDash() {
9898 previewListView.open = true;
99− scopes.get(2).showDash();
99+ scopes.getScope(2).showDash();
100100 tryCompare(previewListView, "open", false);
101101 }
102102
103103 function test_hideDash() {
104104 previewListView.open = true;
105− scopes.get(2).hideDash();
105+ scopes.getScope(2).hideDash();
106106 tryCompare(previewListView, "open", false);
107107 }
108108
109109 function test_searchQuery() {
110− genericScopeView.scope = scopes.get(0);
110+ genericScopeView.scope = scopes.getScope(0);
111111 genericScopeView.scope.searchQuery = "test";
112− genericScopeView.scope = scopes.get(1);
112+ genericScopeView.scope = scopes.getScope(1);
113113 genericScopeView.scope.searchQuery = "test2";
114− genericScopeView.scope = scopes.get(0);
114+ genericScopeView.scope = scopes.getScope(0);
115115 tryCompare(genericScopeView.scope, "searchQuery", "test");
116− genericScopeView.scope = scopes.get(1);
116+ genericScopeView.scope = scopes.getScope(1);
117117 tryCompare(genericScopeView.scope, "searchQuery", "test2");
118118 }
119119
120120 function test_changeScope() {
121121 genericScopeView.scope.searchQuery = "test"
122− genericScopeView.scope = scopes.get(1)
123− genericScopeView.scope = scopes.get(2)
122+ genericScopeView.scope = scopes.getScope(1)
123+ genericScopeView.scope = scopes.getScope(2)
124124 tryCompare(genericScopeView.scope, "searchQuery", "test")
125125 }
126126
127127 function test_filter_expand_collapse() {
128128 // wait for the item to be there
129+ waitForRendering(genericScopeView);
129130 tryCompareFunction(function() { return findChild(genericScopeView, "dashSectionHeader0") != null; }, true);
130131
131132 var header = findChild(genericScopeView, "dashSectionHeader0")
@@ -199,7 +200,7 @@ Item {
199200 var header0 = findChild(genericScopeView, "dashSectionHeader0")
200201 mouseClick(header0, header0.width / 2, header0.height / 2);
201202 tryCompare(category, "filtered", false);
202− tryCompare(category.item, "delegateCreationEnd", category.item.delegateCreationBegin + genericScopeView.height);
203+ tryCompareFunction(function() { return category.item.height == genericScopeView.height - category.item.displayMarginBeginning - category.item.displayMarginEnd; }, true);
203204 mouseClick(header0, header0.width / 2, header0.height / 2);
204205 tryCompare(category, "filtered", true);
205206 }
tests/qmltests/Greeter/tst_Lockscreen.qml+209−31
@@ -17,31 +17,40 @@
1717import QtQuick 2.0
1818import QtTest 1.0
1919import ".."
20−import "../../../qml/Greeter"
20+import "../../../qml/Components"
2121import Ubuntu.Components 0.1
2222import LightDM 0.1 as LightDM
2323import Unity.Test 0.1 as UT
2424
2525Rectangle {
26− width: units.gu(60)
26+ id: root
27+ width: units.gu(80)
2728 height: units.gu(80)
2829 color: "orange"
2930
3031 Lockscreen {
3132 id: lockscreen
3233 anchors.fill: parent
33− anchors.rightMargin: units.gu(18)
34+ anchors.rightMargin: units.gu(30)
3435 placeholderText: "Please enter your PIN"
36+ wrongPlaceholderText: "Incorrect PIN"
37+ retryText: retryCountTextField.text
3538 alphaNumeric: pinPadCheckBox.checked
36− pinLength: pinLengthTextField.text
39+ minPinLength: minPinLengthTextField.text
40+ maxPinLength: maxPinLengthTextField.text
3741 username: "Lola"
42+ background: "../../../qml/graphics/phone_background.jpg"
43+ infoText: infoTextTextField.text
3844 }
3945
4046 Connections {
4147 target: lockscreen
4248
4349 onEmergencyCall: emergencyCheckBox.checked = true
44− onEntered: enteredLabel.text = passphrase
50+ onEntered: {
51+ enteredLabel.text = passphrase
52+ lockscreen.clear(true)
53+ }
4554 }
4655
4756 Connections {
@@ -49,9 +58,9 @@ Rectangle {
4958
5059 onShowPrompt: {
5160 if (text.indexOf("PIN") >= 0) {
52− lockscreen.alphaNumeric = false
61+ pinPadCheckBox.checked = false
5362 } else {
54− lockscreen.alphaNumeric = true
63+ pinPadCheckBox.checked = true
5564 }
5665 lockscreen.placeholderText = text;
5766 }
@@ -65,6 +74,7 @@ Rectangle {
6574 Column {
6675 anchors.fill: parent
6776 anchors.margins: units.gu(1)
77+ spacing: units.gu(1)
6878
6979 Row {
7080 CheckBox {
@@ -86,12 +96,32 @@ Rectangle {
8696 }
8797 Row {
8898 TextField {
89− id: pinLengthTextField
99+ id: minPinLengthTextField
90100 width: units.gu(7)
91101 text: "4"
92102 }
93103 Label {
94− text: "PIN length"
104+ text: "Min PIN length"
105+ }
106+ }
107+ Row {
108+ TextField {
109+ id: maxPinLengthTextField
110+ width: units.gu(7)
111+ text: "4"
112+ }
113+ Label {
114+ text: "Max PIN length"
115+ }
116+ }
117+ Row {
118+ TextField {
119+ id: retryCountTextField
120+ width: units.gu(7)
121+ text: "3 retries left"
122+ }
123+ Label {
124+ text: "Retries left"
95125 }
96126 }
97127 Label {
@@ -108,12 +138,40 @@ Rectangle {
108138 }
109139 Button {
110140 text: "start auth (1234)"
141+ width: parent.width
111142 onClicked: LightDM.Greeter.authenticate("has-pin")
112143 }
113144 Button {
114145 text: "start auth (password)"
146+ width: parent.width
115147 onClicked: LightDM.Greeter.authenticate("has-password")
116148 }
149+
150+ TextField {
151+ id: infoTextTextField
152+ width: parent.width
153+ placeholderText: "Infotext"
154+ text: "+49 179 3253553"
155+ }
156+
157+ TextField {
158+ id: infoPopupTitleTextField
159+ width: parent.width
160+ placeholderText: "Popup title"
161+ text: "This will be the last attempt"
162+ }
163+
164+ TextArea {
165+ id: infoPopupTextArea
166+ width: parent.width
167+ text: "If the SIM PIN is entered incorrectly, your SIM will be blocked and would require the PUK code to unlock."
168+ }
169+
170+ Button {
171+ text: "open info popup"
172+ width: parent.width
173+ onClicked: lockscreen.showInfoPopup(infoPopupTitleTextField.text, infoPopupTextArea.text)
174+ }
117175 }
118176 }
119177
@@ -121,6 +179,16 @@ Rectangle {
121179 name: "Lockscreen"
122180 when: windowShown
123181
182+ function cleanup() {
183+ lockscreen.clear(false);
184+ }
185+
186+ function waitForLockscreenReady() {
187+ var pinPadLoader = findChild(lockscreen, "pinPadLoader");
188+ tryCompare(pinPadLoader, "status", Loader.Ready)
189+ waitForRendering(lockscreen)
190+ }
191+
124192 function test_loading_data() {
125193 return [
126194 {tag: "numeric", alphanumeric: false, pinPadAvailable: true },
@@ -129,8 +197,8 @@ Rectangle {
129197 }
130198
131199 function test_loading(data) {
132− lockscreen.alphaNumeric = data.alphanumeric
133− waitForRendering(lockscreen)
200+ pinPadCheckBox.checked = data.alphanumeric
201+ waitForLockscreenReady();
134202 if (data.pinPadAvailable) {
135203 compare(findChild(lockscreen, "pinPadButton8").text, "8", "Could not find number 8 on PinPad")
136204 } else {
@@ -147,8 +215,8 @@ Rectangle {
147215
148216 function test_emergency_call(data) {
149217 emergencyCheckBox.checked = false
150− lockscreen.alphaNumeric = data.alphanumeric
151− waitForRendering(lockscreen)
218+ pinPadCheckBox.checked = data.alphanumeric
219+ waitForLockscreenReady();
152220 var emergencyButton = findChild(lockscreen, "emergencyCallIcon")
153221 mouseClick(emergencyButton, units.gu(1), units.gu(1))
154222 tryCompare(emergencyCheckBox, "checked", true)
@@ -163,9 +231,9 @@ Rectangle {
163231 }
164232
165233 function test_labels(data) {
166− lockscreen.alphaNumeric = data.alphanumeric
234+ pinPadCheckBox.checked = data.alphanumeric
167235 lockscreen.placeholderText = data.placeholderText
168− waitForRendering(lockscreen)
236+ waitForLockscreenReady();
169237 compare(findChild(lockscreen, "pinentryField").placeholderText, data.placeholderText, "Placeholdertext is not what it should be")
170238 if (data.alphanumeric) {
171239 compare(findChild(lockscreen, "greeterLabel").text, "Hello " + data.username, "Greeter is not set correctly")
@@ -175,23 +243,25 @@ Rectangle {
175243
176244 function test_unlock_data() {
177245 return [
178− {tag: "numeric", alphanumeric: false, username: "has-pin", password: "1234", pinLength: 4},
179− {tag: "alphanumeric", alphanumeric: true, username: "has-password", password: "password", pinLength: -1},
180− {tag: "numeric (wrong)", alphanumeric: false, username: "has-pin", password: "4321", pinLength: 4},
181− {tag: "alphanumeric (wrong)", alphanumeric: true, username: "has-password", password: "drowssap", pinLength: -1},
182− {tag: "flexible length", alphanumeric: false, username: "has-pin", password: "1234", pinLength: -1},
246+ {tag: "numeric", alphanumeric: false, username: "has-pin", password: "1234", minPinLength: 4, maxPinLength: 4},
247+ {tag: "alphanumeric", alphanumeric: true, username: "has-password", password: "password", minPinLength: -1, maxPinLength: -1},
248+ {tag: "numeric (wrong)", alphanumeric: false, username: "has-pin", password: "4321", minPinLength: 4, maxPinLength: 4},
249+ {tag: "alphanumeric (wrong)", alphanumeric: true, username: "has-password", password: "drowssap", minPinLength: -1, maxPinLength: -1},
250+ {tag: "flexible length", alphanumeric: false, username: "has-pin", password: "1234", minPinLength: -1, maxPinLength: -1},
183251 ]
184252 }
185253
186254 function test_unlock(data) {
187255 enteredLabel.text = ""
188− pinLengthTextField.text = data.pinLength
256+ minPinLengthTextField.text = data.minPinLength
257+ maxPinLengthTextField.text = data.maxPinLength
189258 LightDM.Greeter.authenticate(data.username)
190− waitForRendering(lockscreen)
259+ waitForLockscreenReady();
191260
192261 var inputField = findChild(lockscreen, "pinentryField")
193262 if (data.alphanumeric) {
194263 mouseClick(inputField, units.gu(1), units.gu(1))
264+ tryCompare(inputField, "focus", true);
195265 typeString(data.password)
196266 keyClick(Qt.Key_Enter)
197267 } else {
@@ -200,7 +270,7 @@ Rectangle {
200270 var button = findChild(lockscreen, "pinPadButton" + character)
201271 mouseClick(button, units.gu(1), units.gu(1))
202272 }
203− if (data.pinLength == -1) {
273+ if (data.minPinLength !== data.maxPinLength || data.minPinLength == -1) {
204274 var pinPadButtonErase = findChild(lockscreen, "pinPadButtonErase");
205275 mouseClick(pinPadButtonErase, units.gu(1), units.gu(1));
206276 }
@@ -219,11 +289,12 @@ Rectangle {
219289
220290 function test_clear(data) {
221291 pinPadCheckBox.checked = data.alphanumeric
222− waitForRendering(lockscreen)
292+ waitForLockscreenReady();
223293
224294 var inputField = findChild(lockscreen, "pinentryField")
225295 if (data.alphanumeric) {
226296 mouseClick(inputField, units.gu(1), units.gu(1))
297+ tryCompare(inputField, "activeFocus", true);
227298 typeString("1")
228299 } else {
229300 var button = findChild(lockscreen, "pinPadButton1")
@@ -239,6 +310,16 @@ Rectangle {
239310
240311 wait(0) // Trigger event loop to make sure the animation would start running
241312 compare(animation.running, data.animation)
313+ if (data.animation) {
314+ if (data.alphanumeric) {
315+ tryCompare(inputField, "placeholderText", lockscreen.wrongPlaceholderText)
316+ tryCompare(inputField, "placeholderText", lockscreen.placeholderText)
317+ } else {
318+ var label = findChild(lockscreen, "pinentryFieldPlaceHolder");
319+ tryCompare(label, "text", lockscreen.wrongPlaceholderText)
320+ tryCompare(label, "text", lockscreen.placeholderText)
321+ }
322+ }
242323
243324 // wait for animation to finish to not disturb other tests
244325 tryCompare(animation, "running", false)
@@ -246,33 +327,130 @@ Rectangle {
246327
247328 function test_backspace_data() {
248329 return [
249− {tag: "fixed length", pinLength: 4},
250− {tag: "variable length", pinLength: -1}
330+ {tag: "fixed length", minPinLength: 4, maxPinLength: 4},
331+ {tag: "variable undefined length", minPinLength: -1, maxPinLength: -1},
332+ {tag: "variable restricted length", minPinLength: 4, maxPinLength: 8}
251333 ];
252334 }
253335
254336 function test_backspace(data) {
255337 pinPadCheckBox.checked = false
256− pinLengthTextField.text = data.pinLength
257− waitForRendering(lockscreen);
338+ minPinLengthTextField.text = data.minPinLength
339+ maxPinLengthTextField.text = data.maxPinLength
340+ waitForLockscreenReady();
258341
259342 var pinPadButtonErase = findChild(lockscreen, "pinPadButtonErase");
260343 var backspaceIcon = findChild(lockscreen, "backspaceIcon");
261344 var pinEntryField = findChild(lockscreen, "pinentryField");
262345
263− compare(pinPadButtonErase.iconName, data.pinLength == -1 ? "" : "erase");
264− compare(backspaceIcon.visible, data.pinLength == -1);
346+ var autoConfirmEnabled = data.minPinLength === data.maxPinLength && data.minPinLength !== -1;
347+ compare(pinPadButtonErase.iconName, autoConfirmEnabled ? "erase" : "");
348+ compare(backspaceIcon.visible, !autoConfirmEnabled);
265349
266350 var pinPadButton5 = findChild(lockscreen, "pinPadButton5");
267351 mouseClick(pinPadButton5, units.gu(1), units.gu(1));
268352 compare(pinEntryField.text, "5");
269353
270− if (data.pinLength == -1) {
354+ if (data.minPinLength !== data.maxPinLength) {
271355 mouseClick(backspaceIcon, units.gu(1), units.gu(1));
272356 } else {
273357 mouseClick(pinPadButtonErase, units.gu(1), units.gu(1));
274358 }
275359 compare(pinEntryField.text, "");
276360 }
361+
362+ function test_minMaxLength_data() {
363+ return [
364+ {tag: "undefined", minPinLength: -1, maxPinLength: -1},
365+ {tag: "fixed", minPinLength: 4, maxPinLength: 4},
366+ {tag: "variable, limited", minPinLength: 4, maxPinLength: 8},
367+ ];
368+ }
369+
370+ function test_minMaxLength(data) {
371+ pinPadCheckBox.checked = false
372+ minPinLengthTextField.text = data.minPinLength
373+ maxPinLengthTextField.text = data.maxPinLength
374+ waitForLockscreenReady();
375+
376+ var pinPadButton5 = findChild(lockscreen, "pinPadButton5");
377+ var pinPadButtonErase = findChild(lockscreen, "pinPadButtonErase");
378+ var inputField = findChild(lockscreen, "pinentryField")
379+
380+ for (var i = 0; i < 10; i++) {
381+ mouseClick(pinPadButton5, units.gu(1), units.gu(1));
382+
383+ if (data.minPinLength == data.maxPinLength && data.minPinLength != -1) {
384+ // auto confirm mode...
385+ compare(inputField.text.length, (i+1) % data.minPinLength);
386+ } else {
387+ // manual confirm mode
388+ tryCompare(pinPadButtonErase, "enabled", (i+1) >= data.minPinLength)
389+ if (data.maxPinLength == -1) {
390+ compare(inputField.text.length, i+1);
391+ } else {
392+ compare(inputField.text.length, Math.min(data.maxPinLength, i+1));
393+ }
394+
395+ }
396+ }
397+ }
398+
399+ function test_retryDisplay_data() {
400+ return [
401+ {tag: "empty", retryText: "", shown: false},
402+ {tag: "3 retries left", retryText: "3 retries left", shown: true},
403+ ]
404+ }
405+
406+ function test_retryDisplay(data) {
407+ pinPadCheckBox.checked = false
408+ waitForLockscreenReady();
409+
410+ retryCountTextField.text = data.retryText;
411+ var label = findChild(lockscreen, "retryCountLabel")
412+ compare(label.visible, data.shown);
413+ }
414+
415+ function test_infoPopup() {
416+ verify(findChild(root, "infoPopup") === null);
417+ lockscreen.showInfoPopup("foo", "bar");
418+ tryCompareFunction(function() { return findChild(root, "infoPopup") !== null}, true);
419+
420+ var infoPopup = findChild(root, "infoPopup");
421+ compare(infoPopup.title, "foo");
422+ compare(infoPopup.text, "bar");
423+
424+ signalSpy.signalName = "infoPopupConfirmed"
425+ signalSpy.clear();
426+
427+ var okButton = findChild(root, "infoPopupOkButton");
428+ mouseClick(okButton, okButton.width / 2, okButton.height / 2);
429+
430+ tryCompareFunction(function() { return findChild(root, "infoPopup") === null}, true);
431+
432+ tryCompare(signalSpy, "count", 1);
433+ }
434+
435+ function test_infoTextDisplay_data() {
436+ return [
437+ {tag: "empty string", text: "", shown: false},
438+ {tag: "hello world", text: "hello world", shown: true},
439+ ]
440+ }
441+
442+ function test_infoTextDisplay(data) {
443+ pinPadCheckBox.checked = false
444+ waitForLockscreenReady();
445+
446+ infoTextTextField.text = data.text;
447+ var label = findChild(lockscreen, "infoTextLabel")
448+ compare(label.visible, data.shown);
449+ }
450+ }
451+
452+ SignalSpy {
453+ id: signalSpy
454+ target: lockscreen
277455 }
278456}
tests/qmltests/Greeter/tst_Tablet.qml → tests/qmltests/Greeter/tst_MultiGreeter.qmlrenamed+1−1
@@ -61,7 +61,7 @@ Item {
6161 }
6262
6363 UT.UnityTestCase {
64− name: "Greeter"
64+ name: "MultiGreeter"
6565 when: windowShown
6666
6767 function select_index(i) {
tests/qmltests/Greeter/tst_Phone.qml → tests/qmltests/Greeter/tst_SingleGreeter.qmlrenamed+1−19
@@ -33,8 +33,6 @@ Item {
3333 height: parent.height
3434 x: 0; y: 0
3535
36− defaultBackground: Qt.resolvedUrl("../../../qml/graphics/phone_background.jpg")
37−
3836 property int minX: 0
3937
4038 onXChanged: {
@@ -68,7 +66,7 @@ Item {
6866 }
6967
7068 UT.UnityTestCase {
71− name: "Greeter"
69+ name: "SingleGreeter"
7270 when: windowShown
7371
7472 function cleanup() {
@@ -104,22 +102,6 @@ Item {
104102 tryCompare(LightDM.Infographic, "username", "single")
105103 }
106104
107− function test_background_data() {
108− return [
109− {tag: "set", accounts: Qt.resolvedUrl("../../data/unity/backgrounds/blue.png"), expected: "blue.png"},
110− {tag: "unset", accounts: "", expected: "background.jpg"},
111− {tag: "invalid", accounts: "invalid", expected: "background.jpg"},
112− ]
113− }
114−
115− function test_background(data) {
116− var loader = findChild(greeter, "greeterContentLoader")
117− var background = findChild(loader.item, "greeterBackground")
118− AccountsService.backgroundFile = data.accounts
119− tryCompareFunction(function() { return background.source.toString().indexOf(data.expected) !== -1; }, true)
120− tryCompare(background, "status", Image.Ready)
121− }
122−
123105 function test_initial_selected_signal() {
124106 var greeterObj = greeterComponent.createObject(this)
125107 var spy = findChild(greeterObj, "selectedSpy")
tests/qmltests/tst_Shell.qml−9
@@ -475,15 +475,6 @@ Item {
475475 } while (!isStill);
476476 }
477477
478− function test_background_data() {
479− return [
480− {tag: "red", url: Qt.resolvedUrl("../data/unity/backgrounds/red.png"), expectedUrl: "tests/data/unity/backgrounds/red.png"},
481− {tag: "blue", url: Qt.resolvedUrl("../data/unity/backgrounds/blue.png"), expectedUrl: "tests/data/unity/backgrounds/blue.png"},
482− {tag: "invalid", url: "invalid", expectedUrl: shell.defaultBackground},
483− {tag: "empty", url: "", expectedUrl: shell.defaultBackground}
484− ]
485− }
486−
487478 function test_DashShown_data() {
488479 return [
489480 {tag: "in focus", greeter: false, app: false, launcher: false, indicators: false, expectedShown: true},
tests/utils/modules/Unity/Test/CMakeLists.txt+4−7
@@ -1,3 +1,5 @@
1+include(QmlPlugins)
2+
13add_definitions(-DQT_NO_KEYWORDS)
24
35include_directories(
@@ -14,10 +16,5 @@ add_library(UnityTestQml MODULE ${UnityTestQML_SOURCES})
1416
1517qt5_use_modules(UnityTestQml Core Quick Test)
1618
17−# copy qml files into build directory for shadow builds
18−file(GLOB QML_JS_FILES *.js *.qml qmldir)
19−
20−add_custom_target(UnityTestQmlJsFiles ALL
21− COMMAND cp ${QML_JS_FILES} ${CMAKE_CURRENT_BINARY_DIR}
22− DEPENDS ${QML_JS_FILES}
23−)
19+export_qmlfiles(Unity.Test Unity/Test)
20+export_qmlplugin(Unity.Test 0.1 Unity/Test TARGETS UnityTestQml)
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)
tests/utils/modules/Unity/Test/qmldir+2
@@ -1,3 +1,5 @@
11module Unity.Test
22plugin UnityTestQml
3+typeinfo Test.qmltypes
4+
35UnityTestCase 0.1 UnityTestCase.qml
tools/registry-tracker.cpp+33−26
@@ -49,58 +49,66 @@ RegistryTracker::~RegistryTracker()
4949"Registry.Identity = Registry\n" \
5050"Registry.ConfigFile = %1\n" \
5151"Default.Middleware = Zmq\n" \
52−"Zmq.ConfigFile = %2\n"
52+"Zmq.ConfigFile = %2\n" \
53+"Smartscopes.Registry.Identity = %3\n"
5354
5455#define REGISTRY_CONFIG \
5556"[Registry]\n" \
5657"Middleware = Zmq\n" \
57−"Zmq.Endpoint = ipc://%1/Registry\n" \
58−"Zmq.EndpointDir = %2\n" \
59−"Zmq.ConfigFile = %3\n" \
60−"Scope.InstallDir = %4\n" \
61−"Scoperunner.Path = %5\n" \
62−"%6"
58+"Zmq.ConfigFile = %1\n" \
59+"Scope.InstallDir = %2\n" \
60+"Scoperunner.Path = %3\n"
6361
6462#define MW_CONFIG \
6563"[Zmq]\n" \
66−"EndpointDir.Public = %1\n" \
67−"EndpointDir.Private = %2\n"
64+"EndpointDir = %1\n"
6865
6966void RegistryTracker::runRegistry()
7067{
7168 QDir tmp(QDir::temp());
72− m_runtime_config.setFileTemplate(tmp.filePath("Runtime.ini.XXXXXX"));
73− m_registry_config.setFileTemplate(tmp.filePath("Registry.ini.XXXXXX"));
74− m_mw_config.setFileTemplate(tmp.filePath("Zmq.ini.XXXXXX"));
69+ m_runtime_config.setFileTemplate(tmp.filePath("Runtime.XXXXXX.ini"));
70+ m_registry_config.setFileTemplate(tmp.filePath("Registry.XXXXXX.ini"));
71+ m_mw_config.setFileTemplate(tmp.filePath("Zmq.XXXXXX.ini"));
7572
7673 if (!m_runtime_config.open() || !m_registry_config.open() || !m_mw_config.open() || !m_endpoints_dir.isValid()) {
7774 qWarning("Unable to open temporary files!");
7875 return;
7976 }
8077
81− QString scopesLibdir;
78+ QString scopeInstallDir;
79+ QString scopeRegistryBin;
80+ QString scopeRunnerBin;
8281 {
8382 QProcess pkg_config;
83+ QByteArray output;
8484 QStringList arguments;
85− arguments << "--variable=libdir";
85+ arguments << "--variable=scopesdir";
8686 arguments << "libunity-scopes";
8787 pkg_config.start("pkg-config", arguments);
8888 pkg_config.waitForFinished();
89− QByteArray libdir = pkg_config.readAllStandardOutput();
90− scopesLibdir = QDir(QString::fromLocal8Bit(libdir)).path().trimmed();
89+ output = pkg_config.readAllStandardOutput();
90+ scopeInstallDir = QDir(QString::fromLocal8Bit(output)).path().trimmed();
91+
92+ arguments[0] = "--variable=scoperegistry_bin";
93+ pkg_config.start("pkg-config", arguments);
94+ pkg_config.waitForFinished();
95+ output = pkg_config.readAllStandardOutput();
96+ scopeRegistryBin = QString::fromLocal8Bit(output).trimmed();
97+
98+ arguments[0] = "--variable=scoperunner_bin";
99+ pkg_config.start("pkg-config", arguments);
100+ pkg_config.waitForFinished();
101+ output = pkg_config.readAllStandardOutput();
102+ scopeRunnerBin = QString::fromLocal8Bit(output).trimmed();
91103 }
92104
93− if (scopesLibdir.size() == 0) {
105+ if (scopeInstallDir.isEmpty() || scopeRegistryBin.isEmpty() || scopeRunnerBin.isEmpty()) {
94106 qWarning("Unable to find libunity-scopes package config file");
95107 return;
96108 }
97109
98− QString scopeRunnerPath = QDir(scopesLibdir).filePath("scoperunner/scoperunner");
99−
100− QString runtime_ini = QString(RUNTIME_CONFIG).arg(m_registry_config.fileName()).arg(m_mw_config.fileName());
101110 // FIXME: keep in sync with the SSRegistry config
102− QString serverRegistryConfig(m_serverScopes ? "SS.Registry.Identity = SSRegistry\nSS.Registry.Endpoint = ipc:///tmp/SSRegistry" : "");
103− QString scopeInstallDir(scopesLibdir + "/unity-scopes");
111+ QString runtime_ini = QString(RUNTIME_CONFIG).arg(m_registry_config.fileName()).arg(m_mw_config.fileName()).arg(m_serverScopes ? "SSRegistry" : "");
104112 if (!m_systemScopes) {
105113 m_scopeInstallDir.reset(new QTemporaryDir(tmp.filePath("scopes.XXXXXX")));
106114 if (!m_scopeInstallDir->isValid()) {
@@ -108,8 +116,8 @@ void RegistryTracker::runRegistry()
108116 }
109117 scopeInstallDir = m_scopeInstallDir->path();
110118 }
111− QString registry_ini = QString(REGISTRY_CONFIG).arg(m_endpoints_dir.path()).arg(m_endpoints_dir.path()).arg(m_mw_config.fileName()).arg(scopeInstallDir).arg(scopeRunnerPath).arg(serverRegistryConfig);
112− QString mw_ini = QString(MW_CONFIG).arg(m_endpoints_dir.path()).arg(m_endpoints_dir.path());
119+ QString registry_ini = QString(REGISTRY_CONFIG).arg(m_mw_config.fileName()).arg(scopeInstallDir).arg(scopeRunnerBin);
120+ QString mw_ini = QString(MW_CONFIG).arg(m_endpoints_dir.path());
113121
114122 m_runtime_config.write(runtime_ini.toUtf8());
115123 m_registry_config.write(registry_ini.toUtf8());
@@ -121,11 +129,10 @@ void RegistryTracker::runRegistry()
121129
122130 qputenv("UNITY_SCOPES_RUNTIME_PATH", m_runtime_config.fileName().toLocal8Bit());
123131
124− QString registryBin(QDir(scopesLibdir).filePath("scoperegistry/scoperegistry"));
125132 QStringList arguments;
126133 arguments << m_runtime_config.fileName();
127134 arguments << m_scopes;
128135
129136 m_registry.setProcessChannelMode(QProcess::ForwardedChannels);
130− m_registry.start(registryBin, arguments);
137+ m_registry.start(scopeRegistryBin, arguments);
131138}
tools/unlock-device+2−4
@@ -4,7 +4,7 @@
44# Our goal here is to get an Ubuntu Touch device into a testable unlocked state.
55# This will include a reboot.
66
7−WAIT_COMMAND="sleep 20"
7+WAIT_COMMAND="adb reboot; sleep 5; adb wait-for-device; sleep 20"
88
99while getopts s:w: opt; do
1010 case $opt in
@@ -28,10 +28,8 @@ bus.clearSysState(cookie, dbus_interface="com.canonical.powerd");
2828helpers.unlock_unity()
2929'
3030
31−adb reboot
32−sleep 5
33−adb "wait-for-device"
3431eval "$WAIT_COMMAND"
32+
3533UNLOCK_OUTPUT=$(adb shell "sudo -u phablet -i python3 -c '$UNLOCK_SCRIPT'" 2>&1)
3634if echo "$UNLOCK_OUTPUT" | grep 'Greeter unlocked' >/dev/null; then
3735 echo "I: Unlock passed"