on xenial help sign in
Merge from dialer-above
commite7c4f0f46936cfbc5c0288a19530e2171cefa87f authorMichael Terry <michael.terry@canonical.com> dateMon 14 Jul 2014, 13:02 (12 years ago) parent5f2ea430c8a3a9
270 files changed+9856−2250
.bazaar/plugins/makecheck_unity_phablet.py+16−8 build.sh+2 cmake/modules/QmlPlugins.cmake+29−22 cmake/modules/autopilot.cmake+2−2 debian/changelog+148 debian/control+11−6 debian/unity8-private.install+1 doc/CMakeLists.txt+2 include/paths.h.in−8 plugins/AccountsService/AccountsService.qmltypes+22 plugins/CMakeLists.txt+1 plugins/Dash/CardCreator.js+7−4 plugins/Dash/Dash.qmltypes+95 plugins/Dash/ScopeStyle.qml+87 plugins/Dash/qmldir+1 plugins/HudClient/HudClient.qmltypes+91 plugins/LightDM/LightDM.qmltypes+241 plugins/Lights/CMakeLists.txt+18 plugins/Lights/Lights.cpp+182 plugins/Lights/Lights.h+75 plugins/Lights/plugin.cpp+35 plugins/Lights/plugin.h+34 plugins/Lights/qmldir+3 plugins/Powerd/Powerd.qmltypes+46 plugins/SessionBroadcast/SessionBroadcast.qmltypes+19 plugins/Ubuntu/CMakeLists.txt+1 plugins/Ubuntu/DownloadDaemonListener/DownloadDaemonListener.qmltypes+60 plugins/Ubuntu/Gestures/DirectionalDragArea.cpp+1 plugins/Ubuntu/Gestures/DirectionalDragArea.h+1 plugins/Ubuntu/Gestures/Gestures.qmltypes+153 plugins/Ubuntu/Payments/CMakeLists.txt+20 plugins/Ubuntu/Payments/Payments.cpp+118 plugins/Ubuntu/Payments/Payments.h+65 plugins/Ubuntu/Payments/Payments.qmltypes+42 plugins/Ubuntu/Payments/plugin.cpp+28 plugins/Ubuntu/Payments/plugin.h+31 plugins/Ubuntu/Payments/qmldir+3 plugins/Unity/Indicators/CMakeLists.txt+1−4 plugins/Unity/Indicators/qml/CachedUnityMenuModel.qml → plugins/Unity/Indicators/CachedUnityMenuModel.qml plugins/Unity/Indicators/Indicators.qmltypes+278 plugins/Unity/Indicators/qml/qmldir → plugins/Unity/Indicators/qmldir−4 plugins/Unity/Launcher/Launcher.qmltypes+174 plugins/Unity/Launcher/launcheritem.cpp+2−2 plugins/Unity/Launcher/launchermodel.cpp+3−1 plugins/Unity/Session/Session.qmltypes+25 plugins/Utils/Utils.qmltypes+143 plugins/Utils/easingcurve.cpp+3−1 po/am.po+33−9 po/ar.po+33−9 po/ast.po+42−18 po/az.po+33−9 po/bg.po+33−9 po/br.po+33−9 po/bs.po+31−7 po/ca.po+33−9 po/ckb.po+33−9 po/cs.po+33−9 po/da.po+31−7 po/de.po+33−9 po/el.po+33−9 po/en_AU.po+31−7 po/en_GB.po+40−16 po/eo.po+31−7 po/es.po+33−9 po/eu.po+33−9 po/fa.po+31−7 po/fi.po+34−10 po/fo.po+31−7 po/fr.po+35−11 po/gd.po+33−9 po/gl.po+41−15 po/he.po+33−9 po/hi.po+31−7 po/hr.po+31−7 po/hu.po+33−9 po/hy.po+31−7 po/id.po+31−7 po/is.po+31−7 po/it.po+34−10 po/ja.po+33−9 po/km.po+33−9 po/kn.po+31−7 po/ko.po+31−7 po/ky.po+31−7 po/lo.po+31−7 po/lt.po+33−9 po/lv.po+34−10 po/ml.po+33−9 po/mr.po+31−7 po/ms.po+33−9 po/my.po+33−9 po/nb.po+33−9 po/nl.po+33−9 po/pl.po+33−9 po/pt.po+31−7 po/pt_BR.po+33−9 po/ro.po+31−7 po/ru.po+33−9 po/shn.po+31−7 po/si.po+31−7 po/sl.po+33−9 po/sq.po+31−7 po/sr.po+31−7 po/sv.po+31−7 po/sw.po+32−8 po/ta.po+31−7 po/te.po+31−7 po/tr.po+33−9 po/ug.po+34−10 po/uk.po+33−9 po/unity8.pot+30−6 po/update-unity-pot+2−1 po/vi.po+31−7 po/xh.po+31−7 po/zh_CN.po+33−9 po/zh_HK.po+33−9 po/zh_TW.po+32−8 qml/Components/BaseCarouselDelegate.qml+19 qml/Components/Carousel.qml+5−14 qml/Components/ListItems/Header.qml+1 qml/Components/PageHeader.qml+221−313 qml/Components/PageHeaderLabel.qml−41 qml/Components/SearchHistoryModel.qml → qml/Components/SearchHistoryModel/SearchHistoryModel.qml+1 qml/Components/SearchHistoryModel/qmldir+1 qml/Components/graphics/headerback@27.png qml/Dash/CardCarousel.qml+7−4 qml/Dash/CardFilterGrid.qml+1 qml/Dash/CardVerticalJournal.qml+2−1 qml/Dash/Dash.qml+14−15 qml/Dash/DashContent.qml+7−84 qml/Dash/DashDepartments.qml+8−7 qml/Dash/DashDepartmentsList.qml+19−17 qml/Dash/DashRenderer.qml+5−4 qml/Dash/GenericScopeView.qml+57−29 qml/Dash/PreviewListView.qml+8−22 qml/Dash/Previews/Preview.qml+4 qml/Dash/Previews/PreviewAudioPlayback.qml+3−3 qml/Dash/Previews/PreviewHeader.qml+1−1 qml/Dash/Previews/PreviewPayments.qml+56 qml/Dash/Previews/PreviewRatingDisplay.qml+3−4 qml/Dash/Previews/PreviewRatingInput.qml+2−4 qml/Dash/Previews/PreviewTextSummary.qml+2−4 qml/Dash/Previews/PreviewWidget.qml+3 qml/Dash/Previews/PreviewWidgetFactory.qml+5 qml/Dash/ScopeItem.qml−106 qml/Dash/graphics/icon_listview_clear@20.png qml/Dash/graphics/tick@30.png qml/Hud/HudParametrizedActionsPage.qml+2−2 qml/Launcher/Launcher.qml+33−3 qml/Launcher/LauncherDelegate.qml+36−13 qml/Launcher/LauncherPanel.qml+19−16 qml/Launcher/graphics/divider-line.png qml/Launcher/graphics/highlight@18.png qml/Launcher/graphics/home@18.png qml/Launcher/graphics/icon-top-highlight.png qml/Launcher/graphics/launcher_bg@30.png qml/Launcher/graphics/launcher_bg@30.sci−5 qml/Launcher/graphics/non-selected@18.png qml/Launcher/graphics/non-selected@18.sci−5 qml/Launcher/graphics/selected@18.png qml/Launcher/graphics/selected@18.sci−5 qml/Launcher/graphics/triangle@18.png qml/Panel/ActiveCallHint.qml+206 qml/Panel/IndicatorRow.qml+1−1 qml/Panel/Indicators.qml+22−36 qml/Panel/Indicators/DefaultIndicatorPage.qml+3−2 qml/Panel/Indicators/DefaultIndicatorWidget.qml+22−31 plugins/Unity/Indicators/qml/IndicatorBase.qml → qml/Panel/Indicators/IndicatorBase.qml+2−3 qml/Panel/Indicators/IndicatorDelegate.qml+1−2 tests/mocks/Unity/Indicators/MenuItemFactory.qml → qml/Panel/Indicators/IndicatorsLight.qml+14−14 plugins/Unity/Indicators/qml/MenuItemFactory.qml → qml/Panel/Indicators/MenuItemFactory.qml+178−14 plugins/Unity/Indicators/qml/MessageMenuItemFactory.qml → qml/Panel/Indicators/MessageMenuItemFactory.qml+3 plugins/Unity/Indicators/qml/RemoveBackground.qml → qml/Panel/Indicators/RemoveBackground.qml qml/Panel/Panel.qml+131−90 qml/ScopeTool.qml−1 qml/Shell.qml+14−15 run.sh−6 src/CMakeLists.txt+1 src/CachingNetworkManagerFactory.cpp+62 src/CachingNetworkManagerFactory.h+50 src/Panel/Indicators/client/indicatorsclient.cpp−1 src/main.cpp+5−4 tests/autopilot/unity8/process_helpers.py+4−3 tests/autopilot/unity8/shell/emulators/dash.py+29−26 tests/autopilot/unity8/shell/emulators/main_window.py−5 tests/autopilot/unity8/shell/tests/__init__.py+1−2 tests/autopilot/unity8/shell/tests/disabled_test_hud.py+44−13 tests/autopilot/unity8/shell/tests/test_emulators.py−3 tests/autopilot/unity8/shell/tests/test_lock_screen.py+4−5 tests/autopilot/unity8/shell/tests/test_notifications.py+15−10 tests/autopilot/unity8/shell/tests/test_system_integration.py+10−5 tests/autopilot/unity8/shell/tests/test_upstart.py+20−11 tests/mocks/AccountsService/AccountsService.qmltypes+22 tests/mocks/GSettings.1.0/GSettings.qmltypes+42 tests/mocks/HudClient/HudClient.qmltypes+113 tests/mocks/LightDM/LightDM.qmltypes+241 tests/mocks/Powerd/Powerd.qmltypes+46 tests/mocks/QMenuModel/QDBusActionGroup.qml+60 tests/mocks/QMenuModel/QMenuModel.qmltypes+77 tests/mocks/QtMultimedia/QtMultimedia.qmltypes+52 tests/mocks/Ubuntu/CMakeLists.txt+2 tests/mocks/Ubuntu/DownloadDaemonListener/DownloadDaemonListener.qmltypes+60 tests/mocks/Ubuntu/Payments/CMakeLists.txt+10 tests/mocks/Ubuntu/Payments/MockPayments.cpp+89 tests/mocks/Ubuntu/Payments/MockPayments.h+60 tests/mocks/Ubuntu/Payments/Payments.qmltypes+42 tests/mocks/Ubuntu/Payments/plugin.cpp+28 tests/mocks/Ubuntu/Payments/plugin.h+31 tests/mocks/Ubuntu/Payments/qmldir+3 tests/mocks/Ubuntu/Telephony/CMakeLists.txt+22 tests/mocks/Ubuntu/Telephony/ContactWatcherData.cpp+43 tests/mocks/Ubuntu/Telephony/ContactWatcherData.h+46 tests/mocks/Ubuntu/Telephony/MockCallEntry.cpp+66 tests/mocks/Ubuntu/Telephony/MockCallEntry.h+57 tests/mocks/Ubuntu/Telephony/MockCallManager.cpp+80 tests/mocks/Ubuntu/Telephony/MockCallManager.h+60 tests/mocks/Ubuntu/Telephony/MockContactWatcher.cpp+50 tests/mocks/Ubuntu/Telephony/MockContactWatcher.h+49 tests/mocks/Ubuntu/Telephony/MockTelepathyHelper.cpp+35 tests/mocks/Ubuntu/Telephony/MockTelepathyHelper.h+36 tests/mocks/Ubuntu/Telephony/plugin.cpp+52 tests/mocks/Ubuntu/Telephony/plugin.h+37 tests/mocks/Ubuntu/Telephony/qmldir+2 tests/mocks/Ubuntu/Thumbnailer/Thumbnailer.qmltypes+17 tests/mocks/Unity/Application/Application.qmltypes+313 tests/mocks/Unity/Application/CMakeLists.txt+2−1 tests/mocks/Unity/CMakeLists.txt+1−1 tests/mocks/Unity/Indicators/IndicatorBase.qml−38 tests/mocks/Unity/Indicators/Indicators.qmltypes+210 tests/mocks/Unity/Indicators/fakeindicatorsmodel.cpp+1−1 tests/mocks/Unity/Indicators/qmldir−2 tests/mocks/Unity/Launcher/Launcher.qmltypes+171 tests/mocks/Unity/Launcher/MockLauncherModel.cpp+6−1 tests/mocks/Unity/Notifications/Notifications.qmltypes+10 tests/mocks/Unity/Unity.qmltypes+345 tests/mocks/Unity/fake_categories.cpp+4 tests/mocks/Unity/fake_scope.cpp+58−19 tests/mocks/Unity/fake_scope.h+2 tests/mocks/Unity/fake_unity_plugin.cpp+1 tests/plugins/Dash/CMakeLists.txt+2 tests/plugins/Dash/cardcreator/1.res+3−2 tests/plugins/Dash/cardcreator/2.res+5−5 tests/plugins/Dash/cardcreator/3.res+6−4 tests/plugins/Dash/cardcreator/4.res+4−3 tests/plugins/Dash/cardcreator/5.res+3−2 tests/plugins/Dash/cardcreator/6.res+66 tests/plugins/Dash/cardcreator/6.tst+3 tests/plugins/Dash/tst_ScopeStyle.qml+151 tests/plugins/Unity/Launcher/launchermodeltest.cpp+9 tests/qmltests/CMakeLists.txt+3−1 tests/qmltests/Components/tst_Carousel.qml+48−2 tests/qmltests/Components/tst_PageHeaderLabel.qml → tests/qmltests/Components/tst_PageHeader.qml+90−54 tests/qmltests/Components/tst_PageHeader/logo-ubuntu-orange.svg+60 tests/qmltests/Dash/Previews/tst_Preview.qml+2−2 tests/qmltests/Dash/Previews/tst_PreviewPayments.qml+100 tests/qmltests/Dash/Previews/tst_PreviewRatingDisplay.qml+13 tests/qmltests/Dash/tst_Dash.qml−39 tests/qmltests/Dash/tst_DashContent.qml+4−152 tests/qmltests/Dash/tst_GenericScopeView.qml+98−45 tests/qmltests/Panel/Indicators/tst_DefaultIndicatorPage.qml+1 tests/qmltests/Panel/Indicators/tst_DefaultIndicatorWidget.qml+3−40 tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+65−2 tests/qmltests/Panel/Indicators/tst_MessageMenuItemFactory.qml+2−2 tests/qmltests/Panel/tst_ActiveCallHint.qml+165 tests/qmltests/Panel/tst_Indicators.qml+10−21 tests/qmltests/Panel/tst_Panel.qml+147−82 tests/qmltests/tst_Shell.qml+1−37 tests/utils/modules/Unity/Test/Test.qmltypes+59 tests/whitespace/check_whitespace.py+22−12 tools/scopetool.cpp−2
.bazaar/plugins/makecheck_unity_phablet.py+16−8
@@ -1,5 +1,5 @@
11#!/usr/bin/python
2−# Copyright 2013 Canonical Ltd.
2+# Copyright 2013, 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 Lesser General Public License as published by
@@ -13,11 +13,15 @@
1313# You should have received a copy of the GNU Lesser General Public License
1414# along with this program. If not, see <http://www.gnu.org/licenses/>.
1515
16−import os, subprocess
17−from bzrlib import branch, errors
18−from bzrlib.urlutils import dirname, local_path_from_url
16+import os
17+import subprocess
18+from bzrlib import branch
19+from bzrlib.urlutils import local_path_from_url
1920
20−def execute_makecheck(local_branch, master_branch, old_revision_number, old_revision_id, future_revision_number, future_revision_id, tree_delta, future_tree):
21+
22+def execute_makecheck(
23+ local_branch, master_branch, old_revision_number, old_revision_id,
24+ future_revision_number, future_revision_id, tree_delta, future_tree):
2125 if not master_branch.basis_tree().has_filename("qml/Shell.qml"):
2226 return
2327
@@ -27,7 +31,9 @@ def execute_makecheck(local_branch, master_branch, old_revision_number, old_revi
2731 os.environ['CTEST_OUTPUT_ON_FAILURE'] = "1"
2832 if (subprocess.call("make -C builddir test", shell=True) != 0):
2933
30− print("\n\n*** Warning ***\n\nBasic tests failed. This commit will not pass continuous integration.")
34+ print("\n\n*** Warning ***\n\n"
35+ "Basic tests failed. This commit will not pass continuous "
36+ "integration.")
3137
3238 branch = local_branch or master_branch
3339 revision = branch.repository.get_revision(future_revision_id)
@@ -36,8 +42,10 @@ def execute_makecheck(local_branch, master_branch, old_revision_number, old_revi
3642 msg_file.close()
3743
3844 print("\n\nSaved commit message to $SRC_DIR/message.txt.")
39− print("You can uncommit this revision, fix the tests and reuse your message running:\n\nbzr commit -F message.txt\n\n")
45+ print("You can uncommit this revision, fix the tests and reuse your "
46+ "message running:\n\nbzr commit -F message.txt\n\n")
4047 elif os.path.isfile("message.txt"):
4148 os.remove("message.txt")
4249
43−branch.Branch.hooks.install_named_hook('pre_commit', execute_makecheck, 'make check pre-commit')
50+branch.Branch.hooks.install_named_hook(
51+ 'pre_commit', execute_makecheck, 'make check pre-commit')
build.sh+2
@@ -42,11 +42,13 @@ install_dependencies() {
4242 equivs \
4343 gsettings-desktop-schemas \
4444 gsettings-ubuntu-schemas \
45+ pay-service \
4546 qmenumodel-qml \
4647 qml-module-qtquick-xmllistmodel \
4748 qtdeclarative5-gsettings1.0 \
4849 qtdeclarative5-ubuntu-ui-toolkit-plugin \
4950 qtdeclarative5-ubuntu-settings-components \
51+ qtdeclarative5-ubuntu-telephony0.1 \
5052 qtdeclarative5-ubuntu-thumbnailer0.1 \
5153 unity-notifications-impl \
5254 ubuntu-mobile-icons \
cmake/modules/QmlPlugins.cmake+29−22
@@ -12,6 +12,12 @@ if(NOT TARGET qmlplugindump)
1212 set_target_properties(qmlplugindump PROPERTIES IMPORTED_LOCATION ${qmlplugindump_exe})
1313endif()
1414
15+#
16+# A custom target for building the qmltypes files manually.
17+#
18+if (NOT TARGET qmltypes)
19+ add_custom_target(qmltypes)
20+endif()
1521
1622# Creates a target for copying resource files into build dir and optionally installing them.
1723#
@@ -51,6 +57,7 @@ macro(export_qmlfiles PLUGIN PATH)
5157 ${QMLFILES_SEARCH_PATH}/*.png
5258 ${QMLFILES_SEARCH_PATH}/*.sci
5359 ${QMLFILES_SEARCH_PATH}/*.svg
60+ ${QMLFILES_SEARCH_PATH}/*.qmltypes
5461 ${QMLFILES_SEARCH_PATH}/qmldir
5562 )
5663
@@ -69,14 +76,14 @@ macro(export_qmlfiles PLUGIN PATH)
6976 DESTINATION ${QMLFILES_DESTINATION}/${PATH}
7077 )
7178 endif()
72−endmacro(export_qmlfiles)
79+endmacro()
7380
7481
75−# Creates a target for generating the typeinfo file for a QML plugin and optionally installs it
76−# and additional targets.
82+# Creates a target for generating the typeinfo file for a QML plugin and/or installs the plugin
83+# targets.
7784#
7885# 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
86+# into ${DESTINATION}/${path}. If you don't pass BINARY_DIR, it's assumed that current source
8087# path ends with ${path}.
8188#
8289# The generated file will be named after the last segment of the plugin name, e.g. Foo.qmltypes.
@@ -87,15 +94,18 @@ endmacro(export_qmlfiles)
8794# [TARGET_PREFIX string] # Will be prefixed to the target name
8895# [ENVIRONMENT string] # Will be added to qmlplugindump's env
8996# [TARGETS target1 [target2 ...]] # Targets to depend on and install (e.g. the plugin shared object)
97+# [NO_TYPES] # Do not create the qmltypes target
9098# )
9199#
92100# Created target:
93−# - ${TARGET_PREFIX}${plugin}-qmltypes - Generates the qmltypes file in the binary dir.
101+# - ${TARGET_PREFIX}${plugin}-qmltypes - Generates the qmltypes file in the source dir.
102+# It will be made a dependency of the "qmltypes" target.
94103
95104macro(export_qmlplugin PLUGIN VERSION PATH)
105+ set(options NO_TYPES)
96106 set(single BINARY_DIR DESTINATION TARGET_PREFIX ENVIRONMENT)
97107 set(multi TARGETS)
98− cmake_parse_arguments(QMLPLUGIN "" "${single}" "${multi}" ${ARGN})
108+ cmake_parse_arguments(QMLPLUGIN "${options}" "${single}" "${multi}" ${ARGN})
99109
100110 get_target_property(qmlplugindump_executable qmlplugindump LOCATION)
101111
@@ -103,29 +113,26 @@ macro(export_qmlplugin PLUGIN VERSION PATH)
103113 set(qmlplugin_dir ${QMLPLUGIN_BINARY_DIR}/${PATH})
104114 else()
105115 # Find import path to point qmlplugindump at
106− string(REGEX REPLACE "${PATH}$" "" QMLPLUGIN_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
116+ string(REGEX REPLACE "/${PATH}$" "" QMLPLUGIN_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
107117 set(qmlplugin_dir ${CMAKE_CURRENT_BINARY_DIR})
108118 endif()
109119
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)
120+ if(NOT QMLPLUGIN_NO_TYPES)
121+ # Relative path for the module
122+ string(REPLACE "${CMAKE_BINARY_DIR}/" "" QMLPLUGIN_MODULE_DIR "${QMLPLUGIN_BINARY_DIR}")
123+
124+ # Find the last segment of the plugin name to use as qmltypes basename
125+ string(REGEX MATCH "[^.]+$" plugin_suffix ${PLUGIN})
126+ set(target_prefix ${QMLPLUGIN_TARGET_PREFIX}${PLUGIN})
127+ set(qmltypes_path ${CMAKE_CURRENT_SOURCE_DIR}/${plugin_suffix}.qmltypes)
114128
115− # Only generate typeinfo if not cross compiling
116− if(NOT CMAKE_CROSSCOMPILING)
117− add_custom_target(${target_prefix}-qmltypes ALL
129+ add_custom_target(${target_prefix}-qmltypes
118130 COMMAND env ${QMLPLUGIN_ENVIRONMENT} ${qmlplugindump_executable} -notrelocatable
119− ${PLUGIN} ${VERSION} ${QMLPLUGIN_BINARY_DIR} > ${qmltypes_path}
131+ ${PLUGIN} ${VERSION} ${QMLPLUGIN_MODULE_DIR} > ${qmltypes_path}
132+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
120133 )
121134 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()
135+ add_dependencies(qmltypes ${target_prefix}-qmltypes)
129136 endif()
130137
131138 set_target_properties(${QMLPLUGIN_TARGETS} PROPERTIES
cmake/modules/autopilot.cmake+2−2
@@ -2,7 +2,7 @@ add_custom_target(autopilot)
22
33function(declare_autopilot_test TEST_NAME TEST_SUITE WORKING_DIR)
44 add_custom_target(autopilot-${TEST_NAME}
5− COMMAND LANG=C UBUNTU_ICON_THEME=ubuntu-mobile QML2_IMPORT_PATH=${SHELL_INSTALL_QML}/mocks python3 -m autopilot.run run ${TEST_SUITE}
5+ COMMAND LANG=C QML2_IMPORT_PATH=${SHELL_INSTALL_QML}/mocks python3 -m autopilot.run run ${TEST_SUITE}
66 WORKING_DIRECTORY ${WORKING_DIR}
77 DEPENDS fake_install
88 )
@@ -14,7 +14,7 @@ function(declare_autopilot_test TEST_NAME TEST_SUITE WORKING_DIR)
1414 add_dependencies(autopilot autopilot-${TEST_NAME})
1515
1616 add_custom_target(autopilot2-${TEST_NAME}
17− COMMAND LANG=C UBUNTU_ICON_THEME=ubuntu-mobile QML2_IMPORT_PATH=${SHELL_INSTALL_QML}/mocks python2 -m autopilot.run run ${TEST_SUITE}
17+ COMMAND LANG=C QML2_IMPORT_PATH=${SHELL_INSTALL_QML}/mocks python2 -m autopilot.run run ${TEST_SUITE}
1818 WORKING_DIRECTORY ${WORKING_DIR}
1919 DEPENDS fake_install
2020 )
debian/changelog+148
@@ -1,3 +1,151 @@
1+unity8 (7.90+14.10.20140709.2-0ubuntu1) utopic; urgency=low
2+
3+ [ Michal Hruby ]
4+ * Fix FTBFS when using latest unity-api.
5+
6+ [ Michał Sawicz ]
7+ * Refactor carousel item activation.
8+ * Refactor ScopeItem into GenericScopeView.
9+ * Add initial support for scope customizations.
10+ * Make rating stars in PreviewReviewDisplay.qml non-interactive. (LP:
11+ #1337508)
12+
13+ [ Nick Dedekind ]
14+ * Added active call hint A hint is displayed in the indicator panel
15+ when an call is active on the Telephony Serivce
16+
17+ [ Albert Astals ]
18+ * We need to boostrap height also when we have 1 item ^_^ (LP:
19+ #1337408)
20+ * Add initial support for scope customizations.
21+ * CardCreator: Give a correct implicitHeight if we only have art The
22+ hasSubtitle change is really unrelated and not needed here, just
23+ sneaking it in to not create yet another review. (LP: #1330899)
24+ * Fake Scopes Plugin: Register PreviewModelInterface
25+
26+ [ Michael Zanetti ]
27+ * make the launcher's drag'n'drop indicator more prominent (LP:
28+ #1332042)
29+ * make launcher items live having them non-live is not really required
30+ and reveals an issue in combination with UbuntuShape (LP: #1302761)
31+ * Fade out launcher in place instead of moving it to the left on long
32+ left edge swipes. (LP: #1332096)
33+ * update launcher icon glow as requested by design (LP: #1336725)
34+ * update header in dash to use the new header from the SDK (LP:
35+ #1335491)
36+ * fix testPreview with larger GRID_UNIT_PX values
37+ * clip the corner of pinned icons in the launcher as per new design
38+ * update launcher background according to latest design (LP: #1336314)
39+ * Update Launcher's home button design according to new spec. (LP:
40+ #1329331)
41+
42+ [ CI bot ]
43+ * make launcher items live having them non-live is not really required
44+ and reveals an issue in combination with UbuntuShape (LP: #1302761)
45+
46+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 09 Jul 2014 19:46:11 +0000
47+
48+unity8 (7.90+14.10.20140707-0ubuntu1) utopic; urgency=low
49+
50+ [ Nick Dedekind ]
51+ * Added support for TransferMenu
52+
53+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 07 Jul 2014 11:40:59 +0000
54+
55+unity8 (7.90+14.10.20140703.1-0ubuntu1) utopic; urgency=low
56+
57+ [ Michał Sawicz ]
58+ * Initial code for a payment button widget, to handle purchasing apps
59+ from the click scope.
60+
61+ [ Nick Dedekind ]
62+ * Moved [Message]MenuItemFacotory from Unity.Indicators plugin to qml
63+ folder.
64+
65+ [ Albert Astals ]
66+ * EasingCurve: Initialize members
67+ * Fix valgrind warning by not emitting reset on model destructor That
68+ won't be supported until Qt 5.4 More info at https://bugreports.qt-
69+ project.org/browse/QTBUG-39780 Warning was ==16693== Invalid read of
70+ size 8 ==16693== at 0x72B19A0: QQmlContext::isValid() const
71+ (qqmlcontext.cpp:231) ==16693== by 0x736C82B:
72+ QQmlDelegateModelPrivate::emitChanges() (qqmldelegatemodel.cpp:1412)
73+ ==16693== by 0x7372AE6: QQmlDelegateModel::_q_modelReset()
74+ (qqmldelegatemodel.cpp:1463) ==16693== by 0x7397224:
75+ QQmlDelegateModel::qt_static_metacall(QObject*, QMetaObject::Call,
76+ int, void**) (moc_qqmldelegatemodel_p.cpp:196) ==16693== by
77+ 0x739769E: QQmlDelegateModel::qt_metacall(QMetaObject::Call, int,
78+ void**) (moc_qqmldelegatemodel_p.cpp:292) ==16693== by 0x66379CC:
79+ QMetaObject::activate(QObject*, int, int, void**) (in
80+ /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.3.0) ==16693== by
81+ 0x65AEEFD: QAbstractItemModel::endResetModel() (in /usr/lib/x86_64-
82+ linux-gnu/libQt5Core.so.5.3.0) ==16693== by 0x23461EFD:
83+ FakeIndicatorsModel::unload() (fakeindicatorsmodel.cpp:53) ==16693==
84+ by 0x23461E13: FakeIndicatorsModel::~FakeIndicatorsModel()
85+ (fakeindicatorsmodel.cpp:34) ==16693== by 0x2345C073:
86+ QQmlPrivate::QQmlElement<FakeIndicatorsModel>::~QQmlElement() (in
87+ /home/tsdgeos_work/phablet/unity8/investigate_test_shell_crash/build
88+ dir/tests/mocks/Unity/Indicators/libIndicatorsFakeQml.so) ==16693==
89+ by 0x2345C0A3:
90+ QQmlPrivate::QQmlElement<FakeIndicatorsModel>::~QQmlElement()
91+ (qqmlprivate.h:106) ==16693== by 0x663636B:
92+ QObjectPrivate::deleteChildren() (in /usr/lib/x86_64-linux-
93+ gnu/libQt5Core.so.5.3.0) ==16693== Address 0x1862d448 is 8 bytes
94+ inside a block of size 16 free'd ==16693== at 0x4C2C2BC: operator
95+ delete(void*) (vg_replace_malloc.c:503) ==16693== by 0x72B21B8:
96+ QQmlContextData::destroy() (qqmlcontext.cpp:647) ==16693== by
97+ 0x7293458: QQmlPrivate::qdeclarativeelement_destructor(QObject*)
98+ (qqmlengine.cpp:612) ==16693== by 0x6C0CADD:
99+ QQmlPrivate::QQmlElement<QQuickItem>::~QQmlElement()
100+ (qqmlprivate.h:105) ==16693== by 0x663636B:
101+ QObjectPrivate::deleteChildren() (in /usr/lib/x86_64-linux-
102+ gnu/libQt5Core.so.5.3.0) ==16693== by 0x663F0EB: QObject::~QObject()
103+ (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.3.0) ==16693== by
104+ 0x6BF64B5: QQuickItem::~QQuickItem() (qquickitem.cpp:2064) ==16693==
105+ by 0x6C0CAE5: QQmlPrivate::QQmlElement<QQuickItem>::~QQmlElement()
106+ (qqmlprivate.h:106) ==16693== by 0x663636B:
107+ QObjectPrivate::deleteChildren() (in /usr/lib/x86_64-linux-
108+ gnu/libQt5Core.so.5.3.0) ==16693== by 0x663F0EB: QObject::~QObject()
109+ (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.3.0) ==16693== by
110+ 0x6BF64B5: QQuickItem::~QQuickItem() (qquickitem.cpp:2064) ==16693==
111+ by 0x6C0CAE5: QQmlPrivate::QQmlElement<QQuickItem>::~QQmlElement()
112+ (qqmlprivate.h:106) (LP: #1332598)
113+
114+ [ Michael Zanetti ]
115+ * drop launcher item spacing (LP: #1332022)
116+ * change wording in launcher quicklist (LP: #1332035)
117+
118+ [ Alejandro J. Cura ]
119+ * Initial code for a payment button widget, to handle purchasing apps
120+ from the click scope.
121+
122+ [ Rodney Dawes ]
123+ * Initial code for a payment button widget, to handle purchasing apps
124+ from the click scope.
125+
126+ [ Renato Araujo Oliveira Filho ]
127+ * Create IndicatorsLight.qml component used to control indicator led.
128+ A blue led will pulse if the message indicator is blue and screen is
129+ off.
130+
131+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 03 Jul 2014 14:47:46 +0000
132+
133+unity8 (7.90+14.10.20140701.2-0ubuntu2) utopic; urgency=medium
134+
135+ * debian/control:
136+ list qtdeclarative5-ubuntu-ui-toolkit-plugin-gles as an alternative
137+ choice, since provides are not versionned, should restore installability
138+ on amd64 and i386
139+
140+ -- Sebastien Bacher <seb128@ubuntu.com> Thu, 03 Jul 2014 13:26:38 +0200
141+
142+unity8 (7.90+14.10.20140701.2-0ubuntu1) utopic; urgency=medium
143+
144+ [ Michał Sawicz ]
145+ * Adapt to suru theme.
146+
147+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 01 Jul 2014 15:10:35 +0000
148+
1149unity8 (7.89+14.10.20140627-0ubuntu1) utopic; urgency=low
2150
3151 [ Michael Terry ]
debian/control+11−6
@@ -13,12 +13,14 @@ Build-Depends: cmake,
1313 libgles2-mesa-dev[armhf],
1414 libglib2.0-dev,
1515 libgsettings-qt-dev,
16+ libhardware-dev,
1617 libhud-client2-dev,
1718 libpam0g-dev,
19+ libpay1-dev,
1820 libpulse-dev,
1921 libqmenumodel-dev (>= 0.2.7),
2022 libqt5xmlpatterns5-dev,
21− libunity-api-dev (>= 7.83),
23+ libunity-api-dev (>= 7.85),
2224 libunity-mir-dev,
2325 libusermetricsoutput1-dev,
2426 libxcb1-dev,
@@ -38,8 +40,8 @@ Build-Depends: cmake,
3840 qtdeclarative5-dev-tools,
3941 qtdeclarative5-private-dev (>= 5.2.1),
4042 qtdeclarative5-qtmultimedia-plugin,
41− qtdeclarative5-ubuntu-settings-components,
42− qtdeclarative5-ubuntu-ui-toolkit-plugin,
43+ qtdeclarative5-ubuntu-settings-components (>= 0.3),
44+ qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 0.1.49) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 0.1.49),
4345 ttf-ubuntu-font-family,
4446Standards-Version: 3.9.4
4547Homepage: http://launchpad.net/unity
@@ -52,7 +54,7 @@ Vcs-Browser: https://bazaar.launchpad.net/~unity-team/unity8/trunk
5254Package: indicators-client
5355Architecture: amd64 armhf i386
5456Depends: qmenumodel-qml (>= 0.2.7),
55− qtdeclarative5-ubuntu-ui-toolkit-plugin,
57+ qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 0.1.49) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 0.1.49),
5658 unity8 (= ${binary:Version}),
5759 ${misc:Depends},
5860 ${shlibs:Depends},
@@ -79,7 +81,8 @@ Depends: gsettings-desktop-schemas,
7981 qmenumodel-qml (>= 0.2.7),
8082 qml-module-qtquick-xmllistmodel,
8183 qtdeclarative5-gsettings1.0,
82− qtdeclarative5-ubuntu-settings-components,
84+ qtdeclarative5-ubuntu-settings-components (>= 0.3),
85+ qtdeclarative5-ubuntu-telephony0.1,
8386 unity-launcher-impl-3,
8487 unity8-common (= ${source:Version}),
8588 unity8-private (= ${binary:Version}),
@@ -100,7 +103,7 @@ Description: Unity 8 shell
100103Package: unity8-common
101104Architecture: all
102105Depends: qtdeclarative5-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
103− qtdeclarative5-ubuntu-ui-toolkit-plugin,
106+ qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 0.1.49) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 0.1.49),
104107 qtdeclarative5-unity-notifications-plugin | unity-notifications-impl,
105108 ubuntu-thumbnailer-impl-0,
106109 unity-application-impl-2,
@@ -160,7 +163,9 @@ Architecture: any
160163Multi-Arch: same
161164Pre-Depends: ${misc:Pre-Depends},
162165Depends: gsettings-ubuntu-schemas,
166+ libhardware2,
163167 libunity-core-6.0-9,
168+ pay-service,
164169 ${misc:Depends},
165170 ${shlibs:Depends},
166171Provides: unity-launcher-impl,
debian/unity8-private.install+1
@@ -2,6 +2,7 @@ usr/lib/*/unity8/qml/AccountsService
22usr/lib/*/unity8/qml/Dash
33usr/lib/*/unity8/qml/HudClient
44usr/lib/*/unity8/qml/LightDM
5+usr/lib/*/unity8/qml/Lights
56usr/lib/*/unity8/qml/Powerd
67usr/lib/*/unity8/qml/SessionBroadcast
78usr/lib/*/unity8/qml/Ubuntu
doc/CMakeLists.txt+2
@@ -15,6 +15,8 @@ else()
1515 ${CMAKE_SOURCE_DIR}/src/*.cpp
1616 ${CMAKE_SOURCE_DIR}/plugins/*.h
1717 ${CMAKE_SOURCE_DIR}/plugins/*.cpp
18+ ${CMAKE_SOURCE_DIR}/plugins/*.qml
19+ ${CMAKE_SOURCE_DIR}/plugins/*.js
1820 ${CMAKE_SOURCE_DIR}/qml/*.qml
1921 ${CMAKE_SOURCE_DIR}/qml/*.js
2022 ${CMAKE_SOURCE_DIR}/tests/autopilot/*.py
include/paths.h.in−8
@@ -127,12 +127,4 @@ inline void appendImportPaths(QQmlEngine *engine, const QStringList &paths)
127127 engine->setImportPathList(importPathList);
128128}
129129
130−inline void resolveIconTheme() {
131− const char *ubuntuIconTheme = getenv("UBUNTU_ICON_THEME");
132− if (ubuntuIconTheme == NULL) {
133− ubuntuIconTheme = "ubuntu-mobile";
134− }
135− QIcon::setThemeName(ubuntuIconTheme);
136−}
137−
138130#endif
plugins/AccountsService/AccountsService.qmltypesnew file+22
@@ -0,0 +1,22 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable AccountsService 0.1 plugins'
8+
9+Module {
10+ Component {
11+ name: "AccountsService"
12+ prototype: "QObject"
13+ exports: ["AccountsService/AccountsService 0.1"]
14+ isCreatable: false
15+ isSingleton: true
16+ exportMetaObjectRevisions: [0]
17+ Property { name: "user"; type: "string" }
18+ Property { name: "demoEdges"; type: "bool" }
19+ Property { name: "backgroundFile"; type: "string"; isReadonly: true }
20+ Property { name: "statsWelcomeScreen"; type: "bool"; isReadonly: true }
21+ }
22+}
plugins/CMakeLists.txt+1
@@ -14,6 +14,7 @@ endmacro()
1414add_subdirectory(AccountsService)
1515add_subdirectory(HudClient)
1616add_subdirectory(LightDM)
17+add_subdirectory(Lights)
1718add_subdirectory(Dash)
1819add_subdirectory(Powerd)
1920add_subdirectory(SessionBroadcast)
plugins/Dash/CardCreator.js+7−4
@@ -289,6 +289,7 @@ function cardString(template, components) {
289289 property var cardData; \n\
290290 property var artShapeBorderSource: undefined; \n\
291291 property real fontScale: 1.0; \n\
292+ property var scopeStyle: null; \n\
292293 property int headerAlignment: Text.AlignLeft; \n\
293294 property int fixedHeaderHeight: -1; \n\
294295 property size fixedArtShapeSize: Qt.size(-1, -1); \n\
@@ -305,7 +306,7 @@ function cardString(template, components) {
305306 var hasTitle = components["title"] || false;
306307 var hasMascot = components["mascot"] || false;
307308 var headerAsOverlay = hasArt && template && template["overlay"] === true && (hasTitle || hasMascot);
308− var hasSubtitle = components["subtitle"] || false;
309+ var hasSubtitle = hasTitle && components["subtitle"] || false;
309310 var hasHeaderRow = hasMascot && hasTitle;
310311
311312 if (hasBackground) {
@@ -407,7 +408,7 @@ function cardString(template, components) {
407408 mascotCode = kMascotImageCode.arg(anchors).arg(mascotImageVisible);
408409 }
409410
410− var summaryColorWithBackground = 'backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < 0.7 ? "white" : "grey"';
411+ var summaryColorWithBackground = 'backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < 0.7 ? "white" : (root.scopeStyle ? root.scopeStyle.foreground : "grey")';
411412
412413 var titleSubtitleCode = "";
413414 if (hasTitle) {
@@ -419,7 +420,7 @@ function cardString(template, components) {
419420 } else if (hasBackground) {
420421 color = summaryColorWithBackground;
421422 } else {
422− color = '"grey"';
423+ color = 'root.scopeStyle ? root.scopeStyle.foreground : "grey"';
423424 }
424425
425426 var titleAnchors;
@@ -495,7 +496,7 @@ function cardString(template, components) {
495496 if (hasBackground) {
496497 color = summaryColorWithBackground;
497498 } else {
498− color = '"grey"';
499+ color = 'root.scopeStyle ? root.scopeStyle.foreground : "grey"';
499500 }
500501
501502 var summaryTopMargin = (hasMascot || hasSubtitle ? 'anchors.margins' : '0');
@@ -513,6 +514,8 @@ function cardString(template, components) {
513514 code += 'implicitHeight: subtitleLabel.y + subtitleLabel.height + units.gu(1);\n';
514515 } else if (hasTitle) {
515516 code += 'implicitHeight: titleLabel.y + titleLabel.height + units.gu(1);\n';
517+ } else if (hasArt) {
518+ code += 'implicitHeight: artShapeHolder.height;\n';
516519 }
517520 // Close the AbstractButton
518521 code += '}\n';
plugins/Dash/Dash.qmltypesnew file+95
@@ -0,0 +1,95 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Dash 0.1 plugins'
8+
9+Module {
10+ Component {
11+ name: "AbstractDashView"
12+ defaultProperty: "data"
13+ prototype: "QQuickItem"
14+ Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
15+ Property { name: "delegate"; type: "QQmlComponent"; isPointer: true }
16+ Property { name: "columnSpacing"; type: "double" }
17+ Property { name: "rowSpacing"; type: "double" }
18+ Property { name: "displayMarginBeginning"; type: "double" }
19+ Property { name: "displayMarginEnd"; type: "double" }
20+ }
21+ Component {
22+ name: "HorizontalJournal"
23+ defaultProperty: "data"
24+ prototype: "AbstractDashView"
25+ exports: ["Dash/HorizontalJournal 0.1"]
26+ exportMetaObjectRevisions: [0]
27+ Property { name: "rowHeight"; type: "double" }
28+ }
29+ Component {
30+ name: "ListViewWithPageHeader"
31+ defaultProperty: "flickableData"
32+ prototype: "QQuickFlickable"
33+ exports: ["Dash/ListViewWithPageHeader 0.1"]
34+ exportMetaObjectRevisions: [0]
35+ Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
36+ Property { name: "delegate"; type: "QQmlComponent"; isPointer: true }
37+ Property { name: "pageHeader"; type: "QQuickItem"; isPointer: true }
38+ Property { name: "sectionDelegate"; type: "QQmlComponent"; isPointer: true }
39+ Property { name: "sectionProperty"; type: "string" }
40+ Property { name: "forceNoClip"; type: "bool" }
41+ Property { name: "stickyHeaderHeight"; type: "int"; isReadonly: true }
42+ Signal { name: "headerChanged" }
43+ Method { name: "positionAtBeginning" }
44+ Method { name: "showHeader" }
45+ Method {
46+ name: "item"
47+ type: "QQuickItem*"
48+ Parameter { name: "modelIndex"; type: "int" }
49+ }
50+ Method {
51+ name: "maximizeVisibleArea"
52+ type: "bool"
53+ Parameter { name: "modelIndex"; type: "int" }
54+ }
55+ Method {
56+ name: "maximizeVisibleArea"
57+ type: "bool"
58+ Parameter { name: "modelIndex"; type: "int" }
59+ Parameter { name: "itemHeight"; type: "int" }
60+ }
61+ }
62+ Component {
63+ name: "OrganicGrid"
64+ defaultProperty: "data"
65+ prototype: "AbstractDashView"
66+ exports: ["Dash/OrganicGrid 0.1"]
67+ exportMetaObjectRevisions: [0]
68+ Property { name: "smallDelegateSize"; type: "QSizeF" }
69+ Property { name: "bigDelegateSize"; type: "QSizeF" }
70+ }
71+ Component {
72+ name: "VerticalJournal"
73+ defaultProperty: "data"
74+ prototype: "AbstractDashView"
75+ exports: ["Dash/VerticalJournal 0.1"]
76+ exportMetaObjectRevisions: [0]
77+ Property { name: "columnWidth"; type: "double" }
78+ }
79+ Component {
80+ prototype: "QObject"
81+ name: "CardCreatorCache"
82+ exports: ["CardCreatorCache -1.-1"]
83+ exportMetaObjectRevisions: [-1]
84+ isComposite: true
85+ isCreatable: false
86+ isSingleton: true
87+ Property { name: "cache"; type: "QVariant" }
88+ Method {
89+ name: "getCardComponent"
90+ type: "QVariant"
91+ Parameter { name: "template"; type: "QVariant" }
92+ Parameter { name: "components"; type: "QVariant" }
93+ }
94+ }
95+}
plugins/Dash/ScopeStyle.qmlnew file+87
@@ -0,0 +1,87 @@
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.2
18+
19+/*! \brief Helper for processing scope customization options.
20+
21+ It will take the customizations object passed by the scope and
22+ process it to provide the scope UI with data such as colors or
23+ image paths.
24+ */
25+
26+QtObject {
27+ /// Style object passed from the scope
28+ property var style: Object()
29+
30+ /*! \brief Calculate luminance of the passed color
31+
32+ \note If not fully opaque, luminance is dependant on blending.
33+ */
34+ function luminance(color) {
35+ return 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b;
36+ }
37+
38+ /// Color used for text and symbolic icons
39+ readonly property color foreground: "foreground-color" in style ? style["foreground-color"] : d.defaultDark
40+
41+ /// Color used for the overall background
42+ readonly property color background: "background-color" in style ? style["background-color"] : "transparent"
43+
44+ /*! \brief Luminance threshold for switching between fore and background color
45+
46+ \note If background colour is not fully opaque, it's not taken into account.
47+ */
48+ readonly property real threshold: background.a !== 1.0 ? d.foregroundLuminance : (d.foregroundLuminance + d.backgroundLuminance) / 2
49+
50+ /*! \brief The lighter of foreground and background colors
51+
52+ \note If background color is not fully opaque, it's not taken into account
53+ and defaults to the theme-provided light color.
54+ */
55+ readonly property color light: {
56+ if (background.a !== 1.0) return d.foregroundLuminance > d.defaultLightLuminance ? foreground : d.defaultLight;
57+ return d.foregroundLuminance > d.backgroundLuminance ? foreground : background;
58+ }
59+
60+ /*! \brief The darker of foreground and background colors
61+
62+ \note If background color is not fully opaque, it's not taken into account
63+ and defaults to the theme-provided dark color.
64+ */
65+ readonly property color dark: {
66+ if (background.a !== 1.0) return d.foregroundLuminance < d.defaultDarkLuminance ? foreground : d.defaultDark;
67+ return d.foregroundLuminance < d.backgroundLuminance ? foreground : background;
68+ }
69+
70+ /// Source of the logo image for the header
71+ readonly property url headerLogo: "logo" in d.headerStyle ? d.headerStyle["logo"] : ""
72+
73+ //! @cond
74+ property var d: QtObject {
75+ readonly property real foregroundLuminance: luminance(foreground)
76+ readonly property real backgroundLuminance: luminance(background)
77+
78+ // FIXME: should be taken from the theme
79+ readonly property color defaultLight: "white"
80+ readonly property color defaultDark: "grey"
81+ readonly property real defaultLightLuminance: luminance(defaultLight)
82+ readonly property real defaultDarkLuminance: luminance(defaultDark)
83+
84+ readonly property var headerStyle: "page-header" in style ? style["page-header"] : { }
85+ }
86+ //! @endcond
87+}
plugins/Dash/qmldir+1
@@ -2,3 +2,4 @@ module Dash
22plugin Dash-qml
33typeinfo Dash.qmltypes
44singleton CardCreatorCache 0.1 CardCreatorCache.qml
5+ScopeStyle 0.1 ScopeStyle.qml
plugins/HudClient/HudClient.qmltypesnew file+91
@@ -0,0 +1,91 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable HudClient 0.1 plugins'
8+
9+Module {
10+ Component {
11+ name: "DeeListModel"
12+ prototype: "QAbstractListModel"
13+ Property { name: "name"; type: "string" }
14+ Property { name: "synchronized"; type: "bool"; isReadonly: true }
15+ Property { name: "count"; type: "int"; isReadonly: true }
16+ Signal {
17+ name: "nameChanged"
18+ Parameter { type: "string" }
19+ }
20+ Signal {
21+ name: "synchronizedChanged"
22+ Parameter { type: "bool" }
23+ }
24+ Signal {
25+ name: "roleNamesChanged"
26+ Parameter { type: "QHash<int,QByteArray>" }
27+ }
28+ Method {
29+ name: "get"
30+ type: "QVariantMap"
31+ Parameter { name: "row"; type: "int" }
32+ }
33+ Method { name: "count"; type: "int" }
34+ }
35+ Component {
36+ name: "HudClient"
37+ prototype: "QObject"
38+ exports: ["HudClient/HudClient 0.1"]
39+ exportMetaObjectRevisions: [0]
40+ Property { name: "results"; type: "DeeListModel"; isReadonly: true; isPointer: true }
41+ Property { name: "toolBarModel"; type: "QAbstractItemModel"; isReadonly: true; isPointer: true }
42+ Signal { name: "voiceQueryLoading" }
43+ Signal { name: "voiceQueryListening" }
44+ Signal { name: "voiceQueryHeardSomething" }
45+ Signal { name: "voiceQueryFailed" }
46+ Signal {
47+ name: "voiceQueryFinished"
48+ Parameter { name: "query"; type: "string" }
49+ }
50+ Signal { name: "commandExecuted" }
51+ Signal {
52+ name: "showParametrizedAction"
53+ Parameter { name: "action"; type: "string" }
54+ Parameter { name: "items"; type: "QVariant" }
55+ }
56+ Method {
57+ name: "executeCommand"
58+ Parameter { name: "index"; type: "int" }
59+ }
60+ Method {
61+ name: "setQuery"
62+ Parameter { name: "new_query"; type: "string" }
63+ }
64+ Method { name: "startVoiceQuery" }
65+ Method {
66+ name: "executeParametrizedAction"
67+ Parameter { name: "values"; type: "QVariant" }
68+ }
69+ Method {
70+ name: "updateParametrizedAction"
71+ Parameter { name: "values"; type: "QVariant" }
72+ }
73+ Method { name: "cancelParametrizedAction" }
74+ Method {
75+ name: "executeToolBarAction"
76+ Parameter { name: "action"; type: "HudClientQueryToolbarItems" }
77+ }
78+ }
79+ Component {
80+ name: "VolumePeakDetector"
81+ prototype: "QObject"
82+ exports: ["HudClient/VolumePeakDetector 0.1"]
83+ exportMetaObjectRevisions: [0]
84+ Property { name: "enabled"; type: "bool" }
85+ Property { name: "desiredInterval"; type: "int" }
86+ Signal {
87+ name: "newPeak"
88+ Parameter { name: "volume"; type: "float" }
89+ }
90+ }
91+}
plugins/LightDM/LightDM.qmltypesnew file+241
@@ -0,0 +1,241 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable LightDM 0.1 plugins'
8+
9+Module {
10+ Component {
11+ name: "Greeter"
12+ prototype: "QObject"
13+ exports: ["LightDM/Greeter 0.1"]
14+ isCreatable: false
15+ isSingleton: true
16+ exportMetaObjectRevisions: [0]
17+ Property { name: "authenticated"; type: "bool"; isReadonly: true }
18+ Property { name: "authenticationUser"; type: "string"; isReadonly: true }
19+ Property { name: "promptless"; type: "bool"; isReadonly: true }
20+ Signal {
21+ name: "showMessage"
22+ Parameter { name: "text"; type: "string" }
23+ Parameter { name: "isError"; type: "bool" }
24+ }
25+ Signal {
26+ name: "showPrompt"
27+ Parameter { name: "text"; type: "string" }
28+ Parameter { name: "isSecret"; type: "bool" }
29+ }
30+ Signal { name: "authenticationComplete" }
31+ Signal {
32+ name: "authenticationUserChanged"
33+ Parameter { name: "user"; type: "string" }
34+ }
35+ Signal {
36+ name: "requestAuthenticationUser"
37+ Parameter { name: "user"; type: "string" }
38+ }
39+ Method {
40+ name: "authenticate"
41+ Parameter { name: "username"; type: "string" }
42+ }
43+ Method { name: "authenticate" }
44+ Method {
45+ name: "respond"
46+ Parameter { name: "response"; type: "string" }
47+ }
48+ Method {
49+ name: "startSessionSync"
50+ type: "bool"
51+ Parameter { name: "session"; type: "string" }
52+ }
53+ Method { name: "startSessionSync"; type: "bool" }
54+ }
55+ Component {
56+ name: "QAbstractProxyModel"
57+ prototype: "QAbstractItemModel"
58+ Property { name: "sourceModel"; type: "QAbstractItemModel"; isPointer: true }
59+ }
60+ Component {
61+ name: "QLightDM::UsersModel"
62+ prototype: "QAbstractListModel"
63+ exports: ["LightDM/UserRoles 0.1"]
64+ isCreatable: false
65+ exportMetaObjectRevisions: [0]
66+ Enum {
67+ name: "UserModelRoles"
68+ values: {
69+ "NameRole": 256,
70+ "RealNameRole": 257,
71+ "LoggedInRole": 258,
72+ "BackgroundRole": 259,
73+ "SessionRole": 260,
74+ "HasMessagesRole": 261,
75+ "ImagePathRole": 262,
76+ "BackgroundPathRole": 263
77+ }
78+ }
79+ }
80+ Component {
81+ name: "QSortFilterProxyModel"
82+ prototype: "QAbstractProxyModel"
83+ Property { name: "filterRegExp"; type: "QRegExp" }
84+ Property { name: "filterKeyColumn"; type: "int" }
85+ Property { name: "dynamicSortFilter"; type: "bool" }
86+ Property { name: "filterCaseSensitivity"; type: "Qt::CaseSensitivity" }
87+ Property { name: "sortCaseSensitivity"; type: "Qt::CaseSensitivity" }
88+ Property { name: "isSortLocaleAware"; type: "bool" }
89+ Property { name: "sortRole"; type: "int" }
90+ Property { name: "filterRole"; type: "int" }
91+ Method {
92+ name: "setFilterRegExp"
93+ Parameter { name: "pattern"; type: "string" }
94+ }
95+ Method {
96+ name: "setFilterWildcard"
97+ Parameter { name: "pattern"; type: "string" }
98+ }
99+ Method {
100+ name: "setFilterFixedString"
101+ Parameter { name: "pattern"; type: "string" }
102+ }
103+ Method { name: "clear" }
104+ Method { name: "invalidate" }
105+ }
106+ Component {
107+ name: "QSortFilterProxyModelQML"
108+ prototype: "QSortFilterProxyModel"
109+ Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
110+ Property { name: "totalCount"; type: "int"; isReadonly: true }
111+ Property { name: "count"; type: "int"; isReadonly: true }
112+ Property { name: "invertMatch"; type: "bool" }
113+ Signal {
114+ name: "invertMatchChanged"
115+ Parameter { type: "bool" }
116+ }
117+ Method {
118+ name: "get"
119+ type: "QVariantMap"
120+ Parameter { name: "row"; type: "int" }
121+ }
122+ Method {
123+ name: "data"
124+ type: "QVariant"
125+ Parameter { name: "row"; type: "int" }
126+ Parameter { name: "role"; type: "int" }
127+ }
128+ Method { name: "count"; type: "int" }
129+ Method {
130+ name: "findFirst"
131+ type: "int"
132+ Parameter { name: "role"; type: "int" }
133+ Parameter { name: "value"; type: "QVariant" }
134+ }
135+ Method {
136+ name: "mapRowToSource"
137+ type: "int"
138+ Parameter { name: "row"; type: "int" }
139+ }
140+ Method {
141+ name: "mapFromSource"
142+ type: "int"
143+ Parameter { name: "row"; type: "int" }
144+ }
145+ Method {
146+ name: "mapToSource"
147+ type: "int"
148+ Parameter { name: "row"; type: "int" }
149+ }
150+ }
151+ Component {
152+ name: "UserMetricsOutput::ColorTheme"
153+ prototype: "QObject"
154+ Property { name: "start"; type: "QColor"; isReadonly: true }
155+ Property { name: "main"; type: "QColor"; isReadonly: true }
156+ Property { name: "end"; type: "QColor"; isReadonly: true }
157+ Signal {
158+ name: "startChanged"
159+ Parameter { name: "color"; type: "QColor" }
160+ }
161+ Signal {
162+ name: "mainChanged"
163+ Parameter { name: "color"; type: "QColor" }
164+ }
165+ Signal {
166+ name: "endChanged"
167+ Parameter { name: "color"; type: "QColor" }
168+ }
169+ }
170+ Component {
171+ name: "UserMetricsOutput::UserMetrics"
172+ prototype: "QObject"
173+ exports: ["LightDM/Infographic 0.1"]
174+ isCreatable: false
175+ isSingleton: true
176+ exportMetaObjectRevisions: [0]
177+ Property { name: "label"; type: "string"; isReadonly: true }
178+ Property { name: "username"; type: "string" }
179+ Property {
180+ name: "firstColor"
181+ type: "UserMetricsOutput::ColorTheme"
182+ isReadonly: true
183+ isPointer: true
184+ }
185+ Property {
186+ name: "secondColor"
187+ type: "UserMetricsOutput::ColorTheme"
188+ isReadonly: true
189+ isPointer: true
190+ }
191+ Property { name: "firstMonth"; type: "QAbstractItemModel"; isReadonly: true; isPointer: true }
192+ Property { name: "secondMonth"; type: "QAbstractItemModel"; isReadonly: true; isPointer: true }
193+ Property { name: "currentDay"; type: "int"; isReadonly: true }
194+ Signal {
195+ name: "labelChanged"
196+ Parameter { name: "label"; type: "string" }
197+ }
198+ Signal {
199+ name: "usernameChanged"
200+ Parameter { name: "username"; type: "string" }
201+ }
202+ Signal {
203+ name: "firstColorChanged"
204+ Parameter { name: "color"; type: "ColorTheme"; isPointer: true }
205+ }
206+ Signal {
207+ name: "firstMonthChanged"
208+ Parameter { name: "firstMonth"; type: "QAbstractItemModel"; isPointer: true }
209+ }
210+ Signal {
211+ name: "currentDayChanged"
212+ Parameter { name: "currentDay"; type: "int" }
213+ }
214+ Signal {
215+ name: "secondColorChanged"
216+ Parameter { name: "color"; type: "ColorTheme"; isPointer: true }
217+ }
218+ Signal {
219+ name: "secondMonthChanged"
220+ Parameter { name: "secondMonth"; type: "QAbstractItemModel"; isPointer: true }
221+ }
222+ Signal { name: "nextDataSource" }
223+ Signal { name: "readyForDataChange" }
224+ Signal { name: "dataAboutToAppear" }
225+ Signal { name: "dataAppeared" }
226+ Signal { name: "dataAboutToChange" }
227+ Signal { name: "dataChanged" }
228+ Signal { name: "dataAboutToDisappear" }
229+ Signal { name: "dataDisappeared" }
230+ Method { name: "nextDataSourceSlot" }
231+ Method { name: "readyForDataChangeSlot" }
232+ }
233+ Component {
234+ name: "UsersModel"
235+ prototype: "QSortFilterProxyModelQML"
236+ exports: ["LightDM/Users 0.1"]
237+ isCreatable: false
238+ isSingleton: true
239+ exportMetaObjectRevisions: [0]
240+ }
241+}
plugins/Lights/CMakeLists.txtnew file+18
@@ -0,0 +1,18 @@
1+include(FindPkgConfig)
2+
3+pkg_check_modules(ANDROID_HEADERS REQUIRED android-headers)
4+pkg_check_modules(ANDROID_HARDWARE REQUIRED libhardware)
5+
6+include_directories(
7+ ${ANDROID_HEADERS_INCLUDE_DIRS}
8+)
9+
10+add_library(Lights-qml MODULE
11+ plugin.cpp
12+ Lights.cpp
13+ )
14+
15+qt5_use_modules(Lights-qml Qml Gui)
16+target_link_libraries(Lights-qml ${ANDROID_HARDWARE_LIBRARIES})
17+
18+add_unity8_plugin(Lights 0.1 Lights TARGETS Lights-qml)
plugins/Lights/Lights.cppnew file+182
@@ -0,0 +1,182 @@
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+ * Author: Renato Araujo Oliveira Filho <renato.filho@canonical.com>
17+ */
18+
19+#include "Lights.h"
20+#include <QtCore/QDebug>
21+
22+extern "C" {
23+#include <hardware/hardware.h>
24+#include <hardware/lights.h>
25+#include <string.h>
26+}
27+
28+Lights::Lights(QObject* parent)
29+ : QObject(parent),
30+ m_lightDevice(0),
31+ m_color("blue"),
32+ m_state(Lights::Off),
33+ m_onMs(1000),
34+ m_offMs(3000)
35+{
36+}
37+
38+Lights::~Lights()
39+{
40+ if (m_lightDevice) {
41+ hw_device_t* device = (hw_device_t*) m_lightDevice;
42+ device->close(device);
43+ }
44+}
45+
46+void Lights::setState(Lights::State newState)
47+{
48+ if (m_state != newState) {
49+ if (newState == Lights::On) {
50+ turnOn();
51+ } else {
52+ turnOff();
53+ }
54+ }
55+}
56+
57+Lights::State Lights::state() const
58+{
59+ return m_state;
60+}
61+
62+void Lights::setColor(const QColor &color)
63+{
64+ if (m_color != color) {
65+ m_color = color;
66+ Q_EMIT colorChanged(m_color);
67+ // FIXME: update the collor if the light is already on
68+ }
69+}
70+
71+QColor Lights::color() const
72+{
73+ return m_color;
74+}
75+
76+int Lights::onMillisec() const
77+{
78+ return m_onMs;
79+}
80+
81+void Lights::setOnMillisec(int onMs)
82+{
83+ if (m_onMs != onMs) {
84+ m_onMs = onMs;
85+ Q_EMIT onMillisecChanged(m_onMs);
86+ // FIXME: update the property if the light is already on
87+ }
88+}
89+
90+int Lights::offMillisec() const
91+{
92+ return m_offMs;
93+}
94+
95+void Lights::setOffMillisec(int offMs)
96+{
97+ if (m_offMs != offMs) {
98+ m_offMs = offMs;
99+ Q_EMIT offMillisecChanged(m_offMs);
100+ // FIXME: update the property if the light is already on
101+ }
102+}
103+
104+bool Lights::init()
105+{
106+ if (m_lightDevice) {
107+ return true;
108+ }
109+
110+ int err;
111+ hw_module_t* module;
112+
113+ err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);
114+ if (err == 0) {
115+ hw_device_t* device;
116+ err = module->methods->open(module, LIGHT_ID_NOTIFICATIONS, &device);
117+ if (err == 0) {
118+ m_lightDevice = (light_device_t*)device;
119+ return true;
120+ } else {
121+ qWarning() << "Failed to access notification lights";
122+ }
123+ } else {
124+ qWarning() << "Failed to initialize lights hardware.";
125+ }
126+ return false;
127+}
128+
129+void Lights::turnOn()
130+{
131+ if (!init()) {
132+ qWarning() << "No lights device";
133+ return;
134+ }
135+
136+ if (m_state == Lights::On) {
137+ return;
138+ }
139+
140+ // pulse
141+ light_state_t state;
142+ memset(&state, 0, sizeof(light_state_t));
143+ state.color = m_color.rgba();
144+ state.flashMode = LIGHT_FLASH_TIMED;
145+ state.flashOnMS = m_onMs;
146+ state.flashOffMS = m_offMs;
147+ state.brightnessMode = BRIGHTNESS_MODE_USER;
148+
149+ if (m_lightDevice->set_light(m_lightDevice, &state) != 0) {
150+ qWarning() << "Failed to turn the light off";
151+ } else {
152+ m_state = Lights::On;
153+ Q_EMIT stateChanged(m_state);
154+ }
155+}
156+
157+void Lights::turnOff()
158+{
159+ if (!init()) {
160+ qWarning() << "No lights device";
161+ return;
162+ }
163+
164+ if (m_state == Lights::Off) {
165+ return;
166+ }
167+
168+ light_state_t state;
169+ memset(&state, 0, sizeof(light_state_t));
170+ state.color = 0x00000000;
171+ state.flashMode = LIGHT_FLASH_NONE;
172+ state.flashOnMS = 0;
173+ state.flashOffMS = 0;
174+ state.brightnessMode = 0;
175+
176+ if (m_lightDevice->set_light(m_lightDevice, &state) != 0) {
177+ qWarning() << "Failed to turn the light off";
178+ } else {
179+ m_state = Lights::Off;
180+ Q_EMIT stateChanged(m_state);
181+ }
182+}
plugins/Lights/Lights.hnew file+75
@@ -0,0 +1,75 @@
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+ * Author: Renato Araujo Oliveira Filho <renato.filho@canonical.com>
17+ */
18+
19+#ifndef UNITY_LIGHTS_H
20+#define UNITY_LIGHTS_H
21+
22+#include <QtCore/QObject>
23+#include <QtGui/QColor>
24+
25+struct light_device_t;
26+
27+class Lights: public QObject
28+{
29+ Q_OBJECT
30+ Q_ENUMS(State)
31+ Q_PROPERTY(State state READ state WRITE setState NOTIFY stateChanged)
32+ Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
33+ Q_PROPERTY(int onMillisec READ onMillisec WRITE setOnMillisec NOTIFY onMillisecChanged)
34+ Q_PROPERTY(int offMillisec READ offMillisec WRITE setOffMillisec NOTIFY offMillisecChanged)
35+
36+public:
37+ enum State {
38+ Off,
39+ On,
40+ };
41+
42+ explicit Lights(QObject *parent = 0);
43+ ~Lights();
44+
45+ void setState(State newState);
46+ State state() const;
47+
48+ void setColor(const QColor &color);
49+ QColor color() const;
50+
51+ int onMillisec() const;
52+ void setOnMillisec(int onMs);
53+
54+ int offMillisec() const;
55+ void setOffMillisec(int offMs);
56+
57+Q_SIGNALS:
58+ void stateChanged(State newState);
59+ void colorChanged(const QColor &color);
60+ void onMillisecChanged(int onMs);
61+ void offMillisecChanged(int offMs);
62+
63+private:
64+ light_device_t* m_lightDevice;
65+ QColor m_color;
66+ State m_state;
67+ int m_onMs;
68+ int m_offMs;
69+
70+ bool init();
71+ void turnOff();
72+ void turnOn();
73+};
74+
75+#endif
plugins/Lights/plugin.cppnew file+35
@@ -0,0 +1,35 @@
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+ * Author: Renato Araujo Oliveira Filho <renato.filho@canonical.com>
17+ */
18+
19+#include "plugin.h"
20+#include "Lights.h"
21+
22+#include <QtQml/qqml.h>
23+
24+static QObject *lights_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
25+{
26+ Q_UNUSED(engine)
27+ Q_UNUSED(scriptEngine)
28+ return new Lights();
29+}
30+
31+void LightsPlugin::registerTypes(const char *uri)
32+{
33+ Q_ASSERT(uri == QLatin1String("Lights"));
34+ qmlRegisterSingletonType<Lights>(uri, 0, 1, "Lights", lights_provider);
35+}
plugins/Lights/plugin.hnew file+34
@@ -0,0 +1,34 @@
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+ * Author: Renato Araujo Oliveira Filho <renato.filho@canonical.com>
17+ */
18+
19+#ifndef LIGHTS_PLUGIN_H
20+#define LIGHTS_PLUGIN_H
21+
22+#include <QtQml/QQmlEngine>
23+#include <QtQml/QQmlExtensionPlugin>
24+
25+class LightsPlugin : public QQmlExtensionPlugin
26+{
27+ Q_OBJECT
28+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29+
30+public:
31+ void registerTypes(const char *uri);
32+};
33+
34+#endif
plugins/Lights/qmldirnew file+3
@@ -0,0 +1,3 @@
1+module Lights
2+plugin Lights-qml
3+typeinfo Lights.qmltypes
plugins/Powerd/Powerd.qmltypesnew file+46
@@ -0,0 +1,46 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Powerd 0.1 plugins'
8+
9+Module {
10+ Component {
11+ name: "Powerd"
12+ prototype: "QObject"
13+ exports: ["Powerd/Powerd 0.1"]
14+ isCreatable: false
15+ isSingleton: true
16+ exportMetaObjectRevisions: [0]
17+ Enum {
18+ name: "DisplayFlag"
19+ values: {
20+ "UseProximity": 1,
21+ "DisableAutoBrightness": 2,
22+ "Bright": 4
23+ }
24+ }
25+ Enum {
26+ name: "DisplayFlags"
27+ values: {
28+ "UseProximity": 1,
29+ "DisableAutoBrightness": 2,
30+ "Bright": 4
31+ }
32+ }
33+ Enum {
34+ name: "Status"
35+ values: {
36+ "Off": 0,
37+ "On": 1
38+ }
39+ }
40+ Signal {
41+ name: "displayPowerStateChange"
42+ Parameter { name: "status"; type: "int" }
43+ Parameter { name: "flags"; type: "uint" }
44+ }
45+ }
46+}
plugins/SessionBroadcast/SessionBroadcast.qmltypesnew file+19
@@ -0,0 +1,19 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable SessionBroadcast 0.1 plugins'
8+
9+Module {
10+ Component {
11+ name: "SessionBroadcast"
12+ prototype: "QObject"
13+ exports: ["SessionBroadcast/SessionBroadcast 0.1"]
14+ isCreatable: false
15+ isSingleton: true
16+ exportMetaObjectRevisions: [0]
17+ Signal { name: "showHome" }
18+ }
19+}
plugins/Ubuntu/CMakeLists.txt+1
@@ -1,2 +1,3 @@
11add_subdirectory(Gestures)
22add_subdirectory(DownloadDaemonListener)
3+add_subdirectory(Payments)
plugins/Ubuntu/DownloadDaemonListener/DownloadDaemonListener.qmltypesnew file+60
@@ -0,0 +1,60 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Ubuntu.DownloadDaemonListener 0.1 plugins'
8+
9+Module {
10+ Component {
11+ name: "DownloadTracker"
12+ prototype: "QObject"
13+ exports: ["Ubuntu.DownloadDaemonListener/DownloadTracker 0.1"]
14+ exportMetaObjectRevisions: [0]
15+ Property { name: "service"; type: "string" }
16+ Property { name: "dbusPath"; type: "string" }
17+ Property { name: "serviceReady"; type: "bool"; isReadonly: true }
18+ Signal {
19+ name: "serviceChanged"
20+ Parameter { name: "service"; type: "string" }
21+ }
22+ Signal {
23+ name: "dbusPathChanged"
24+ Parameter { name: "dbusPath"; type: "string" }
25+ }
26+ Signal {
27+ name: "serviceReadyChanged"
28+ Parameter { name: "serviceReady"; type: "bool" }
29+ }
30+ Signal {
31+ name: "canceled"
32+ Parameter { name: "success"; type: "bool" }
33+ }
34+ Signal {
35+ name: "error"
36+ Parameter { name: "error"; type: "string" }
37+ }
38+ Signal {
39+ name: "finished"
40+ Parameter { name: "path"; type: "string" }
41+ }
42+ Signal {
43+ name: "paused"
44+ Parameter { name: "success"; type: "bool" }
45+ }
46+ Signal {
47+ name: "progress"
48+ Parameter { name: "received"; type: "qulonglong" }
49+ Parameter { name: "total"; type: "qulonglong" }
50+ }
51+ Signal {
52+ name: "resumed"
53+ Parameter { name: "success"; type: "bool" }
54+ }
55+ Signal {
56+ name: "started"
57+ Parameter { name: "success"; type: "bool" }
58+ }
59+ }
60+}
plugins/Ubuntu/Gestures/DirectionalDragArea.cpp+1
@@ -378,6 +378,7 @@ void DirectionalDragArea::touchEvent_undecided(QTouchEvent *event)
378378 // touch has ended before recognition concluded
379379 DDA_DEBUG("Touch has ended before recognition concluded");
380380 setStatus(WaitingForTouch);
381+ Q_EMIT tapped();
381382 return;
382383 }
383384
plugins/Ubuntu/Gestures/DirectionalDragArea.h+1
@@ -212,6 +212,7 @@ Q_SIGNALS:
212212 void touchYChanged(qreal value);
213213 void touchSceneXChanged(qreal value);
214214 void touchSceneYChanged(qreal value);
215+ void tapped();
215216
216217protected:
217218 virtual void touchEvent(QTouchEvent *event);
plugins/Ubuntu/Gestures/Gestures.qmltypesnew file+153
@@ -0,0 +1,153 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Ubuntu.Gestures 0.1 plugins'
8+
9+Module {
10+ Component {
11+ name: "AxisVelocityCalculator"
12+ prototype: "QObject"
13+ exports: ["Ubuntu.Gestures/AxisVelocityCalculator 0.1"]
14+ exportMetaObjectRevisions: [0]
15+ Property { name: "trackedPosition"; type: "double" }
16+ Signal {
17+ name: "trackedPositionChanged"
18+ Parameter { name: "value"; type: "double" }
19+ }
20+ Method { name: "calculate"; type: "double" }
21+ Method { name: "reset" }
22+ }
23+ Component {
24+ name: "Direction"
25+ prototype: "QObject"
26+ exports: ["Ubuntu.Gestures/Direction 0.1"]
27+ isCreatable: false
28+ isSingleton: true
29+ exportMetaObjectRevisions: [0]
30+ Enum {
31+ name: "Type"
32+ values: {
33+ "Rightwards": 0,
34+ "Leftwards": 1,
35+ "Downwards": 2,
36+ "Upwards": 3
37+ }
38+ }
39+ Method {
40+ name: "isHorizontal"
41+ type: "bool"
42+ Parameter { name: "type"; type: "Direction::Type" }
43+ }
44+ Method {
45+ name: "isVertical"
46+ type: "bool"
47+ Parameter { name: "type"; type: "Direction::Type" }
48+ }
49+ Method {
50+ name: "isPositive"
51+ type: "bool"
52+ Parameter { name: "type"; type: "Direction::Type" }
53+ }
54+ }
55+ Component {
56+ name: "DirectionalDragArea"
57+ defaultProperty: "data"
58+ prototype: "QQuickItem"
59+ exports: ["Ubuntu.Gestures/DirectionalDragArea 0.1"]
60+ exportMetaObjectRevisions: [0]
61+ Enum {
62+ name: "Status"
63+ values: {
64+ "WaitingForTouch": 0,
65+ "Undecided": 1,
66+ "Recognized": 2
67+ }
68+ }
69+ Property { name: "direction"; type: "Direction::Type" }
70+ Property { name: "distance"; type: "double"; isReadonly: true }
71+ Property { name: "sceneDistance"; type: "double"; isReadonly: true }
72+ Property { name: "touchX"; type: "double"; isReadonly: true }
73+ Property { name: "touchY"; type: "double"; isReadonly: true }
74+ Property { name: "touchSceneX"; type: "double"; isReadonly: true }
75+ Property { name: "touchSceneY"; type: "double"; isReadonly: true }
76+ Property { name: "status"; type: "Status"; isReadonly: true }
77+ Property { name: "dragging"; type: "bool"; isReadonly: true }
78+ Property { name: "maxDeviation"; type: "double" }
79+ Property { name: "wideningAngle"; type: "double" }
80+ Property { name: "distanceThreshold"; type: "double" }
81+ Property { name: "minSpeed"; type: "double" }
82+ Property { name: "maxSilenceTime"; type: "int" }
83+ Property { name: "compositionTime"; type: "int" }
84+ Signal {
85+ name: "directionChanged"
86+ Parameter { name: "direction"; type: "Direction::Type" }
87+ }
88+ Signal {
89+ name: "statusChanged"
90+ Parameter { name: "value"; type: "Status" }
91+ }
92+ Signal {
93+ name: "draggingChanged"
94+ Parameter { name: "value"; type: "bool" }
95+ }
96+ Signal {
97+ name: "distanceChanged"
98+ Parameter { name: "value"; type: "double" }
99+ }
100+ Signal {
101+ name: "sceneDistanceChanged"
102+ Parameter { name: "value"; type: "double" }
103+ }
104+ Signal {
105+ name: "maxDeviationChanged"
106+ Parameter { name: "value"; type: "double" }
107+ }
108+ Signal {
109+ name: "wideningAngleChanged"
110+ Parameter { name: "value"; type: "double" }
111+ }
112+ Signal {
113+ name: "distanceThresholdChanged"
114+ Parameter { name: "value"; type: "double" }
115+ }
116+ Signal {
117+ name: "minSpeedChanged"
118+ Parameter { name: "value"; type: "double" }
119+ }
120+ Signal {
121+ name: "maxSilenceTimeChanged"
122+ Parameter { name: "value"; type: "int" }
123+ }
124+ Signal {
125+ name: "compositionTimeChanged"
126+ Parameter { name: "value"; type: "int" }
127+ }
128+ Signal {
129+ name: "touchXChanged"
130+ Parameter { name: "value"; type: "double" }
131+ }
132+ Signal {
133+ name: "touchYChanged"
134+ Parameter { name: "value"; type: "double" }
135+ }
136+ Signal {
137+ name: "touchSceneXChanged"
138+ Parameter { name: "value"; type: "double" }
139+ }
140+ Signal {
141+ name: "touchSceneYChanged"
142+ Parameter { name: "value"; type: "double" }
143+ }
144+ }
145+ Component {
146+ name: "PressedOutsideNotifier"
147+ defaultProperty: "data"
148+ prototype: "QQuickItem"
149+ exports: ["Ubuntu.Gestures/PressedOutsideNotifier 0.1"]
150+ exportMetaObjectRevisions: [0]
151+ Signal { name: "pressedOutside" }
152+ }
153+}
plugins/Ubuntu/Payments/CMakeLists.txtnew file+20
@@ -0,0 +1,20 @@
1+include_directories(
2+ ${CMAKE_CURRENT_SOURCE_DIR}
3+ ${CMAKE_CURRENT_BINARY_DIR}
4+)
5+
6+set(PAYMENTS_SOURCES
7+ plugin.cpp
8+ Payments.cpp
9+)
10+
11+add_library(Payments MODULE ${PAYMENTS_SOURCES})
12+
13+qt5_use_modules(Payments Qml Quick DBus Core)
14+
15+add_unity8_plugin(Ubuntu.Payments 0.1 Ubuntu/Payments TARGETS Payments)
16+
17+pkg_check_modules(LIBPAY REQUIRED pay-1)
18+add_definitions(${LIBPAY_CFLAGS} ${LIBPAY_CFLAGS_OTHER})
19+
20+target_link_libraries(Payments ${LIBPAY_LDFLAGS})
plugins/Ubuntu/Payments/Payments.cppnew file+118
@@ -0,0 +1,118 @@
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 "Payments.h"
18+
19+#include <QLocale>
20+
21+#include <libpay/pay-package.h>
22+
23+
24+// The observer callback for the package we are watching.
25+static void observer(PayPackage* /* package */, const char* itemid, PayPackageItemStatus status, void* user_data) {
26+ // This function is called in libpay's thread, so be careful what you call
27+ // Emitting signals should be fine as long as they use Queued or Auto
28+ // connections (the default)
29+ // http://qt-project.org/doc/qt-5/threads-qobject.html#signals-and-slots-across-threads
30+
31+ Payments *self = static_cast<Payments*>(user_data);
32+
33+ // If the item ID is different, ignore it.
34+ if (itemid != self->storeItemId()) {
35+ return;
36+ }
37+
38+ // FIXME: No error reporting from libpay, but we need to show some
39+ // types of errors to the user. https://launchpad.net/bugs/1333403
40+ switch (status) {
41+ case PAY_PACKAGE_ITEM_STATUS_PURCHASED:
42+ Q_EMIT self->purchaseCompleted();
43+ break;
44+ default:
45+ break;
46+ }
47+}
48+
49+Payments::Payments(QObject *parent)
50+ : QObject(parent)
51+{
52+ m_package = pay_package_new("click-scope");
53+ pay_package_item_observer_install(m_package, observer, this);
54+}
55+
56+Payments::~Payments()
57+{
58+ pay_package_item_observer_uninstall(m_package, observer, this);
59+ pay_package_delete(m_package);
60+}
61+
62+QString Payments::currency() const
63+{
64+ return m_currency;
65+}
66+
67+double Payments::price() const
68+{
69+ return m_price;
70+}
71+
72+QString Payments::storeItemId() const
73+{
74+ return m_store_item_id;
75+}
76+
77+QString Payments::formattedPrice() const
78+{
79+ QLocale locale;
80+ return locale.toCurrencyString(m_price, m_currency);
81+}
82+
83+void Payments::setCurrency(const QString &currency)
84+{
85+ if(m_currency != currency) {
86+ m_currency = currency;
87+ Q_EMIT currencyChanged(currency);
88+ Q_EMIT formattedPriceChanged(formattedPrice());
89+ }
90+}
91+
92+void Payments::setPrice(const double price)
93+{
94+ if(m_price != price) {
95+ m_price = price;
96+ Q_EMIT priceChanged(price);
97+ Q_EMIT formattedPriceChanged(formattedPrice());
98+ }
99+}
100+
101+void Payments::setStoreItemId(const QString &store_item_id)
102+{
103+ if (m_store_item_id != store_item_id) {
104+ m_store_item_id = store_item_id;
105+ Q_EMIT storeItemIdChanged(m_store_item_id);
106+ }
107+
108+ if (m_store_item_id.isEmpty()) {
109+ return;
110+ }
111+
112+ pay_package_item_start_verification(m_package, m_store_item_id.toLocal8Bit().data());
113+}
114+
115+void Payments::start()
116+{
117+ pay_package_item_start_purchase(m_package, m_store_item_id.toLocal8Bit().data());
118+}
plugins/Ubuntu/Payments/Payments.hnew file+65
@@ -0,0 +1,65 @@
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+#ifndef PAYMENTS_H
18+#define PAYMENTS_H
19+
20+#include <QObject>
21+
22+#include <libpay/pay-package.h>
23+
24+
25+class Payments : public QObject
26+{
27+ Q_OBJECT
28+ Q_DISABLE_COPY(Payments)
29+ Q_PROPERTY(QString currency READ currency WRITE setCurrency NOTIFY currencyChanged)
30+ Q_PROPERTY(double price READ price WRITE setPrice NOTIFY priceChanged)
31+ Q_PROPERTY(QString storeItemId READ storeItemId WRITE setStoreItemId NOTIFY storeItemIdChanged)
32+ Q_PROPERTY(QString formattedPrice READ formattedPrice NOTIFY formattedPriceChanged)
33+
34+public:
35+ explicit Payments(QObject *parent = 0);
36+ virtual ~Payments();
37+
38+ QString currency() const;
39+ double price() const;
40+ QString storeItemId() const;
41+ QString formattedPrice() const;
42+
43+ void setCurrency(const QString& currency);
44+ void setPrice(const double price);
45+ void setStoreItemId(const QString& store_item_id);
46+ Q_INVOKABLE void start();
47+
48+Q_SIGNALS:
49+ void currencyChanged(const QString& currency);
50+ void priceChanged(const double price);
51+ void storeItemIdChanged(const QString &store_item_id);
52+ void formattedPriceChanged(const QString &formatted_price);
53+
54+ void purchaseError(const QString &error);
55+ void purchaseCompleted();
56+
57+private:
58+ QString m_currency;
59+ double m_price;
60+ QString m_store_item_id;
61+
62+ PayPackage *m_package;
63+};
64+
65+#endif // PAYMENTS_H
plugins/Ubuntu/Payments/Payments.qmltypesnew file+42
@@ -0,0 +1,42 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Ubuntu.Payments 0.1 plugins'
8+
9+Module {
10+ Component {
11+ name: "Payments"
12+ prototype: "QObject"
13+ exports: ["Ubuntu.Payments/Payments 0.1"]
14+ exportMetaObjectRevisions: [0]
15+ Property { name: "currency"; type: "string" }
16+ Property { name: "price"; type: "double" }
17+ Property { name: "storeItemId"; type: "string" }
18+ Property { name: "formattedPrice"; type: "string"; isReadonly: true }
19+ Signal {
20+ name: "currencyChanged"
21+ Parameter { name: "currency"; type: "string" }
22+ }
23+ Signal {
24+ name: "priceChanged"
25+ Parameter { name: "price"; type: "double" }
26+ }
27+ Signal {
28+ name: "storeItemIdChanged"
29+ Parameter { name: "store_item_id"; type: "string" }
30+ }
31+ Signal {
32+ name: "formattedPriceChanged"
33+ Parameter { name: "formatted_price"; type: "string" }
34+ }
35+ Signal {
36+ name: "purchaseError"
37+ Parameter { name: "error"; type: "string" }
38+ }
39+ Signal { name: "purchaseCompleted" }
40+ Method { name: "start" }
41+ }
42+}
plugins/Ubuntu/Payments/plugin.cppnew file+28
@@ -0,0 +1,28 @@
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 "plugin.h"
18+#include "Payments.h"
19+
20+#include <QtQml>
21+
22+
23+void BackendPlugin::registerTypes(const char *uri)
24+{
25+ Q_ASSERT(uri == QLatin1String("Ubuntu.Payments"));
26+
27+ qmlRegisterType<Payments>(uri, 0, 1, "Payments");
28+}
plugins/Ubuntu/Payments/plugin.hnew file+31
@@ -0,0 +1,31 @@
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+#ifndef PAYMENTS_PLUGIN_H
18+#define PAYMENTS_PLUGIN_H
19+
20+#include <QQmlExtensionPlugin>
21+
22+class BackendPlugin : public QQmlExtensionPlugin
23+{
24+ Q_OBJECT
25+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26+
27+public:
28+ void registerTypes(const char *uri);
29+};
30+
31+#endif // PAYMENTS_PLUGIN_H
plugins/Ubuntu/Payments/qmldirnew file+3
@@ -0,0 +1,3 @@
1+module Ubuntu.Payments
2+plugin Payments
3+typeinfo Payments.qmltypes
plugins/Unity/Indicators/CMakeLists.txt+1−4
@@ -51,7 +51,4 @@ target_link_libraries(IndicatorsQml
5151
5252qt5_use_modules(IndicatorsQml Core Qml Quick)
5353
54−add_unity8_plugin(Unity.Indicators 0.1 Unity/Indicators
55− SEARCH_PATH qml
56− TARGETS IndicatorsQml
57−)
54+add_unity8_plugin(Unity.Indicators 0.1 Unity/Indicators TARGETS IndicatorsQml)
plugins/Unity/Indicators/qml/CachedUnityMenuModel.qml → plugins/Unity/Indicators/CachedUnityMenuModel.qmlrenamed

The content is the same.

plugins/Unity/Indicators/Indicators.qmltypesnew file+278
@@ -0,0 +1,278 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Unity.Indicators 0.1 plugins'
8+
9+Module {
10+ Component {
11+ name: "ActionState"
12+ prototype: "QObject"
13+ exports: ["Unity.Indicators/ActionState 0.1"]
14+ isCreatable: false
15+ exportMetaObjectRevisions: [0]
16+ Enum {
17+ name: "ActionStates"
18+ values: {
19+ "Label": 0,
20+ "IconSource": 1,
21+ "AccessableName": 2,
22+ "Visible": 3
23+ }
24+ }
25+ }
26+ Component { name: "ActionStateParser"; prototype: "QObject" }
27+ Component {
28+ name: "FlatMenuProxyModelRole"
29+ prototype: "QObject"
30+ exports: ["Unity.Indicators/FlatMenuProxyModelRole 0.1"]
31+ isCreatable: false
32+ exportMetaObjectRevisions: [0]
33+ Enum {
34+ name: "Roles"
35+ values: {
36+ "Action": 1,
37+ "Label": 2,
38+ "Extra": 3,
39+ "Depth": 4,
40+ "hasSection": 5,
41+ "hasSubMenu": 6
42+ }
43+ }
44+ }
45+ Component {
46+ name: "IndicatorsManager"
47+ prototype: "QObject"
48+ exports: ["Unity.Indicators/IndicatorsManager 0.1"]
49+ exportMetaObjectRevisions: [0]
50+ Property { name: "loaded"; type: "bool"; isReadonly: true }
51+ Signal {
52+ name: "loadedChanged"
53+ Parameter { type: "bool" }
54+ }
55+ Signal {
56+ name: "indicatorLoaded"
57+ Parameter { name: "indicator_name"; type: "string" }
58+ }
59+ Signal {
60+ name: "indicatorAboutToBeUnloaded"
61+ Parameter { name: "indicator_name"; type: "string" }
62+ }
63+ Method {
64+ name: "load"
65+ Parameter { name: "profile"; type: "string" }
66+ }
67+ Method { name: "unload" }
68+ }
69+ Component {
70+ name: "IndicatorsModel"
71+ prototype: "QAbstractListModel"
72+ exports: ["Unity.Indicators/IndicatorsModel 0.1"]
73+ exportMetaObjectRevisions: [0]
74+ Property { name: "count"; type: "int"; isReadonly: true }
75+ Signal {
76+ name: "indicatorDataChanged"
77+ Parameter { name: "data"; type: "QVariant" }
78+ }
79+ Method {
80+ name: "load"
81+ Parameter { name: "profile"; type: "string" }
82+ }
83+ Method { name: "unload" }
84+ Method {
85+ name: "data"
86+ type: "QVariant"
87+ Parameter { name: "row"; type: "int" }
88+ Parameter { name: "role"; type: "int" }
89+ }
90+ }
91+ Component {
92+ name: "IndicatorsModelRole"
93+ prototype: "QObject"
94+ exports: ["Unity.Indicators/IndicatorsModelRole 0.1"]
95+ isCreatable: false
96+ exportMetaObjectRevisions: [0]
97+ Enum {
98+ name: "Roles"
99+ values: {
100+ "Identifier": 0,
101+ "Position": 1,
102+ "WidgetSource": 2,
103+ "PageSource": 3,
104+ "IndicatorProperties": 4,
105+ "IsVisible": 5
106+ }
107+ }
108+ }
109+ Component {
110+ name: "MenuContentActivator"
111+ prototype: "QObject"
112+ exports: ["Unity.Indicators/MenuContentActivator 0.1"]
113+ exportMetaObjectRevisions: [0]
114+ Property { name: "baseIndex"; type: "int" }
115+ Property { name: "running"; type: "bool" }
116+ Property { name: "count"; type: "int" }
117+ Property { name: "content"; type: "MenuContentState"; isList: true; isReadonly: true }
118+ Signal {
119+ name: "baseIndexChanged"
120+ Parameter { name: "baseIndex"; type: "int" }
121+ }
122+ Signal {
123+ name: "deltaChanged"
124+ Parameter { name: "delta"; type: "int" }
125+ }
126+ Signal {
127+ name: "runningChanged"
128+ Parameter { name: "running"; type: "bool" }
129+ }
130+ Signal {
131+ name: "countChanged"
132+ Parameter { name: "count"; type: "int" }
133+ }
134+ Method { name: "restart" }
135+ Method { name: "stop" }
136+ Method { name: "clear" }
137+ Method {
138+ name: "isMenuContentActive"
139+ type: "bool"
140+ Parameter { name: "index"; type: "int" }
141+ }
142+ }
143+ Component {
144+ name: "MenuContentState"
145+ prototype: "QObject"
146+ exports: ["Unity.Indicators/MenuContentState 0.1"]
147+ isCreatable: false
148+ exportMetaObjectRevisions: [0]
149+ Property { name: "active"; type: "bool"; isReadonly: true }
150+ }
151+ Component {
152+ name: "ModelPrinter"
153+ prototype: "QObject"
154+ exports: ["Unity.Indicators/ModelPrinter 0.1"]
155+ exportMetaObjectRevisions: [0]
156+ Property { name: "model"; type: "UnityMenuModel"; isPointer: true }
157+ Property { name: "text"; type: "string"; isReadonly: true }
158+ Method { name: "text"; type: "string" }
159+ }
160+ Component {
161+ name: "NetworkActionState"
162+ prototype: "QObject"
163+ exports: ["Unity.Indicators/NetworkActionState 0.1"]
164+ isCreatable: false
165+ exportMetaObjectRevisions: [0]
166+ Enum {
167+ name: "NetworkActionStates"
168+ values: {
169+ "Connection": 1,
170+ "SignalStrength": 2
171+ }
172+ }
173+ }
174+ Component {
175+ name: "NetworkConnection"
176+ prototype: "QObject"
177+ exports: ["Unity.Indicators/NetworkConnection 0.1"]
178+ isCreatable: false
179+ exportMetaObjectRevisions: [0]
180+ Enum {
181+ name: "NetworkConnectionStates"
182+ values: {
183+ "Initial": 0,
184+ "Activating": 1,
185+ "Activated": 2,
186+ "Deactivating": 3
187+ }
188+ }
189+ }
190+ Component {
191+ name: "QAbstractProxyModel"
192+ prototype: "QAbstractItemModel"
193+ Property { name: "sourceModel"; type: "QAbstractItemModel"; isPointer: true }
194+ }
195+ Component { name: "QIdentityProxyModel"; prototype: "QAbstractProxyModel" }
196+ Component {
197+ name: "RootActionState"
198+ prototype: "ActionStateParser"
199+ exports: ["Unity.Indicators/RootActionState 0.1"]
200+ exportMetaObjectRevisions: [0]
201+ Property { name: "menu"; type: "UnityMenuModel"; isPointer: true }
202+ Property { name: "valid"; type: "bool"; isReadonly: true }
203+ Property { name: "title"; type: "string"; isReadonly: true }
204+ Property { name: "leftLabel"; type: "string"; isReadonly: true }
205+ Property { name: "rightLabel"; type: "string"; isReadonly: true }
206+ Property { name: "icons"; type: "QStringList"; isReadonly: true }
207+ Property { name: "accessibleName"; type: "string"; isReadonly: true }
208+ Property { name: "visible"; type: "bool"; isReadonly: true }
209+ Signal { name: "updated" }
210+ Signal { name: "indexChanged" }
211+ }
212+ Component {
213+ name: "UnityMenuModelCache"
214+ prototype: "QObject"
215+ exports: ["Unity.Indicators/UnityMenuModelCache 0.1"]
216+ isCreatable: false
217+ isSingleton: true
218+ exportMetaObjectRevisions: [0]
219+ Method {
220+ name: "model"
221+ type: "UnityMenuModel*"
222+ Parameter { name: "path"; type: "string" }
223+ }
224+ Method {
225+ name: "registerModel"
226+ Parameter { name: "path"; type: "string" }
227+ Parameter { name: "menuModel"; type: "UnityMenuModel"; isPointer: true }
228+ }
229+ }
230+ Component {
231+ name: "UnityMenuModelStack"
232+ prototype: "QObject"
233+ exports: ["Unity.Indicators/UnityMenuModelStack 0.1"]
234+ exportMetaObjectRevisions: [0]
235+ Property { name: "head"; type: "UnityMenuModel"; isPointer: true }
236+ Property { name: "tail"; type: "UnityMenuModel"; isReadonly: true; isPointer: true }
237+ Property { name: "count"; type: "int"; isReadonly: true }
238+ Signal {
239+ name: "headChanged"
240+ Parameter { name: "head"; type: "UnityMenuModel"; isPointer: true }
241+ }
242+ Signal {
243+ name: "tailChanged"
244+ Parameter { name: "tail"; type: "UnityMenuModel"; isPointer: true }
245+ }
246+ Signal {
247+ name: "countChanged"
248+ Parameter { name: "count"; type: "int" }
249+ }
250+ Method {
251+ name: "push"
252+ Parameter { name: "model"; type: "UnityMenuModel"; isPointer: true }
253+ Parameter { name: "menuIndex"; type: "int" }
254+ }
255+ Method { name: "pop"; type: "UnityMenuModel*" }
256+ }
257+ Component {
258+ name: "VisibleIndicatorsModel"
259+ prototype: "QIdentityProxyModel"
260+ exports: ["Unity.Indicators/VisibleIndicatorsModel 0.1"]
261+ exportMetaObjectRevisions: [0]
262+ Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
263+ Property { name: "visible"; type: "QVariantMap" }
264+ Signal { name: "totalCountChanged" }
265+ Method {
266+ name: "onBeginRowInserted"
267+ Parameter { type: "QModelIndex" }
268+ Parameter { name: "start"; type: "int" }
269+ Parameter { name: "end"; type: "int" }
270+ }
271+ Method {
272+ name: "onRowInserted"
273+ Parameter { type: "QModelIndex" }
274+ Parameter { name: "start"; type: "int" }
275+ Parameter { name: "end"; type: "int" }
276+ }
277+ }
278+}
plugins/Unity/Indicators/qml/qmldir → plugins/Unity/Indicators/qmldirrenamed−4
@@ -4,7 +4,3 @@ typeinfo Indicators.qmltypes
44
55CachedUnityMenuModel 0.1 CachedUnityMenuModel.qml
66IndicatorBase 0.1 IndicatorBase.qml
7−MenuItemFactory 0.1 MenuItemFactory.qml
8−MessageMenuItemFactory 0.1 MessageMenuItemFactory.qml
9−
10−internal RemoveBackground RemoveBackground.qml
plugins/Unity/Launcher/Launcher.qmltypesnew file+174
@@ -0,0 +1,174 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Unity.Launcher 0.1 plugins'
8+
9+Module {
10+ Component {
11+ name: "LauncherItem"
12+ prototype: "unity::shell::launcher::LauncherItemInterface"
13+ exports: ["Unity.Launcher/LauncherItem 0.1"]
14+ isCreatable: false
15+ exportMetaObjectRevisions: [0]
16+ Signal {
17+ name: "favoriteChanged"
18+ Parameter { name: "favorite"; type: "bool" }
19+ }
20+ Signal {
21+ name: "runningChanged"
22+ Parameter { name: "running"; type: "bool" }
23+ }
24+ }
25+ Component {
26+ name: "LauncherModel"
27+ prototype: "unity::shell::launcher::LauncherModelInterface"
28+ exports: ["Unity.Launcher/LauncherModel 0.1"]
29+ isCreatable: false
30+ isSingleton: true
31+ exportMetaObjectRevisions: [0]
32+ Method {
33+ name: "get"
34+ type: "unity::shell::launcher::LauncherItemInterface*"
35+ Parameter { name: "index"; type: "int" }
36+ }
37+ Method {
38+ name: "move"
39+ Parameter { name: "oldIndex"; type: "int" }
40+ Parameter { name: "newIndex"; type: "int" }
41+ }
42+ Method {
43+ name: "pin"
44+ Parameter { name: "appId"; type: "string" }
45+ Parameter { name: "index"; type: "int" }
46+ }
47+ Method {
48+ name: "pin"
49+ Parameter { name: "appId"; type: "string" }
50+ }
51+ Method {
52+ name: "requestRemove"
53+ Parameter { name: "appId"; type: "string" }
54+ }
55+ Method {
56+ name: "quickListActionInvoked"
57+ Parameter { name: "appId"; type: "string" }
58+ Parameter { name: "actionIndex"; type: "int" }
59+ }
60+ Method {
61+ name: "setUser"
62+ Parameter { name: "username"; type: "string" }
63+ }
64+ Method {
65+ name: "getUrlForAppId"
66+ type: "string"
67+ Parameter { name: "appId"; type: "string" }
68+ }
69+ }
70+ Component {
71+ name: "QuickListModel"
72+ prototype: "unity::shell::launcher::QuickListModelInterface"
73+ exports: ["Unity.Launcher/QuickListModel 0.1"]
74+ isCreatable: false
75+ exportMetaObjectRevisions: [0]
76+ }
77+ Component {
78+ name: "unity::shell::launcher::LauncherItemInterface"
79+ prototype: "QObject"
80+ exports: ["Unity.Launcher/LauncherItemInterface 0.1"]
81+ isCreatable: false
82+ exportMetaObjectRevisions: [0]
83+ Property { name: "appId"; type: "string"; isReadonly: true }
84+ Property { name: "name"; type: "string"; isReadonly: true }
85+ Property { name: "icon"; type: "string"; isReadonly: true }
86+ Property { name: "pinned"; type: "bool"; isReadonly: true }
87+ Property { name: "running"; type: "bool"; isReadonly: true }
88+ Property { name: "recent"; type: "bool"; isReadonly: true }
89+ Property { name: "progress"; type: "int"; isReadonly: true }
90+ Property { name: "count"; type: "int"; isReadonly: true }
91+ Property { name: "focused"; type: "bool"; isReadonly: true }
92+ Property {
93+ name: "quickList"
94+ type: "unity::shell::launcher::QuickListModelInterface"
95+ isReadonly: true
96+ isPointer: true
97+ }
98+ Signal {
99+ name: "pinnedChanged"
100+ Parameter { name: "pinned"; type: "bool" }
101+ }
102+ Signal {
103+ name: "runningChanged"
104+ Parameter { name: "running"; type: "bool" }
105+ }
106+ Signal {
107+ name: "recentChanged"
108+ Parameter { name: "running"; type: "bool" }
109+ }
110+ Signal {
111+ name: "progressChanged"
112+ Parameter { name: "progress"; type: "int" }
113+ }
114+ Signal {
115+ name: "countChanged"
116+ Parameter { name: "count"; type: "int" }
117+ }
118+ Signal {
119+ name: "focusedChanged"
120+ Parameter { name: "focused"; type: "bool" }
121+ }
122+ }
123+ Component {
124+ name: "unity::shell::launcher::LauncherModelInterface"
125+ prototype: "QAbstractListModel"
126+ exports: ["Unity.Launcher/LauncherModelInterface 0.1"]
127+ isCreatable: false
128+ exportMetaObjectRevisions: [0]
129+ Property {
130+ name: "applicationManager"
131+ type: "unity::shell::application::ApplicationManagerInterface"
132+ isPointer: true
133+ }
134+ Method {
135+ name: "move"
136+ Parameter { name: "oldIndex"; type: "int" }
137+ Parameter { name: "newIndex"; type: "int" }
138+ }
139+ Method {
140+ name: "get"
141+ type: "unity::shell::launcher::LauncherItemInterface*"
142+ Parameter { name: "index"; type: "int" }
143+ }
144+ Method {
145+ name: "pin"
146+ Parameter { name: "appId"; type: "string" }
147+ Parameter { name: "index"; type: "int" }
148+ }
149+ Method {
150+ name: "pin"
151+ Parameter { name: "appId"; type: "string" }
152+ }
153+ Method {
154+ name: "requestRemove"
155+ Parameter { name: "appId"; type: "string" }
156+ }
157+ Method {
158+ name: "quickListActionInvoked"
159+ Parameter { name: "appId"; type: "string" }
160+ Parameter { name: "actionIndex"; type: "int" }
161+ }
162+ Method {
163+ name: "setUser"
164+ Parameter { name: "username"; type: "string" }
165+ }
166+ }
167+ Component {
168+ name: "unity::shell::launcher::QuickListModelInterface"
169+ prototype: "QAbstractListModel"
170+ exports: ["Unity.Launcher/QuickListInterface 0.1"]
171+ isCreatable: false
172+ exportMetaObjectRevisions: [0]
173+ }
174+}
plugins/Unity/Launcher/launcheritem.cpp+2−2
@@ -40,7 +40,7 @@ LauncherItem::LauncherItem(const QString &appId, const QString &name, const QStr
4040 m_quickList->appendAction(nameAction);
4141 QuickListEntry pinningAction;
4242 pinningAction.setActionId("pin_item");
43− pinningAction.setText(gettext("Lock to Launcher"));
43+ pinningAction.setText(gettext("Pin shortcut"));
4444 m_quickList->appendAction(pinningAction);
4545}
4646
@@ -70,7 +70,7 @@ void LauncherItem::setPinned(bool pinned)
7070 m_pinned = pinned;
7171 QuickListEntry entry;
7272 entry.setActionId("pin_item");
73− entry.setText(pinned ? gettext("Unlock from Launcher") : gettext("Lock to Launcher"));
73+ entry.setText(pinned ? gettext("Unpin shortcut") : gettext("Pin shortcut"));
7474 m_quickList->updateAction(entry);
7575 Q_EMIT pinnedChanged(pinned);
7676 }
plugins/Unity/Launcher/launchermodel.cpp+3−1
@@ -128,7 +128,7 @@ void LauncherModel::pin(const QString &appId, int index)
128128 if (index == -1 || index == currentIndex) {
129129 m_list.at(currentIndex)->setPinned(true);
130130 QModelIndex modelIndex = this->index(currentIndex);
131− Q_EMIT dataChanged(modelIndex, modelIndex);
131+ Q_EMIT dataChanged(modelIndex, modelIndex, QVector<int>() << RolePinned);
132132 } else {
133133 move(currentIndex, index);
134134 // move() will store the list to the backend itself, so just exit at this point.
@@ -159,6 +159,8 @@ void LauncherModel::requestRemove(const QString &appId)
159159
160160 if (m_appManager->findApplication(appId)) {
161161 m_list.at(index)->setPinned(false);
162+ QModelIndex modelIndex = this->index(index);
163+ Q_EMIT dataChanged(modelIndex, modelIndex, QVector<int>() << RolePinned);
162164 return;
163165 }
164166
plugins/Unity/Session/Session.qmltypesnew file+25
@@ -0,0 +1,25 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Unity.Session 0.1 plugins'
8+
9+Module {
10+ Component {
11+ name: "DBusUnitySessionService"
12+ prototype: "QObject"
13+ exports: ["Unity.Session/DBusUnitySessionService 0.1"]
14+ isCreatable: false
15+ isSingleton: true
16+ exportMetaObjectRevisions: [0]
17+ Signal {
18+ name: "logoutRequested"
19+ Parameter { name: "have_inhibitors"; type: "bool" }
20+ }
21+ Signal { name: "logoutReady" }
22+ Method { name: "Logout" }
23+ Method { name: "RequestLogout" }
24+ }
25+}
plugins/Utils/Utils.qmltypesnew file+143
@@ -0,0 +1,143 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Utils 0.1 plugins'
8+
9+Module {
10+ Component {
11+ name: "EasingCurve"
12+ prototype: "QObject"
13+ exports: ["Utils/EasingCurve 0.1"]
14+ exportMetaObjectRevisions: [0]
15+ Property { name: "type"; type: "QEasingCurve::Type" }
16+ Property { name: "period"; type: "double" }
17+ Property { name: "progress"; type: "double" }
18+ Property { name: "value"; type: "double"; isReadonly: true }
19+ }
20+ Component {
21+ name: "QAbstractProxyModel"
22+ prototype: "QAbstractItemModel"
23+ Property { name: "sourceModel"; type: "QAbstractItemModel"; isPointer: true }
24+ }
25+ Component { name: "QIdentityProxyModel"; prototype: "QAbstractProxyModel" }
26+ Component {
27+ name: "QLimitProxyModelQML"
28+ prototype: "QIdentityProxyModel"
29+ exports: ["Utils/LimitProxyModel 0.1"]
30+ exportMetaObjectRevisions: [0]
31+ Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
32+ Property { name: "limit"; type: "int" }
33+ Property { name: "count"; type: "int"; isReadonly: true }
34+ Signal { name: "totalCountChanged" }
35+ }
36+ Component {
37+ name: "QSortFilterProxyModel"
38+ prototype: "QAbstractProxyModel"
39+ Property { name: "filterRegExp"; type: "QRegExp" }
40+ Property { name: "filterKeyColumn"; type: "int" }
41+ Property { name: "dynamicSortFilter"; type: "bool" }
42+ Property { name: "filterCaseSensitivity"; type: "Qt::CaseSensitivity" }
43+ Property { name: "sortCaseSensitivity"; type: "Qt::CaseSensitivity" }
44+ Property { name: "isSortLocaleAware"; type: "bool" }
45+ Property { name: "sortRole"; type: "int" }
46+ Property { name: "filterRole"; type: "int" }
47+ Method {
48+ name: "setFilterRegExp"
49+ Parameter { name: "pattern"; type: "string" }
50+ }
51+ Method {
52+ name: "setFilterWildcard"
53+ Parameter { name: "pattern"; type: "string" }
54+ }
55+ Method {
56+ name: "setFilterFixedString"
57+ Parameter { name: "pattern"; type: "string" }
58+ }
59+ Method { name: "clear" }
60+ Method { name: "invalidate" }
61+ }
62+ Component {
63+ name: "QSortFilterProxyModelQML"
64+ prototype: "QSortFilterProxyModel"
65+ exports: ["Utils/SortFilterProxyModel 0.1"]
66+ exportMetaObjectRevisions: [0]
67+ Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
68+ Property { name: "totalCount"; type: "int"; isReadonly: true }
69+ Property { name: "count"; type: "int"; isReadonly: true }
70+ Property { name: "invertMatch"; type: "bool" }
71+ Signal {
72+ name: "invertMatchChanged"
73+ Parameter { type: "bool" }
74+ }
75+ Method {
76+ name: "get"
77+ type: "QVariantMap"
78+ Parameter { name: "row"; type: "int" }
79+ }
80+ Method {
81+ name: "data"
82+ type: "QVariant"
83+ Parameter { name: "row"; type: "int" }
84+ Parameter { name: "role"; type: "int" }
85+ }
86+ Method { name: "count"; type: "int" }
87+ Method {
88+ name: "findFirst"
89+ type: "int"
90+ Parameter { name: "role"; type: "int" }
91+ Parameter { name: "value"; type: "QVariant" }
92+ }
93+ Method {
94+ name: "mapRowToSource"
95+ type: "int"
96+ Parameter { name: "row"; type: "int" }
97+ }
98+ Method {
99+ name: "mapFromSource"
100+ type: "int"
101+ Parameter { name: "row"; type: "int" }
102+ }
103+ Method {
104+ name: "mapToSource"
105+ type: "int"
106+ Parameter { name: "row"; type: "int" }
107+ }
108+ }
109+ Component {
110+ name: "TimeFormatter"
111+ prototype: "QObject"
112+ exports: ["Utils/GDateTimeFormatter 0.1", "Utils/TimeFormatter 0.1"]
113+ exportMetaObjectRevisions: [0, 0]
114+ Property { name: "format"; type: "string" }
115+ Property { name: "timeString"; type: "string"; isReadonly: true }
116+ Property { name: "time"; type: "qlonglong" }
117+ Signal {
118+ name: "formatChanged"
119+ Parameter { name: "format"; type: "string" }
120+ }
121+ Signal {
122+ name: "timeStringChanged"
123+ Parameter { name: "timeString"; type: "string" }
124+ }
125+ Signal {
126+ name: "timeChanged"
127+ Parameter { name: "time"; type: "qlonglong" }
128+ }
129+ }
130+ Component {
131+ name: "UnityMenuModelPaths"
132+ prototype: "QObject"
133+ exports: ["Utils/UnityMenuModelPaths 0.1"]
134+ exportMetaObjectRevisions: [0]
135+ Property { name: "source"; type: "QVariant" }
136+ Property { name: "busName"; type: "QByteArray"; isReadonly: true }
137+ Property { name: "actions"; type: "QVariantMap"; isReadonly: true }
138+ Property { name: "menuObjectPath"; type: "QByteArray"; isReadonly: true }
139+ Property { name: "busNameHint"; type: "QByteArray" }
140+ Property { name: "actionsHint"; type: "QByteArray" }
141+ Property { name: "menuObjectPathHint"; type: "QByteArray" }
142+ }
143+}
plugins/Utils/easingcurve.cpp+3−1
@@ -20,7 +20,9 @@
2020
2121
2222EasingCurve::EasingCurve(QObject *parent):
23− QObject(parent)
23+ QObject(parent),
24+ m_progress(0),
25+ m_value(0)
2426{
2527
2628}
po/am.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "ማስነሻው ላይ መቆለፊያ"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "ከማስነሻው ላይ ማላቀቂያ"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr ""
8686
@@ -165,11 +165,35 @@ msgstr "የመግቢያ ቃል ማሳያ"
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr "መፈለጊያ"
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr "እባክዎን ያስገቡ %1"
po/ar.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
1111"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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "ثبّت في الشريط"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "فُك التثبيت من الشريط"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -83,7 +83,7 @@ msgstr "مكالمة طوارئ"
8383msgid "OK"
8484msgstr ""
8585
86−#: qml/Components/PageHeader.qml:365
86+#: qml/Components/PageHeader.qml:366
8787msgid "Recent searches"
8888msgstr "عمليات البحث الأخيرة"
8989
@@ -168,11 +168,35 @@ msgstr "عرض كلمة السر"
168168msgid "Please enter SIM PIN"
169169msgstr "من فضلك أدخِل رقم التعريف الشخصي لبطاقة SIM"
170170
171+#: qml/Panel/Indicators/MenuItemFactory.qml:583
172+msgid "In queue…"
173+msgstr ""
174+
175+#: qml/Panel/Indicators/MenuItemFactory.qml:587
176+msgid "Downloading"
177+msgstr ""
178+
179+#: qml/Panel/Indicators/MenuItemFactory.qml:589
180+msgid "Paused, tap to resume"
181+msgstr ""
182+
183+#: qml/Panel/Indicators/MenuItemFactory.qml:591
184+msgid "Canceled"
185+msgstr ""
186+
187+#: qml/Panel/Indicators/MenuItemFactory.qml:593
188+msgid "Finished"
189+msgstr ""
190+
191+#: qml/Panel/Indicators/MenuItemFactory.qml:595
192+msgid "Failed, tap to retry"
193+msgstr ""
194+
171195#: qml/Panel/SearchIndicator.qml:27
172196msgid "Search"
173197msgstr "ابحث"
174198
175−#: qml/Shell.qml:334
199+#: qml/Shell.qml:359
176200#, qt-format
177201msgid "Please enter %1"
178202msgstr "من فضلك أدخِل %1"
po/ast.po+42−18
@@ -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-06-13 09:55+0200\n"
11−"PO-Revision-Date: 2014-04-04 02:16+0000\n"
12−"Last-Translator: Xuacu Saturio <xuacusk8@gmail.com>\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11+"PO-Revision-Date: 2014-07-04 15:29+0000\n"
12+"Last-Translator: ivarela <ivarela@ubuntu.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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Caltener nel Llanzador"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Nun caltener nel llanzador"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -73,8 +73,8 @@ 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 domina los xestos de los bordes y pue principiar a usar el "
77−"teléfonu<br><br>Toque la pantalla pa comenzar"
76+"Agora yá domines los xestos de los berbesos y pues entamar a usar el "
77+"teléfonu<br><br>Toca la pantalla pa comenzar"
7878
7979#: qml/Components/Lockscreen.qml:214
8080msgid "Emergency Call"
@@ -82,9 +82,9 @@ msgstr "Llamada d'emerxencia"
8282
8383#: qml/Components/Lockscreen.qml:231
8484msgid "OK"
85−msgstr ""
85+msgstr "Aceutar"
8686
87−#: qml/Components/PageHeader.qml:365
87+#: qml/Components/PageHeader.qml:366
8888msgid "Recent searches"
8989msgstr "Busques recientes"
9090
@@ -99,11 +99,11 @@ msgstr "Hola"
9999
100100#: qml/Components/PinLockscreen.qml:198
101101msgid "CANCEL"
102−msgstr ""
102+msgstr "ENCABOXAR"
103103
104104#: qml/Components/PinLockscreen.qml:216
105105msgid "DONE"
106−msgstr ""
106+msgstr "FECHO"
107107
108108#: qml/Components/SeeMore.qml:35
109109msgid "See more"
@@ -139,7 +139,7 @@ msgstr "Unviar"
139139
140140#: qml/Greeter/Greeter.qml:157
141141msgid "Swipe to unlock"
142−msgstr ""
142+msgstr "Esliza pa desbloquiar"
143143
144144#: qml/Hud/HudParametrizedActionsPage.qml:132
145145msgid "Confirm"
@@ -167,13 +167,37 @@ msgstr "Amosar contraseña"
167167
168168#: qml/Notifications/NotificationMenuItemFactory.qml:103
169169msgid "Please enter SIM PIN"
170−msgstr "Escriba'l PIN de la SIM"
170+msgstr "Escribi'l PIN de la SIM"
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:583
173+msgid "In queue…"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:587
177+msgid "Downloading"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:589
181+msgid "Paused, tap to resume"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:591
185+msgid "Canceled"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:593
189+msgid "Finished"
190+msgstr ""
191+
192+#: qml/Panel/Indicators/MenuItemFactory.qml:595
193+msgid "Failed, tap to retry"
194+msgstr ""
171195
172196#: qml/Panel/SearchIndicator.qml:27
173197msgid "Search"
174198msgstr "Guetar"
175199
176−#: qml/Shell.qml:334
200+#: qml/Shell.qml:359
177201#, qt-format
178202msgid "Please enter %1"
179203msgstr "Introduz %1"
po/az.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Panelə Bərkit"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Paneldən Qaldır"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -81,7 +81,7 @@ msgstr "Zərurət zəngi"
8181msgid "OK"
8282msgstr ""
8383
84−#: qml/Components/PageHeader.qml:365
84+#: qml/Components/PageHeader.qml:366
8585msgid "Recent searches"
8686msgstr "Son axtarışlar"
8787
@@ -166,11 +166,35 @@ msgstr "Parolu göstər"
166166msgid "Please enter SIM PIN"
167167msgstr ""
168168
169+#: qml/Panel/Indicators/MenuItemFactory.qml:583
170+msgid "In queue…"
171+msgstr ""
172+
173+#: qml/Panel/Indicators/MenuItemFactory.qml:587
174+msgid "Downloading"
175+msgstr ""
176+
177+#: qml/Panel/Indicators/MenuItemFactory.qml:589
178+msgid "Paused, tap to resume"
179+msgstr ""
180+
181+#: qml/Panel/Indicators/MenuItemFactory.qml:591
182+msgid "Canceled"
183+msgstr ""
184+
185+#: qml/Panel/Indicators/MenuItemFactory.qml:593
186+msgid "Finished"
187+msgstr ""
188+
189+#: qml/Panel/Indicators/MenuItemFactory.qml:595
190+msgid "Failed, tap to retry"
191+msgstr ""
192+
169193#: qml/Panel/SearchIndicator.qml:27
170194msgid "Search"
171195msgstr "Axtar"
172196
173−#: qml/Shell.qml:334
197+#: qml/Shell.qml:359
174198#, qt-format
175199msgid "Please enter %1"
176200msgstr "Xahiş edirik daxil edin: %1"
po/bg.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Заключване към панела"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Отключи от панела за стартиране"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -87,7 +87,7 @@ msgstr "Спешно повикване"
8787msgid "OK"
8888msgstr ""
8989
90−#: qml/Components/PageHeader.qml:365
90+#: qml/Components/PageHeader.qml:366
9191msgid "Recent searches"
9292msgstr "Последни търсения"
9393
@@ -172,11 +172,35 @@ msgstr "Покажи паролата"
172172msgid "Please enter SIM PIN"
173173msgstr ""
174174
175+#: qml/Panel/Indicators/MenuItemFactory.qml:583
176+msgid "In queue…"
177+msgstr ""
178+
179+#: qml/Panel/Indicators/MenuItemFactory.qml:587
180+msgid "Downloading"
181+msgstr ""
182+
183+#: qml/Panel/Indicators/MenuItemFactory.qml:589
184+msgid "Paused, tap to resume"
185+msgstr ""
186+
187+#: qml/Panel/Indicators/MenuItemFactory.qml:591
188+msgid "Canceled"
189+msgstr ""
190+
191+#: qml/Panel/Indicators/MenuItemFactory.qml:593
192+msgid "Finished"
193+msgstr ""
194+
195+#: qml/Panel/Indicators/MenuItemFactory.qml:595
196+msgid "Failed, tap to retry"
197+msgstr ""
198+
175199#: qml/Panel/SearchIndicator.qml:27
176200msgid "Search"
177201msgstr "Търсене"
178202
179−#: qml/Shell.qml:334
203+#: qml/Shell.qml:359
180204#, qt-format
181205msgid "Please enter %1"
182206msgstr "Моля, въведете %1"
po/br.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
1111"PO-Revision-Date: 2014-06-16 11:41+0000\n"
1212"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
1313"Language-Team: Breton <br@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Stagañ ouzh al lañser"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Distagañ diouzh al lañser"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -87,7 +87,7 @@ msgstr "Pellgomzadenn vallus"
8787msgid "OK"
8888msgstr "Mat eo"
8989
90−#: qml/Components/PageHeader.qml:365
90+#: qml/Components/PageHeader.qml:366
9191msgid "Recent searches"
9292msgstr "Enklaskoù graet nevez zo"
9393
@@ -172,11 +172,35 @@ msgstr "Diskouez ar ger-tremen"
172172msgid "Please enter SIM PIN"
173173msgstr "Ebarzhit kod PIN ho kartenn SIM, mar plij"
174174
175+#: qml/Panel/Indicators/MenuItemFactory.qml:583
176+msgid "In queue…"
177+msgstr ""
178+
179+#: qml/Panel/Indicators/MenuItemFactory.qml:587
180+msgid "Downloading"
181+msgstr ""
182+
183+#: qml/Panel/Indicators/MenuItemFactory.qml:589
184+msgid "Paused, tap to resume"
185+msgstr ""
186+
187+#: qml/Panel/Indicators/MenuItemFactory.qml:591
188+msgid "Canceled"
189+msgstr ""
190+
191+#: qml/Panel/Indicators/MenuItemFactory.qml:593
192+msgid "Finished"
193+msgstr ""
194+
195+#: qml/Panel/Indicators/MenuItemFactory.qml:595
196+msgid "Failed, tap to retry"
197+msgstr ""
198+
175199#: qml/Panel/SearchIndicator.qml:27
176200msgid "Search"
177201msgstr "Klask"
178202
179−#: qml/Shell.qml:334
203+#: qml/Shell.qml:359
180204#, qt-format
181205msgid "Please enter %1"
182206msgstr "Ebarzhit %1, mar plij"
po/bs.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr ""
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr ""
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
po/ca.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
1111"PO-Revision-Date: 2014-06-13 07:47+0000\n"
1212"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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Mantén-la al llançador"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "No la mantinguis al llançador"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -88,7 +88,7 @@ msgstr "Trucada d'emergència"
8888msgid "OK"
8989msgstr "D'acord"
9090
91−#: qml/Components/PageHeader.qml:365
91+#: qml/Components/PageHeader.qml:366
9292msgid "Recent searches"
9393msgstr "Cerques recents"
9494
@@ -173,11 +173,35 @@ msgstr "Mostra la contrasenya"
173173msgid "Please enter SIM PIN"
174174msgstr "Introduïu el PIN de la targeta SIM"
175175
176+#: qml/Panel/Indicators/MenuItemFactory.qml:583
177+msgid "In queue…"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:587
181+msgid "Downloading"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:589
185+msgid "Paused, tap to resume"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:591
189+msgid "Canceled"
190+msgstr ""
191+
192+#: qml/Panel/Indicators/MenuItemFactory.qml:593
193+msgid "Finished"
194+msgstr ""
195+
196+#: qml/Panel/Indicators/MenuItemFactory.qml:595
197+msgid "Failed, tap to retry"
198+msgstr ""
199+
176200#: qml/Panel/SearchIndicator.qml:27
177201msgid "Search"
178202msgstr "Cerca"
179203
180−#: qml/Shell.qml:334
204+#: qml/Shell.qml:359
181205#, qt-format
182206msgid "Please enter %1"
183207msgstr "Introduïu %1"
po/ckb.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "چەسباندن بە لانچرەوە"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "ھەڵکەندن لە لانچر"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -80,7 +80,7 @@ msgstr "هێڵی فریاگوزاری"
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr "دوایین گەڕانەکان"
8686
@@ -165,11 +165,35 @@ msgstr "تێپەڕەوشە پیشان بدە"
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr "گەڕان"
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr "تکایە %1 بنووسە"
po/cs.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Přidat do Launcheru"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Odebrat z Launcheru"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -80,7 +80,7 @@ msgstr "Tísňové volání"
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr "Poslední vyhledávání"
8686
@@ -165,11 +165,35 @@ msgstr "Zobrazit heslo"
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr "Hledat"
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr "Zadejte prosím %1"
po/da.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr ""
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr ""
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
po/de.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
1111"PO-Revision-Date: 2014-06-06 19:34+0000\n"
1212"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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Im Starter sperren"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Aus dem Starter entsperren"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -85,7 +85,7 @@ msgstr "Notruf"
8585msgid "OK"
8686msgstr ""
8787
88−#: qml/Components/PageHeader.qml:365
88+#: qml/Components/PageHeader.qml:366
8989msgid "Recent searches"
9090msgstr "Zuletzt verwendete Suchbegriffe"
9191
@@ -170,11 +170,35 @@ msgstr "Passwort anzeigen"
170170msgid "Please enter SIM PIN"
171171msgstr "Bitte die PIN der SIM eingeben"
172172
173+#: qml/Panel/Indicators/MenuItemFactory.qml:583
174+msgid "In queue…"
175+msgstr ""
176+
177+#: qml/Panel/Indicators/MenuItemFactory.qml:587
178+msgid "Downloading"
179+msgstr ""
180+
181+#: qml/Panel/Indicators/MenuItemFactory.qml:589
182+msgid "Paused, tap to resume"
183+msgstr ""
184+
185+#: qml/Panel/Indicators/MenuItemFactory.qml:591
186+msgid "Canceled"
187+msgstr ""
188+
189+#: qml/Panel/Indicators/MenuItemFactory.qml:593
190+msgid "Finished"
191+msgstr ""
192+
193+#: qml/Panel/Indicators/MenuItemFactory.qml:595
194+msgid "Failed, tap to retry"
195+msgstr ""
196+
173197#: qml/Panel/SearchIndicator.qml:27
174198msgid "Search"
175199msgstr "Suchen"
176200
177−#: qml/Shell.qml:334
201+#: qml/Shell.qml:359
178202#, qt-format
179203msgid "Please enter %1"
180204msgstr "Bitte geben Sie %1 ein"
po/el.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Διατήρηση στον εκκινητή"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Απομάκρυνση από τον εκκινητή"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -84,7 +84,7 @@ msgstr "Κλήση έκτακτης ανάγκης"
8484msgid "OK"
8585msgstr ""
8686
87−#: qml/Components/PageHeader.qml:365
87+#: qml/Components/PageHeader.qml:366
8888msgid "Recent searches"
8989msgstr "Πρόσφατες αναζητήσεις"
9090
@@ -169,11 +169,35 @@ msgstr "Εμφάνιση κωδικού"
169169msgid "Please enter SIM PIN"
170170msgstr "Παρακαλώ εισάγετε το PIN της κάρτας SIM"
171171
172+#: qml/Panel/Indicators/MenuItemFactory.qml:583
173+msgid "In queue…"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:587
177+msgid "Downloading"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:589
181+msgid "Paused, tap to resume"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:591
185+msgid "Canceled"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:593
189+msgid "Finished"
190+msgstr ""
191+
192+#: qml/Panel/Indicators/MenuItemFactory.qml:595
193+msgid "Failed, tap to retry"
194+msgstr ""
195+
172196#: qml/Panel/SearchIndicator.qml:27
173197msgid "Search"
174198msgstr "Αναζήτηση"
175199
176−#: qml/Shell.qml:334
200+#: qml/Shell.qml:359
177201#, qt-format
178202msgid "Please enter %1"
179203msgstr "Πληκτρολογήστε %1"
po/en_AU.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr "Emergency Call"
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr "Recent searches"
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr "Search"
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr "Please enter %1"
po/en_GB.po+40−16
@@ -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-06-13 09:55+0200\n"
11−"PO-Revision-Date: 2014-03-07 13:27+0000\n"
12−"Last-Translator: Andi Chandler <Unknown>\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11+"PO-Revision-Date: 2014-07-10 10:59+0000\n"
12+"Last-Translator: Alan Pope ㋛ <alan@ubuntu.com>\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-11 06:15+0000\n"
18+"X-Generator: Launchpad (build 17111)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Lock to Launcher"
22+msgid "Pin shortcut"
23+msgstr "Pin shortcut"
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Unlock from Launcher"
26+msgid "Unpin shortcut"
27+msgstr "Unpin shortcut"
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -80,9 +80,9 @@ msgstr "Emergency Call"
8080
8181#: qml/Components/Lockscreen.qml:231
8282msgid "OK"
83−msgstr ""
83+msgstr "OK"
8484
85−#: qml/Components/PageHeader.qml:365
85+#: qml/Components/PageHeader.qml:366
8686msgid "Recent searches"
8787msgstr "Recent searches"
8888
@@ -97,11 +97,11 @@ msgstr "Hello"
9797
9898#: qml/Components/PinLockscreen.qml:198
9999msgid "CANCEL"
100−msgstr ""
100+msgstr "CANCEL"
101101
102102#: qml/Components/PinLockscreen.qml:216
103103msgid "DONE"
104−msgstr ""
104+msgstr "DONE"
105105
106106#: qml/Components/SeeMore.qml:35
107107msgid "See more"
@@ -113,7 +113,7 @@ msgstr "See less"
113113
114114#: qml/Dash/DashApps.qml:37
115115msgid "Recent"
116−msgstr ""
116+msgstr "Recent"
117117
118118#: qml/Dash/Previews/PreviewActionCombo.qml:34
119119msgid "More..."
@@ -137,7 +137,7 @@ msgstr "Send"
137137
138138#: qml/Greeter/Greeter.qml:157
139139msgid "Swipe to unlock"
140−msgstr ""
140+msgstr "Swipe to unlock"
141141
142142#: qml/Hud/HudParametrizedActionsPage.qml:132
143143msgid "Confirm"
@@ -167,11 +167,35 @@ msgstr "Show password"
167167msgid "Please enter SIM PIN"
168168msgstr "Please enter SIM PIN"
169169
170+#: qml/Panel/Indicators/MenuItemFactory.qml:583
171+msgid "In queue…"
172+msgstr "In queue…"
173+
174+#: qml/Panel/Indicators/MenuItemFactory.qml:587
175+msgid "Downloading"
176+msgstr "Downloading"
177+
178+#: qml/Panel/Indicators/MenuItemFactory.qml:589
179+msgid "Paused, tap to resume"
180+msgstr "Paused, tap to resume"
181+
182+#: qml/Panel/Indicators/MenuItemFactory.qml:591
183+msgid "Canceled"
184+msgstr "Cancelled"
185+
186+#: qml/Panel/Indicators/MenuItemFactory.qml:593
187+msgid "Finished"
188+msgstr "Finished"
189+
190+#: qml/Panel/Indicators/MenuItemFactory.qml:595
191+msgid "Failed, tap to retry"
192+msgstr "Failed, tap to retry"
193+
170194#: qml/Panel/SearchIndicator.qml:27
171195msgid "Search"
172196msgstr "Search"
173197
174−#: qml/Shell.qml:334
198+#: qml/Shell.qml:359
175199#, qt-format
176200msgid "Please enter %1"
177201msgstr "Please enter %1"
po/eo.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr ""
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr ""
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
po/es.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
1111"PO-Revision-Date: 2014-06-26 03:08+0000\n"
1212"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
1313"Language-Team: Spanish <es@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-06-27 07:13+0000\n"
18−"X-Generator: Launchpad (build 17077)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Fijar al lanzador"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Quitar del lanzador"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -85,7 +85,7 @@ msgstr "Llamada de emergencia"
8585msgid "OK"
8686msgstr "Aceptar"
8787
88−#: qml/Components/PageHeader.qml:365
88+#: qml/Components/PageHeader.qml:366
8989msgid "Recent searches"
9090msgstr "Búsquedas recientes"
9191
@@ -170,11 +170,35 @@ msgstr "Mostrar contraseña"
170170msgid "Please enter SIM PIN"
171171msgstr "Escriba el PIN de la SIM"
172172
173+#: qml/Panel/Indicators/MenuItemFactory.qml:583
174+msgid "In queue…"
175+msgstr ""
176+
177+#: qml/Panel/Indicators/MenuItemFactory.qml:587
178+msgid "Downloading"
179+msgstr ""
180+
181+#: qml/Panel/Indicators/MenuItemFactory.qml:589
182+msgid "Paused, tap to resume"
183+msgstr ""
184+
185+#: qml/Panel/Indicators/MenuItemFactory.qml:591
186+msgid "Canceled"
187+msgstr ""
188+
189+#: qml/Panel/Indicators/MenuItemFactory.qml:593
190+msgid "Finished"
191+msgstr ""
192+
193+#: qml/Panel/Indicators/MenuItemFactory.qml:595
194+msgid "Failed, tap to retry"
195+msgstr ""
196+
173197#: qml/Panel/SearchIndicator.qml:27
174198msgid "Search"
175199msgstr "Buscar"
176200
177−#: qml/Shell.qml:334
201+#: qml/Shell.qml:359
178202#, qt-format
179203msgid "Please enter %1"
180204msgstr "Introduzca %1"
po/eu.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Lotu abiarazlera"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Askatu abiarazletik"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -84,7 +84,7 @@ msgstr "Larrialdi-deia"
8484msgid "OK"
8585msgstr ""
8686
87−#: qml/Components/PageHeader.qml:365
87+#: qml/Components/PageHeader.qml:366
8888msgid "Recent searches"
8989msgstr "Azken bilaketak"
9090
@@ -169,11 +169,35 @@ msgstr "Erakutsi pasahitza"
169169msgid "Please enter SIM PIN"
170170msgstr "Sartu SIMaren PINa"
171171
172+#: qml/Panel/Indicators/MenuItemFactory.qml:583
173+msgid "In queue…"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:587
177+msgid "Downloading"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:589
181+msgid "Paused, tap to resume"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:591
185+msgid "Canceled"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:593
189+msgid "Finished"
190+msgstr ""
191+
192+#: qml/Panel/Indicators/MenuItemFactory.qml:595
193+msgid "Failed, tap to retry"
194+msgstr ""
195+
172196#: qml/Panel/SearchIndicator.qml:27
173197msgid "Search"
174198msgstr "Bilatu"
175199
176−#: qml/Shell.qml:334
200+#: qml/Shell.qml:359
177201#, qt-format
178202msgid "Please enter %1"
179203msgstr "Sartu %1"
po/fa.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr ""
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr ""
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
po/fi.po+34−10
@@ -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-06-13 09:55+0200\n"
11−"PO-Revision-Date: 2014-06-14 10:23+0000\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11+"PO-Revision-Date: 2014-07-09 17:26+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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-10 07:29+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Kiinnitä käynnistimeen"
22+msgid "Pin shortcut"
23+msgstr "Kiinnitä pikakuvake"
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Poista käynnistimestä"
26+msgid "Unpin shortcut"
27+msgstr "Poista pikakuvakkeen kiinnitys"
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -82,7 +82,7 @@ msgstr "Hätäpuhelu"
8282msgid "OK"
8383msgstr "OK"
8484
85−#: qml/Components/PageHeader.qml:365
85+#: qml/Components/PageHeader.qml:366
8686msgid "Recent searches"
8787msgstr "Viimeisimmät haut"
8888
@@ -167,11 +167,35 @@ msgstr "Näytä salasana"
167167msgid "Please enter SIM PIN"
168168msgstr "Anna SIM-kortin PIN-koodi"
169169
170+#: qml/Panel/Indicators/MenuItemFactory.qml:583
171+msgid "In queue…"
172+msgstr "Jonossa…"
173+
174+#: qml/Panel/Indicators/MenuItemFactory.qml:587
175+msgid "Downloading"
176+msgstr "Ladataan"
177+
178+#: qml/Panel/Indicators/MenuItemFactory.qml:589
179+msgid "Paused, tap to resume"
180+msgstr "Keskeytetty, napauta palauttaaksesi"
181+
182+#: qml/Panel/Indicators/MenuItemFactory.qml:591
183+msgid "Canceled"
184+msgstr "Peruttu"
185+
186+#: qml/Panel/Indicators/MenuItemFactory.qml:593
187+msgid "Finished"
188+msgstr "Valmistunut"
189+
190+#: qml/Panel/Indicators/MenuItemFactory.qml:595
191+msgid "Failed, tap to retry"
192+msgstr "Epäonnistunut, napauta yrittääksesi uudelleen"
193+
170194#: qml/Panel/SearchIndicator.qml:27
171195msgid "Search"
172196msgstr "Hae"
173197
174−#: qml/Shell.qml:334
198+#: qml/Shell.qml:359
175199#, qt-format
176200msgid "Please enter %1"
177201msgstr "Kirjoita %1"
po/fo.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr ""
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr "Leita"
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
po/fr.po+35−11
@@ -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-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"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11+"PO-Revision-Date: 2014-07-10 12:11+0000\n"
12+"Last-Translator: Anne <anneonyme017@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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-11 06:15+0000\n"
18+"X-Generator: Launchpad (build 17111)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Conserver dans le lanceur"
22+msgid "Pin shortcut"
23+msgstr "Épingler le raccourci"
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Retirer du lanceur"
26+msgid "Unpin shortcut"
27+msgstr "Détacher le raccourci"
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -89,7 +89,7 @@ msgstr "Appel d'urgence"
8989msgid "OK"
9090msgstr "OK"
9191
92−#: qml/Components/PageHeader.qml:365
92+#: qml/Components/PageHeader.qml:366
9393msgid "Recent searches"
9494msgstr "Recherches récentes"
9595
@@ -174,11 +174,35 @@ msgstr "Afficher le mot de passe"
174174msgid "Please enter SIM PIN"
175175msgstr "Veuillez entrer le code PIN de votre carte SIM"
176176
177+#: qml/Panel/Indicators/MenuItemFactory.qml:583
178+msgid "In queue…"
179+msgstr "Dans la file d'attente..."
180+
181+#: qml/Panel/Indicators/MenuItemFactory.qml:587
182+msgid "Downloading"
183+msgstr "Téléchargement en cours"
184+
185+#: qml/Panel/Indicators/MenuItemFactory.qml:589
186+msgid "Paused, tap to resume"
187+msgstr "En pause, appuyez pour reprendre"
188+
189+#: qml/Panel/Indicators/MenuItemFactory.qml:591
190+msgid "Canceled"
191+msgstr "Annulé"
192+
193+#: qml/Panel/Indicators/MenuItemFactory.qml:593
194+msgid "Finished"
195+msgstr "Terminé"
196+
197+#: qml/Panel/Indicators/MenuItemFactory.qml:595
198+msgid "Failed, tap to retry"
199+msgstr "Échec, appuyez pour réessayer"
200+
177201#: qml/Panel/SearchIndicator.qml:27
178202msgid "Search"
179203msgstr "Rechercher"
180204
181−#: qml/Shell.qml:334
205+#: qml/Shell.qml:359
182206#, qt-format
183207msgid "Please enter %1"
184208msgstr "Veuillez saisir %1"
po/gd.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
1111"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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Glais ris an lòinsear"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Dealaich on lòinsear"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -88,7 +88,7 @@ msgstr "Gairm èiginn"
8888msgid "OK"
8989msgstr ""
9090
91−#: qml/Components/PageHeader.qml:365
91+#: qml/Components/PageHeader.qml:366
9292msgid "Recent searches"
9393msgstr "Na lorg thu o chionn goirid"
9494
@@ -173,11 +173,35 @@ msgstr "Seall am facal-faire"
173173msgid "Please enter SIM PIN"
174174msgstr "Cuir a-steach SIM PIN"
175175
176+#: qml/Panel/Indicators/MenuItemFactory.qml:583
177+msgid "In queue…"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:587
181+msgid "Downloading"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:589
185+msgid "Paused, tap to resume"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:591
189+msgid "Canceled"
190+msgstr ""
191+
192+#: qml/Panel/Indicators/MenuItemFactory.qml:593
193+msgid "Finished"
194+msgstr ""
195+
196+#: qml/Panel/Indicators/MenuItemFactory.qml:595
197+msgid "Failed, tap to retry"
198+msgstr ""
199+
176200#: qml/Panel/SearchIndicator.qml:27
177201msgid "Search"
178202msgstr "Lorg"
179203
180−#: qml/Shell.qml:334
204+#: qml/Shell.qml:359
181205#, qt-format
182206msgid "Please enter %1"
183207msgstr "Cuir a-steach %1"
po/gl.po+41−15
@@ -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-06-13 09:55+0200\n"
11−"PO-Revision-Date: 2014-06-07 13:26+0000\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11+"PO-Revision-Date: 2014-07-09 12:17+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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-10 07:29+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Manter no Iniciador"
22+msgid "Pin shortcut"
23+msgstr "Pegar o atallo"
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Non manter no Iniciador"
26+msgid "Unpin shortcut"
27+msgstr "Despegar o atallo"
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -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 a esvarar desde o bordo dereito para desbloquear o teléfono"
39+msgstr "Esvare o dedo desde o bordo dereito para desbloquear o teléfono"
4040
4141#: qml/Components/EdgeDemo.qml:145
4242msgid "Top edge"
@@ -44,7 +44,7 @@ msgstr "Bordo superior"
4444
4545#: qml/Components/EdgeDemo.qml:146
4646msgid "Try swiping from the top edge to access the indicators"
47−msgstr "Esvare desde o bordo superior para acceder aos indicadores."
47+msgstr "Esvare o dedo desde o bordo superior para acceder aos indicadores."
4848
4949#: qml/Components/EdgeDemo.qml:171
5050msgid "Close"
@@ -52,7 +52,7 @@ msgstr "Pechar"
5252
5353#: qml/Components/EdgeDemo.qml:172
5454msgid "Swipe up again to close the settings screen"
55−msgstr "Esvare cara a arriba para pechar os axustes"
55+msgstr "Esvare o dedo cara a arriba para pechar os axustes"
5656
5757#: qml/Components/EdgeDemo.qml:199
5858msgid "Left edge"
@@ -60,7 +60,9 @@ msgstr "Bordo esquerdo"
6060
6161#: qml/Components/EdgeDemo.qml:200
6262msgid "Swipe from the left to reveal the launcher for quick access to apps"
63−msgstr "Esvare desde a esquerda para mostrar o iniciador de acceso rápido"
63+msgstr ""
64+"Esvare o dedo desde a esquerda para mostrar o iniciador rápido aos "
65+"aplicativos"
6466
6567#: qml/Components/EdgeDemo.qml:227
6668msgid "Well done"
@@ -82,7 +84,7 @@ msgstr "Chamada de emerxencia"
8284msgid "OK"
8385msgstr "Aceptar"
8486
85−#: qml/Components/PageHeader.qml:365
87+#: qml/Components/PageHeader.qml:366
8688msgid "Recent searches"
8789msgstr "Buscas recentes"
8890
@@ -137,7 +139,7 @@ msgstr "Enviar"
137139
138140#: qml/Greeter/Greeter.qml:157
139141msgid "Swipe to unlock"
140−msgstr "Esvare para desbloquear"
142+msgstr "Esvare o dedo para desbloquear"
141143
142144#: qml/Hud/HudParametrizedActionsPage.qml:132
143145msgid "Confirm"
@@ -167,11 +169,35 @@ msgstr "Mostrar contrasinal"
167169msgid "Please enter SIM PIN"
168170msgstr "Introduza o PIN da SIM"
169171
172+#: qml/Panel/Indicators/MenuItemFactory.qml:583
173+msgid "In queue…"
174+msgstr "Na cola..."
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:587
177+msgid "Downloading"
178+msgstr "Descargando"
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:589
181+msgid "Paused, tap to resume"
182+msgstr "Detido, toque para continuar"
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:591
185+msgid "Canceled"
186+msgstr "Cancelado"
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:593
189+msgid "Finished"
190+msgstr "Rematado"
191+
192+#: qml/Panel/Indicators/MenuItemFactory.qml:595
193+msgid "Failed, tap to retry"
194+msgstr "Fallou, toque para reintentar"
195+
170196#: qml/Panel/SearchIndicator.qml:27
171197msgid "Search"
172198msgstr "Buscar"
173199
174−#: qml/Shell.qml:334
200+#: qml/Shell.qml:359
175201#, qt-format
176202msgid "Please enter %1"
177203msgstr "Introduza %1"
po/he.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
1111"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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "נעילה למשגר"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "הפרדה מהמשגר"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -82,7 +82,7 @@ msgstr "שיחת חירום"
8282msgid "OK"
8383msgstr "אישור"
8484
85−#: qml/Components/PageHeader.qml:365
85+#: qml/Components/PageHeader.qml:366
8686msgid "Recent searches"
8787msgstr "חיפושים אחרונים"
8888
@@ -167,11 +167,35 @@ msgstr "הצגת הססמה"
167167msgid "Please enter SIM PIN"
168168msgstr "נא להזין את קוד ה־<U+200F>SIM"
169169
170+#: qml/Panel/Indicators/MenuItemFactory.qml:583
171+msgid "In queue…"
172+msgstr ""
173+
174+#: qml/Panel/Indicators/MenuItemFactory.qml:587
175+msgid "Downloading"
176+msgstr ""
177+
178+#: qml/Panel/Indicators/MenuItemFactory.qml:589
179+msgid "Paused, tap to resume"
180+msgstr ""
181+
182+#: qml/Panel/Indicators/MenuItemFactory.qml:591
183+msgid "Canceled"
184+msgstr ""
185+
186+#: qml/Panel/Indicators/MenuItemFactory.qml:593
187+msgid "Finished"
188+msgstr ""
189+
190+#: qml/Panel/Indicators/MenuItemFactory.qml:595
191+msgid "Failed, tap to retry"
192+msgstr ""
193+
170194#: qml/Panel/SearchIndicator.qml:27
171195msgid "Search"
172196msgstr "חיפוש"
173197
174−#: qml/Shell.qml:334
198+#: qml/Shell.qml:359
175199#, qt-format
176200msgid "Please enter %1"
177201msgstr "נא להזין %1"
po/hi.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr "आपातकालीन कॉल"
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr "पिछले खोजों"
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr "खोजें"
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
po/hr.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr "Nedavne pretrage"
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr "Pretraživanje"
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
po/hu.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Indítóban tartás"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Eltávolítás az Indítóból"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -82,7 +82,7 @@ msgstr "Vészhívás"
8282msgid "OK"
8383msgstr ""
8484
85−#: qml/Components/PageHeader.qml:365
85+#: qml/Components/PageHeader.qml:366
8686msgid "Recent searches"
8787msgstr "Legutóbbi keresések"
8888
@@ -167,11 +167,35 @@ msgstr "Jelszó megjelenítése"
167167msgid "Please enter SIM PIN"
168168msgstr ""
169169
170+#: qml/Panel/Indicators/MenuItemFactory.qml:583
171+msgid "In queue…"
172+msgstr ""
173+
174+#: qml/Panel/Indicators/MenuItemFactory.qml:587
175+msgid "Downloading"
176+msgstr ""
177+
178+#: qml/Panel/Indicators/MenuItemFactory.qml:589
179+msgid "Paused, tap to resume"
180+msgstr ""
181+
182+#: qml/Panel/Indicators/MenuItemFactory.qml:591
183+msgid "Canceled"
184+msgstr ""
185+
186+#: qml/Panel/Indicators/MenuItemFactory.qml:593
187+msgid "Finished"
188+msgstr ""
189+
190+#: qml/Panel/Indicators/MenuItemFactory.qml:595
191+msgid "Failed, tap to retry"
192+msgstr ""
193+
170194#: qml/Panel/SearchIndicator.qml:27
171195msgid "Search"
172196msgstr "Keresés"
173197
174−#: qml/Shell.qml:334
198+#: qml/Shell.qml:359
175199#, qt-format
176200msgid "Please enter %1"
177201msgstr "Adja meg a következőt: %1"
po/hy.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr "Վերջին որոնումներ"
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr "Որոնում"
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
po/id.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr ""
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr ""
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
po/is.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -81,7 +81,7 @@ msgstr "Neyðarsímtal"
8181msgid "OK"
8282msgstr ""
8383
84−#: qml/Components/PageHeader.qml:365
84+#: qml/Components/PageHeader.qml:366
8585msgid "Recent searches"
8686msgstr "Nýlegar leitir"
8787
@@ -166,11 +166,35 @@ msgstr ""
166166msgid "Please enter SIM PIN"
167167msgstr ""
168168
169+#: qml/Panel/Indicators/MenuItemFactory.qml:583
170+msgid "In queue…"
171+msgstr ""
172+
173+#: qml/Panel/Indicators/MenuItemFactory.qml:587
174+msgid "Downloading"
175+msgstr ""
176+
177+#: qml/Panel/Indicators/MenuItemFactory.qml:589
178+msgid "Paused, tap to resume"
179+msgstr ""
180+
181+#: qml/Panel/Indicators/MenuItemFactory.qml:591
182+msgid "Canceled"
183+msgstr ""
184+
185+#: qml/Panel/Indicators/MenuItemFactory.qml:593
186+msgid "Finished"
187+msgstr ""
188+
189+#: qml/Panel/Indicators/MenuItemFactory.qml:595
190+msgid "Failed, tap to retry"
191+msgstr ""
192+
169193#: qml/Panel/SearchIndicator.qml:27
170194msgid "Search"
171195msgstr "Leita"
172196
173−#: qml/Shell.qml:334
197+#: qml/Shell.qml:359
174198#, qt-format
175199msgid "Please enter %1"
176200msgstr ""
po/it.po+34−10
@@ -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-06-13 09:55+0200\n"
11−"PO-Revision-Date: 2014-06-10 12:08+0000\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11+"PO-Revision-Date: 2014-07-09 07:07+0000\n"
1212"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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-10 07:29+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Blocca nel Launcher"
22+msgid "Pin shortcut"
23+msgstr "Blocca scorciatoia"
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Sblocca dal Launcher"
26+msgid "Unpin shortcut"
27+msgstr "Sblocca scorciatoia"
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -87,7 +87,7 @@ msgstr "Chiamata di emergenza"
8787msgid "OK"
8888msgstr "OK"
8989
90−#: qml/Components/PageHeader.qml:365
90+#: qml/Components/PageHeader.qml:366
9191msgid "Recent searches"
9292msgstr "Ricerche recenti"
9393
@@ -172,11 +172,35 @@ msgstr "Mostra password"
172172msgid "Please enter SIM PIN"
173173msgstr "Inserire il codice PIN"
174174
175+#: qml/Panel/Indicators/MenuItemFactory.qml:583
176+msgid "In queue…"
177+msgstr "In coda..."
178+
179+#: qml/Panel/Indicators/MenuItemFactory.qml:587
180+msgid "Downloading"
181+msgstr "Scaricamento in corso"
182+
183+#: qml/Panel/Indicators/MenuItemFactory.qml:589
184+msgid "Paused, tap to resume"
185+msgstr "In pausa. Tocca per riprendere"
186+
187+#: qml/Panel/Indicators/MenuItemFactory.qml:591
188+msgid "Canceled"
189+msgstr "Annullato"
190+
191+#: qml/Panel/Indicators/MenuItemFactory.qml:593
192+msgid "Finished"
193+msgstr "Completato"
194+
195+#: qml/Panel/Indicators/MenuItemFactory.qml:595
196+msgid "Failed, tap to retry"
197+msgstr "Non riuscito. Tocca per riprovare"
198+
175199#: qml/Panel/SearchIndicator.qml:27
176200msgid "Search"
177201msgstr "Cerca"
178202
179−#: qml/Shell.qml:334
203+#: qml/Shell.qml:359
180204#, qt-format
181205msgid "Please enter %1"
182206msgstr "Inserire %1"
po/ja.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Launcherに登録"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Launcherへの登録を解除"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr "最近の検索"
8686
@@ -165,11 +165,35 @@ msgstr "パスワードを表示"
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr "検索"
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
po/km.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
1111"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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "ចាក់​សោ​​ទៅ​កម្មវិធី​ចាប់ផ្ដើម"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "ដោះសោ​ពី​កម្មវិធី​ចាប់ផ្ដើម"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -84,7 +84,7 @@ msgstr "ការ​ហៅ​ពេល​អាសន្ន"
8484msgid "OK"
8585msgstr ""
8686
87−#: qml/Components/PageHeader.qml:365
87+#: qml/Components/PageHeader.qml:366
8888msgid "Recent searches"
8989msgstr "ការ​ស្វែងរក​ថ្មី"
9090
@@ -169,11 +169,35 @@ msgstr "បង្ហាញ​ពាក្យ​សម្ងាត់"
169169msgid "Please enter SIM PIN"
170170msgstr "បញ្ចូល​កូដ PIN របស់​ស៊ីមកាត"
171171
172+#: qml/Panel/Indicators/MenuItemFactory.qml:583
173+msgid "In queue…"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:587
177+msgid "Downloading"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:589
181+msgid "Paused, tap to resume"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:591
185+msgid "Canceled"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:593
189+msgid "Finished"
190+msgstr ""
191+
192+#: qml/Panel/Indicators/MenuItemFactory.qml:595
193+msgid "Failed, tap to retry"
194+msgstr ""
195+
172196#: qml/Panel/SearchIndicator.qml:27
173197msgid "Search"
174198msgstr "ស្វែង​រក"
175199
176−#: qml/Shell.qml:334
200+#: qml/Shell.qml:359
177201#, qt-format
178202msgid "Please enter %1"
179203msgstr "សូម​បញ្ចូល %1"
po/kn.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr "ಇತ್ತೀಚಿನ ಹುಡುಕಾಟಗಳು"
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr "ಹುಡುಕು"
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
po/ko.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr "최근 검색"
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr "검색"
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
po/ky.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr "Соңку издөөлөр"
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr "Издөө"
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
po/lo.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr ""
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr "ຊອກຫາ"
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr "ກະລູນາປ້ອນ %1"
po/lt.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
1111"PO-Revision-Date: 2014-05-19 17:15+0000\n"
1212"Last-Translator: Mantas Kriaučiūnas <mantas@akl.lt>\n"
1313"Language-Team: Lithuanian <lt@li.org>\n"
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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Palikti mygtukų juostoje"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Nelaikyti mygtukų juostoje"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -83,7 +83,7 @@ msgstr "Pagalbos skambutis"
8383msgid "OK"
8484msgstr ""
8585
86−#: qml/Components/PageHeader.qml:365
86+#: qml/Components/PageHeader.qml:366
8787msgid "Recent searches"
8888msgstr "Paskiausios paieškos"
8989
@@ -168,11 +168,35 @@ msgstr "Rodyti slaptažodį"
168168msgid "Please enter SIM PIN"
169169msgstr "Įveskite SIM kortelės PIN kodą"
170170
171+#: qml/Panel/Indicators/MenuItemFactory.qml:583
172+msgid "In queue…"
173+msgstr ""
174+
175+#: qml/Panel/Indicators/MenuItemFactory.qml:587
176+msgid "Downloading"
177+msgstr ""
178+
179+#: qml/Panel/Indicators/MenuItemFactory.qml:589
180+msgid "Paused, tap to resume"
181+msgstr ""
182+
183+#: qml/Panel/Indicators/MenuItemFactory.qml:591
184+msgid "Canceled"
185+msgstr ""
186+
187+#: qml/Panel/Indicators/MenuItemFactory.qml:593
188+msgid "Finished"
189+msgstr ""
190+
191+#: qml/Panel/Indicators/MenuItemFactory.qml:595
192+msgid "Failed, tap to retry"
193+msgstr ""
194+
171195#: qml/Panel/SearchIndicator.qml:27
172196msgid "Search"
173197msgstr "Paieška"
174198
175−#: qml/Shell.qml:334
199+#: qml/Shell.qml:359
176200#, qt-format
177201msgid "Please enter %1"
178202msgstr "Prašom įvesti %1"
po/lv.po+34−10
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
1111"PO-Revision-Date: 2014-05-31 14:54+0000\n"
12−"Last-Translator: Jānis-Marks Gailis <jeanmarc.gailis@gmail.com>\n"
12+"Last-Translator: Jānis-Marks Gailis <jm-gailis@fai-vianet.fr>\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Pieslēgt palaidējam"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Atslēgt no palaidēja"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -80,7 +80,7 @@ msgstr "Neatliekamās Palīdzības zvans"
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr "Nesen veiktās meklēšanas"
8686
@@ -165,11 +165,35 @@ msgstr "Rādīt paroli"
165165msgid "Please enter SIM PIN"
166166msgstr "Lūdzu ievadiet SIM PIN"
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr "Meklēt"
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr "Lūdzu ievadiet %1"
po/ml.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "വിക്ഷേപികയില്‍ സ്ഥിരപ്പെടുത്തുക"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "വിക്ഷേപികാ സ്ഥിരപ്പെടുത്തല്‍ ഒഴിവാക്കുക"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -82,7 +82,7 @@ msgstr "അടിയന്തിര വിളി"
8282msgid "OK"
8383msgstr ""
8484
85−#: qml/Components/PageHeader.qml:365
85+#: qml/Components/PageHeader.qml:366
8686msgid "Recent searches"
8787msgstr "സമീപകാല തിരയലുകള്‍"
8888
@@ -167,11 +167,35 @@ msgstr "രഹസ്യവാക്ക് കാണിക്കുക"
167167msgid "Please enter SIM PIN"
168168msgstr ""
169169
170+#: qml/Panel/Indicators/MenuItemFactory.qml:583
171+msgid "In queue…"
172+msgstr ""
173+
174+#: qml/Panel/Indicators/MenuItemFactory.qml:587
175+msgid "Downloading"
176+msgstr ""
177+
178+#: qml/Panel/Indicators/MenuItemFactory.qml:589
179+msgid "Paused, tap to resume"
180+msgstr ""
181+
182+#: qml/Panel/Indicators/MenuItemFactory.qml:591
183+msgid "Canceled"
184+msgstr ""
185+
186+#: qml/Panel/Indicators/MenuItemFactory.qml:593
187+msgid "Finished"
188+msgstr ""
189+
190+#: qml/Panel/Indicators/MenuItemFactory.qml:595
191+msgid "Failed, tap to retry"
192+msgstr ""
193+
170194#: qml/Panel/SearchIndicator.qml:27
171195msgid "Search"
172196msgstr "തിരയുക"
173197
174−#: qml/Shell.qml:334
198+#: qml/Shell.qml:359
175199#, qt-format
176200msgid "Please enter %1"
177201msgstr "ദയവായി %1 നല്‍കുക"
po/mr.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr ""
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr ""
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
po/ms.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Kunci ke Pelancar"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Tanggalkan dari Pelancar"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -80,7 +80,7 @@ msgstr "panggilan Kecemasan"
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr "Gelintar baru-baru ini"
8686
@@ -165,11 +165,35 @@ msgstr "Tunjuk kata laluan"
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr "Gelintar"
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr "Sila masukkan %1"
po/my.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Launcher တွင်ထားမည်"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Launcher မှဖြုတ်မည်"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -80,7 +80,7 @@ msgstr "အရေးပေါ်ခေါ်မည်"
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr "မကြာသေးခင်က ရှာဖွေခြင်း"
8686
@@ -165,11 +165,35 @@ msgstr "စကားဝှက်ကိုပြ"
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr "ရှာဖွေ"
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr "%1ကိုရိုက်ထည့်ပါ"
po/nb.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
1111"PO-Revision-Date: 2014-06-11 06:36+0000\n"
1212"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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Lås til oppstarter"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Lås opp fra oppstarter"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -82,7 +82,7 @@ msgstr "Nødanrop"
8282msgid "OK"
8383msgstr "OK"
8484
85−#: qml/Components/PageHeader.qml:365
85+#: qml/Components/PageHeader.qml:366
8686msgid "Recent searches"
8787msgstr "Nylige søk"
8888
@@ -167,11 +167,35 @@ msgstr "Vis passord"
167167msgid "Please enter SIM PIN"
168168msgstr "Skriv inn PIN-koden til SIM-kortet"
169169
170+#: qml/Panel/Indicators/MenuItemFactory.qml:583
171+msgid "In queue…"
172+msgstr ""
173+
174+#: qml/Panel/Indicators/MenuItemFactory.qml:587
175+msgid "Downloading"
176+msgstr ""
177+
178+#: qml/Panel/Indicators/MenuItemFactory.qml:589
179+msgid "Paused, tap to resume"
180+msgstr ""
181+
182+#: qml/Panel/Indicators/MenuItemFactory.qml:591
183+msgid "Canceled"
184+msgstr ""
185+
186+#: qml/Panel/Indicators/MenuItemFactory.qml:593
187+msgid "Finished"
188+msgstr ""
189+
190+#: qml/Panel/Indicators/MenuItemFactory.qml:595
191+msgid "Failed, tap to retry"
192+msgstr ""
193+
170194#: qml/Panel/SearchIndicator.qml:27
171195msgid "Search"
172196msgstr "Søk"
173197
174−#: qml/Shell.qml:334
198+#: qml/Shell.qml:359
175199#, qt-format
176200msgid "Please enter %1"
177201msgstr "Skriv inn %1"
po/nl.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "In Starter vastzetten"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Uit Starter verwijderen"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -80,7 +80,7 @@ msgstr "Noodoproep"
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr "Recente zoekopdrachten"
8686
@@ -165,11 +165,35 @@ msgstr "Wachtwoord tonen"
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr "Zoeken"
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr "Voer %1 in"
po/pl.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
1111"PO-Revision-Date: 2014-05-27 15:20+0000\n"
1212"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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Dodaj do panelu uruchamiania"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Usuń z panelu uruchamiania"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -84,7 +84,7 @@ msgstr "Telefon ratunkowy"
8484msgid "OK"
8585msgstr ""
8686
87−#: qml/Components/PageHeader.qml:365
87+#: qml/Components/PageHeader.qml:366
8888msgid "Recent searches"
8989msgstr "Ostatnie wyszukiwania"
9090
@@ -169,11 +169,35 @@ msgstr "Wyświetl hasło"
169169msgid "Please enter SIM PIN"
170170msgstr "Wprowadź kod PIN karty SIM"
171171
172+#: qml/Panel/Indicators/MenuItemFactory.qml:583
173+msgid "In queue…"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:587
177+msgid "Downloading"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:589
181+msgid "Paused, tap to resume"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:591
185+msgid "Canceled"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:593
189+msgid "Finished"
190+msgstr ""
191+
192+#: qml/Panel/Indicators/MenuItemFactory.qml:595
193+msgid "Failed, tap to retry"
194+msgstr ""
195+
172196#: qml/Panel/SearchIndicator.qml:27
173197msgid "Search"
174198msgstr "Szukaj"
175199
176−#: qml/Shell.qml:334
200+#: qml/Shell.qml:359
177201#, qt-format
178202msgid "Please enter %1"
179203msgstr "Wprowadź %1"
po/pt.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr ""
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr ""
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
po/pt_BR.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
1111"PO-Revision-Date: 2014-05-15 14:31+0000\n"
1212"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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Bloquear no lançador"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Desbloquear do lançador"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -84,7 +84,7 @@ msgstr "Chamada de emergência"
8484msgid "OK"
8585msgstr ""
8686
87−#: qml/Components/PageHeader.qml:365
87+#: qml/Components/PageHeader.qml:366
8888msgid "Recent searches"
8989msgstr "Pesquisas recentes"
9090
@@ -169,11 +169,35 @@ msgstr "Exibir senha"
169169msgid "Please enter SIM PIN"
170170msgstr "Por favor, digite o PIN do cartão SIM"
171171
172+#: qml/Panel/Indicators/MenuItemFactory.qml:583
173+msgid "In queue…"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:587
177+msgid "Downloading"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:589
181+msgid "Paused, tap to resume"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:591
185+msgid "Canceled"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:593
189+msgid "Finished"
190+msgstr ""
191+
192+#: qml/Panel/Indicators/MenuItemFactory.qml:595
193+msgid "Failed, tap to retry"
194+msgstr ""
195+
172196#: qml/Panel/SearchIndicator.qml:27
173197msgid "Search"
174198msgstr "Pesquisar"
175199
176−#: qml/Shell.qml:334
200+#: qml/Shell.qml:359
177201#, qt-format
178202msgid "Please enter %1"
179203msgstr "Por favor, digite %1"
po/ro.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr "Căutări recente"
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr "Căutare"
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
po/ru.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
1111"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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Закрепить на панели"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Убрать с панели"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -87,7 +87,7 @@ msgstr "Экстренный вызов"
8787msgid "OK"
8888msgstr ""
8989
90−#: qml/Components/PageHeader.qml:365
90+#: qml/Components/PageHeader.qml:366
9191msgid "Recent searches"
9292msgstr "Последние поисковые запросы"
9393
@@ -172,11 +172,35 @@ msgstr "Показать пароль"
172172msgid "Please enter SIM PIN"
173173msgstr "Введите PIN код"
174174
175+#: qml/Panel/Indicators/MenuItemFactory.qml:583
176+msgid "In queue…"
177+msgstr ""
178+
179+#: qml/Panel/Indicators/MenuItemFactory.qml:587
180+msgid "Downloading"
181+msgstr ""
182+
183+#: qml/Panel/Indicators/MenuItemFactory.qml:589
184+msgid "Paused, tap to resume"
185+msgstr ""
186+
187+#: qml/Panel/Indicators/MenuItemFactory.qml:591
188+msgid "Canceled"
189+msgstr ""
190+
191+#: qml/Panel/Indicators/MenuItemFactory.qml:593
192+msgid "Finished"
193+msgstr ""
194+
195+#: qml/Panel/Indicators/MenuItemFactory.qml:595
196+msgid "Failed, tap to retry"
197+msgstr ""
198+
175199#: qml/Panel/SearchIndicator.qml:27
176200msgid "Search"
177201msgstr "Поиск"
178202
179−#: qml/Shell.qml:334
203+#: qml/Shell.qml:359
180204#, qt-format
181205msgid "Please enter %1"
182206msgstr "Пожалуйста, введите %1"
po/shn.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr ""
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr ""
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
po/si.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr ""
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr ""
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
po/sl.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
1111"PO-Revision-Date: 2014-06-23 09:29+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-06-24 06:33+0000\n"
18−"X-Generator: Launchpad (build 17065)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Zakleni na zaganjalnik"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Odkleni z zaganjalnika"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -84,7 +84,7 @@ msgstr "Klic v sili"
8484msgid "OK"
8585msgstr "V REDU"
8686
87−#: qml/Components/PageHeader.qml:365
87+#: qml/Components/PageHeader.qml:366
8888msgid "Recent searches"
8989msgstr "Nedavna iskanja"
9090
@@ -169,11 +169,35 @@ msgstr "Pokaži geslo"
169169msgid "Please enter SIM PIN"
170170msgstr "Vnesite PIN kartice SIM"
171171
172+#: qml/Panel/Indicators/MenuItemFactory.qml:583
173+msgid "In queue…"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:587
177+msgid "Downloading"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:589
181+msgid "Paused, tap to resume"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:591
185+msgid "Canceled"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:593
189+msgid "Finished"
190+msgstr ""
191+
192+#: qml/Panel/Indicators/MenuItemFactory.qml:595
193+msgid "Failed, tap to retry"
194+msgstr ""
195+
172196#: qml/Panel/SearchIndicator.qml:27
173197msgid "Search"
174198msgstr "Iskanje"
175199
176−#: qml/Shell.qml:334
200+#: qml/Shell.qml:359
177201#, qt-format
178202msgid "Please enter %1"
179203msgstr "Vnesite %1"
po/sq.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:50+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -81,7 +81,7 @@ msgstr ""
8181msgid "OK"
8282msgstr ""
8383
84−#: qml/Components/PageHeader.qml:365
84+#: qml/Components/PageHeader.qml:366
8585msgid "Recent searches"
8686msgstr ""
8787
@@ -166,11 +166,35 @@ msgstr ""
166166msgid "Please enter SIM PIN"
167167msgstr ""
168168
169+#: qml/Panel/Indicators/MenuItemFactory.qml:583
170+msgid "In queue…"
171+msgstr ""
172+
173+#: qml/Panel/Indicators/MenuItemFactory.qml:587
174+msgid "Downloading"
175+msgstr ""
176+
177+#: qml/Panel/Indicators/MenuItemFactory.qml:589
178+msgid "Paused, tap to resume"
179+msgstr ""
180+
181+#: qml/Panel/Indicators/MenuItemFactory.qml:591
182+msgid "Canceled"
183+msgstr ""
184+
185+#: qml/Panel/Indicators/MenuItemFactory.qml:593
186+msgid "Finished"
187+msgstr ""
188+
189+#: qml/Panel/Indicators/MenuItemFactory.qml:595
190+msgid "Failed, tap to retry"
191+msgstr ""
192+
169193#: qml/Panel/SearchIndicator.qml:27
170194msgid "Search"
171195msgstr ""
172196
173−#: qml/Shell.qml:334
197+#: qml/Shell.qml:359
174198#, qt-format
175199msgid "Please enter %1"
176200msgstr ""
po/sr.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr "Скорашње претраге"
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr "Претрага"
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
po/sv.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
1111"PO-Revision-Date: 2014-06-07 19:14+0000\n"
1212"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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr "Nödsamtal"
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr ""
8686
@@ -165,11 +165,35 @@ msgstr "Visa lösenord"
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr "Sök"
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr "Vänligen fyll i %1"
po/sw.po+32−8
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
1111"PO-Revision-Date: 2014-01-14 19:28+0000\n"
12−"Last-Translator: Damas Mlabwa <Unknown>\n"
12+"Last-Translator: Damas <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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr ""
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr "Tafuta"
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
po/ta.po+31−7
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919"Language: ta\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
23−msgid "Lock to Launcher"
23+msgid "Pin shortcut"
2424msgstr ""
2525
2626#: plugins/Unity/Launcher/launcheritem.cpp:73
27−msgid "Unlock from Launcher"
27+msgid "Unpin shortcut"
2828msgstr ""
2929
3030#: qml/Components/EdgeDemoOverlay.qml:151
@@ -83,7 +83,7 @@ msgstr "அவசர அழைப்பு"
8383msgid "OK"
8484msgstr ""
8585
86−#: qml/Components/PageHeader.qml:365
86+#: qml/Components/PageHeader.qml:366
8787msgid "Recent searches"
8888msgstr "கடையாக தேடப்பட்டவைகள்"
8989
@@ -168,11 +168,35 @@ msgstr ""
168168msgid "Please enter SIM PIN"
169169msgstr ""
170170
171+#: qml/Panel/Indicators/MenuItemFactory.qml:583
172+msgid "In queue…"
173+msgstr ""
174+
175+#: qml/Panel/Indicators/MenuItemFactory.qml:587
176+msgid "Downloading"
177+msgstr ""
178+
179+#: qml/Panel/Indicators/MenuItemFactory.qml:589
180+msgid "Paused, tap to resume"
181+msgstr ""
182+
183+#: qml/Panel/Indicators/MenuItemFactory.qml:591
184+msgid "Canceled"
185+msgstr ""
186+
187+#: qml/Panel/Indicators/MenuItemFactory.qml:593
188+msgid "Finished"
189+msgstr ""
190+
191+#: qml/Panel/Indicators/MenuItemFactory.qml:595
192+msgid "Failed, tap to retry"
193+msgstr ""
194+
171195#: qml/Panel/SearchIndicator.qml:27
172196msgid "Search"
173197msgstr "தெடு"
174198
175−#: qml/Shell.qml:334
199+#: qml/Shell.qml:359
176200#, qt-format
177201msgid "Please enter %1"
178202msgstr "தயவுச்செய்து %1 உள்ளிடு"
po/te.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr ""
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr ""
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
po/tr.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
1111"PO-Revision-Date: 2014-05-19 12:52+0000\n"
1212"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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Başlatıcıya Sabitle"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Başlatıcıdan Ayır"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -83,7 +83,7 @@ msgstr "Acil Arama"
8383msgid "OK"
8484msgstr ""
8585
86−#: qml/Components/PageHeader.qml:365
86+#: qml/Components/PageHeader.qml:366
8787msgid "Recent searches"
8888msgstr "Son aramalar"
8989
@@ -168,11 +168,35 @@ msgstr "Parolayı göster"
168168msgid "Please enter SIM PIN"
169169msgstr "Lütfen SIM PIN'inizi girin"
170170
171+#: qml/Panel/Indicators/MenuItemFactory.qml:583
172+msgid "In queue…"
173+msgstr ""
174+
175+#: qml/Panel/Indicators/MenuItemFactory.qml:587
176+msgid "Downloading"
177+msgstr ""
178+
179+#: qml/Panel/Indicators/MenuItemFactory.qml:589
180+msgid "Paused, tap to resume"
181+msgstr ""
182+
183+#: qml/Panel/Indicators/MenuItemFactory.qml:591
184+msgid "Canceled"
185+msgstr ""
186+
187+#: qml/Panel/Indicators/MenuItemFactory.qml:593
188+msgid "Finished"
189+msgstr ""
190+
191+#: qml/Panel/Indicators/MenuItemFactory.qml:595
192+msgid "Failed, tap to retry"
193+msgstr ""
194+
171195#: qml/Panel/SearchIndicator.qml:27
172196msgid "Search"
173197msgstr "Ara"
174198
175−#: qml/Shell.qml:334
199+#: qml/Shell.qml:359
176200#, qt-format
177201msgid "Please enter %1"
178202msgstr "Lütfen %1 girin"
po/ug.po+34−10
@@ -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-06-13 09:55+0200\n"
11−"PO-Revision-Date: 2014-06-13 21:07+0000\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11+"PO-Revision-Date: 2014-07-10 23:16+0000\n"
1212"Last-Translator: Gheyret T.Kenji <Unknown>\n"
1313"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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-11 06:15+0000\n"
18+"X-Generator: Launchpad (build 17111)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "ئىجراچىغا سولىۋەت"
22+msgid "Pin shortcut"
23+msgstr "تېزلەتمىنى قوي"
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "ئىجراچىدىن چىقار"
26+msgid "Unpin shortcut"
27+msgstr "تېزلەتمىنى ئېلىۋەت"
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -82,7 +82,7 @@ msgstr "جىددىي تېلېفون"
8282msgid "OK"
8383msgstr "تامام"
8484
85−#: qml/Components/PageHeader.qml:365
85+#: qml/Components/PageHeader.qml:366
8686msgid "Recent searches"
8787msgstr "يېقىنقى ئىزدەشلەر"
8888
@@ -167,11 +167,35 @@ msgstr "ئىم كۆرسەت"
167167msgid "Please enter SIM PIN"
168168msgstr "سىم(SIM) كارتىڭىزنىڭ PIN نومۇرىنى كىرگۈزۈڭ"
169169
170+#: qml/Panel/Indicators/MenuItemFactory.qml:583
171+msgid "In queue…"
172+msgstr ""
173+
174+#: qml/Panel/Indicators/MenuItemFactory.qml:587
175+msgid "Downloading"
176+msgstr "چۈشۈرۈۋاتىدۇ"
177+
178+#: qml/Panel/Indicators/MenuItemFactory.qml:589
179+msgid "Paused, tap to resume"
180+msgstr "توختىتىلغان، چەكسە داۋاملىشىدۇ"
181+
182+#: qml/Panel/Indicators/MenuItemFactory.qml:591
183+msgid "Canceled"
184+msgstr "قالدۇرۇۋېتىلدى"
185+
186+#: qml/Panel/Indicators/MenuItemFactory.qml:593
187+msgid "Finished"
188+msgstr "تاماملاندى"
189+
190+#: qml/Panel/Indicators/MenuItemFactory.qml:595
191+msgid "Failed, tap to retry"
192+msgstr "مەغلۇپ بولدى، چېكىپ قايتا سىناڭ"
193+
170194#: qml/Panel/SearchIndicator.qml:27
171195msgid "Search"
172196msgstr "ئىزدە"
173197
174−#: qml/Shell.qml:334
198+#: qml/Shell.qml:359
175199#, qt-format
176200msgid "Please enter %1"
177201msgstr "%1 نى كىرگۈزۈڭ"
po/uk.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
1111"PO-Revision-Date: 2014-06-08 19:09+0000\n"
1212"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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "Зафіксувати на панелі запуску"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "Від’єднати від панелі запуску"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -85,7 +85,7 @@ msgstr "Терміновий виклик"
8585msgid "OK"
8686msgstr "Гаразд"
8787
88−#: qml/Components/PageHeader.qml:365
88+#: qml/Components/PageHeader.qml:366
8989msgid "Recent searches"
9090msgstr "Нещодавні пошуки"
9191
@@ -170,11 +170,35 @@ msgstr "Показати пароль"
170170msgid "Please enter SIM PIN"
171171msgstr "Введіть PIN-код SIM-картки"
172172
173+#: qml/Panel/Indicators/MenuItemFactory.qml:583
174+msgid "In queue…"
175+msgstr ""
176+
177+#: qml/Panel/Indicators/MenuItemFactory.qml:587
178+msgid "Downloading"
179+msgstr ""
180+
181+#: qml/Panel/Indicators/MenuItemFactory.qml:589
182+msgid "Paused, tap to resume"
183+msgstr ""
184+
185+#: qml/Panel/Indicators/MenuItemFactory.qml:591
186+msgid "Canceled"
187+msgstr ""
188+
189+#: qml/Panel/Indicators/MenuItemFactory.qml:593
190+msgid "Finished"
191+msgstr ""
192+
193+#: qml/Panel/Indicators/MenuItemFactory.qml:595
194+msgid "Failed, tap to retry"
195+msgstr ""
196+
173197#: qml/Panel/SearchIndicator.qml:27
174198msgid "Search"
175199msgstr "Пошук"
176200
177−#: qml/Shell.qml:334
201+#: qml/Shell.qml:359
178202#, qt-format
179203msgid "Please enter %1"
180204msgstr "Будь ласка, введіть %1"
po/unity8.pot+30−6
@@ -8,22 +8,22 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity8\n"
1010"Report-Msgid-Bugs-To: \n"
11−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
11+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
1212"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1313"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1414"Language-Team: LANGUAGE <LL@li.org>\n"
1515"Language: \n"
1616"MIME-Version: 1.0\n"
17−"Content-Type: text/plain; charset=CHARSET\n"
17+"Content-Type: text/plain; charset=UTF-8\n"
1818"Content-Transfer-Encoding: 8bit\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr ""
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr ""
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
po/update-unity-pot+2−1
@@ -22,6 +22,7 @@ xgettext \
2222 --keyword=tr \
2323 --keyword=tr:1,2 \
2424 --package-name="unity8" \
25− --copyright-holder="Canonical Ltd."
25+ --copyright-holder="Canonical Ltd." \
26+ --from-code="UTF-8"
2627
2728echo "$PROGNAME: $PO_DIR/auto-generated.pot updated"
po/vi.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr ""
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr ""
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
po/xh.po+31−7
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
22+msgid "Pin shortcut"
2323msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr ""
8686
@@ -165,11 +165,35 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr ""
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
po/zh_CN.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\n"
1111"PO-Revision-Date: 2014-06-12 08:55+0000\n"
1212"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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "固定到启动器"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "从启动器移除"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -80,7 +80,7 @@ msgstr "紧急电话"
8080msgid "OK"
8181msgstr "确定"
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr "近期搜索"
8686
@@ -165,11 +165,35 @@ msgstr "显示密码"
165165msgid "Please enter SIM PIN"
166166msgstr "请输入 SIM PIN"
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr "搜索"
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr "请输入 %1"
po/zh_HK.po+33−9
@@ -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-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "鎖定至啟動器"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
27−msgstr "從啟動器解除鎖定"
26+msgid "Unpin shortcut"
27+msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -80,7 +80,7 @@ msgstr "緊急電話"
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr "最近的搜尋"
8686
@@ -165,11 +165,35 @@ msgstr "顯示密碼"
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr "搜尋"
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr "請輸入 %1"
po/zh_TW.po+32−8
@@ -7,23 +7,23 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-06-13 09:55+0200\n"
10+"POT-Creation-Date: 2014-07-07 12:15+0100\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-06-17 06:51+0000\n"
18−"X-Generator: Launchpad (build 17045)\n"
17+"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18+"X-Generator: Launchpad (build 17100)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
22−msgid "Lock to Launcher"
23−msgstr "鎖定至啟動欄"
22+msgid "Pin shortcut"
23+msgstr ""
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
26−msgid "Unlock from Launcher"
26+msgid "Unpin shortcut"
2727msgstr ""
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
@@ -80,7 +80,7 @@ msgstr "緊急連絡"
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:365
83+#: qml/Components/PageHeader.qml:366
8484msgid "Recent searches"
8585msgstr "最近搜尋"
8686
@@ -165,11 +165,35 @@ msgstr "顯示密碼"
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/Indicators/MenuItemFactory.qml:583
169+msgid "In queue…"
170+msgstr ""
171+
172+#: qml/Panel/Indicators/MenuItemFactory.qml:587
173+msgid "Downloading"
174+msgstr ""
175+
176+#: qml/Panel/Indicators/MenuItemFactory.qml:589
177+msgid "Paused, tap to resume"
178+msgstr ""
179+
180+#: qml/Panel/Indicators/MenuItemFactory.qml:591
181+msgid "Canceled"
182+msgstr ""
183+
184+#: qml/Panel/Indicators/MenuItemFactory.qml:593
185+msgid "Finished"
186+msgstr ""
187+
188+#: qml/Panel/Indicators/MenuItemFactory.qml:595
189+msgid "Failed, tap to retry"
190+msgstr ""
191+
168192#: qml/Panel/SearchIndicator.qml:27
169193msgid "Search"
170194msgstr "搜尋"
171195
172−#: qml/Shell.qml:334
196+#: qml/Shell.qml:359
173197#, qt-format
174198msgid "Please enter %1"
175199msgstr ""
qml/Components/BaseCarouselDelegate.qml+19
@@ -17,7 +17,26 @@
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
1919
20+/*!
21+ \brief Base delegate for use with the Carousel component
22+
23+ Use this as the base of your component in a Carousel, the properties
24+ will get updated and signals emitted accordingly.
25+*/
26+
2027Item {
28+ /// True if this item is currently "focused" in the carousel.
2129 property bool explicitlyScaled
30+
31+ /// Model index for this delegate.
32+ property int index
33+
34+ /// Model data for this delegate.
2235 property var model
36+
37+ /// Will be emitted when the item is tapped.
38+ signal clicked
39+
40+ /// Will be emitted when the item is long-pressed.
41+ signal pressAndHold
2342}
qml/Components/Carousel.qml+5−14
@@ -52,16 +52,6 @@ Item {
5252 /// exposes the distance to the next row (only one row in carousel, so it's the topMargins)
5353 readonly property alias verticalSpacing: listView.verticalMargin
5454
55− /// Emitted when the user clicked on an item
56− /// @param index is the index of the clicked item
57− /// @param itemY is y of the clicked delegate
58− signal clicked(int index, real itemY)
59−
60− /// Emitted when the user pressed and held on an item
61− /// @param index is the index of the held item
62− /// @param itemY is y of the held delegate
63− signal pressAndHold(int index, real itemY)
64−
6555 implicitHeight: listView.tileHeight * selectedItemScaleFactor
6656 opacity: listView.highlightIndex === -1 ? 1 : 0.6
6757
@@ -167,7 +157,7 @@ Item {
167157 /* We're clicking the selected item and
168158 we're in the neighbourhood of radius 1 pixel from it.
169159 Let's emit the clicked signal. */
170− carousel.clicked(index, delegateItem.y)
160+ delegateItem.clicked()
171161 return
172162 }
173163
@@ -185,7 +175,7 @@ Item {
185175 /* We're pressAndHold the selected item and
186176 we're in the neighbourhood of radius 1 pixel from it.
187177 Let's emit the pressAndHold signal. */
188− carousel.pressAndHold(index, delegateItem.y);
178+ delegateItem.pressAndHold();
189179 return;
190180 }
191181
@@ -316,8 +306,9 @@ Item {
316306 }
317307
318308 onLoaded: {
319− item.explicitlyScaled = Qt.binding(function() { return explicitlyScaled; })
320− item.model = Qt.binding(function() { return model; })
309+ item.explicitlyScaled = Qt.binding(function() { return explicitlyScaled; });
310+ item.index = Qt.binding(function() { return index; });
311+ item.model = Qt.binding(function() { return model; });
321312 }
322313
323314 MouseArea {
qml/Components/ListItems/Header.qml+1
@@ -24,6 +24,7 @@ Item {
2424 \qmlproperty string text
2525 */
2626 property alias text: label.text
27+ property alias textColor: label.color
2728 property alias image: image.source
2829
2930 signal clicked(variant mouse)
qml/Components/PageHeader.qml+221−313
@@ -14,386 +14,294 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 */
1616
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import Ubuntu.Components.Popups 0.1
20−import Ubuntu.Components.ListItems 0.1 as ListItem
21−import Unity 0.2
17+import QtQuick 2.2
18+import Ubuntu.Components 1.1
19+import Ubuntu.Components.Themes.Ambiance 1.1
20+import Ubuntu.Components.Popups 1.0
21+import Ubuntu.Components.ListItems 1.0
22+import "SearchHistoryModel"
2223
2324Item {
2425 id: root
26+ objectName: "pageHeader"
27+ implicitHeight: headerContainer.height + units.gu(2) + bottomContainer.height
28+
29+ property bool showBackButton: false
30+ property string title
31+
2532 property bool searchEntryEnabled: false
26− property alias searchQuery: searchField.text
27− property ListModel searchHistory
28− property var scope: null
29− property alias childItem: itemContainer.children
33+ property ListModel searchHistory: SearchHistoryModel
34+ property alias searchQuery: searchTextField.text
35+ property bool searchInProgress: false
36+
3037 property alias bottomItem: bottomContainer.children
31− property alias showBackButton: backButton.visible
3238
33− signal backClicked
39+ // TODO We should use foreground for the icons
40+ // of the toolbar but unfortunately Action does not have
41+ // the keyColor property as Icon does :-/
42+ property var scopeStyle: null
3443
35− height: header.height + units.gu(2) + bottomContainer.height
36− implicitHeight: header.height + units.gu(2) + bottomContainer.height
44+ signal backClicked()
45+
46+ onScopeStyleChanged: refreshLogo()
3747
3848 function triggerSearch() {
39− if (searchEntryEnabled) searchField.forceActiveFocus()
49+ if (searchEntryEnabled) {
50+ headerContainer.showSearch = true;
51+ searchTextField.forceActiveFocus();
52+ }
4053 }
4154
42− function resetSearch() {
43− if (!searchHistory) return;
44−
45− searchHistory.addQuery(searchField.text);
46− unfocus();
47− searchField.text = "";
55+ function resetSearch(keepFocus) {
56+ if (searchHistory) {
57+ searchHistory.addQuery(searchTextField.text);
58+ }
59+ if (!keepFocus) {
60+ unfocus();
61+ }
62+ searchTextField.text = "";
63+ if (headerContainer.popover != null) {
64+ PopupUtils.close(headerContainer.popover);
65+ }
4866 }
4967
5068 function unfocus() {
51− searchField.focus = false;
69+ searchTextField.focus = false;
70+ if (!searchTextField.text) {
71+ headerContainer.showSearch = false;
72+ }
5273 }
5374
54− Connections {
55− target: greeter
56− onShownChanged: if (shown) resetSearch()
75+ function openSearchHistory() {
76+ if (openSearchAnimation.running) {
77+ openSearchAnimation.openSearchHistory = true;
78+ } else if (root.searchHistory.count > 0 && headerContainer.popover == null) {
79+ headerContainer.popover = PopupUtils.open(popoverComponent, searchTextField,
80+ {
81+ "contentWidth": searchTextField.width,
82+ "edgeMargins": units.gu(1)
83+ }
84+ );
85+ }
5786 }
5887
59− Flickable {
60− id: header
61− anchors {
62− left: parent.left
63− right: parent.right
64− top: parent.top
88+ function refreshLogo() {
89+ if (scopeStyle ? scopeStyle.headerLogo != "" : false) {
90+ header.contents = imageComponent.createObject();
91+ } else if (header.contents) {
92+ header.contents.destroy();
93+ header.contents = null;
6594 }
66− height: units.gu(6.5)
67−
68− interactive: false
69− contentHeight: headerContainer.height
70− clip: true
71−
72− contentY: searchField.activeFocus || searchField.text != "" ? searchContainer.y : headerContainer.y
95+ }
7396
74− Behavior on contentY { NumberAnimation { duration: 200; easing.type: Easing.OutQuad } }
97+ Connections {
98+ target: root.scopeStyle
99+ onHeaderLogoChanged: root.refreshLogo()
100+ }
75101
76− AbstractButton {
77− id: backButton
78− objectName: root.objectName + "_backButton"
79− visible: false
80− height: header.height
81− y: header.contentY
82− anchors {
83− left: parent.left
84− leftMargin: visible ? units.gu(2) : 0
102+ InverseMouseArea {
103+ anchors { fill: parent; margins: units.gu(1); bottomMargin: units.gu(3) + bottomContainer.height }
104+ visible: headerContainer.showSearch
105+ onPressed: {
106+ if (headerContainer.popover) {
107+ PopupUtils.close(headerContainer.popover);
85108 }
86− width: visible ? image.width + units.gu(2) : 0
87− onClicked: root.backClicked();
88− Image {
89− id: image
90− anchors.centerIn: parent
91− source: "graphics/headerback.png"
109+ if (!searchTextField.text) {
110+ headerContainer.showSearch = false;
92111 }
112+ searchTextField.focus = false;
113+ mouse.accepted = false;
93114 }
115+ }
94116
95− // FIXME this could potentially be simplified to avoid all the containers
96− Item {
97− id: headerContainer
98−
99− anchors {
100− left: backButton.right
101− right: parent.right
102− }
103− height: childrenRect.height
104−
105− Item {
106− id: itemContainer
107−
108− width: searchContainer.narrowMode ? header.width : header.width - searchContainer.width
109− height: header.height
110− }
111−
112− Item {
113− id: searchContainer
114− objectName: "searchContainer"
115−
116− visible: searchEntryEnabled
117− property bool popoverShouldOpen: false
118− property bool popoverShouldClose: false
119−
120− property bool narrowMode: parent.width < units.gu(80)
121−
122− property bool active: searchField.text != "" || searchField.activeFocus
123− property var popover: null
117+ Flickable {
118+ id: headerContainer
119+ objectName: "headerContainer"
120+ clip: true
121+ anchors { left: parent.left; top: parent.top; right: parent.right }
122+ height: units.gu(6.5)
123+ contentHeight: headersColumn.height
124+ interactive: false
125+ contentY: showSearch ? 0 : height
124126
125− anchors.right: headerContainer.right
126− height: header.height
127+ property bool showSearch: false
128+ property var popover: null
127129
128− state:
129− if (active && narrowMode) "narrowActive"
130− else if (!active && narrowMode) "narrowInactive"
131− else if (active && !narrowMode) "active"
132− else if (!active && !narrowMode) "inactive"
130+ Behavior on contentY {
131+ UbuntuNumberAnimation {
132+ id: openSearchAnimation
133+ property bool openSearchHistory: false
133134
134− onStateChanged: {
135− if (state == "active" || state == "narrowActive") {
136− popoverShouldOpen = true;
137− popoverShouldClose = false;
138− } else {
139− popoverShouldOpen = false;
140− popoverShouldClose = true;
135+ onRunningChanged: {
136+ if (!running && openSearchAnimation.openSearchHistory) {
137+ openSearchAnimation.openSearchHistory = false;
138+ root.openSearchHistory();
141139 }
142140 }
141+ }
142+ }
143143
144− function openPopover() {
145− if (searchHistory.count > 0) {
146− searchContainer.popover = PopupUtils.open(popoverComponent, pointerPositioner,
147− {
148− "contentWidth": searchField.width,
149− "edgeMargins": units.gu(1)
150− }
151− )
144+ Column {
145+ id: headersColumn
146+ anchors { left: parent.left; right: parent.right }
147+
148+ PageHeadStyle {
149+ id: searchHeader
150+ anchors { left: parent.left; right: parent.right }
151+ height: headerContainer.height
152+ contentHeight: height
153+ separatorSource: ""
154+ // Required to keep PageHeadStyle noise down as it expects the Page's properties around.
155+ property var styledItem: searchHeader
156+ property string title
157+ property var config: PageHeadConfiguration {
158+ backAction: Action {
159+ iconName: "back"
160+ onTriggered: {
161+ root.resetSearch();
162+ headerContainer.showSearch = false;
163+ }
152164 }
153− popoverShouldOpen = false;
154− popoverShouldClose = false;
155165 }
156−
157− function closePopover() {
158− if (searchContainer.popover) {
159− PopupUtils.close(searchContainer.popover);
160− searchContainer.popover = null;
166+ property var contents: TextField {
167+ id: searchTextField
168+ objectName: "searchTextField"
169+ hasClearButton: false
170+ anchors {
171+ fill: parent
172+ leftMargin: units.gu(1)
173+ topMargin: units.gu(1)
174+ bottomMargin: units.gu(1)
175+ rightMargin: root.width > units.gu(60) ? root.width - units.gu(40) : units.gu(1)
161176 }
162− popoverShouldOpen = false;
163− popoverShouldClose = false;
164− }
165−
166− onActiveFocusChanged: if (!activeFocus) { searchHistory.addQuery(searchField.text) }
167−
168− TextField {
169− id: searchField
170−
171− anchors.fill: parent
172− anchors.margins: units.gu(1)
173177
174− inputMethodHints: Qt.ImhNoPredictiveText
175− hasClearButton: false
178+ secondaryItem: AbstractButton {
179+ height: searchTextField.height
180+ width: height
181+ enabled: searchTextField.text.length > 0
176182
177− primaryItem: AbstractButton {
178− enabled: searchField.text != "" && !searchIndicator.running
179− onClicked: {
180− if (searchField.text != "") {
181− searchHistory.addQuery(searchField.text)
182− searchField.text = ""
183+ Image {
184+ objectName: "clearIcon"
185+ anchors.fill: parent
186+ anchors.margins: units.gu(.75)
187+ source: "image://theme/clear"
188+ opacity: searchTextField.text.length > 0 && !searchActivityIndicator.running
189+ visible: opacity > 0
190+ Behavior on opacity {
191+ UbuntuNumberAnimation { duration: UbuntuAnimation.FastDuration }
183192 }
184193 }
185− height: parent.height
186− width: height
187194
188195 ActivityIndicator {
189− id: searchIndicator
196+ id: searchActivityIndicator
190197 objectName: "searchIndicator"
191−
192− anchors {
193− verticalCenter: parent.verticalCenter
194− left: parent.left
195− leftMargin: units.gu(0.5)
196− }
197−
198− running: opacity > 0
199− }
200−
201− Image {
202− id: primaryImage
203− objectName: "primaryImage"
204− anchors {
205− verticalCenter: parent.verticalCenter
206− left: parent.left
207− leftMargin: units.gu(0.5)
198+ anchors.fill: parent
199+ anchors.margins: units.gu(.75)
200+ running: root.searchInProgress
201+ opacity: running ? 1 : 0
202+ Behavior on opacity {
203+ UbuntuNumberAnimation { duration: UbuntuAnimation.FastDuration }
208204 }
209− width: units.gu(3)
210− height: units.gu(3)
211− visible: opacity > 0
212205 }
213206
214− Item {
215− id: pointerPositioner
216− anchors.left: parent.right
217− anchors.leftMargin: units.gu(0.5)
218− anchors.top: parent.bottom
207+ onClicked: {
208+ root.resetSearch(true);
209+ root.openSearchHistory();
219210 }
220211 }
221212
222− onTextChanged: {
223− if (text != "") searchContainer.closePopover()
224− else if (text == "" && activeFocus) searchContainer.openPopover()
225− }
226−
227213 onActiveFocusChanged: {
228− if (!activeFocus) searchContainer.closePopover()
214+ if (activeFocus) {
215+ root.openSearchHistory();
216+ }
229217 }
218+ }
219+ }
230220
231− states: [
232− State {
233− name: "searching"
234− when: scope && scope.searchInProgress
235− PropertyChanges { target: searchIndicator; running: true; opacity: 1 }
236− PropertyChanges { target: primaryImage; opacity: 0 }
237− },
238− State {
239− name: "idle"
240− when: !scope || !scope.searchInProgress
241− PropertyChanges { target: searchIndicator; opacity: 0 }
242− PropertyChanges { target: primaryImage; opacity: 1 }
221+ PageHeadStyle {
222+ id: header
223+ objectName: "innerPageHeader"
224+ anchors { left: parent.left; right: parent.right }
225+ height: headerContainer.height
226+ contentHeight: height
227+ separatorSource: ""
228+ textColor: root.scopeStyle ? root.scopeStyle.foreground : "grey"
229+ property var styledItem: header
230+ property string title: root.title
231+ property var config: PageHeadConfiguration {
232+ backAction: Action {
233+ iconName: "back"
234+ visible: root.showBackButton
235+ onTriggered: {
236+ root.backClicked();
243237 }
244− ]
238+ }
245239
246− transitions: [
247− Transition {
248− to: "searching"
249− reversible: true
250− SequentialAnimation {
251− NumberAnimation { target: primaryImage; property: "opacity"; duration: UbuntuAnimation.FastDuration; easing.type: Easing.Linear }
252− NumberAnimation { target: searchIndicator; property: "opacity"; duration: UbuntuAnimation.FastDuration; easing.type: Easing.Linear }
240+ actions: [
241+ Action {
242+ iconName: "search"
243+ visible: root.searchEntryEnabled
244+ onTriggered: {
245+ headerContainer.showSearch = true;
246+ searchTextField.forceActiveFocus();
253247 }
254248 }
255249 ]
256250 }
257251
258− states: [
259− State {
260− name: "wide"
261− AnchorChanges { target: itemContainer; anchors.top: headerContainer.top }
262− AnchorChanges { target: searchContainer; anchors.left: undefined; anchors.top: itemContainer.top }
263− },
264− State {
265− name: "narrow"
266− PropertyChanges { target: searchField; highlighted: true }
267− AnchorChanges { target: itemContainer; anchors.top: searchContainer.bottom }
268− AnchorChanges { target: searchContainer; anchors.left: headerContainer.left; anchors.top: headerContainer.top }
269− },
270− State {
271− name: "active"
272− extend: "wide"
273− PropertyChanges { target: searchContainer; width: units.gu(40) }
274− PropertyChanges { target: primaryImage; source: searchField.text ? "../Dash/graphics/icon_clear.png" : "../Dash/graphics/icon_search_active.png" }
275− PropertyChanges { target: searchField; highlighted: true }
276− },
277− State {
278− name: "inactive"
279− extend: "wide"
280− PropertyChanges { target: searchContainer; width: units.gu(25) }
281− PropertyChanges { target: primaryImage; source: "../Dash/graphics/icon_search_inactive.png" }
282− PropertyChanges { target: searchField; highlighted: false }
283− },
284− State {
285− name: "narrowActive"
286− extend: "narrow"
287− PropertyChanges { target: header; contentY: 0 }
288− PropertyChanges { target: primaryImage; source: searchField.text ? "../Dash/graphics/icon_clear.png" : "../Dash/graphics/icon_search_active.png" }
289− },
290− State {
291− name: "narrowInactive"
292− extend: "narrow"
293− PropertyChanges { target: header; contentY: header.height }
294− PropertyChanges { target: primaryImage; source: searchField.text ? "../Dash/graphics/icon_clear.png" : "../Dash/graphics/icon_search_active.png" }
295− }
296− ]
297−
298− transitions: [
299− Transition {
300− to: "active"
301− SequentialAnimation {
302− ParallelAnimation {
303− NumberAnimation { targets: [searchContainer, searchField]; property: "width"; duration: 200; easing.type: Easing.InOutQuad }
304− PropertyAction { target: primaryImage; property: "source" }
305− AnchorAnimation { targets: [searchContainer, itemContainer]; duration: 200; easing.type: Easing.InOutQuad }
306− }
307− ScriptAction { script: if (searchContainer.popoverShouldOpen) { searchContainer.openPopover(); } }
308− }
309− },
310− Transition {
311− to: "inactive"
312− ScriptAction { script: if (searchContainer.popoverShouldClose) { searchContainer.closePopover(); } }
313− NumberAnimation { targets: [searchContainer, searchField] ; property: "width"; duration: 200; easing.type: Easing.InOutQuad }
314− AnchorAnimation { targets: [searchContainer, itemContainer]; duration: 200; easing.type: Easing.InOutQuad }
315− },
316− Transition {
317− to: "narrowActive"
318− SequentialAnimation {
319− ParallelAnimation {
320− NumberAnimation { targets: [searchContainer, searchField] ; property: "width"; duration: 200; easing.type: Easing.OutQuad }
321− AnchorAnimation { targets: [searchContainer, itemContainer]; duration: 200; easing.type: Easing.InOutQuad }
322− }
323− ScriptAction { script: if (searchContainer.popoverShouldOpen) { searchContainer.openPopover(); } }
324− }
325− },
326− Transition {
327− to: "narrowInactive"
328− ScriptAction { script: if (searchContainer.popoverShouldClose) { searchContainer.closePopover(); } }
329− NumberAnimation { targets: [searchContainer, searchField] ; property: "width"; duration: 200; easing.type: Easing.OutQuad }
330− AnchorAnimation { targets: [searchContainer, itemContainer]; duration: 200; easing.type: Easing.InOutQuad }
331− }
332− ]
252+ property var contents: null
253+ Component.onCompleted: root.refreshLogo()
333254
334255 Component {
335− id: popoverComponent
336− Popover {
337− id: popover
338−
339− // FIXME: this should go into the first item below, but enable: false
340− // prevents mouse events propagation
341− AbstractButton {
342− anchors {
343− top: parent.top
344− right: parent.right
345− }
346− height: units.gu(6)
347− width: height
348−
349− onClicked: searchContainer.closePopover()
256+ id: imageComponent
350257
351− Image {
352− anchors.centerIn: parent
353− width: units.gu(2)
354− height: units.gu(2)
355− source: "../Dash/graphics/icon_listview_clear.png"
356− }
258+ Item {
259+ anchors { fill: parent; topMargin: units.gu(1); bottomMargin: units.gu(1) }
260+ clip: true
261+ Image {
262+ objectName: "titleImage"
263+ anchors.fill: parent
264+ source: root.scopeStyle ? root.scopeStyle.headerLogo : ""
265+ fillMode: Image.PreserveAspectFit
266+ horizontalAlignment: Image.AlignLeft
267+ sourceSize.height: height
357268 }
269+ }
270+ }
271+ }
272+ }
273+ }
358274
359− Column {
360− anchors {
361− top: parent.top
362− left: parent.left
363− right: parent.right
364− }
365−
366− ListItem.Standard { enabled: false; text: i18n.tr("Recent searches") }
275+ Component {
276+ id: popoverComponent
277+ Popover {
278+ id: popover
279+ autoClose: false
367280
368− Repeater {
369− id: recentSearches
370− model: searchHistory
281+ Component.onDestruction: {
282+ headerContainer.popover = null;
283+ }
371284
372− delegate: ListItem.Standard {
373− showDivider: index < recentSearches.count - 1
374− text: query
375− onClicked: {
376− searchHistory.addQuery(text)
377− searchField.text = text
378− }
379− }
380− }
381− }
382− }
285+ Column {
286+ anchors {
287+ top: parent.top
288+ left: parent.left
289+ right: parent.right
383290 }
384291
385− InverseMouseArea {
386− enabled: searchField.activeFocus
292+ Repeater {
293+ id: recentSearches
294+ model: searchHistory
387295
388− anchors {
389− top: parent.top
390− left: parent.left
391− right: parent.right
296+ delegate: Standard {
297+ showDivider: index < recentSearches.count - 1
298+ text: query
299+ onClicked: {
300+ searchHistory.addQuery(text);
301+ searchTextField.text = text;
302+ PopupUtils.close(popover);
303+ }
392304 }
393−
394− height: searchContainer.popover ? parent.height + searchContainer.popover.contentHeight + units.gu(2) : parent.height
395−
396− onPressed: searchField.focus = false
397305 }
398306 }
399307 }
@@ -402,7 +310,7 @@ Item {
402310 BorderImage {
403311 id: bottomBorder
404312 anchors {
405− top: header.bottom
313+ top: headerContainer.bottom
406314 left: parent.left
407315 right: parent.right
408316 bottom: bottomContainer.top
qml/Components/PageHeaderLabel.qmldeleted−41
@@ -1,41 +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−PageHeader {
21− property alias text: label.text
22−
23− childItem: Label {
24− id: label
25− anchors {
26− left: parent.left
27− leftMargin: units.gu(2)
28− right: parent.right
29− verticalCenter: parent.verticalCenter
30− }
31−
32− color: Theme.palette.selected.backgroundText
33− opacity: 0.8
34− font.family: "Ubuntu"
35− font.weight: Font.Light
36− fontSize: "x-large"
37− elide: Text.ElideRight
38− style: Text.Raised
39− styleColor: "black"
40− }
41−}
qml/Components/SearchHistoryModel.qml → qml/Components/SearchHistoryModel/SearchHistoryModel.qmlrenamed+1
@@ -14,6 +14,7 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 */
1616
17+pragma Singleton
1718import QtQuick 2.0
1819
1920// TODO sanitize input, move to persistent storage
qml/Components/SearchHistoryModel/qmldirnew file+1
@@ -0,0 +1 @@
1+singleton SearchHistoryModel 1.0 SearchHistoryModel.qml
qml/Components/graphics/headerback@27.pngdeleted

Binary file not shown.

qml/Dash/CardCarousel.qml+7−4
@@ -40,9 +40,6 @@ DashRenderer {
4040 cacheBuffer: 1404 // 18px * 13gu * 6
4141 model: cardCarousel.model
4242
43− onClicked: cardCarousel.clicked(index, null)
44− onPressAndHold: cardCarousel.pressAndHold(index)
45−
4643 property real fontScale: 1 / selectedItemScaleFactor
4744 property real headerHeight: cardTool.headerHeight / selectedItemScaleFactor
4845
@@ -51,11 +48,16 @@ DashRenderer {
5148
5249 property bool explicitlyScaled
5350 property var model
51+ property int index
5452 enabled: false
5553
54+ objectName: "carouselDelegate" + index
55+
56+ function clicked() { cardCarousel.clicked(index, model.result) }
57+ function pressAndHold() { cardCarousel.pressAndHold(index, model.result) }
58+
5659 sourceComponent: cardTool.cardComponent
5760 onLoaded: {
58− item.objectName = "carouselDelegate" + index;
5961 item.fixedHeaderHeight = Qt.binding(function() { return carousel.headerHeight; });
6062 item.height = Qt.binding(function() { return cardTool.cardHeight; });
6163 item.cardData = Qt.binding(function() { return model; });
@@ -64,6 +66,7 @@ DashRenderer {
6466 item.fontScale = Qt.binding(function() { return carousel.fontScale; });
6567 item.showHeader = Qt.binding(function() { return loader.explicitlyScaled; });
6668 item.artShapeBorderSource = "none";
69+ item.scopeStyle = cardCarousel.scopeStyle;
6770 }
6871
6972 BorderImage {
qml/Dash/CardFilterGrid.qml+1
@@ -58,6 +58,7 @@ DashRenderer {
5858 item.template = Qt.binding(function() { return cardTool.template; });
5959 item.components = Qt.binding(function() { return cardTool.components; });
6060 item.headerAlignment = Qt.binding(function() { return cardTool.headerAlignment; });
61+ item.scopeStyle = genericFilterGrid.scopeStyle;
6162 }
6263 Connections {
6364 target: loader.item
qml/Dash/CardVerticalJournal.qml+2−1
@@ -31,7 +31,7 @@ DashRenderer {
3131 // is special by the fact that it doesn't know how to calculate its implicit height unless we give it
3232 // enough height that it can start creating its children so we make sure it has enough height for that
3333 // in case the model is non empty
34− readonly property double minHeight: root.model.count > 1 ? cardVerticalJournal.rowSpacing + 1 : 0
34+ readonly property double minHeight: root.model.count >= 1 ? cardVerticalJournal.rowSpacing + 1 : 0
3535 height: filtered ? Math.max(collapsedHeight, minHeight) : uncollapsedHeight
3636
3737 Behavior on height {
@@ -75,6 +75,7 @@ DashRenderer {
7575 item.template = Qt.binding(function() { return cardTool.template; });
7676 item.components = Qt.binding(function() { return cardTool.components; });
7777 item.headerAlignment = Qt.binding(function() { return cardTool.headerAlignment; });
78+ item.scopeStyle = root.scopeStyle;
7879 }
7980 Connections {
8081 target: loader.item
qml/Dash/Dash.qml+14−15
@@ -26,9 +26,6 @@ Showable {
2626
2727 visible: shown
2828
29− property ListModel searchHistory: SearchHistoryModel {}
30− property bool searchable: !dashContent.previewOpen && !scopeItem.previewOpen
31−
3229 property string showScopeOnLoaded: "clickscope"
3330 property real contentScale: 1.0
3431
@@ -76,7 +73,6 @@ Showable {
7673 height: parent.height
7774 model: filteredScopes
7875 scopes: scopes
79− searchHistory: dash.searchHistory
8076 visible: x != -width
8177 onGotoScope: {
8278 dash.setCurrentScope(scopeId, true, false);
@@ -105,26 +101,29 @@ Showable {
105101 }
106102 }
107103
108− ScopeItem {
104+ GenericScopeView {
109105 id: scopeItem
110106 anchors.left: dashContent.right
111107 width: parent.width
112108 height: parent.height
113− searchHistory: dash.searchHistory
114109 scale: dash.contentScale
115110 clip: scale != 1.0
116111 visible: scope != null
117− onBack: {
112+ hasBackAction: true
113+ isCurrent: visible
114+ onBackClicked: {
118115 closeOverlayScope();
119− }
120− onGotoScope: {
121− // TODO
122− console.log("gotoScope from an openScope scope is not implemented");
123− }
124− onOpenScope: {
125− // TODO
126− console.log("openScope from an openScope scope is not implemented");
116+ closePreview();
127117 }
128118
119+ Connections {
120+ target: scopeItem.scope
121+ onGotoScope: {
122+ dashContent.gotoScope(scopeId);
123+ }
124+ onOpenScope: {
125+ dashContent.openScope(scope);
126+ }
127+ }
129128 }
130129}
qml/Dash/DashContent.qml+7−84
@@ -26,13 +26,11 @@ Item {
2626 property var model: null
2727 property var scopes: null
2828 readonly property alias currentIndex: dashContentList.currentIndex
29− property alias previewOpen: previewListView.open
30−
31− property ListModel searchHistory
3229
3330 signal scopeLoaded(string scopeId)
3431 signal gotoScope(string scopeId)
3532 signal openScope(var scope)
33+ signal closePreview()
3634
3735 // If we set the current scope index before the scopes have been added,
3836 // then we need to wait until the loaded signals gets emitted from the scopes
@@ -82,23 +80,16 @@ Item {
8280 dashContentList.currentItem.theScope.closeScope(scope)
8381 }
8482
85− function closePreview() {
86− previewListView.open = false;
87− }
88−
8983 Item {
9084 id: dashContentListHolder
9185
92− x: previewListView.open ? -width : 0
93− Behavior on x { UbuntuNumberAnimation { } }
94− width: parent.width
95− height: parent.height
86+ anchors.fill: parent
9687
9788 ListView {
9889 id: dashContentList
9990 objectName: "dashContentList"
10091
101− interactive: dashContent.scopes.loaded && !previewListView.open && currentItem && !currentItem.moving
92+ interactive: dashContent.scopes.loaded && currentItem && !currentItem.moving
10293
10394 anchors.fill: parent
10495 model: dashContent.model
@@ -147,11 +138,8 @@ Item {
147138
148139 onLoaded: {
149140 item.objectName = scope.id
150− item.pageHeader = dashPageHeader;
151− item.previewListView = previewListView;
152141 item.scope = Qt.binding(function() { return scope })
153142 item.isCurrent = Qt.binding(function() { return visible && ListView.isCurrentItem })
154− item.tabBarHeight = Qt.binding(function() { return dashPageHeader.implicitHeight; })
155143 dashContent.scopeLoaded(item.scope.id)
156144 }
157145 Connections {
@@ -164,78 +152,13 @@ Item {
164152 dashContent.openScope(scope);
165153 }
166154 }
167−
168− Component.onDestruction: active = false
169− }
170− }
171−
172− PageHeader {
173− id: dashPageHeader
174− objectName: "pageHeader"
175− width: parent.width
176− searchEntryEnabled: true
177− searchHistory: dashContent.searchHistory
178− scope: dashContentList.currentItem && dashContentList.currentItem.theScope
179−
180− childItem: TabBar {
181− id: tabBar
182− objectName: "tabbar"
183− height: units.gu(6.5)
184− width: parent.width
185− style: DashContentTabBarStyle {}
186−
187− SortFilterProxyModel {
188− id: tabBarModel
189−
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;
202− }
203− }
204−
205− model: tabBarModel.count > 0 ? tabBarModel : null
206−
207− Connections {
208− target: dashContentList
209− onCurrentIndexChanged: {
210− tabBarModel.selectedIndex = dashContentList.currentIndex
155+ Connections {
156+ target: dashContent
157+ onClosePreview: if (item) item.closePreview()
211158 }
212− }
213159
214− Timer {
215− id: selectionModeTimer
216− interval: 1
217− onTriggered: tabBar.selectionMode = false
160+ Component.onDestruction: active = false
218161 }
219− }
220−
221− bottomItem: DashDepartments {
222− scope: dashContentList.currentItem ? dashContentList.currentItem.theScope : null
223− width: parent.width <= units.gu(60) ? parent.width : units.gu(40)
224− anchors.right: parent.right
225− windowHeight: dashContent.height
226− windowWidth: dashContent.width
227− }
228162 }
229163 }
230−
231− PreviewListView {
232− id: previewListView
233− objectName: "dashContentPreviewList"
234− visible: x != width
235− scope: dashContentList.currentItem ? dashContentList.currentItem.theScope : null
236− pageHeader: dashPageHeader
237− width: parent.width
238− height: parent.height
239− anchors.left: dashContentListHolder.right
240− }
241164}
qml/Dash/DashDepartments.qml+8−7
@@ -29,6 +29,7 @@ AbstractButton {
2929
3030 property alias windowWidth: blackRect.width
3131 property alias windowHeight: blackRect.height
32+ property var scopeStyle: null
3233
3334 // Are we drilling down the tree or up?
3435 property bool isGoingBack: false
@@ -78,18 +79,17 @@ AbstractButton {
7879 anchors.margins: units.gu(2)
7980 verticalAlignment: Text.AlignVCenter
8081 text: root.currentDepartment ? root.currentDepartment.label : ""
81− color: "gray" // TODO remove once we're a separate app
82+ color: root.scopeStyle ? root.scopeStyle.foreground : "grey"
8283 }
8384
84− Image {
85+ Icon {
8586 anchors.verticalCenter: parent.verticalCenter
8687 anchors.right: parent.right
8788 anchors.rightMargin: units.gu(2)
88− rotation: showList ? 180 : 0
89− source: "image://theme/dropdown-menu"
90− sourceSize.height: parent.height - units.gu(2)
91− sourceSize.width: units.gu(2)
92− fillMode: Image.PreserveAspectFit
89+ name: showList ? "up" : "down"
90+ height: units.gu(2)
91+ width: height
92+ color: root.scopeStyle ? root.scopeStyle.foreground : "grey"
9393 }
9494
9595 // departmentListView is outside root
@@ -124,6 +124,7 @@ AbstractButton {
124124 objectName: "department" + index
125125 visible: height != 0
126126 width: departmentListView.width
127+ scopeStyle: root.scopeStyle
127128 property real desiredHeight: {
128129 if (root.showList) {
129130 if (department && department.loaded && x == departmentListView.contentX)
qml/Dash/DashDepartmentsList.qml+19−17
@@ -21,15 +21,17 @@ Item {
2121 id: root
2222 property var department: null
2323 property var currentDepartment: null
24+ property var scopeStyle: null
2425 signal enterDepartment(var newDepartmentId, bool hasChildren)
2526 signal goBackToParentClicked()
2627 signal allDepartmentClicked()
2728
2829 readonly property int itemHeight: units.gu(5)
30+ readonly property color foregroundColor: root.scopeStyle ? root.scopeStyle.foreground : "grey"
2931 implicitHeight: flickable.contentHeight
3032
3133 Rectangle {
32− color: "white"
34+ color: !root.scopeStyle || Qt.colorEqual(root.scopeStyle.background, "transparent") ? "white" : root.scopeStyle.background
3335 anchors.fill: parent
3436 }
3537
@@ -71,17 +73,17 @@ Item {
7173
7274 onClicked: root.goBackToParentClicked();
7375
74− Image {
76+ Icon {
7577 id: backImage
7678 anchors {
7779 verticalCenter: parent.verticalCenter
7880 left: parent.left
7981 leftMargin: units.gu(2)
8082 }
81− source: "image://theme/back"
82− sourceSize.height: parent.height - units.gu(3)
83− sourceSize.width: units.gu(3)
84− fillMode: Image.PreserveAspectFit
83+ name: "back"
84+ height: units.gu(2)
85+ width: height
86+ color: root.foregroundColor
8587 }
8688
8789 Label {
@@ -91,7 +93,7 @@ Item {
9193 leftMargin: units.gu(0.5)
9294 }
9395 text: department ? department.parentLabel : ""
94− color: "gray" // TODO remove once we're a separate app
96+ color: root.foregroundColor
9597 }
9698
9799 Rectangle {
@@ -102,7 +104,7 @@ Item {
102104 leftMargin: units.gu(2)
103105 rightMargin: units.gu(2)
104106 }
105− color: "gray"
107+ color: root.foregroundColor
106108 opacity: 0.2
107109 height: units.dp(1)
108110 }
@@ -123,7 +125,7 @@ Item {
123125 }
124126 text: department ? (department.allLabel != "" ? department.allLabel : department.label) : ""
125127 font.bold: true
126− color: "gray" // TODO remove once we're a separate app
128+ color: root.foregroundColor
127129 }
128130
129131 Rectangle {
@@ -134,7 +136,7 @@ Item {
134136 leftMargin: units.gu(2)
135137 rightMargin: units.gu(2)
136138 }
137− color: "gray"
139+ color: root.foregroundColor
138140 opacity: 0.2
139141 height: units.dp(1)
140142 }
@@ -159,19 +161,19 @@ Item {
159161 leftMargin: units.gu(2)
160162 }
161163 text: label
162− color: "gray" // TODO remove once we're a separate app
164+ color: root.foregroundColor
163165 }
164166
165− Image {
167+ Icon {
166168 anchors {
167169 verticalCenter: parent.verticalCenter
168170 right: parent.right
169171 rightMargin: units.gu(2)
170172 }
171− source: hasChildren ? "image://theme/chevron" : "graphics/tick.png"
172− sourceSize.height: parent.height - units.gu(3)
173− sourceSize.width: units.gu(3)
174− fillMode: Image.PreserveAspectFit
173+ height: units.gu(2)
174+ width: height
175+ name: hasChildren ? "go-next" : "tick"
176+ color: root.foregroundColor
175177 visible: hasChildren || isActive
176178 }
177179
@@ -183,7 +185,7 @@ Item {
183185 leftMargin: units.gu(2)
184186 rightMargin: units.gu(2)
185187 }
186− color: "gray"
188+ color: root.foregroundColor
187189 opacity: 0.1
188190 height: units.dp(1)
189191 visible: index != department.count - 1
qml/Dash/DashRenderer.qml+5−4
@@ -36,10 +36,11 @@ Item {
3636 // The model to renderer
3737 property var model
3838
39− /*!
40− \brief CardTool component.
41− */
42− property var cardTool: undefined
39+ /// CardTool component.
40+ property var cardTool: null
41+
42+ /// ScopeStyle component.
43+ property var scopeStyle: null
4344
4445 /// Emitted when the user clicked on an item
4546 /// @param index is the index of the clicked item
qml/Dash/GenericScopeView.qml+57−29
@@ -19,6 +19,7 @@ import Ubuntu.Components 0.1
1919import Utils 0.1
2020import Unity 0.2
2121import Unity.Application 0.1
22+import Dash 0.1
2223import "../Components"
2324import "../Components/ListItems" as ListItems
2425
@@ -29,13 +30,16 @@ FocusScope {
2930 property SortFilterProxyModel categories: categoryFilter
3031 property bool isCurrent: false
3132 property alias moving: categoryView.moving
32− property int tabBarHeight: 0
33− property PageHeader pageHeader: null
34− property Item previewListView: null
35−
33+ property bool hasBackAction: false
3634 property bool enableHeightBehaviorOnNextCreation: false
3735 property var categoryView: categoryView
3836
37+ property var scopeStyle: ScopeStyle {
38+ style: scope ? scope.customizations : {}
39+ }
40+
41+ signal backClicked()
42+
3943 onScopeChanged: {
4044 if (scope) {
4145 scope.activateApplication.connect(activateApp);
@@ -54,6 +58,10 @@ FocusScope {
5458 categoryView.showHeader()
5559 }
5660
61+ function closePreview() {
62+ previewListView.open = false;
63+ }
64+
5765 Binding {
5866 target: scope
5967 property: "isActive"
@@ -88,33 +96,32 @@ FocusScope {
8896 when: isCurrent
8997 }
9098
91− Connections {
92− target: panel
93− onSearchClicked: if (isCurrent) {
94− pageHeader.triggerSearch()
95− categoryView.showHeader()
96− }
97− }
98−
9999 Connections {
100100 target: scopeView.scope
101101 onShowDash: previewListView.open = false;
102102 onHideDash: previewListView.open = false;
103103 }
104104
105+ Rectangle {
106+ anchors.fill: parent
107+ color: scopeView.scopeStyle ? scopeView.scopeStyle.background : "transparent"
108+ visible: color != "transparent"
109+ }
110+
105111 ScopeListView {
106112 id: categoryView
107113 objectName: "categoryListView"
108− anchors.fill: parent
114+
115+ x: previewListView.open ? -width : 0
116+ Behavior on x { UbuntuNumberAnimation { } }
117+ width: parent.width
118+ height: parent.height
119+
109120 model: scopeView.categories
110121 forceNoClip: previewListView.open
111122
112123 property string expandedCategoryId: ""
113124
114− onContentYChanged: pageHeader.positionRealHeader();
115− onOriginYChanged: pageHeader.positionRealHeader();
116− onContentHeightChanged: pageHeader.positionRealHeader();
117−
118125 delegate: ListItems.Base {
119126 id: baseItem
120127 objectName: "dashCategory" + category
@@ -168,6 +175,7 @@ FocusScope {
168175 item.model = Qt.binding(function() { return results })
169176 }
170177 item.objectName = Qt.binding(function() { return categoryId })
178+ item.scopeStyle = scopeView.scopeStyle;
171179 if (item.expandable) {
172180 var shouldFilter = categoryId != categoryView.expandedCategoryId;
173181 item.setFilter(shouldFilter, false /*animate*/);
@@ -307,6 +315,7 @@ FocusScope {
307315 property var delegate: categoryView.item(delegateIndex)
308316 width: categoryView.width
309317 text: section
318+ textColor: scopeStyle ? scopeStyle.foreground : "grey"
310319 image: {
311320 if (delegate && delegate.expandable)
312321 return delegate.filtered ? "graphics/header_handlearrow.png" : "graphics/header_handlearrow2.png"
@@ -319,20 +328,39 @@ FocusScope {
319328 categoryView.expandedCategoryId = "";
320329 }
321330 }
322− pageHeader: Item {
323− implicitHeight: scopeView.tabBarHeight
324− onHeightChanged: {
325− if (scopeView.pageHeader && scopeView.isCurrent) {
326− scopeView.pageHeader.height = height;
327− }
328− }
329− onYChanged: positionRealHeader();
330331
331− function positionRealHeader() {
332− if (scopeView.pageHeader && scopeView.isCurrent) {
333− scopeView.pageHeader.y = y + parent.y;
334− }
332+ pageHeader: PageHeader {
333+ id: pageHeader
334+ objectName: "scopePageHeader"
335+ width: parent.width
336+ title: scopeView.scope ? scopeView.scope.name : ""
337+ showBackButton: scopeView.hasBackAction
338+ searchEntryEnabled: true
339+ searchInProgress: scopeView.scope ? scopeView.scope.searchInProgress : false
340+ scopeStyle: scopeView.scopeStyle
341+
342+ bottomItem: DashDepartments {
343+ scope: scopeView.scope
344+ width: parent.width <= units.gu(60) ? parent.width : units.gu(40)
345+ anchors.right: parent.right
346+ windowHeight: scopeView.height
347+ windowWidth: scopeView.width
348+ scopeStyle: scopeView.scopeStyle
335349 }
350+
351+ onBackClicked: scopeView.backClicked()
336352 }
337353 }
354+
355+ PreviewListView {
356+ id: previewListView
357+ objectName: "previewListView"
358+ visible: x != width
359+ scope: scopeView.scope
360+ scopeStyle: scopeView.scopeStyle
361+ width: parent.width
362+ height: parent.height
363+ anchors.left: categoryView.right
364+ }
365+
338366}
qml/Dash/PreviewListView.qml+8−22
@@ -24,7 +24,7 @@ Item {
2424 id: root
2525
2626 property var scope: null
27− property var pageHeader: null
27+ property var scopeStyle: null
2828
2929 property alias open: previewListView.open
3030 property alias model: previewListView.model
@@ -34,34 +34,19 @@ Item {
3434
3535 PageHeader {
3636 id: header
37− objectName: root.objectName + "_pageHeader"
37+ objectName: "pageHeader"
3838 width: parent.width
39− searchEntryEnabled: false
40− scope: root.scope
41− height: units.gu(8.5)
39+ title: scope ? scope.name : ""
4240 showBackButton: true
43− onBackClicked: root.open = false
41+ searchEntryEnabled: false
42+ scopeStyle: root.scopeStyle
4443
45− childItem: Label {
46− id: label
47− anchors {
48− left: parent.left
49− right: parent.right
50− verticalCenter: parent.verticalCenter
51− }
52− text: scope ? scope.name : ""
53− // TODO Saviq: These should come from updated Ubuntu Palette.
54− color: "#888888"
55− font.family: "Ubuntu"
56− font.weight: Font.Light
57− fontSize: "x-large"
58− elide: Text.ElideRight
59− }
44+ onBackClicked: root.open = false
6045 }
6146
6247 ListView {
6348 id: previewListView
64− objectName: root.objectName + "_listView"
49+ objectName: "listView"
6550 anchors {
6651 top: header.bottom
6752 bottom: parent.bottom
@@ -118,6 +103,7 @@ Item {
118103 var previewStack = root.scope.preview(result);
119104 return previewStack.getPreviewModel(0);
120105 }
106+ scopeStyle: root.scopeStyle
121107 }
122108
123109 MouseArea {
qml/Dash/Previews/Preview.qml+4
@@ -36,6 +36,9 @@ Item {
3636 //! \brief Should be set to true if this preview is currently displayed.
3737 property bool isCurrent: false
3838
39+ //! \brief The ScopeStyle component.
40+ property var scopeStyle: null
41+
3942 clip: true
4043
4144 Binding {
@@ -77,6 +80,7 @@ Item {
7780 widgetType: model.type
7881 widgetData: model.properties
7982 isCurrentPreview: root.isCurrent
83+ scopeStyle: root.scopeStyle
8084 anchors {
8185 left: parent.left
8286 right: parent.right
qml/Dash/Previews/PreviewAudioPlayback.qml+3−3
@@ -139,7 +139,7 @@ PreviewWidget {
139139 objectName: "trackTitleLabel"
140140 anchors { top: parent.top; left: parent.left; right: parent.right }
141141 opacity: 0.9
142− color: "grey"//Theme.palette.selected.backgroundText // TODO karni: Use updated Palette.
142+ color: scopeStyle ? scopeStyle.foreground : "grey"
143143 fontSize: "small"
144144 horizontalAlignment: Text.AlignLeft
145145 text: modelData["title"]
@@ -152,7 +152,7 @@ PreviewWidget {
152152 anchors { top: trackTitleLabel.bottom; left: parent.left; right: parent.right }
153153 visible: text !== ""
154154 opacity: 0.9
155− color: "grey"//Theme.palette.selected.backgroundText // TODO karni: Use updated Palette.
155+ color: scopeStyle ? scopeStyle.foreground : "grey"
156156 font.weight: Font.Light
157157 fontSize: "small"
158158 horizontalAlignment: Text.AlignLeft
@@ -193,7 +193,7 @@ PreviewWidget {
193193 anchors.verticalCenter: parent.verticalCenter
194194 width: parent.column3Width
195195 opacity: 0.9
196− color: "grey"//Theme.palette.selected.backgroundText // TODO karni: Use updated Palette.
196+ color: scopeStyle ? scopeStyle.foreground : "grey"
197197 fontSize: "small"
198198 horizontalAlignment: Text.AlignRight
199199 text: audio.lengthToString(modelData["length"])
qml/Dash/Previews/PreviewHeader.qml+1−1
@@ -35,7 +35,7 @@ PreviewWidget {
3535 readonly property url mascot: root.widgetData["mascot"] || ""
3636 readonly property string title: root.widgetData["title"] || ""
3737 readonly property string subtitle: root.widgetData["subtitle"] || ""
38− readonly property color fontColor: "grey"
38+ readonly property color fontColor: root.scopeStyle ? root.scopeStyle.foreground : "grey"
3939
4040 implicitHeight: row.height + row.margins * 2
4141 width: parent.width
qml/Dash/Previews/PreviewPayments.qmlnew file+56
@@ -0,0 +1,56 @@
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.1
18+import Ubuntu.Components 0.1
19+import Ubuntu.Payments 0.1
20+
21+/*! \brief Preview widget for a purchase button.
22+ *
23+ * When clicked, this button starts the payments service.
24+ * Then it waits until the purchase finishes or fails.
25+ * Those events trigger the corresponding actions.
26+ */
27+
28+PreviewWidget {
29+ id: root
30+
31+ implicitHeight: paymentButton.implicitHeight
32+ implicitWidth: paymentButton.implicitWidth
33+
34+ Button {
35+ id: paymentButton
36+ objectName: "paymentButton"
37+
38+ color: Theme.palette.selected.foreground
39+ text: paymentClient.formattedPrice
40+ onClicked: paymentClient.start()
41+ anchors.right: parent.right
42+ width: (root.width - units.gu(1)) / 2
43+
44+ Payments {
45+ id: paymentClient
46+
47+ property var source: widgetData["source"]
48+
49+ price: source["price"]
50+ currency: source["currency"]
51+ storeItemId: source["store_item_id"]
52+ onPurchaseCompleted: root.triggered(widgetId, "purchaseCompleted", source)
53+ onPurchaseError: root.triggered(widgetId, "purchaseError", source)
54+ }
55+ }
56+}
qml/Dash/Previews/PreviewRatingDisplay.qml+3−4
@@ -61,6 +61,7 @@ PreviewWidget {
6161 size: 5
6262 value: modelData["rating"] || -1
6363 visible: value >= 0
64+ interactive: false
6465
6566 property var urlIconEmpty: widgetData["rating-icon-empty"]
6667 property var urlIconFull: widgetData["rating-icon-full"]
@@ -71,8 +72,7 @@ PreviewWidget {
7172 id: authorLabel
7273 objectName: "authorLabel"
7374 anchors { left: parent.left; right: parent.right }
74− // TODO cimi: Yet another fix requiring Palette update.
75− color: "grey" //Theme.palette.selected.backgroundText
75+ color: scopeStyle ? scopeStyle.foreground : "grey"
7676 opacity: .8
7777 text: modelData["author"] || ""
7878 visible: text !== ""
@@ -83,8 +83,7 @@ PreviewWidget {
8383 id: reviewLabel
8484 objectName: "reviewLabel"
8585 anchors { left: parent.left; right: parent.right }
86− // TODO cimi: Yet another fix requiring Palette update.
87− color: "grey" //Theme.palette.selected.backgroundText
86+ color: scopeStyle ? scopeStyle.foreground : "grey"
8887 opacity: .8
8988 text: modelData["review"] || ""
9089 visible: text !== ""
qml/Dash/Previews/PreviewRatingInput.qml+2−4
@@ -76,8 +76,7 @@ PreviewWidget {
7676 verticalCenter: parent.verticalCenter
7777 left: parent.left
7878 }
79− // TODO cimi: Yet another fix requiring Palette update.
80− color: "grey" //Theme.palette.selected.backgroundText
79+ color: root.scopeStyle ? root.scopeStyle.foreground : "grey"
8180 opacity: .8
8281 text: widgetData["rating-label"] || i18n.tr("Rate this")
8382 }
@@ -122,8 +121,7 @@ PreviewWidget {
122121 left: parent.left
123122 right: parent.right
124123 }
125− // TODO cimi: Yet another fix requiring Palette update.
126− color: "grey" //Theme.palette.selected.backgroundText
124+ color: root.scopeStyle ? root.scopeStyle.foreground : "grey"
127125 opacity: .8
128126 text: widgetData["review-label"] || i18n.tr("Add a review")
129127 }
qml/Dash/Previews/PreviewTextSummary.qml+2−4
@@ -39,8 +39,7 @@ PreviewWidget {
3939 }
4040 height: visible ? implicitHeight : 0
4141 fontSize: "large"
42− // TODO karni: Yet another fix requiring Palette update.
43− color: "grey" //Theme.palette.selected.backgroundText
42+ color: root.scopeStyle ? root.scopeStyle.foreground : "grey"
4443 visible: text !== ""
4544 opacity: .8
4645 text: widgetData["title"] || ""
@@ -62,8 +61,7 @@ PreviewWidget {
6261 clip: true
6362 fontSize: "small"
6463 lineHeight: 1.2
65− // TODO karni: Yet another fix requiring Palette update.
66− color: "grey" //Theme.palette.selected.backgroundText
64+ color: root.scopeStyle ? root.scopeStyle.foreground : "grey"
6765 opacity: .8
6866 text: widgetData["text"]
6967 wrapMode: Text.Wrap
qml/Dash/Previews/PreviewWidget.qml+3
@@ -28,6 +28,9 @@ Item {
2828 //! Variable used to contain widget's data
2929 property var widgetData
3030
31+ //! The ScopeStyle component.
32+ property var scopeStyle: null
33+
3134 /*! \brief This signal should be emitted when a preview action was triggered.
3235 *
3336 * \param widgetId, actionId Respective identifiers from widgetData.
qml/Dash/Previews/PreviewWidgetFactory.qml+5
@@ -31,6 +31,9 @@ Loader {
3131 //! Widget data, forwarded to the widget as is.
3232 property var widgetData: null
3333
34+ //! The ScopeStyle component.
35+ property var scopeStyle: null
36+
3437 //! Set to true if the parent preview is displayed.
3538 property bool isCurrentPreview: false
3639
@@ -48,6 +51,7 @@ Loader {
4851 case "header": return "PreviewHeader.qml";
4952 case "image": return "PreviewZoomableImage.qml";
5053 case "progress": return "PreviewProgress.qml";
54+ case "payments": return "PreviewPayments.qml";
5155 case "rating-input": return "PreviewRatingInput.qml";
5256 case "reviews": return "PreviewRatingDisplay.qml";
5357 case "text": return "PreviewTextSummary.qml";
@@ -61,6 +65,7 @@ Loader {
6165 item.widgetId = Qt.binding(function() { return root.widgetId } )
6266 item.widgetData = Qt.binding(function() { return root.widgetData } )
6367 item.isCurrentPreview = Qt.binding(function() { return root.isCurrentPreview } )
68+ if (item.hasOwnProperty("scopeStyle")) item.scopeStyle = root.scopeStyle;
6469 }
6570
6671 Connections {
qml/Dash/ScopeItem.qmldeleted−106
@@ -1,106 +0,0 @@
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 Unity 0.2
20−import "../Components"
21−
22−Item {
23− id: root
24−
25− property alias scope: scopeView.scope
26− property alias previewOpen: previewListView.open
27−
28− property ListModel searchHistory
29−
30− signal back
31− signal gotoScope(string scopeId)
32− signal openScope(var scope)
33−
34− // TODO see how much code we can share
35− // between here and other Dash parts, it's starting to have
36− // too much duplicated code with the DashDepartments, etc
37−
38− Item {
39− id: scopeViewHolder
40−
41− x: previewListView.open ? -width : 0
42− Behavior on x { UbuntuNumberAnimation { } }
43− width: parent.width
44− height: parent.height
45−
46− GenericScopeView {
47− id: scopeView
48− width: parent.width
49− height: parent.height
50− isCurrent: scope != null
51− tabBarHeight: scopeItemPageHeader.implicitHeight
52− pageHeader: scopeItemPageHeader
53− previewListView: previewListView
54−
55− Connections {
56− target: scopeView.isCurrent ? scope : null
57− onGotoScope: root.gotoScope(scopeId);
58− onOpenScope: root.openScope(scope);
59− }
60− }
61−
62− PageHeader {
63− id: scopeItemPageHeader
64− width: parent.width
65− searchEntryEnabled: true
66− searchHistory: root.searchHistory
67− scope: root.scope
68− height: units.gu(8.5)
69− showBackButton: true
70− onBackClicked: root.back();
71−
72− childItem: Label {
73− id: label
74− anchors {
75− left: parent.left
76− right: parent.right
77− verticalCenter: parent.verticalCenter
78− }
79− text: scope ? scope.name : ""
80− color: "#888888"
81− font.family: "Ubuntu"
82− font.weight: Font.Light
83− fontSize: "x-large"
84− elide: Text.ElideRight
85− }
86−
87− bottomItem: DashDepartments {
88− scope: root.scope
89− width: parent.width <= units.gu(60) ? parent.width : units.gu(40)
90− anchors.right: parent.right
91− windowHeight: root.height
92− windowWidth: root.width
93− }
94− }
95− }
96−
97− PreviewListView {
98− id: previewListView
99− visible: x != width
100− pageHeader: scopeItemPageHeader
101− scope: root.scope
102− width: parent.width
103− height: parent.height
104− anchors.left: scopeViewHolder.right
105− }
106−}
qml/Dash/graphics/icon_listview_clear@20.pngdeleted

Binary file not shown.

qml/Dash/graphics/tick@30.pngdeleted

Binary file not shown.

qml/Hud/HudParametrizedActionsPage.qml+2−2
@@ -19,7 +19,7 @@ import Ubuntu.Components 0.1
1919import "../Components"
2020
2121Item {
22− property alias header: header.text
22+ property alias header: header.title
2323 signal backPressed
2424 signal confirmPressed
2525 signal valuesUpdated
@@ -89,7 +89,7 @@ Item {
8989 anchors.left: parent.left
9090 anchors.right: parent.right
9191
92− PageHeaderLabel {
92+ PageHeader {
9393 id: header
9494 anchors.top: parent.top
9595 anchors.left: parent.left
qml/Launcher/Launcher.qml+33−3
@@ -55,6 +55,10 @@ Item {
5555 switchToNextState("")
5656 }
5757
58+ function fadeOut() {
59+ fadeOutAnimation.start();
60+ }
61+
5862 function switchToNextState(state) {
5963 animateTimer.nextState = state
6064 animateTimer.start();
@@ -99,6 +103,31 @@ Item {
99103 }
100104 }
101105
106+ SequentialAnimation {
107+ id: fadeOutAnimation
108+ ScriptAction {
109+ script: {
110+ panel.layer.enabled = true
111+ }
112+ }
113+ UbuntuNumberAnimation {
114+ target: panel
115+ property: "opacity"
116+ easing.type: Easing.InQuad
117+ to: 0
118+ }
119+ ScriptAction {
120+ script: {
121+ panel.layer.enabled = false
122+ panel.animate = false;
123+ root.state = "";
124+ panel.x = -panel.width
125+ panel.opacity = 1;
126+ panel.animate = true;
127+ }
128+ }
129+ }
130+
102131 MouseArea {
103132 id: launcherDragArea
104133 enabled: root.state == "visible"
@@ -173,9 +202,9 @@ Item {
173202 }
174203
175204 Behavior on x {
205+ enabled: !dragArea.dragging && !launcherDragArea.drag.active && panel.animate;
176206 NumberAnimation {
177− // Disabling animation when dragging
178− duration: dragArea.dragging || launcherDragArea.drag.active ? 0 : 300;
207+ duration: 300
179208 easing.type: Easing.OutCubic
180209 }
181210 }
@@ -215,9 +244,10 @@ Item {
215244 onDraggingChanged: {
216245 if (!dragging) {
217246 if (distance > panel.width / 2) {
218− root.switchToNextState("visible")
219247 if (distance > minimizeDistance) {
220248 root.dash()
249+ } else {
250+ root.switchToNextState("visible")
221251 }
222252 } else {
223253 root.switchToNextState("")
qml/Launcher/LauncherDelegate.qml+36−13
@@ -23,10 +23,10 @@ Item {
2323 property string iconName
2424 property int count: -1
2525 property int progress: -1
26− property bool highlighted: false
2726 property bool itemFocused: false
2827 property real maxAngle: 0
2928 property bool inverted: false
29+ property bool clipCorner: false
3030
3131 readonly property int effectiveHeight: Math.cos(angle * Math.PI / 180) * itemHeight
3232 readonly property real foldedHeight: Math.cos(maxAngle * Math.PI / 180) * itemHeight
@@ -40,12 +40,6 @@ Item {
4040 property real itemOpacity: 1
4141 property real brightness: 0
4242
43− onIconNameChanged: shaderEffectSource.scheduleUpdate();
44− onCountChanged: shaderEffectSource.scheduleUpdate();
45− onProgressChanged: shaderEffectSource.scheduleUpdate();
46− onHighlightedChanged: shaderEffectSource.scheduleUpdate();
47− onItemFocusedChanged: shaderEffectSource.scheduleUpdate();
48−
4943 Item {
5044 id: iconItem
5145 width: parent.itemWidth + units.gu(1)
@@ -63,17 +57,17 @@ Item {
6357 id: iconImage
6458 sourceSize.width: iconShape.width
6559 sourceSize.height: iconShape.height
60+ fillMode: Image.PreserveAspectCrop
6661 source: root.iconName
6762 }
6863 }
6964
7065 BorderImage {
71− id: overlayHighlight
66+ id: itemGlow
7267 anchors.centerIn: iconItem
73− rotation: inverted ? 180 : 0
74− source: root.highlighted ? "graphics/selected.sci" : "graphics/non-selected.sci"
75− width: root.itemWidth + units.gu(0.5)
76− height: root.itemHeight + units.gu(0.5)
68+ source: "graphics/icon-top-highlight.png"
69+ width: root.itemWidth - units.gu(1)
70+ height: root.itemHeight - units.gu(1)
7771 }
7872
7973 BorderImage {
@@ -150,6 +144,24 @@ Item {
150144 }
151145 }
152146
147+ Item {
148+ id: clipper
149+ anchors.centerIn: parent
150+ width: iconItem.width
151+ height: iconItem.height
152+ Rectangle {
153+ anchors {
154+ fill: parent
155+ topMargin: -units.gu(2)
156+ leftMargin: -units.gu(2)
157+ rightMargin: -units.gu(2)
158+ bottomMargin: units.gu(1.2)
159+ }
160+ color: "red"
161+ rotation: root.rotation + 45
162+ }
163+ }
164+
153165 ShaderEffect {
154166 id: transformEffect
155167 anchors.centerIn: parent
@@ -159,13 +171,18 @@ Item {
159171 property real itemOpacity: root.itemOpacity
160172 property real brightness: Math.max(-1, root.brightness)
161173 property real angle: root.angle
174+ property bool clipCorner: root.clipCorner
162175 rotation: root.inverted ? 180 : 0
163176
164177 property variant source: ShaderEffectSource {
165178 id: shaderEffectSource
166179 sourceItem: iconItem
167180 hideSource: true
168− live: false
181+ }
182+
183+ property var mask: ShaderEffectSource {
184+ sourceItem: clipper
185+ hideSource: true
169186 }
170187
171188 transform: [
@@ -202,13 +219,19 @@ Item {
202219 fragmentShader: "
203220 varying highp vec2 qt_TexCoord0;
204221 uniform sampler2D source;
222+ uniform sampler2D mask;
205223 uniform lowp float brightness;
206224 uniform lowp float itemOpacity;
225+ uniform bool clipCorner;
207226 void main(void)
208227 {
209228 highp vec4 sourceColor = texture2D(source, qt_TexCoord0);
229+ highp vec4 maskColor = texture2D(mask, qt_TexCoord0);
210230 sourceColor.rgb = mix(sourceColor.rgb, vec3(step(0.0, brightness)), abs(brightness));
211231 sourceColor *= itemOpacity;
232+ if (clipCorner) {
233+ sourceColor *= maskColor.a;
234+ }
212235 gl_FragColor = sourceColor;
213236 }"
214237 }
qml/Launcher/LauncherPanel.qml+19−16
@@ -22,8 +22,9 @@ import Ubuntu.Components.Popups 0.1
2222import "../Components/ListItems"
2323import "../Components/"
2424
25−Item {
25+Rectangle {
2626 id: root
27+ color: "#B2000000"
2728
2829 rotation: inverted ? 180 : 0
2930
@@ -37,27 +38,18 @@ Item {
3738 signal applicationSelected(string appId)
3839 signal showDashHome()
3940
40− BorderImage {
41− id: background
42− source: "graphics/launcher_bg.sci"
43− anchors.fill: parent
44− anchors.rightMargin: root.inverted ? 0 : -units.gu(1)
45− anchors.leftMargin: root.inverted ? -units.gu(1) : 0
46− rotation: root.rotation
47− }
48−
4941 Column {
5042 id: mainColumn
5143 anchors {
5244 fill: parent
5345 }
5446
55− MouseArea {
56− id: dashItem
47+ Rectangle {
5748 width: parent.width
5849 height: units.gu(7)
59− onClicked: root.showDashHome()
50+ color: UbuntuColors.orange
6051 z: 1
52+
6153 Image {
6254 objectName: "dashItem"
6355 width: units.gu(5)
@@ -66,7 +58,13 @@ Item {
6658 source: "graphics/home.png"
6759 rotation: root.rotation
6860 }
61+ MouseArea {
62+ id: dashItem
63+ anchors.fill: parent
64+ onClicked: root.showDashHome()
65+ }
6966 }
67+
7068 ThinDivider {
7169 anchors {
7270 left: parent.left
@@ -104,7 +102,6 @@ Item {
104102 highlightRangeMode: ListView.ApplyRange
105103 preferredHighlightBegin: (height - itemHeight) / 2
106104 preferredHighlightEnd: (height + itemHeight) / 2
107− spacing: units.gu(0.5)
108105
109106 // The size of the area the ListView is extended to make sure items are not
110107 // destroyed when dragging them outside the list. This needs to be at least
@@ -156,6 +153,7 @@ Item {
156153 iconName: model.icon
157154 count: model.count
158155 progress: model.progress
156+ clipCorner: model.pinned
159157 itemFocused: model.focused
160158 inverted: root.inverted
161159 z: -Math.abs(offset)
@@ -168,6 +166,7 @@ Item {
168166 anchors.centerIn: parent
169167 width: parent.width + mainColumn.anchors.leftMargin + mainColumn.anchors.rightMargin
170168 opacity: 0
169+ source: "graphics/divider-line.png"
171170 }
172171
173172 states: [
@@ -247,7 +246,7 @@ Item {
247246 Transition {
248247 from: "dragging"
249248 to: "*"
250− NumberAnimation { target: dropIndicator; properties: "opacity"; duration: UbuntuAnimation.FastDuration }
249+ NumberAnimation { target: dropIndicator; properties: "opacity"; duration: UbuntuAnimation.SnapDuration }
251250 NumberAnimation { properties: "itemOpacity"; duration: UbuntuAnimation.BriskDuration }
252251 SequentialAnimation {
253252 ScriptAction { script: if (index == launcherListView.count-1) launcherListView.flick(0, -launcherListView.clickFlickSpeed); }
@@ -465,6 +464,10 @@ Item {
465464 width: itemWidth
466465 rotation: root.rotation
467466 itemOpacity: 0.9
467+ clipCorner: dndArea.draggedIndex > -1 &&
468+ LauncherModel.get(dndArea.draggedIndex).pinned &&
469+ !dndArea.preDragging &&
470+ !dndArea.dragging
468471
469472 function flatten() {
470473 fakeDragItemAnimation.start();
@@ -523,11 +526,11 @@ Item {
523526 color: "#221e1c"
524527 width: units.gu(30)
525528 height: quickListColumn.height
529+ visible: quickListShape.visible
526530 anchors {
527531 left: root.inverted ? undefined : parent.right
528532 right: root.inverted ? parent.left : undefined
529533 margins: units.gu(1)
530−
531534 }
532535 y: itemCenter - (height / 2) + offset
533536 rotation: root.rotation
qml/Launcher/graphics/divider-line.pngnew file

Binary file not shown.

qml/Launcher/graphics/highlight@18.pngdeleted

Binary file not shown.

qml/Launcher/graphics/home@18.png

Binary file not shown.

qml/Launcher/graphics/icon-top-highlight.pngnew file

Binary file not shown.

qml/Launcher/graphics/launcher_bg@30.pngdeleted

Binary file not shown.

qml/Launcher/graphics/launcher_bg@30.scideleted−5
@@ -1,5 +0,0 @@
1−border.left: 4
2−border.top: 4
3−border.bottom: 4
4−border.right: 66
5−source: launcher_bg@30.png
qml/Launcher/graphics/non-selected@18.pngdeleted

Binary file not shown.

qml/Launcher/graphics/non-selected@18.scideleted−5
@@ -1,5 +0,0 @@
1−border.left: 54
2−border.top: 60
3−border.bottom: 60
4−border.right: 54
5−source: non-selected@18.png
qml/Launcher/graphics/selected@18.pngdeleted

Binary file not shown.

qml/Launcher/graphics/selected@18.scideleted−5
@@ -1,5 +0,0 @@
1−border.left: 54
2−border.top: 60
3−border.bottom: 60
4−border.right: 54
5−source: selected@18.png
qml/Launcher/graphics/triangle@18.pngdeleted

Binary file not shown.

qml/Panel/ActiveCallHint.qmlnew file+206
@@ -0,0 +1,206 @@
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.Telephony 0.1 as Telephony
19+import Ubuntu.Components 0.1
20+import Unity.Application 0.1
21+import "../Components"
22+
23+Item {
24+ id: callHint
25+
26+ readonly property bool active: {
27+ var application = ApplicationManager.findApplication("dialer-app");
28+
29+ if (callManager.callIndicatorVisible) {
30+ // at the moment, callIndicatorVisible is only "valid" if dialer is in focus.
31+ if (application && ApplicationManager.focusedApplicationId === "dialer-app") {
32+ // Don't show if application is still starting; might get a fleeting true/false.
33+ return application.state !== ApplicationInfoInterface.Starting;
34+ }
35+ }
36+ if (ApplicationManager.focusedApplicationId !== "dialer-app") {
37+ if (application) {
38+ // Don't show if application is still starting; might get a fleeting true/false.
39+ return application.state !== ApplicationInfoInterface.Starting && callManager.hasCalls;
40+ }
41+ return callManager.hasCalls;
42+ }
43+ return false;
44+ }
45+ readonly property QtObject contactWatcher: _contactWatcher
46+ property int labelSwitchInterval: 6000
47+ implicitWidth: row.x + row.width
48+
49+ Component.onCompleted: {
50+ telepathyHelper.registerChannelObserver("unity8");
51+ }
52+
53+ function showLiveCall() {
54+ Qt.openUrlExternally("dialer:///?view=liveCall");
55+ }
56+
57+ Component {
58+ id: contactColumn
59+
60+ Column {
61+ id: column
62+ objectName: "contactColumn"
63+
64+ anchors.left: parent.left
65+
66+ Component.onCompleted: {
67+ if (index === 0) {
68+ labelPathView.column1 = column;
69+ } else {
70+ labelPathView.column2 = column;
71+ }
72+ }
73+
74+ Label {
75+ height: callHint.height
76+ verticalAlignment: Text.AlignVCenter
77+ text: i18n.tr("Tap to return to call...");
78+ }
79+
80+ Label {
81+ objectName: "contactLabel"
82+ height: callHint.height
83+ verticalAlignment: Text.AlignVCenter
84+ width: Math.max(contentWidth, 1)
85+
86+ text: {
87+ if (!d.activeCall) {
88+ return "";
89+ } else if (d.activeCall.isConference) {
90+ return i18n.tr("Conference");
91+ } else {
92+ return contactWatcher.alias !== "" ? contactWatcher.alias : contactWatcher.phoneNumber;
93+ }
94+ }
95+ }
96+ }
97+ }
98+
99+ Row {
100+ id: row
101+ anchors {
102+ top: parent.top
103+ bottom: parent.bottom
104+ left: parent.left
105+ leftMargin: units.gu(1)
106+ }
107+ spacing: units.gu(1)
108+
109+ Label {
110+ id: time
111+ objectName: "timeLabel"
112+
113+ anchors {
114+ top: parent.top
115+ bottom: parent.bottom
116+ }
117+ verticalAlignment: Text.AlignVCenter
118+ horizontalAlignment: Text.AlignRight
119+ text: {
120+ var m = Math.round(d.callTime/60);
121+ var ss = d.callTime % 60;
122+ if (ss >= 10) {
123+ return m + ":" + ss;
124+ } else {
125+ return m + ":0" + ss;
126+ }
127+ }
128+ }
129+
130+ PathView {
131+ id: labelPathView
132+ objectName: "labelPathView"
133+
134+ anchors {
135+ top: parent.top
136+ bottom: parent.bottom
137+ }
138+ width: column1 && column2 ? Math.max(column1.width, column1.width) : 0
139+ clip: true
140+
141+ property Column column1
142+ property Column column2
143+ property int columnHeight: column1 ? column1.height : 0
144+
145+ delegate: contactColumn
146+ model: 2
147+ offset: 0
148+ interactive: false
149+
150+ path: Path {
151+ startY: -labelPathView.columnHeight / 2
152+ PathLine {
153+ y: labelPathView.columnHeight * 1.5
154+ }
155+ }
156+
157+ Behavior on offset {
158+ id: offsetBehaviour
159+ SmoothedAnimation {
160+ id: offsetAnimation
161+ // ensure we go faster than the label switch
162+ duration: labelSwitchInterval/8
163+ velocity: 0.75
164+ easing.type: Easing.InOutQuad
165+ }
166+ }
167+ }
168+ }
169+
170+ Timer {
171+ id: alternateLabelTimer
172+ running: callHint.active
173+ interval: labelPathView.offset % 1.0 !== 0 ? labelSwitchInterval : labelSwitchInterval/4
174+ repeat: true
175+
176+ onRunningChanged: {
177+ if (running) {
178+ offsetBehaviour.enabled = false;
179+ labelPathView.offset = 0;
180+ offsetBehaviour.enabled = true;
181+ }
182+ }
183+
184+ onTriggered: {
185+ labelPathView.offset = labelPathView.offset + 0.5;
186+ }
187+ }
188+
189+ Telephony.ContactWatcher {
190+ id: _contactWatcher
191+ objectName: "contactWatcher"
192+ phoneNumber: d.activeCall ? d.activeCall.phoneNumber : ""
193+ }
194+
195+ QtObject {
196+ id: d
197+
198+ property QtObject activeCall: {
199+ if (callManager.foregroundCall) {
200+ return callManager.foregroundCall;
201+ }
202+ return callManager.backgroundCall;
203+ }
204+ property int callTime: activeCall ? activeCall.elapsedTime : 0
205+ }
206+}
qml/Panel/IndicatorRow.qml+1−1
@@ -36,7 +36,7 @@ Item {
3636
3737 function setDefaultItem() {
3838 // The leftmost indicator
39− setCurrentItem(0);
39+ setCurrentItemIndex(0);
4040 }
4141
4242 function setCurrentItemIndex(index) {
qml/Panel/Indicators.qml+22−36
@@ -28,7 +28,6 @@ Showable {
2828
2929 property real openedHeight: units.gu(71)
3030 property int panelHeight: units.gu(3)
31− property bool pinnedMode: true //should be set true if indicators menu can cover whole screen
3231 property alias overFlowWidth: indicatorRow.overFlowWidth
3332 property alias showAll: indicatorRow.showAll
3433 // TODO: This should be sourced by device type (eg "desktop", "tablet", "phone"...)
@@ -38,26 +37,20 @@ Showable {
3837 readonly property int lockThreshold: openedHeight / 2
3938 property bool fullyOpened: height == openedHeight
4039 property bool partiallyOpened: height > panelHeight && !fullyOpened
41− property real visualBottom: Math.max(y+height, y+indicatorRow.y+indicatorRow.height)
4240 property bool contentEnabled: true
4341 property bool initalizeItem: true
4442 readonly property alias content: menuContent
4543 property real unitProgress: (height - panelHeight) / (openedHeight - panelHeight)
44+ property bool enableHint: true
45+ property real showHintBottomMargin: 0
46+
47+ signal showTapped(point position)
4648
4749 // TODO: Perhaps we need a animation standard for showing/hiding? Each showable seems to
4850 // use its own values. Need to ask design about this.
4951 showAnimation: StandardAnimation {
5052 property: "height"
51− duration: 350
5253 to: openedHeight
53− easing.type: Easing.OutCubic
54−
55− // Re-size if we've changed the openHeight while shown.
56− onToChanged: {
57− if (indicators.shown) {
58− indicators.show();
59− }
60− }
6154 }
6255
6356 hideAnimation: StandardAnimation {
@@ -67,16 +60,24 @@ Showable {
6760 easing.type: Easing.OutCubic
6861 }
6962
63+ onOpenedHeightChanged: {
64+ if (showAnimation.running) {
65+ showAnimation.restart();
66+ } else if (indicators.shown) {
67+ height = openedHeight;
68+ }
69+ }
70+
7071 height: panelHeight
71− onHeightChanged: updateRevealProgressState(indicators.height - panelHeight, true)
72+ onHeightChanged: updateRevealProgressState(indicators.height - panelHeight - showHintBottomMargin, true)
7273
7374 function updateRevealProgressState(revealProgress, enableRelease) {
7475 if (!showAnimation.running && !hideAnimation.running) {
7576 if (revealProgress === 0) {
7677 indicators.state = "initial";
77− } else if (revealProgress > 0 && revealProgress <= hintValue) {
78+ } else if (enableHint && revealProgress > 0 && revealProgress <= hintValue) {
7879 indicators.state = "hint";
79− } else if (revealProgress > hintValue && revealProgress < lockThreshold) {
80+ } else if ((!enableHint || revealProgress > hintValue) && revealProgress < lockThreshold) {
8081 indicators.state = "reveal";
8182 } else if (revealProgress >= lockThreshold && lockThreshold > 0) {
8283 indicators.state = "locked";
@@ -171,17 +172,6 @@ Showable {
171172 }
172173 }
173174
174− VerticalThinDivider {
175− anchors {
176− top: indicators.top
177− topMargin: panelHeight
178− bottom: handle.bottom
179− right: indicators.left
180− }
181− width: units.dp(2)
182− source: "graphics/VerticalDivider.png"
183− }
184−
185175 VisibleIndicators {
186176 id: visibleIndicators
187177 }
@@ -245,10 +235,6 @@ Showable {
245235 }
246236 }
247237
248− PanelBackground {
249− anchors.fill: indicatorRow
250− }
251−
252238 IndicatorRow {
253239 id: indicatorRow
254240 objectName: "indicatorRow"
@@ -356,24 +342,27 @@ Showable {
356342 id: showDragHandle
357343 anchors.bottom: parent.bottom
358344 // go beyond parent so that it stays reachable, at the top of the screen.
359− anchors.bottomMargin: pinnedMode ? 0 : -panelHeight
345+ anchors.bottomMargin: showHintBottomMargin
360346 anchors.left: parent.left
361347 anchors.right: parent.right
362348 height: panelHeight
363349 direction: Direction.Downwards
364350 enabled: !indicators.shown && indicators.available
365− hintDisplacement: pinnedMode ? indicators.hintValue : 0
351+ hintDisplacement: enableHint ? indicators.hintValue : 0
366352 autoCompleteDragThreshold: maxTotalDragDistance / 2
367353 stretch: true
368354 maxTotalDragDistance: openedHeight - panelHeight
369− distanceThreshold: pinnedMode ? 0 : units.gu(3)
355+ distanceThreshold: panelHeight
370356
371357 onStatusChanged: {
372358 if (status === DirectionalDragArea.Recognized) {
373359 menuContent.activateContent();
374360 }
375361 }
362+
363+ onTapped: showTapped(Qt.point(touchSceneX, touchSceneY));
376364 }
365+
377366 DragHandle {
378367 id: hideDragHandle
379368 anchors.fill: handle
@@ -396,10 +385,6 @@ Showable {
396385 },
397386 State {
398387 name: "hint"
399− PropertyChanges {
400− target: indicatorRow;
401− y: pinnedMode ? 0 : panelHeight
402− }
403388 StateChangeScript {
404389 script: {
405390 if (d.activeDragHandle) {
@@ -432,5 +417,6 @@ Showable {
432417 Component.onCompleted: initialise();
433418 function initialise() {
434419 visibleIndicators.load(profile);
420+ indicatorRow.setDefaultItem();
435421 }
436422}
qml/Panel/Indicators/DefaultIndicatorPage.qml+3−2
@@ -22,7 +22,7 @@ import QtQuick 2.0
2222import Ubuntu.Components 0.1 as Components
2323import Unity.Indicators 0.1 as Indicators
2424
25−Indicators.IndicatorBase {
25+IndicatorBase {
2626 id: main
2727
2828 //const
@@ -174,8 +174,9 @@ Indicators.IndicatorBase {
174174 }
175175 }
176176
177− Indicators.MenuItemFactory {
177+ MenuItemFactory {
178178 id: factory
179+ rootModel: main.menuModel ? main.menuModel : null
179180 menuModel: mainMenu.model ? mainMenu.model : null
180181 }
181182
qml/Panel/Indicators/DefaultIndicatorWidget.qml+22−31
@@ -19,12 +19,12 @@
1919
2020import QtQuick 2.0
2121import Ubuntu.Components 0.1
22−import Unity.Indicators 0.1 as Indicators
22+import Ubuntu.Settings.Components 0.1
2323
24−Indicators.IndicatorBase {
24+IndicatorBase {
2525 id: indicatorWidget
2626
27− property int iconSize: height
27+ property int iconSize: units.gu(2)
2828 property alias leftLabel: itemLeftLabel.text
2929 property alias rightLabel: itemRightLabel.text
3030 property var icons: undefined
@@ -32,9 +32,16 @@ Indicators.IndicatorBase {
3232 width: itemRow.width
3333 enabled: false
3434
35+ // FIXME: For now we will enable led indicator support only for messaging indicator
36+ // in the future we should export a led API insted of doing that,
37+ Loader {
38+ id: indicatorLed
39+ // only load source Component if the icons contains the new message icon
40+ source: (indicatorWidget.icons && (String(indicatorWidget.icons).indexOf("indicator-messages-new") != -1)) ? Qt.resolvedUrl("IndicatorsLight.qml") : ""
41+ }
42+
3543 Row {
3644 id: itemRow
37− width: childrenRect.width
3845 objectName: "itemRow"
3946 anchors {
4047 top: parent.top
@@ -44,7 +51,7 @@ Indicators.IndicatorBase {
4451
4552 Label {
4653 id: itemLeftLabel
47− width: guRoundUp(implicitWidth)
54+ width: contentWidth + units.gu(1)
4855 objectName: "leftLabel"
4956 color: Theme.palette.selected.backgroundText
5057 opacity: 0.8
@@ -52,10 +59,10 @@ Indicators.IndicatorBase {
5259 fontSize: "medium"
5360 anchors.verticalCenter: parent.verticalCenter
5461 visible: text != ""
62+ horizontalAlignment: Text.AlignHCenter
5563 }
5664
5765 Row {
58− width: childrenRect.width
5966 anchors {
6067 top: parent.top
6168 bottom: parent.bottom
@@ -65,22 +72,16 @@ Indicators.IndicatorBase {
6572 model: indicatorWidget.icons
6673
6774 Item {
68− width: guRoundUp(itemImage.width)
69− height: indicatorWidget.iconSize
75+ width: itemImage.width + units.gu(1)
76+ anchors { top: parent.top; bottom: parent.bottom }
7077
71− Image {
78+ StatusIcon {
7279 id: itemImage
73− objectName: "itemImage"
74− visible: source != ""
80+ height: indicatorWidget.iconSize
81+ anchors.centerIn: parent
7582 source: modelData
76− height: parent.height
77− anchors.horizontalCenter: parent.horizontalCenter
78− fillMode: Image.PreserveAspectFit
79−
80− sourceSize {
81− width: indicatorWidget.iconSize
82− height: indicatorWidget.iconSize
83− }
83+ sets: ["status", "actions"]
84+ color: "#CCCCCC"
8485 }
8586 }
8687 }
@@ -88,7 +89,7 @@ Indicators.IndicatorBase {
8889
8990 Label {
9091 id: itemRightLabel
91− width: guRoundUp(implicitWidth)
92+ width: contentWidth + units.gu(1)
9293 objectName: "rightLabel"
9394 color: Theme.palette.selected.backgroundText
9495 opacity: 0.8
@@ -96,20 +97,10 @@ Indicators.IndicatorBase {
9697 fontSize: "medium"
9798 anchors.verticalCenter: parent.verticalCenter
9899 visible: text != ""
100+ horizontalAlignment: Text.AlignHCenter
99101 }
100102 }
101103
102− // TODO: Use toolkit function https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1242575
103− function guRoundUp(width) {
104− if (width == 0) {
105− return 0;
106− }
107− var gu1 = units.gu(1.0);
108− var mod = (width % gu1);
109−
110− return mod == 0 ? width : width + (gu1 - mod);
111− }
112−
113104 onRootActionStateChanged: {
114105 if (rootActionState == undefined) {
115106 leftLabel = "";
plugins/Unity/Indicators/qml/IndicatorBase.qml → qml/Panel/Indicators/IndicatorBase.qmlrenamed+2−3
@@ -18,8 +18,7 @@
1818 */
1919
2020import QtQuick 2.0
21−import QMenuModel 0.1 as QMenuModel
22−import Unity.Indicators 0.1 as Indicators
21+import Unity.Indicators 0.1
2322
2423Item {
2524 id: indicatorItem
@@ -43,7 +42,7 @@ Item {
4342 menuObjectPath: indicatorItem.deviceMenuObjectPath
4443 }
4544
46− property var rootActionState: Indicators.RootActionState {
45+ property RootActionState rootActionState: RootActionState {
4746 menu: menuModel
4847 onUpdated: indicatorItem.rootActionStateChanged()
4948 }
qml/Panel/Indicators/IndicatorDelegate.qml+1−2
@@ -18,9 +18,8 @@
1818 */
1919
2020import QtQuick 2.0
21−import Unity.Indicators 0.1 as Indicators
2221
23−Indicators.IndicatorBase {
22+IndicatorBase {
2423 enabled: false
2524
2625 onRootActionStateChanged: {
tests/mocks/Unity/Indicators/MenuItemFactory.qml → qml/Panel/Indicators/IndicatorsLight.qmlrenamed+14−14
@@ -1,5 +1,5 @@
11/*
2− * Copyright 2013 Canonical Ltd.
2+ * Copyright 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 Lesser General Public License as published by
@@ -14,25 +14,25 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 *
1616 * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
17+ * Renato Araujo Oliveira Filho <renato@canonical.com>
1818 */
1919
2020import QtQuick 2.0
21−import Ubuntu.Components.ListItems 0.1 as ListItem
21+import Powerd 0.1
22+import Lights 0.1
2223
23−Item {
24− id: menuFactory
24+QtObject {
25+ id: root
2526
26− property var menuModel: null
27+ Component.onDestruction: Lights.state = Lights.Off
2728
28− Component {
29− id: standardMenu;
30− ListItem.Standard {
31− objectName: "standardMenu"
32− }
33− }
29+ // QtObject does not have children
30+ property var _connections: Connections {
31+ id: powerConnection
3432
35− function load(modelData) {
36− return standardMenu;
33+ target: Powerd
34+ onDisplayPowerStateChange: {
35+ Lights.state = (status === Powerd.Off) ? Lights.On : Lights.Off
36+ }
3737 }
3838}
plugins/Unity/Indicators/qml/MenuItemFactory.qml → qml/Panel/Indicators/MenuItemFactory.qmlrenamed+178−14
@@ -19,7 +19,8 @@
1919
2020import QtQuick 2.0
2121import Ubuntu.Settings.Menus 0.1 as Menus
22−import QMenuModel 0.1 as QMenuModel
22+import Ubuntu.Settings.Components 0.1 as SettingsComponents
23+import QMenuModel 0.1
2324import Utils 0.1 as Utils
2425import Ubuntu.Components.ListItems 0.1 as ListItems
2526import Ubuntu.Components 0.1
@@ -27,20 +28,23 @@ import Ubuntu.Components 0.1
2728Item {
2829 id: menuFactory
2930
31+ property var rootModel: null
3032 property var menuModel: null
3133
3234 property var _map: {
3335 "unity.widgets.systemsettings.tablet.volumecontrol" : sliderMenu,
3436 "unity.widgets.systemsettings.tablet.switch" : switchMenu,
3537
36− "com.canonical.indicator.button" : buttonMenu,
37− "com.canonical.indicator.div" : separatorMenu,
38− "com.canonical.indicator.section" : sectionMenu,
39− "com.canonical.indicator.progress" : progressMenu,
40− "com.canonical.indicator.slider" : sliderMenu,
41− "com.canonical.indicator.switch" : switchMenu,
42− "com.canonical.indicator.alarm" : alarmMenu,
43− "com.canonical.indicator.appointment" : appointmentMenu,
38+ "com.canonical.indicator.button" : buttonMenu,
39+ "com.canonical.indicator.div" : separatorMenu,
40+ "com.canonical.indicator.section" : sectionMenu,
41+ "com.canonical.indicator.progress" : progressMenu,
42+ "com.canonical.indicator.slider" : sliderMenu,
43+ "com.canonical.indicator.switch" : switchMenu,
44+ "com.canonical.indicator.alarm" : alarmMenu,
45+ "com.canonical.indicator.appointment" : appointmentMenu,
46+ "com.canonical.indicator.transfer" : transferMenu,
47+ "com.canonical.indicator.button-section" : buttonSectionMenu,
4448
4549 "com.canonical.indicator.messages.messageitem" : messageItem,
4650 "com.canonical.indicator.messages.sourceitem" : groupedMessage,
@@ -64,6 +68,7 @@ Item {
6468
6569 Component {
6670 id: separatorMenu;
71+
6772 Menus.SeparatorMenu {
6873 objectName: "separatorMenu"
6974 }
@@ -71,6 +76,7 @@ Item {
7176
7277 Component {
7378 id: sliderMenu;
79+
7480 Menus.SliderMenu {
7581 objectName: "sliderMenu"
7682 property QtObject menuData: null
@@ -122,6 +128,7 @@ Item {
122128
123129 Component {
124130 id: buttonMenu;
131+
125132 Menus.ButtonMenu {
126133 objectName: "buttonMenu"
127134 property QtObject menuData: null
@@ -139,6 +146,7 @@ Item {
139146 }
140147 Component {
141148 id: sectionMenu;
149+
142150 Menus.SectionMenu {
143151 objectName: "sectionMenu"
144152 property QtObject menuData: null
@@ -151,6 +159,7 @@ Item {
151159
152160 Component {
153161 id: progressMenu;
162+
154163 Menus.ProgressValueMenu {
155164 objectName: "progressMenu"
156165 property QtObject menuData: null
@@ -165,7 +174,8 @@ Item {
165174
166175 Component {
167176 id: standardMenu;
168− ListItems.Standard {
177+
178+ Menus.StandardMenu {
169179 objectName: "standardMenu"
170180 property QtObject menuData: null
171181 property int menuIndex: -1
@@ -183,6 +193,7 @@ Item {
183193
184194 Component {
185195 id: checkableMenu;
196+
186197 Menus.CheckableMenu {
187198 objectName: "checkableMenu"
188199 property QtObject menuData: null
@@ -202,6 +213,7 @@ Item {
202213
203214 Component {
204215 id: switchMenu;
216+
205217 Menus.SwitchMenu {
206218 objectName: "switchMenu"
207219 property QtObject menuData: null
@@ -221,6 +233,7 @@ Item {
221233
222234 Component {
223235 id: alarmMenu;
236+
224237 Menus.EventMenu {
225238 objectName: "alarmMenu"
226239 property QtObject menuData: null
@@ -258,6 +271,7 @@ Item {
258271
259272 Component {
260273 id: appointmentMenu;
274+
261275 Menus.EventMenu {
262276 objectName: "appointmentMenu"
263277 property QtObject menuData: null
@@ -297,6 +311,7 @@ Item {
297311
298312 Component {
299313 id: wifiSection;
314+
300315 Menus.SectionMenu {
301316 objectName: "wifiSection"
302317 property QtObject menuData: null
@@ -323,6 +338,7 @@ Item {
323338
324339 Component {
325340 id: accessPoint;
341+
326342 Menus.AccessPointMenu {
327343 objectName: "accessPoint"
328344 property QtObject menuData: null
@@ -330,7 +346,7 @@ Item {
330346 property int menuIndex: -1
331347 property var extendedData: menuData && menuData.ext || undefined
332348
333− property var strengthAction: QMenuModel.UnityMenuAction {
349+ property var strengthAction: UnityMenuAction {
334350 model: menuModel
335351 index: menuIndex
336352 name: getExtendedProperty(extendedData, "xCanonicalWifiApStrengthAction", "")
@@ -365,6 +381,7 @@ Item {
365381
366382 Component {
367383 id: messageItem
384+
368385 MessageMenuItemFactory {
369386 objectName: "messageItem"
370387 menuModel: menuFactory.menuModel
@@ -373,6 +390,7 @@ Item {
373390
374391 Component {
375392 id: groupedMessage
393+
376394 Menus.GroupedMessageMenu {
377395 objectName: "groupedMessage"
378396 property QtObject menuData: null
@@ -409,6 +427,7 @@ Item {
409427
410428 Component {
411429 id: mediaPayerMenu;
430+
412431 Menus.MediaPlayerMenu {
413432 objectName: "mediaPayerMenu"
414433 property QtObject menuData: null
@@ -435,6 +454,7 @@ Item {
435454
436455 Component {
437456 id: playbackItemMenu;
457+
438458 Menus.PlaybackItemMenu {
439459 objectName: "playbackItemMenu"
440460 property QtObject menuData: null
@@ -442,17 +462,17 @@ Item {
442462 property int menuIndex: -1
443463 property var extendedData: menuData && menuData.ext || undefined
444464
445− property var playAction: QMenuModel.UnityMenuAction {
465+ property var playAction: UnityMenuAction {
446466 model: menuModel
447467 index: menuIndex
448468 name: getExtendedProperty(extendedData, "xCanonicalPlayAction", "")
449469 }
450− property var nextAction: QMenuModel.UnityMenuAction {
470+ property var nextAction: UnityMenuAction {
451471 model: menuModel
452472 index: menuIndex
453473 name: getExtendedProperty(extendedData, "xCanonicalNextAction", "")
454474 }
455− property var previousAction: QMenuModel.UnityMenuAction {
475+ property var previousAction: UnityMenuAction {
456476 model: menuModel
457477 index: menuIndex
458478 name: getExtendedProperty(extendedData, "xCanonicalPreviousAction", "")
@@ -489,6 +509,150 @@ Item {
489509 }
490510 }
491511
512+ Component {
513+ id: transferMenu
514+
515+ Menus.TransferMenu {
516+ objectName: "transferMenu"
517+ id: transfer
518+ property QtObject menuData: null
519+ property var menuModel: menuFactory.menuModel
520+ property int menuIndex: -1
521+ property var extendedData: menuData && menuData.ext || undefined
522+ property var uid: getExtendedProperty(extendedData, "xCanonicalUid", undefined)
523+
524+ text: menuData && menuData.label || ""
525+ iconSource: menuData && menuData.icon || ""
526+ maximum: 1.0
527+ enabled: menuData && menuData.sensitive || false
528+ removable: true
529+ confirmRemoval: true
530+
531+ QDBusActionGroup {
532+ id: actionGroup
533+ busType: 1
534+ busName: rootModel.busName
535+ objectPath: rootModel.actions["indicator"]
536+
537+ property var activateAction: action("activate-transfer")
538+ property var cancelAction: action("cancel-transfer")
539+ property var transferStateAction: uid !== undefined ? action("transfer-state."+uid) : null
540+
541+ Component.onCompleted: actionGroup.start()
542+ }
543+
544+ property var transferState: {
545+ if (actionGroup.transferStateAction === null) return undefined;
546+ return actionGroup.transferStateAction.valid ? actionGroup.transferStateAction.state : undefined
547+ }
548+
549+ property var runningState : transferState !== undefined ? transferState["state"] : undefined
550+ property var secondsLeft : transferState !== undefined ? transferState["seconds-left"] : undefined
551+
552+ active: runningState !== undefined && runningState !== Menus.TransferState.Finished
553+ progress: transferState !== undefined ? transferState["percent"] : 0.0
554+
555+ // TODO - Should be in the SDK
556+ property var timeRemaining: {
557+ if (secondsLeft === undefined) return undefined;
558+
559+ var remaining = "";
560+ var hours = Math.floor(secondsLeft / (60 * 60));
561+ var minutes = Math.floor(secondsLeft / 60) % 60;
562+ var seconds = secondsLeft % 60;
563+ if (hours > 0) {
564+ remaining += hours + (hours == 1 ? " hour" : " hours");
565+ }
566+ if (minutes > 0) {
567+ if (remaining != "") remaining += ", ";
568+ remaining += minutes + (minutes == 1 ? " minute" : " minutes");
569+ }
570+ // don't include seconds if hours > 0
571+ if (hours == 0 && minutes < 5 && seconds > 0) {
572+ if (remaining != "") remaining += ", ";
573+ remaining += seconds + (seconds == 1 ? " second" : " seconds");
574+ }
575+ if (remaining == "")
576+ remaining = "0 seconds";
577+ return remaining + " remaining";
578+ }
579+
580+ stateText: {
581+ switch (runningState) {
582+ case Menus.TransferState.Queued:
583+ return i18n.tr("In queue…");
584+ case Menus.TransferState.Hashing:
585+ case Menus.TransferState.Processing:
586+ case Menus.TransferState.Running:
587+ return timeRemaining === undefined ? i18n.tr("Downloading") : timeRemaining;
588+ case Menus.TransferState.Paused:
589+ return i18n.tr("Paused, tap to resume");
590+ case Menus.TransferState.Canceled:
591+ return i18n.tr("Canceled");
592+ case Menus.TransferState.Finished:
593+ return i18n.tr("Finished");
594+ case Menus.TransferState.Error:
595+ return i18n.tr("Failed, tap to retry");
596+ }
597+ return "";
598+ }
599+
600+ onMenuModelChanged: {
601+ loadAttributes();
602+ }
603+ onMenuIndexChanged: {
604+ loadAttributes();
605+ }
606+ onTriggered: {
607+ actionGroup.activateAction.activate(uid);
608+ }
609+ onItemRemoved: {
610+ actionGroup.cancelAction.activate(uid);
611+ }
612+
613+ function loadAttributes() {
614+ if (!menuModel || menuIndex == -1) return;
615+ menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-uid': 'string'});
616+ }
617+ }
618+ }
619+
620+ Component {
621+ id: buttonSectionMenu;
622+
623+ ListItems.Standard {
624+ objectName: "buttonSectionMenu"
625+ property QtObject menuData: null
626+ property var menuModel: menuFactory.menuModel
627+ property int menuIndex: -1
628+ property var extendedData: menuData && menuData.ext || undefined
629+
630+ iconSource: menuData && menuData.icon || ""
631+ enabled: menuData && menuData.sensitive || false
632+ text: menuData && menuData.label || ""
633+ showDivider: false
634+
635+ onMenuModelChanged: {
636+ loadAttributes();
637+ }
638+ onMenuIndexChanged: {
639+ loadAttributes();
640+ }
641+ function loadAttributes() {
642+ if (!menuModel || menuIndex == -1) return;
643+ menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-extra-label': 'string'});
644+ }
645+
646+ control: Button {
647+ text: getExtendedProperty(extendedData, "xCanonicalExtraLabel", "")
648+
649+ onClicked: {
650+ menuModel.activate(menuIndex);
651+ }
652+ }
653+ }
654+ }
655+
492656 function load(modelData) {
493657 if (modelData.type !== undefined) {
494658 var component = _map[modelData.type];
plugins/Unity/Indicators/qml/MessageMenuItemFactory.qml → qml/Panel/Indicators/MessageMenuItemFactory.qmlrenamed+3
@@ -77,6 +77,7 @@ Item {
7777
7878 Component {
7979 id: simpleTextMessage
80+
8081 Menus.SimpleTextMessageMenu {
8182 id: message
8283 objectName: "simpleTextMessage"
@@ -115,6 +116,7 @@ Item {
115116
116117 Component {
117118 id: textMessage
119+
118120 Menus.TextMessageMenu {
119121 id: message
120122 objectName: "textMessage"
@@ -165,6 +167,7 @@ Item {
165167 }
166168 Component {
167169 id: snapDecision
170+
168171 Menus.SnapDecisionMenu {
169172 id: message
170173 objectName: "snapDecision"
plugins/Unity/Indicators/qml/RemoveBackground.qml → qml/Panel/Indicators/RemoveBackground.qmlrenamed

The content is the same.

qml/Panel/Panel.qml+131−90
@@ -16,27 +16,23 @@
1616
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
19+import Unity.Application 0.1
1920import "../Components"
21+import "../Components/ListItems"
2022
2123Item {
2224 id: root
23− readonly property real panelHeight: units.gu(3) + units.dp(2)
24− property real indicatorsMenuWidth: (shell.width > units.gu(60)) ? units.gu(40) : shell.width
25− property alias indicators: indicatorsMenu
25+ readonly property real panelHeight: indicatorArea.y + d.indicatorHeight
26+ property alias indicators: __indicators
27+ property alias callHint: __callHint
2628 property bool fullscreenMode: false
27− property bool searchVisible: true
28−
29− readonly property real separatorLineHeight: leftSeparatorLine.height
30− readonly property real __panelMinusSeparatorLineHeight: panelHeight - separatorLineHeight
31−
32− signal searchClicked
3329
3430 function hideIndicatorMenu(delay) {
3531 if (delay !== undefined) {
3632 hideTimer.interval = delay;
3733 hideTimer.start();
3834 } else {
39− indicatorsMenu.hide();
35+ indicators.hide();
4036 }
4137 }
4238
@@ -44,129 +40,174 @@ Item {
4440 id: hideTimer
4541 running: false
4642 onTriggered: {
47− indicatorsMenu.hide();
43+ indicators.hide();
4844 }
4945 }
5046
5147 Connections {
52− target: indicatorsMenu
48+ target: indicators
5349 onShownChanged: hideTimer.stop()
5450 }
5551
56− PanelBackground {
57− id: panelBackground
58− anchors {
59− left: parent.left
60− right: parent.right
61− }
62− height: __panelMinusSeparatorLineHeight
63− y: 0
64−
65− Behavior on y { StandardAnimation { duration: 500 } }
66− }
67−
68− PanelSeparatorLine {
69− id: leftSeparatorLine
70− anchors {
71− top: panelBackground.bottom
72− left: parent.left
73− right: indicatorsMenu.left
74− }
75− saturation: 1 - indicatorsMenu.unitProgress
76− }
77−
7852 Rectangle {
7953 id: darkenedArea
8054 property real darkenedOpacity: 0.6
8155 anchors {
56+ top: parent.top
57+ topMargin: panelHeight
8258 left: parent.left
8359 right: parent.right
84− top: panelBackground.bottom
8560 bottom: parent.bottom
8661 }
8762 color: "black"
88− opacity: indicatorsMenu.unitProgress * darkenedOpacity
63+ opacity: indicators.unitProgress * darkenedOpacity
64+
8965 MouseArea {
9066 anchors.fill: parent
91− enabled: indicatorsMenu.shown
92− onClicked: if (indicatorsMenu.fullyOpened) indicatorsMenu.hide();
67+ enabled: indicators.shown
68+ onClicked: if (indicators.fullyOpened) indicators.hide();
9369 }
9470 }
9571
96− Indicators {
97− id: indicatorsMenu
98− objectName: "indicators"
99−
100− anchors.right: parent.right
101− y: panelBackground.y
102− width: root.indicatorsMenuWidth
103− shown: false
104− panelHeight: __panelMinusSeparatorLineHeight
105− openedHeight: parent.height + (pinnedMode ? 0 : root.panelHeight)
106− pinnedMode: !fullscreenMode
107− overFlowWidth: search.state=="hidden" ? parent.width : parent.width - search.width
108− }
72+ Item {
73+ id: indicatorArea
74+ objectName: "indicatorArea"
10975
110− PanelSeparatorLine {
111− id: indicatorsSeparatorLine
112− visible: true
113− anchors {
114− left: indicatorsMenu.left
115− right: indicatorsMenu.right
76+ anchors.fill: parent
77+
78+ Behavior on anchors.topMargin { StandardAnimation {} }
79+
80+ BorderImage {
81+ id: dropShadow
82+ anchors {
83+ fill: indicators
84+ leftMargin: -units.gu(1)
85+ bottomMargin: -units.gu(1)
86+ }
87+ visible: indicators.height > indicators.panelHeight
88+ source: "graphics/rectangular_dropshadow.sci"
11689 }
117− y: indicatorsMenu.visualBottom
118− }
11990
120− BorderImage {
121− id: dropShadow
122− anchors {
123− top: indicators.top
124− bottom: indicatorsSeparatorLine.bottom
125− left: indicators.left
126− right: indicators.right
127− margins: -units.gu(1)
91+ VerticalThinDivider {
92+ id: indicatorDividor
93+ anchors {
94+ top: indicators.top
95+ bottom: indicators.bottom
96+ right: indicators.left
97+
98+ topMargin: indicatorArea.anchors.topMargin + indicators.panelHeight
99+ }
100+
101+ width: units.dp(2)
102+ source: "graphics/VerticalDivider.png"
103+ }
104+
105+ Rectangle {
106+ id: indicatorAreaBackground
107+ color: callHint.visible ? "green" : "black"
108+ anchors {
109+ top: parent.top
110+ left: parent.left
111+ right: parent.right
112+ }
113+ height: indicators.panelHeight
114+
115+ Behavior on color { ColorAnimation { duration: UbuntuAnimation.FastDuration } }
116+ }
117+
118+ PanelSeparatorLine {
119+ id: nonIndicatorAreaSeparatorLine
120+ anchors {
121+ top: indicatorAreaBackground.bottom
122+ left: parent.left
123+ right: indicators.left
124+ }
125+ saturation: 1 - indicators.unitProgress
126+ }
127+
128+ MouseArea {
129+ anchors {
130+ top: parent.top
131+ left: parent.left
132+ right: indicators.left
133+ }
134+ height: indicators.panelHeight
135+ enabled: callHint.visible
136+ onClicked: callHint.showLiveCall()
128137 }
129− visible: indicatorsMenu.height > indicatorsMenu.panelHeight
130− source: "graphics/rectangular_dropshadow.sci"
131− }
132138
133− SearchIndicator {
134− id: search
135− objectName: "search"
136− enabled: root.searchVisible
139+ Indicators {
140+ id: __indicators
141+ objectName: "indicators"
137142
138− state: {
139− if (parent.width < indicatorsMenu.width + width) {
140− if (indicatorsMenu.state != "initial") {
141− return "hidden";
143+ anchors {
144+ top: parent.top
145+ right: parent.right
146+ }
147+
148+ width: root.width
149+ shown: false
150+ panelHeight: units.gu(3)
151+ openedHeight: root.height
152+ overFlowWidth: {
153+ if (callHint.visible) {
154+ return Math.max(root.width - (callHint.width + units.gu(2)), 0)
142155 }
156+ return root.width
143157 }
144− if (root.searchVisible && !indicatorsMenu.showAll) {
145− return "visible";
158+
159+ enableHint: !callHint.active && !fullscreenMode
160+ showHintBottomMargin: fullscreenMode ? -panelHeight : 0
161+
162+ onShowTapped: {
163+ if (callHint.active) {
164+ callHint.showLiveCall();
165+ }
146166 }
167+ }
147168
148− return "hidden";
169+ ActiveCallHint {
170+ id: __callHint
171+ anchors {
172+ top: parent.top
173+ left: parent.left
174+ }
175+ height: indicators.panelHeight
176+ visible: active && indicators.state == "initial"
149177 }
150178
151− height: __panelMinusSeparatorLineHeight
152− anchors {
153− top: panelBackground.top
154− left: panelBackground.left
179+ PanelSeparatorLine {
180+ id: indicatorsSeparatorLine
181+ visible: true
182+ anchors {
183+ top: indicators.bottom
184+ left: indicatorDividor.left
185+ right: indicators.right
186+ }
155187 }
188+ }
156189
157− onClicked: root.searchClicked()
190+ QtObject {
191+ id: d
192+ readonly property real indicatorHeight: indicators.panelHeight + indicatorsSeparatorLine.height
158193 }
159194
160195 states: [
161196 State {
162− name: "in" //fully opaque and visible at top edge of screen
197+ name: "onscreen" //fully opaque and visible at top edge of screen
163198 when: !fullscreenMode
164− PropertyChanges { target: panelBackground; y: 0 }
199+ PropertyChanges {
200+ target: indicatorArea;
201+ anchors.topMargin: 0
202+ }
165203 },
166204 State {
167− name: "out" //pushed off screen
205+ name: "offscreen" //pushed off screen
168206 when: fullscreenMode
169− PropertyChanges { target: panelBackground; y: -panelHeight }
207+ PropertyChanges {
208+ target: indicatorArea;
209+ anchors.topMargin: indicators.state === "initial" ? -d.indicatorHeight : 0
210+ }
170211 }
171212 ]
172213}
qml/ScopeTool.qml−1
@@ -73,7 +73,6 @@ Rectangle {
7373 id: dashContent
7474
7575 model: filteredScopes
76− searchHistory: SearchHistoryModel { }
7776 property var scope: scopes.getScope(currentIndex)
7877
7978 anchors {
qml/Shell.qml+14−15
@@ -109,7 +109,7 @@ FocusScope {
109109 anchors.rightMargin: -parent.anchors.rightMargin
110110
111111 // Whether the underlay is fully covered by opaque UI elements.
112− property bool fullyCovered: panel.indicators.fullyOpened && shell.width <= panel.indicatorsMenuWidth
112+ property bool fullyCovered: panel.indicators.fullyOpened && shell.width <= panel.indicators.width
113113
114114 // Whether the user should see the topmost application surface (if there's one at all).
115115 readonly property bool applicationSurfaceShouldBeSeen: stages.shown && !stages.painting && !stages.overlayMode
@@ -533,15 +533,16 @@ FocusScope {
533533 if (LightDM.Greeter.active && !LightDM.Greeter.promptless)
534534 return;
535535
536− if (stages.shown && !stages.overlayMode) {
537− if (!stages.locked) {
538− stages.hide();
539− launcher.hide();
540− }
536+ if (stages.shown && !stages.overlayMode && !stages.locked) {
537+ stages.hide();
538+ launcher.fadeOut();
539+ } else {
540+ launcher.switchToNextState("visible");
541541 }
542+
542543 if (greeter.shown) {
543544 greeter.hideRight();
544− launcher.hide();
545+ launcher.fadeOut();
545546 }
546547 }
547548
@@ -558,16 +559,16 @@ FocusScope {
558559 id: panel
559560 objectName: "panel"
560561 anchors.fill: parent //because this draws indicator menus
561− indicatorsMenuWidth: parent.width > units.gu(60) ? units.gu(40) : parent.width
562562 indicators {
563563 hides: [launcher]
564564 available: edgeDemo.panelEnabled && greeter.fakeActiveForApp === ""
565565 contentEnabled: edgeDemo.panelContentEnabled
566+ width: parent.width > units.gu(60) ? units.gu(40) : parent.width
567+ panelHeight: units.gu(3)
566568 }
567569 property string focusedAppId: ApplicationManager.focusedApplicationId
568570 property var focusedApplication: ApplicationManager.findApplication(focusedAppId)
569571 fullscreenMode: (focusedApplication && stages.fullscreen && !LightDM.Greeter.active) || greeter.fakeActiveForApp !== ""
570− searchVisible: !LightDM.Greeter.active && dash.shown && dash.searchable
571572
572573 InputFilterArea {
573574 anchors {
@@ -642,12 +643,10 @@ FocusScope {
642643 model: NotificationBackend.Model
643644 margin: units.gu(1)
644645
645− anchors {
646− top: parent.top
647− right: parent.right
648− bottom: parent.bottom
649− topMargin: panel.panelHeight
650− }
646+ y: panel.panelHeight
647+ width: parent.width
648+ height: parent.height - panel.panelHeight
649+
651650 states: [
652651 State {
653652 name: "narrow"
run.sh−6
@@ -57,12 +57,6 @@ if $KEYLOCK; then
5757 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/tests/mocks/libusermetrics:$PWD/builddir/tests/mocks/LightDM/single-passphrase
5858fi
5959
60−# Force icon theme if running on the desktop, otherwise gnome theme (if running
61−# on Ubuntu Desktop) will be used and icons won't be found
62−if [ -n "$DESKTOP_SESSION" ]; then
63− export UBUNTU_ICON_THEME=ubuntu-mobile
64−fi
65−
6660QML_PHONE_SHELL_ARGS=""
6761if $MOUSE_TOUCH; then
6862 QML_PHONE_SHELL_ARGS="$QML_PHONE_SHELL_ARGS -mousetouch"
src/CMakeLists.txt+1
@@ -19,6 +19,7 @@ add_executable(${SHELL_APP}
1919 ApplicationArguments.h
2020 main.cpp
2121 MouseTouchAdaptor.cpp
22+ CachingNetworkManagerFactory.cpp
2223 ${QML_FILES} # This is to make qml and image files appear in the IDE's project tree
2324)
2425
src/CachingNetworkManagerFactory.cppnew file+62
@@ -0,0 +1,62 @@
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+
18+#include "CachingNetworkManagerFactory.h"
19+
20+#include <QNetworkDiskCache>
21+#include <QNetworkAccessManager>
22+#include <QStandardPaths>
23+#include <QNetworkConfigurationManager>
24+
25+CachingNetworkAccessManager::CachingNetworkAccessManager(QObject *parent)
26+ : QNetworkAccessManager(parent)
27+{
28+ m_networkManager = new QNetworkConfigurationManager(this);
29+
30+ QObject::connect(m_networkManager, &QNetworkConfigurationManager::onlineStateChanged, this, &CachingNetworkAccessManager::onlineStateChanged);
31+ m_isOnline = m_networkManager->isOnline();
32+}
33+
34+void CachingNetworkAccessManager::onlineStateChanged(bool isOnline)
35+{
36+ m_isOnline = isOnline;
37+}
38+
39+QNetworkReply* CachingNetworkAccessManager::createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData)
40+{
41+ if (!m_isOnline) {
42+ QNetworkRequest req(request);
43+ req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysCache);
44+ return QNetworkAccessManager::createRequest(op, req, outgoingData);
45+ }
46+
47+ return QNetworkAccessManager::createRequest(op, request, outgoingData);
48+}
49+
50+CachingNetworkManagerFactory::CachingNetworkManagerFactory()
51+{
52+}
53+
54+QNetworkAccessManager *CachingNetworkManagerFactory::create(QObject *parent) {
55+ QNetworkAccessManager *manager = new CachingNetworkAccessManager(parent);
56+
57+ QNetworkDiskCache* cache = new QNetworkDiskCache(manager);
58+ cache->setCacheDirectory(QString("%1/network").arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)));
59+
60+ manager->setCache(cache);
61+ return manager;
62+}
src/CachingNetworkManagerFactory.hnew file+50
@@ -0,0 +1,50 @@
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+
18+#ifndef CACHINGNETWORKMANAGERFACTORY_H
19+#define CACHINGNETWORKMANAGERFACTORY_H
20+
21+#include <QQmlNetworkAccessManagerFactory>
22+#include <QNetworkAccessManager>
23+
24+class QNetworkConfigurationManager;
25+
26+class CachingNetworkAccessManager : public QNetworkAccessManager
27+{
28+public:
29+ CachingNetworkAccessManager(QObject *parent = 0);
30+
31+protected:
32+ QNetworkReply* createRequest(Operation op, const QNetworkRequest &req, QIODevice *outgoingData = 0) override;
33+
34+private Q_SLOTS:
35+ void onlineStateChanged(bool isOnline);
36+
37+private:
38+ QNetworkConfigurationManager* m_networkManager;
39+ bool m_isOnline;
40+};
41+
42+class CachingNetworkManagerFactory : public QQmlNetworkAccessManagerFactory
43+{
44+public:
45+ CachingNetworkManagerFactory();
46+
47+ QNetworkAccessManager *create(QObject *parent) override;
48+};
49+
50+#endif // CACHINGNETWORKMANAGERFACTORY_H
src/Panel/Indicators/client/indicatorsclient.cpp−1
@@ -32,7 +32,6 @@ IndicatorsClient::IndicatorsClient(int &argc, char **argv)
3232 m_view(0)
3333{
3434 m_application = new QApplication(argc, argv);
35− resolveIconTheme();
3635
3736 QStringList args = m_application->arguments();
3837
src/main.cpp+5−4
@@ -34,15 +34,15 @@
3434#include <paths.h>
3535#include "MouseTouchAdaptor.h"
3636#include "ApplicationArguments.h"
37+#include "CachingNetworkManagerFactory.h"
3738
3839#include <unity-mir/qmirserver.h>
3940
40−
4141int startShell(int argc, const char** argv, void* server)
4242{
4343 const bool isUbuntuMirServer = qgetenv("QT_QPA_PLATFORM") == "ubuntumirserver";
4444
45− QGuiApplication::setApplicationName("Unity 8");
45+ QGuiApplication::setApplicationName("unity8");
4646 QGuiApplication *application;
4747
4848 QCommandLineParser parser;
@@ -96,8 +96,6 @@ Load the testability driver");
9696 indicatorProfile = "phone";
9797 }
9898
99− resolveIconTheme();
100−
10199 ApplicationArguments qmlArgs;
102100 if (parser.isSet(windowGeometryOption) &&
103101 parser.value(windowGeometryOption).split('x').size() == 2)
@@ -159,6 +157,9 @@ Load the testability driver");
159157 }
160158 appendImportPaths(view->engine(), ::fallbackImportPaths());
161159
160+ CachingNetworkManagerFactory *managerFactory = new CachingNetworkManagerFactory();
161+ view->engine()->setNetworkAccessManagerFactory(managerFactory);
162+
162163 view->setSource(source);
163164 view->setColor("transparent");
164165 QObject::connect(view->engine(), SIGNAL(quit()), application, SLOT(quit()));
tests/autopilot/unity8/process_helpers.py+4−3
@@ -75,7 +75,7 @@ def unlock_unity(unity_proxy_obj=None):
7575 main_window_emulator.QQuickView)
7676
7777 greeter = main_window.get_greeter()
78− if greeter.created == False:
78+ if greeter.created is False:
7979 raise RuntimeWarning("Greeter appears to be already unlocked.")
8080
8181 # Because of potential input jerkiness under heavy load,
@@ -98,7 +98,8 @@ def unlock_unity(unity_proxy_obj=None):
9898
9999def lock_unity(unity_proxy_obj=None):
100100 """Helper function that attempts to lock the unity greeter."""
101− import evdev, time
101+ import evdev
102+ import time
102103 uinput = evdev.UInput(name='unity8-autopilot-power-button',
103104 devnode='/dev/autopilot-uinput')
104105 # One press and release to turn screen off (locking unity)
@@ -172,7 +173,7 @@ def _get_unity_status():
172173
173174def _get_unity_pid():
174175 status = _get_unity_status()
175− if not "start/" in status:
176+ if "start/" not in status:
176177 raise CannotAccessUnity("Unity is not in the running state.")
177178 return int(status.split()[-1])
178179
tests/autopilot/unity8/shell/emulators/dash.py+29−26
@@ -108,44 +108,47 @@ class Dash(emulators.UnityEmulatorBase):
108108 @autopilot_logging.log_action(logger.info)
109109 def _scroll_to_left_scope(self):
110110 original_index = self.dash_content_list.currentIndex
111− # Scroll on the border of the page header, because some scopes have
112− # contents that can be scrolled horizontally.
113− page_header = self._get_page_header()
114− border = page_header.select_single('QQuickBorderImage')
115− start_x = border.width / 3
116− stop_x = border.width / 3 * 2
117− start_y = stop_y = border.globalRect.y + border.height / 2
111+ dashContent = self.select_single(objectName="dashContent")
112+ start_x = dashContent.width / 3
113+ stop_x = dashContent.width / 3 * 2
114+ start_y = stop_y = dashContent.globalRect.y + 1
118115 self.pointing_device.drag(start_x, start_y, stop_x, stop_y)
119116 self.dash_content_list.currentIndex.wait_for(original_index - 1)
120117
121− def _get_page_header(self):
122− return self.select_single('PageHeader', objectName='pageHeader')
123−
124118 @autopilot_logging.log_action(logger.info)
125119 def _scroll_to_right_scope(self):
126120 original_index = self.dash_content_list.currentIndex
127− # Scroll on the border of the page header, because some scopes have
128− # contents that can be scrolled horizontally.
129− page_header = self._get_page_header()
130− border = page_header.select_single('QQuickBorderImage')
131− start_x = border.width / 3 * 2
132− stop_x = border.width / 3
133− start_y = stop_y = border.globalRect.y + border.height / 2
121+ dashContent = self.select_single(objectName="dashContent")
122+ start_x = dashContent.width / 3 * 2
123+ stop_x = dashContent.width / 3
124+ start_y = stop_y = dashContent.globalRect.y + 1
134125 self.pointing_device.drag(start_x, start_y, stop_x, stop_y)
135126 self.dash_content_list.currentIndex.wait_for(original_index + 1)
136127
137128 def enter_search_query(self, query):
129+ current_header = self._get_current_page_header()
130+ self.pointing_device.move(current_header.globalRect.x +
131+ current_header.width - current_header.height / 2,
132+ current_header.globalRect.y +
133+ current_header.height / 2)
134+ self.pointing_device.click()
135+ headerContainer = current_header.select_single(objectName="headerContainer")
136+ headerContainer.contentY.wait_for(0)
138137 search_text_field = self._get_search_text_field()
139138 search_text_field.write(query)
140− search_text_field.state.wait_for('idle')
139+ current_header.select_single(objectName="searchIndicator").running.wait_for(False)
141140
142141 def _get_search_text_field(self):
143− page_header = self._get_page_header()
144− search_container = page_header.select_single(
145− 'QQuickItem', objectName='searchContainer')
146− search_container.state.wait_for(
147− MatchesAny(Equals('narrowActive'), Equals('active')))
148− return search_container.select_single(toolkit_emulators.TextField)
142+ page_header = self._get_current_page_header()
143+ return page_header.select_single(objectName='searchTextField')
144+
145+ def _get_current_page_header(self):
146+ dashContentList = self.select_single(objectName="dashContentList")
147+ all_headers = dashContentList.select_many("QQuickLoader")
148+ for i in all_headers:
149+ if i.isCurrent:
150+ return i.select_single(objectName="scopePageHeader")
151+ return None
149152
150153
151154class GenericScopeView(emulators.UnityEmulatorBase):
@@ -166,8 +169,8 @@ class GenericScopeView(emulators.UnityEmulatorBase):
166169 # Some categories do not show previews, like recent apps.
167170 # --elopio - 2014-1-14
168171 self.pointing_device.click_object(icon)
169− preview_list = self.get_root_instance().wait_select_single(
170− 'PreviewListView', objectName='dashContentPreviewList')
172+ preview_list = self.wait_select_single(
173+ 'PreviewListView', objectName='previewListView')
171174 preview_list.x.wait_for(0)
172175 return preview_list.select_single(
173176 Preview, objectName='preview{}'.format(preview_list.currentIndex))
tests/autopilot/unity8/shell/emulators/main_window.py−5
@@ -133,9 +133,4 @@ class QQuickView(emulators.UnityEmulatorBase):
133133
134134 @autopilot_logging.log_action(logger.info)
135135 def search(self, query):
136− search_indicator = self._get_search_indicator()
137− self.pointing_device.click_object(search_indicator)
138136 self.get_dash().enter_search_query(query)
139−
140− def _get_search_indicator(self):
141− return self.select_single('SearchIndicator', objectName='search')
tests/autopilot/unity8/shell/tests/__init__.py+1−2
@@ -142,12 +142,11 @@ class UnityTestCase(AutopilotTestCase):
142142 self._data_dirs_mock_enabled = True
143143 self._environment = {}
144144
145− #### FIXME: This is a work around re: lp:1238417 ####
145+ # FIXME: This is a work around re: lp:1238417
146146 if model() != "Desktop":
147147 from autopilot.input import _uinput
148148 _uinput._touch_device = _uinput.create_touch_device()
149149 self.addCleanup(_uinput._touch_device.close)
150− ####
151150
152151 self.touch = Touch.create()
153152 self._setup_display_details()
tests/autopilot/unity8/shell/tests/disabled_test_hud.py+44−13
@@ -20,12 +20,13 @@
2020from __future__ import absolute_import
2121
2222from unity8.process_helpers import unlock_unity
23−from unity8.shell import with_lightdm_mock, DragMixin
23+from unity8.shell import DragMixin
2424from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
2525
2626from testtools.matchers import Equals
2727from autopilot.matchers import Eventually
2828
29+
2930class TestHud(UnityTestCase, DragMixin):
3031
3132 """Tests the Shell HUD."""
@@ -33,10 +34,14 @@ class TestHud(UnityTestCase, DragMixin):
3334 scenarios = _get_device_emulation_scenarios()
3435
3536 def test_show_hud_button_appears(self):
36− """Swiping up while an app is active must show the 'show hud' button, following some behaviours.
37+ """Swiping up while an app is active must show the 'show hud' button.
38+
39+ It should follow some behaviours.
3740 The button must disappear not opening the HUD when releasing the
38− mouse again somewhere on the screen except on the button itself following a timeout.
39− The button must disappear when touching somewhere on the screen except the button itself.
41+ mouse again somewhere on the screen except on the button itself
42+ following a timeout.
43+ The button must disappear when touching somewhere on the screen
44+ except the button itself.
4045
4146 """
4247 unity_proxy = self.launch_unity()
@@ -55,29 +60,47 @@ class TestHud(UnityTestCase, DragMixin):
5560
5661 self.touch.press(swipe_coords.start_x, swipe_coords.start_y)
5762 self.addCleanup(self._maybe_release_finger)
58− self._drag(swipe_coords.start_x, swipe_coords.start_y, swipe_coords.start_x, swipe_coords.start_y - int(edge_drag_area.distanceThreshold) - 5)
63+ self._drag(
64+ swipe_coords.start_x,
65+ swipe_coords.start_y,
66+ swipe_coords.start_x,
67+ swipe_coords.start_y - int(edge_drag_area.distanceThreshold) - 5)
5968 self.assertThat(hud_show_button.opacity, Eventually(Equals(0.5)))
60− self.assertThat(hud_show_button.bottomMargin, Eventually(Equals(initialBottomMargin)))
61− self._drag(swipe_coords.start_x, swipe_coords.start_y - int(edge_drag_area.distanceThreshold) - 5, swipe_coords.end_x, swipe_coords.start_y - int(edge_drag_area.distanceThreshold) - int(edge_drag_area.commitDistance) - 5)
69+ self.assertThat(
70+ hud_show_button.bottomMargin,
71+ Eventually(Equals(initialBottomMargin)))
72+ self._drag(
73+ swipe_coords.start_x,
74+ swipe_coords.start_y - int(edge_drag_area.distanceThreshold) - 5,
75+ swipe_coords.end_x,
76+ swipe_coords.start_y - int(edge_drag_area.distanceThreshold) -
77+ int(edge_drag_area.commitDistance) - 5)
6278 self.assertThat(hud_show_button.opacity, Eventually(Equals(1.0)))
6379 self.assertThat(hud_show_button.bottomMargin, Eventually(Equals(0.0)))
64− self.touch.release();
80+ self.touch.release()
6581 self.assertThat(hud.shown, Equals(False))
6682 self.assertThat(hud_show_button.opacity, Eventually(Equals(0.0)))
6783
6884 self.touch.press(swipe_coords.start_x, swipe_coords.start_y)
69− self._drag(swipe_coords.start_x, swipe_coords.start_y, swipe_coords.start_x, swipe_coords.end_y - int(hud_show_button.height))
85+ self._drag(
86+ swipe_coords.start_x,
87+ swipe_coords.start_y,
88+ swipe_coords.start_x,
89+ swipe_coords.end_y - int(hud_show_button.height))
7090 self.assertThat(hud.shown, Equals(False))
7191 self.assertThat(hud_show_button.opacity, Eventually(Equals(1.0)))
7292 self.touch.release()
7393 self.assertThat(hud_show_button.opacity, Eventually(Equals(1.0)))
74− self.touch.tap(swipe_coords.end_x, swipe_coords.end_y - int(hud_show_button.height))
94+ self.touch.tap(
95+ swipe_coords.end_x,
96+ swipe_coords.end_y - int(hud_show_button.height))
7597 self.assertThat(hud.shown, Equals(False))
7698 self.assertThat(hud_show_button.opacity, Eventually(Equals(0.0)))
7799
78100 def test_show_hud_appears(self):
79101 """Releasing the touch on the 'show hud' button must display the hud.
80− Test that the hud button stays on screen and tapping it opens the hud.
102+ Test that the hud button stays on screen and tapping it opens the
103+ hud.
81104
82105 """
83106 unity_proxy = self.launch_unity()
@@ -94,7 +117,11 @@ class TestHud(UnityTestCase, DragMixin):
94117
95118 self.touch.press(swipe_coords.start_x, swipe_coords.start_y)
96119 self.addCleanup(self._maybe_release_finger)
97− self._drag(swipe_coords.start_x, swipe_coords.start_y, swipe_coords.start_x, swipe_coords.end_y)
120+ self._drag(
121+ swipe_coords.start_x,
122+ swipe_coords.start_y,
123+ swipe_coords.start_x,
124+ swipe_coords.end_y)
98125 self.assertThat(hud.shown, Eventually(Equals(False)))
99126 self.assertThat(hud_show_button.opacity, Eventually(Equals(1.0)))
100127 self.touch.release()
@@ -105,7 +132,11 @@ class TestHud(UnityTestCase, DragMixin):
105132 self.assertThat(hud.shown, Eventually(Equals(False)))
106133
107134 self.touch.press(swipe_coords.start_x, swipe_coords.start_y)
108− self._drag(swipe_coords.start_x, swipe_coords.start_y, swipe_coords.start_x, swipe_coords.end_y - int(hud_show_button.height))
135+ self._drag(
136+ swipe_coords.start_x,
137+ swipe_coords.start_y,
138+ swipe_coords.start_x,
139+ swipe_coords.end_y - int(hud_show_button.height))
109140 self.assertThat(hud.shown, Equals(False))
110141 self.assertThat(hud_show_button.opacity, Eventually(Equals(1.0)))
111142 self.touch.release()
tests/autopilot/unity8/shell/tests/test_emulators.py−3
@@ -32,8 +32,6 @@ try:
3232except ImportError:
3333 import mock
3434
35−from testtools.matchers import Contains, HasLength
36−
3735from unity8 import process_helpers
3836from unity8.shell import emulators, fixture_setup, tests
3937from unity8.shell.emulators import dash as dash_emulators
@@ -52,7 +50,6 @@ class MainWindowTestCase(tests.UnityTestCase):
5250 self.main_window.search('Test')
5351 text_field = self.main_window.get_dash()._get_search_text_field()
5452 self.assertEqual(text_field.text, 'Test')
55− self.assertEqual(text_field.state, 'idle')
5653
5754
5855class DashBaseTestCase(tests.UnityTestCase):
tests/autopilot/unity8/shell/tests/test_lock_screen.py+4−5
@@ -1,7 +1,7 @@
11# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
22#
33# Unity Autopilot Test Suite
4−# Copyright (C) 2012-2013 Canonical
4+# Copyright (C) 2012, 2013, 2014 Canonical
55#
66# This program is free software: you can redistribute it and/or modify
77# it under the terms of the GNU General Public License as published by
@@ -25,9 +25,7 @@ from unity8.shell import with_lightdm_mock
2525from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
2626
2727from autopilot.matchers import Eventually
28−from autopilot.platform import model
2928import sys
30−from testtools import skipUnless
3129from testtools.matchers import Equals
3230import logging
3331
@@ -133,7 +131,7 @@ class TestLockscreen(UnityTestCase):
133131 if not isinstance(code, basestring):
134132 raise TypeError(
135133 "'code' parameter must be a string, not %r."
136− % type(passphrase)
134+ % type(code)
137135 )
138136 for num in code:
139137 if not num.isdigit():
@@ -190,7 +188,8 @@ class TestLockscreen(UnityTestCase):
190188 current_text = prompt.text
191189 self.keyboard.type(character)
192190 try:
193− self.assertThat(prompt.text, Eventually(Equals(current_text + character)))
191+ self.assertThat(
192+ prompt.text, Eventually(Equals(current_text + character)))
194193 except AssertionError:
195194 if retries > 0:
196195 self._type_character(character, prompt, retries-1)
tests/autopilot/unity8/shell/tests/test_notifications.py+15−10
@@ -211,8 +211,8 @@ 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."""
214+ def test_modal_sd_without_greeter(self):
215+ """Snap-decision should block input to shell without greeter."""
216216 unity_proxy = self.launch_unity()
217217 unlock_unity(unity_proxy)
218218
@@ -238,7 +238,8 @@ class InteractiveNotificationBase(NotificationsBase):
238238 hints
239239 )
240240
241− # verify that we cannot reveal the launcher (no longer interact with the shell)
241+ # verify that we cannot reveal the launcher (no longer interact with
242+ # the shell)
242243 time.sleep(1)
243244 self.main_window.show_dash_swiping()
244245 launcher = self.main_window.get_launcher()
@@ -249,13 +250,14 @@ class InteractiveNotificationBase(NotificationsBase):
249250 get_notification = lambda: notify_list.wait_select_single(
250251 'Notification', objectName='notification1')
251252 notification = get_notification()
252− self._assert_notification(notification, summary, body, True, False, 1.0)
253+ self._assert_notification(
254+ notification, summary, body, True, False, 1.0)
253255 self.touch.tap_object(notification.select_single(objectName="button0"))
254256 self.assert_notification_action_id_was_called("action_accept")
255257
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()
258+ def test_modal_sd_with_greeter(self):
259+ """A snap-decision should not block input to the greeter beneath it."""
260+ self.launch_unity()
259261
260262 summary = "Incoming file"
261263 body = "Frank would like to send you the file: essay.pdf"
@@ -290,7 +292,8 @@ class InteractiveNotificationBase(NotificationsBase):
290292 get_notification = lambda: notify_list.wait_select_single(
291293 'Notification', objectName='notification1')
292294 notification = get_notification()
293− self._assert_notification(notification, summary, body, True, False, 1.0)
295+ self._assert_notification(
296+ notification, summary, body, True, False, 1.0)
294297 self.touch.tap_object(notification.select_single(objectName="button0"))
295298 self.assert_notification_action_id_was_called("action_accept")
296299
@@ -663,7 +666,8 @@ class EphemeralNotificationsTests(NotificationsBase):
663666 icon_path = self._get_icon_path('avatars/amanda.png')
664667 notification.update(summary, body, icon_path)
665668 notification.show()
666− self._assert_notification(get_notification(), summary, body, True, False, 1.0)
669+ self._assert_notification(
670+ get_notification(), summary, body, True, False, 1.0)
667671
668672 def test_update_notification_layout_change(self):
669673 """Notification must allow updating its contents and layout while
@@ -710,7 +714,8 @@ class EphemeralNotificationsTests(NotificationsBase):
710714 notification.show()
711715
712716 self.assertThat(get_notification, Eventually(NotEquals(None)))
713− self._assert_notification(get_notification(), summary, body, False, False, 1.0)
717+ self._assert_notification(
718+ get_notification(), summary, body, False, False, 1.0)
714719
715720 def test_append_hint(self):
716721 """Notification has to accumulate body-text using append-hint."""
tests/autopilot/unity8/shell/tests/test_system_integration.py+10−5
@@ -23,19 +23,24 @@ import subprocess
2323import unittest
2424
2525from autopilot import platform
26−from unity8.shell.emulators import UnityEmulatorBase
2726from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
2827
29−from testtools.matchers._basic import Equals
3028
3129class SystemIntegrationTests(UnityTestCase):
3230
3331 scenarios = _get_device_emulation_scenarios()
3432
35− @unittest.skipIf(platform.model() == "Desktop", "Test is broken on otto, see bug 1281634.")
33+ @unittest.skipIf(
34+ platform.model() == "Desktop",
35+ "Test is broken on otto, see bug 1281634.")
3636 def test_networkmanager_integration(self):
3737 self.launch_unity()
3838
3939 # invoke policykit to check permissions
40− pid = subprocess.check_output(["pidof", "-s", "unity8"], universal_newlines=True)
41− subprocess.check_call("pkcheck --action-id org.freedesktop.NetworkManager.enable-disable-network --process " + pid, shell=True)
40+ pid = subprocess.check_output(
41+ ["pidof", "-s", "unity8"], universal_newlines=True)
42+ subprocess.check_call(
43+ "pkcheck --action-id "
44+ "org.freedesktop.NetworkManager.enable-disable-network "
45+ "--process " + pid,
46+ shell=True)
tests/autopilot/unity8/shell/tests/test_upstart.py+20−11
@@ -1,7 +1,7 @@
11# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
22#
33# Unity Autopilot Test Suite
4−# Copyright (C) 2013 Canonical
4+# Copyright (C) 2013, 2014 Canonical
55#
66# This program is free software: you can redistribute it and/or modify
77# it under the terms of the GNU General Public License as published by
@@ -42,19 +42,24 @@ import sys
4242if sys.version_info < (3,):
4343 range = xrange
4444
45+
4546class UpstartIntegrationTests(UnityTestCase):
4647
4748 scenarios = _get_device_emulation_scenarios()
4849
4950 def _get_status(self):
50− pid, status = os.waitpid(self.process.pid, os.WUNTRACED | os.WCONTINUED | os.WNOHANG)
51− logger.debug("Got status: {0}; stopped: {1}; continued: {2}"\
52− .format(status, os.WIFSTOPPED(status), os.WIFCONTINUED(status)))
51+ pid, status = os.waitpid(
52+ self.process.pid, os.WUNTRACED | os.WCONTINUED | os.WNOHANG)
53+ logger.debug(
54+ "Got status: {0}; stopped: {1}; continued: {2}".format(
55+ status, os.WIFSTOPPED(status), os.WIFCONTINUED(status)))
5356 return status
5457
5558 def _launch_unity(self):
5659 self.patch_environment("QT_LOAD_TESTABILITY", "1")
57− self.process = subprocess.Popen([get_binary_path()] + self.unity_geometry_args)
60+ self.process = subprocess.Popen(
61+ [get_binary_path()] + self.unity_geometry_args)
62+
5863 def ensure_stopped():
5964 self.process.terminate()
6065 for i in range(10):
@@ -76,10 +81,10 @@ class UpstartIntegrationTests(UnityTestCase):
7681 self.addCleanup(ensure_stopped)
7782
7883 def _set_proxy(self):
79− super(UpstartIntegrationTests, self)._set_proxy(get_proxy_object_for_existing_process(
80− pid=self.process.pid,
81− emulator_base=UnityEmulatorBase,
82− ))
84+ super(UpstartIntegrationTests, self)._set_proxy(
85+ get_proxy_object_for_existing_process(
86+ pid=self.process.pid,
87+ emulator_base=UnityEmulatorBase,))
8388
8489 def test_no_sigstop(self):
8590 self.patch_environment("UNITY_MIR_EMITS_SIGSTOP", "")
@@ -93,10 +98,14 @@ class UpstartIntegrationTests(UnityTestCase):
9398 def test_expect_sigstop(self):
9499 self.patch_environment("UNITY_MIR_EMITS_SIGSTOP", "1")
95100 self._launch_unity()
96− self.assertThat(lambda: os.WIFSTOPPED(self._get_status()), Eventually(Equals(True)), "Unity8 should raise SIGSTOP when ready")
101+ self.assertThat(
102+ lambda: os.WIFSTOPPED(self._get_status()),
103+ Eventually(Equals(True)), "Unity8 should raise SIGSTOP when ready")
97104
98105 self.process.send_signal(signal.SIGCONT)
99− self.assertThat(lambda: os.WIFCONTINUED(self._get_status()), Eventually(Equals(True)), "Unity8 should have resumed")
106+ self.assertThat(
107+ lambda: os.WIFCONTINUED(self._get_status()),
108+ Eventually(Equals(True)), "Unity8 should have resumed")
100109
101110 logger.debug("Unity started, waiting for it to be ready.")
102111 self._set_proxy()
tests/mocks/AccountsService/AccountsService.qmltypesnew file+22
@@ -0,0 +1,22 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable AccountsService 0.1 tests/mocks'
8+
9+Module {
10+ Component {
11+ name: "AccountsService"
12+ prototype: "QObject"
13+ exports: ["AccountsService/AccountsService 0.1"]
14+ isCreatable: false
15+ isSingleton: true
16+ exportMetaObjectRevisions: [0]
17+ Property { name: "user"; type: "string" }
18+ Property { name: "demoEdges"; type: "bool" }
19+ Property { name: "backgroundFile"; type: "string" }
20+ Property { name: "statsWelcomeScreen"; type: "bool" }
21+ }
22+}
tests/mocks/GSettings.1.0/GSettings.qmltypesnew file+42
@@ -0,0 +1,42 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable GSettings 1.0 tests/mocks'
8+
9+Module {
10+ Component {
11+ name: "GSettingsControllerQml"
12+ prototype: "QObject"
13+ exports: ["GSettings/GSettingsController 1.0"]
14+ isCreatable: false
15+ isSingleton: true
16+ exportMetaObjectRevisions: [0]
17+ Method {
18+ name: "setPictureUri"
19+ Parameter { name: "str"; type: "string" }
20+ }
21+ }
22+ Component {
23+ name: "GSettingsQml"
24+ prototype: "QObject"
25+ exports: ["GSettings/GSettings 1.0"]
26+ exportMetaObjectRevisions: [0]
27+ Property { name: "schema"; type: "GSettingsSchemaQml"; isReadonly: true; isPointer: true }
28+ Property { name: "pictureUri"; type: "string" }
29+ Signal {
30+ name: "pictureUriChanged"
31+ Parameter { type: "string" }
32+ }
33+ }
34+ Component {
35+ name: "GSettingsSchemaQml"
36+ prototype: "QObject"
37+ exports: ["GSettings/GSettingsSchema 1.0"]
38+ isCreatable: false
39+ exportMetaObjectRevisions: [0]
40+ Property { name: "id"; type: "QByteArray" }
41+ }
42+}
tests/mocks/HudClient/HudClient.qmltypesnew file+113
@@ -0,0 +1,113 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable HudClient 0.1 tests/mocks'
8+
9+Module {
10+ Component {
11+ name: "DeeListModel"
12+ prototype: "QAbstractListModel"
13+ Property { name: "name"; type: "string" }
14+ Property { name: "synchronized"; type: "bool"; isReadonly: true }
15+ Property { name: "count"; type: "int"; isReadonly: true }
16+ Signal {
17+ name: "nameChanged"
18+ Parameter { type: "string" }
19+ }
20+ Signal {
21+ name: "synchronizedChanged"
22+ Parameter { type: "bool" }
23+ }
24+ Signal {
25+ name: "roleNamesChanged"
26+ Parameter { type: "QHash<int,QByteArray>" }
27+ }
28+ Method {
29+ name: "get"
30+ type: "QVariantMap"
31+ Parameter { name: "row"; type: "int" }
32+ }
33+ Method { name: "count"; type: "int" }
34+ }
35+ Component {
36+ name: "HudClient"
37+ prototype: "QObject"
38+ exports: ["HudClient/HudClient 0.1"]
39+ exportMetaObjectRevisions: [0]
40+ Property { name: "results"; type: "DeeListModel"; isReadonly: true; isPointer: true }
41+ Property { name: "toolBarModel"; type: "QAbstractItemModel"; isReadonly: true; isPointer: true }
42+ Signal { name: "voiceQueryLoading" }
43+ Signal { name: "voiceQueryListening" }
44+ Signal { name: "voiceQueryHeardSomething" }
45+ Signal { name: "voiceQueryFailed" }
46+ Signal {
47+ name: "voiceQueryFinished"
48+ Parameter { name: "query"; type: "string" }
49+ }
50+ Signal { name: "commandExecuted" }
51+ Signal {
52+ name: "showParametrizedAction"
53+ Parameter { name: "action"; type: "string" }
54+ Parameter { name: "items"; type: "QVariant" }
55+ }
56+ Method {
57+ name: "executeCommand"
58+ Parameter { name: "index"; type: "int" }
59+ }
60+ Method {
61+ name: "setQuery"
62+ Parameter { name: "new_query"; type: "string" }
63+ }
64+ Method { name: "startVoiceQuery" }
65+ Method {
66+ name: "executeParametrizedAction"
67+ Parameter { name: "values"; type: "QVariant" }
68+ }
69+ Method {
70+ name: "updateParametrizedAction"
71+ Parameter { name: "values"; type: "QVariant" }
72+ }
73+ Method { name: "cancelParametrizedAction" }
74+ Method {
75+ name: "executeToolBarAction"
76+ Parameter { name: "action"; type: "HudClientQueryToolbarItems" }
77+ }
78+ }
79+ Component {
80+ name: "HudClientStub"
81+ prototype: "QObject"
82+ exports: ["HudClient/HudClientStub 0.1"]
83+ exportMetaObjectRevisions: [0]
84+ Property { name: "lastExecutedToolbarItem"; type: "int"; isReadonly: true }
85+ Property { name: "lastSetQuery"; type: "string"; isReadonly: true }
86+ Property { name: "lastExecutedCommandRow"; type: "int"; isReadonly: true }
87+ Property { name: "lastExecutedParametrizedCommandRow"; type: "int"; isReadonly: true }
88+ Property { name: "lastParametrizedCommandCommited"; type: "bool"; isReadonly: true }
89+ Property { name: "activatedActions"; type: "QVariantMap"; isReadonly: true }
90+ Method { name: "reset" }
91+ Method { name: "fullScreenToolbarItemValue"; type: "int" }
92+ Method { name: "helpToolbarItemValue"; type: "int" }
93+ Method { name: "preferencesToolbarItemValue"; type: "int" }
94+ Method { name: "undoToolbarItemValue"; type: "int" }
95+ Method {
96+ name: "setHelpToolbarItemEnabled"
97+ Parameter { name: "enabled"; type: "bool" }
98+ }
99+ }
100+ Component { name: "HudToolBarModel"; prototype: "QAbstractListModel" }
101+ Component {
102+ name: "VolumePeakDetector"
103+ prototype: "QObject"
104+ exports: ["HudClient/VolumePeakDetector 0.1"]
105+ exportMetaObjectRevisions: [0]
106+ Property { name: "enabled"; type: "bool" }
107+ Property { name: "desiredInterval"; type: "int" }
108+ Signal {
109+ name: "newPeak"
110+ Parameter { name: "volume"; type: "float" }
111+ }
112+ }
113+}
tests/mocks/LightDM/LightDM.qmltypesnew file+241
@@ -0,0 +1,241 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable LightDM 0.1 tests/mocks'
8+
9+Module {
10+ Component {
11+ name: "Greeter"
12+ prototype: "QObject"
13+ exports: ["LightDM/Greeter 0.1"]
14+ isCreatable: false
15+ isSingleton: true
16+ exportMetaObjectRevisions: [0]
17+ Property { name: "authenticated"; type: "bool"; isReadonly: true }
18+ Property { name: "authenticationUser"; type: "string"; isReadonly: true }
19+ Property { name: "promptless"; type: "bool"; isReadonly: true }
20+ Signal {
21+ name: "showMessage"
22+ Parameter { name: "text"; type: "string" }
23+ Parameter { name: "isError"; type: "bool" }
24+ }
25+ Signal {
26+ name: "showPrompt"
27+ Parameter { name: "text"; type: "string" }
28+ Parameter { name: "isSecret"; type: "bool" }
29+ }
30+ Signal { name: "authenticationComplete" }
31+ Signal {
32+ name: "authenticationUserChanged"
33+ Parameter { name: "user"; type: "string" }
34+ }
35+ Signal {
36+ name: "requestAuthenticationUser"
37+ Parameter { name: "user"; type: "string" }
38+ }
39+ Method {
40+ name: "authenticate"
41+ Parameter { name: "username"; type: "string" }
42+ }
43+ Method { name: "authenticate" }
44+ Method {
45+ name: "respond"
46+ Parameter { name: "response"; type: "string" }
47+ }
48+ Method {
49+ name: "startSessionSync"
50+ type: "bool"
51+ Parameter { name: "session"; type: "string" }
52+ }
53+ Method { name: "startSessionSync"; type: "bool" }
54+ }
55+ Component {
56+ name: "QAbstractProxyModel"
57+ prototype: "QAbstractItemModel"
58+ Property { name: "sourceModel"; type: "QAbstractItemModel"; isPointer: true }
59+ }
60+ Component {
61+ name: "QLightDM::UsersModel"
62+ prototype: "QAbstractListModel"
63+ exports: ["LightDM/UserRoles 0.1"]
64+ isCreatable: false
65+ exportMetaObjectRevisions: [0]
66+ Enum {
67+ name: "UserModelRoles"
68+ values: {
69+ "NameRole": 256,
70+ "RealNameRole": 257,
71+ "LoggedInRole": 258,
72+ "BackgroundRole": 259,
73+ "SessionRole": 260,
74+ "HasMessagesRole": 261,
75+ "ImagePathRole": 262,
76+ "BackgroundPathRole": 263
77+ }
78+ }
79+ }
80+ Component {
81+ name: "QSortFilterProxyModel"
82+ prototype: "QAbstractProxyModel"
83+ Property { name: "filterRegExp"; type: "QRegExp" }
84+ Property { name: "filterKeyColumn"; type: "int" }
85+ Property { name: "dynamicSortFilter"; type: "bool" }
86+ Property { name: "filterCaseSensitivity"; type: "Qt::CaseSensitivity" }
87+ Property { name: "sortCaseSensitivity"; type: "Qt::CaseSensitivity" }
88+ Property { name: "isSortLocaleAware"; type: "bool" }
89+ Property { name: "sortRole"; type: "int" }
90+ Property { name: "filterRole"; type: "int" }
91+ Method {
92+ name: "setFilterRegExp"
93+ Parameter { name: "pattern"; type: "string" }
94+ }
95+ Method {
96+ name: "setFilterWildcard"
97+ Parameter { name: "pattern"; type: "string" }
98+ }
99+ Method {
100+ name: "setFilterFixedString"
101+ Parameter { name: "pattern"; type: "string" }
102+ }
103+ Method { name: "clear" }
104+ Method { name: "invalidate" }
105+ }
106+ Component {
107+ name: "QSortFilterProxyModelQML"
108+ prototype: "QSortFilterProxyModel"
109+ Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
110+ Property { name: "totalCount"; type: "int"; isReadonly: true }
111+ Property { name: "count"; type: "int"; isReadonly: true }
112+ Property { name: "invertMatch"; type: "bool" }
113+ Signal {
114+ name: "invertMatchChanged"
115+ Parameter { type: "bool" }
116+ }
117+ Method {
118+ name: "get"
119+ type: "QVariantMap"
120+ Parameter { name: "row"; type: "int" }
121+ }
122+ Method {
123+ name: "data"
124+ type: "QVariant"
125+ Parameter { name: "row"; type: "int" }
126+ Parameter { name: "role"; type: "int" }
127+ }
128+ Method { name: "count"; type: "int" }
129+ Method {
130+ name: "findFirst"
131+ type: "int"
132+ Parameter { name: "role"; type: "int" }
133+ Parameter { name: "value"; type: "QVariant" }
134+ }
135+ Method {
136+ name: "mapRowToSource"
137+ type: "int"
138+ Parameter { name: "row"; type: "int" }
139+ }
140+ Method {
141+ name: "mapFromSource"
142+ type: "int"
143+ Parameter { name: "row"; type: "int" }
144+ }
145+ Method {
146+ name: "mapToSource"
147+ type: "int"
148+ Parameter { name: "row"; type: "int" }
149+ }
150+ }
151+ Component {
152+ name: "UserMetricsOutput::ColorTheme"
153+ prototype: "QObject"
154+ Property { name: "start"; type: "QColor"; isReadonly: true }
155+ Property { name: "main"; type: "QColor"; isReadonly: true }
156+ Property { name: "end"; type: "QColor"; isReadonly: true }
157+ Signal {
158+ name: "startChanged"
159+ Parameter { name: "color"; type: "QColor" }
160+ }
161+ Signal {
162+ name: "mainChanged"
163+ Parameter { name: "color"; type: "QColor" }
164+ }
165+ Signal {
166+ name: "endChanged"
167+ Parameter { name: "color"; type: "QColor" }
168+ }
169+ }
170+ Component {
171+ name: "UserMetricsOutput::UserMetrics"
172+ prototype: "QObject"
173+ exports: ["LightDM/Infographic 0.1"]
174+ isCreatable: false
175+ isSingleton: true
176+ exportMetaObjectRevisions: [0]
177+ Property { name: "label"; type: "string"; isReadonly: true }
178+ Property { name: "username"; type: "string" }
179+ Property {
180+ name: "firstColor"
181+ type: "UserMetricsOutput::ColorTheme"
182+ isReadonly: true
183+ isPointer: true
184+ }
185+ Property {
186+ name: "secondColor"
187+ type: "UserMetricsOutput::ColorTheme"
188+ isReadonly: true
189+ isPointer: true
190+ }
191+ Property { name: "firstMonth"; type: "QAbstractItemModel"; isReadonly: true; isPointer: true }
192+ Property { name: "secondMonth"; type: "QAbstractItemModel"; isReadonly: true; isPointer: true }
193+ Property { name: "currentDay"; type: "int"; isReadonly: true }
194+ Signal {
195+ name: "labelChanged"
196+ Parameter { name: "label"; type: "string" }
197+ }
198+ Signal {
199+ name: "usernameChanged"
200+ Parameter { name: "username"; type: "string" }
201+ }
202+ Signal {
203+ name: "firstColorChanged"
204+ Parameter { name: "color"; type: "ColorTheme"; isPointer: true }
205+ }
206+ Signal {
207+ name: "firstMonthChanged"
208+ Parameter { name: "firstMonth"; type: "QAbstractItemModel"; isPointer: true }
209+ }
210+ Signal {
211+ name: "currentDayChanged"
212+ Parameter { name: "currentDay"; type: "int" }
213+ }
214+ Signal {
215+ name: "secondColorChanged"
216+ Parameter { name: "color"; type: "ColorTheme"; isPointer: true }
217+ }
218+ Signal {
219+ name: "secondMonthChanged"
220+ Parameter { name: "secondMonth"; type: "QAbstractItemModel"; isPointer: true }
221+ }
222+ Signal { name: "nextDataSource" }
223+ Signal { name: "readyForDataChange" }
224+ Signal { name: "dataAboutToAppear" }
225+ Signal { name: "dataAppeared" }
226+ Signal { name: "dataAboutToChange" }
227+ Signal { name: "dataChanged" }
228+ Signal { name: "dataAboutToDisappear" }
229+ Signal { name: "dataDisappeared" }
230+ Method { name: "nextDataSourceSlot" }
231+ Method { name: "readyForDataChangeSlot" }
232+ }
233+ Component {
234+ name: "UsersModel"
235+ prototype: "QSortFilterProxyModelQML"
236+ exports: ["LightDM/Users 0.1"]
237+ isCreatable: false
238+ isSingleton: true
239+ exportMetaObjectRevisions: [0]
240+ }
241+}
tests/mocks/Powerd/Powerd.qmltypesnew file+46
@@ -0,0 +1,46 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Powerd 0.1 tests/mocks'
8+
9+Module {
10+ Component {
11+ name: "Powerd"
12+ prototype: "QObject"
13+ exports: ["Powerd/Powerd 0.1"]
14+ isCreatable: false
15+ isSingleton: true
16+ exportMetaObjectRevisions: [0]
17+ Enum {
18+ name: "DisplayFlag"
19+ values: {
20+ "UseProximity": 1,
21+ "DisableAutoBrightness": 2,
22+ "Bright": 4
23+ }
24+ }
25+ Enum {
26+ name: "DisplayFlags"
27+ values: {
28+ "UseProximity": 1,
29+ "DisableAutoBrightness": 2,
30+ "Bright": 4
31+ }
32+ }
33+ Enum {
34+ name: "Status"
35+ values: {
36+ "Off": 0,
37+ "On": 1
38+ }
39+ }
40+ Signal {
41+ name: "displayPowerStateChange"
42+ Parameter { name: "status"; type: "int" }
43+ Parameter { name: "flags"; type: "uint" }
44+ }
45+ }
46+}
tests/mocks/QMenuModel/QDBusActionGroup.qml+60
@@ -18,10 +18,70 @@
1818 */
1919
2020import QtQuick 2.0
21+import Ubuntu.Settings.Menus 0.1 as Menus
2122
2223QtObject {
2324 property int busType
2425 property string busName
2526 property string objectPath
2627 function start() {}
28+ function action(actionName) {
29+ switch (actionName) {
30+ case "transfer-state.queued":
31+ return {
32+ 'valid': true,
33+ 'state': {
34+ 'state': Menus.TransferState.Queued,
35+ 'percent': 0.0
36+ }
37+ }
38+ case "transfer-state.running":
39+ return {
40+ 'valid': true,
41+ 'state': {
42+ 'state': Menus.TransferState.Running,
43+ 'seconds-left': 100,
44+ 'percent': 0.1
45+ }
46+ }
47+ case "transfer-state.paused":
48+ return {
49+ 'valid': true,
50+ 'state': {
51+ 'state': Menus.TransferState.Paused,
52+ 'seconds-left': 100,
53+ 'percent': 0.5
54+ }
55+ }
56+ case "transfer-state.cancelled":
57+ return {
58+ 'valid': true,
59+ 'state': {
60+ 'state': Menus.TransferState.Canceled,
61+ 'percent': 0.4
62+ }
63+ }
64+ case "transfer-state.finished": return {
65+ 'valid': true,
66+ 'state': {
67+ 'state': Menus.TransferState.Finished,
68+ 'seconds-left': 0,
69+ 'percent': 1.0
70+ }
71+ }
72+ case "transfer-state.error":
73+ return {
74+ 'valid': true,
75+ 'state': {
76+ 'state': Menus.TransferState.Error,
77+ 'seconds-left': 100,
78+ 'percent': 0.0
79+ }
80+ }
81+ default:
82+ break;
83+ }
84+
85+ return null;
86+ }
2787}
tests/mocks/QMenuModel/QMenuModel.qmltypesnew file+77
@@ -0,0 +1,77 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable QMenuModel 0.1 tests/mocks'
8+
9+Module {
10+ Component {
11+ name: "ActionStateParser"
12+ prototype: "QObject"
13+ exports: ["QMenuModel/ActionStateParser 0.1"]
14+ exportMetaObjectRevisions: [0]
15+ }
16+ Component {
17+ name: "UnityMenuModel"
18+ prototype: "QAbstractListModel"
19+ exports: ["QMenuModel/UnityMenuModel 0.1"]
20+ exportMetaObjectRevisions: [0]
21+ Property { name: "modelData"; type: "QVariant" }
22+ Property { name: "busName"; type: "QByteArray" }
23+ Property { name: "actions"; type: "QVariantMap" }
24+ Property { name: "menuObjectPath"; type: "QByteArray" }
25+ Property { name: "actionStateParser"; type: "ActionStateParser"; isPointer: true }
26+ Method {
27+ name: "insertRow"
28+ Parameter { name: "row"; type: "int" }
29+ Parameter { name: "data"; type: "QVariant" }
30+ }
31+ Method {
32+ name: "appendRow"
33+ Parameter { name: "data"; type: "QVariant" }
34+ }
35+ Method {
36+ name: "removeRow"
37+ Parameter { name: "row"; type: "int" }
38+ }
39+ Method {
40+ name: "submenu"
41+ type: "QObject*"
42+ Parameter { name: "position"; type: "int" }
43+ Parameter { name: "actionStateParser"; type: "QQmlComponent"; isPointer: true }
44+ }
45+ Method {
46+ name: "submenu"
47+ type: "QObject*"
48+ Parameter { name: "position"; type: "int" }
49+ }
50+ Method {
51+ name: "loadExtendedAttributes"
52+ type: "bool"
53+ Parameter { name: "position"; type: "int" }
54+ Parameter { name: "schema"; type: "QVariantMap" }
55+ }
56+ Method {
57+ name: "get"
58+ type: "QVariant"
59+ Parameter { name: "row"; type: "int" }
60+ Parameter { name: "role"; type: "QByteArray" }
61+ }
62+ Method {
63+ name: "activate"
64+ Parameter { name: "index"; type: "int" }
65+ Parameter { name: "parameter"; type: "QVariant" }
66+ }
67+ Method {
68+ name: "activate"
69+ Parameter { name: "index"; type: "int" }
70+ }
71+ Method {
72+ name: "changeState"
73+ Parameter { name: "index"; type: "int" }
74+ Parameter { name: "parameter"; type: "QVariant" }
75+ }
76+ }
77+}
tests/mocks/QtMultimedia/QtMultimedia.qmltypesnew file+52
@@ -0,0 +1,52 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable QtMultimedia 5.0 tests/mocks'
8+
9+Module {
10+ Component {
11+ name: "Audio"
12+ prototype: "QObject"
13+ exports: ["QtMultimedia/Audio 5.0"]
14+ exportMetaObjectRevisions: [0]
15+ Enum {
16+ name: "PlaybackState"
17+ values: {
18+ "PlayingState": 0,
19+ "PausedState": 1,
20+ "StoppedState": 2
21+ }
22+ }
23+ Property { name: "source"; type: "QUrl" }
24+ Property { name: "playbackState"; type: "PlaybackState"; isReadonly: true }
25+ Property { name: "position"; type: "int"; isReadonly: true }
26+ Property { name: "duration"; type: "int"; isReadonly: true }
27+ Property { name: "errorString"; type: "string"; isReadonly: true }
28+ Signal {
29+ name: "sourceChanged"
30+ Parameter { name: "source"; type: "QUrl" }
31+ }
32+ Signal {
33+ name: "playbackStateChanged"
34+ Parameter { name: "playbackState"; type: "PlaybackState" }
35+ }
36+ Signal {
37+ name: "positionChanged"
38+ Parameter { name: "position"; type: "int" }
39+ }
40+ Signal {
41+ name: "durationChanged"
42+ Parameter { name: "duration"; type: "int" }
43+ }
44+ Signal {
45+ name: "errorStringChanged"
46+ Parameter { name: "errorString"; type: "string" }
47+ }
48+ Method { name: "pause" }
49+ Method { name: "play" }
50+ Method { name: "stop" }
51+ }
52+}
tests/mocks/Ubuntu/CMakeLists.txt+2
@@ -1,2 +1,4 @@
11add_subdirectory(DownloadDaemonListener)
2+add_subdirectory(Payments)
3+add_subdirectory(Telephony)
24add_subdirectory(Thumbnailer)
tests/mocks/Ubuntu/DownloadDaemonListener/DownloadDaemonListener.qmltypesnew file+60
@@ -0,0 +1,60 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Ubuntu.DownloadDaemonListener 0.1 tests/mocks'
8+
9+Module {
10+ Component {
11+ name: "MockDownloadTracker"
12+ prototype: "QObject"
13+ exports: ["Ubuntu.DownloadDaemonListener/DownloadTracker 0.1"]
14+ exportMetaObjectRevisions: [0]
15+ Property { name: "service"; type: "string" }
16+ Property { name: "dbusPath"; type: "string" }
17+ Property { name: "serviceReady"; type: "bool"; isReadonly: true }
18+ Signal {
19+ name: "serviceChanged"
20+ Parameter { name: "service"; type: "string" }
21+ }
22+ Signal {
23+ name: "dbusPathChanged"
24+ Parameter { name: "dbusPath"; type: "string" }
25+ }
26+ Signal {
27+ name: "serviceReadyChanged"
28+ Parameter { name: "serviceReady"; type: "bool" }
29+ }
30+ Signal {
31+ name: "canceled"
32+ Parameter { name: "success"; type: "bool" }
33+ }
34+ Signal {
35+ name: "error"
36+ Parameter { name: "error"; type: "string" }
37+ }
38+ Signal {
39+ name: "finished"
40+ Parameter { name: "path"; type: "string" }
41+ }
42+ Signal {
43+ name: "paused"
44+ Parameter { name: "success"; type: "bool" }
45+ }
46+ Signal {
47+ name: "progress"
48+ Parameter { name: "received"; type: "qulonglong" }
49+ Parameter { name: "total"; type: "qulonglong" }
50+ }
51+ Signal {
52+ name: "resumed"
53+ Parameter { name: "success"; type: "bool" }
54+ }
55+ Signal {
56+ name: "started"
57+ Parameter { name: "success"; type: "bool" }
58+ }
59+ }
60+}
tests/mocks/Ubuntu/Payments/CMakeLists.txtnew file+10
@@ -0,0 +1,10 @@
1+set(FakeUbuntuPaymentsQml_SOURCES
2+ plugin.cpp
3+ MockPayments.cpp
4+ )
5+
6+add_library(FakeUbuntuPaymentsQml MODULE ${FakeUbuntuPaymentsQml_SOURCES})
7+
8+qt5_use_modules(FakeUbuntuPaymentsQml Qml Quick Core)
9+
10+add_unity8_mock(Ubuntu.Payments 0.1 Ubuntu/Payments TARGETS FakeUbuntuPaymentsQml)
tests/mocks/Ubuntu/Payments/MockPayments.cppnew file+89
@@ -0,0 +1,89 @@
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 "MockPayments.h"
18+
19+#include <QLocale>
20+
21+
22+MockPayments::MockPayments(QObject *parent)
23+ : QObject(parent)
24+{
25+}
26+
27+QString MockPayments::currency() const
28+{
29+ return m_currency;
30+}
31+
32+double MockPayments::price() const
33+{
34+ return m_price;
35+}
36+
37+QString MockPayments::storeItemId() const
38+{
39+ return m_store_item_id;
40+}
41+
42+QString MockPayments::formattedPrice() const
43+{
44+ QLocale locale;
45+ return locale.toCurrencyString(m_price, m_currency);
46+}
47+
48+void MockPayments::setCurrency(const QString &currency)
49+{
50+ if(m_currency != currency) {
51+ m_currency = currency;
52+ Q_EMIT currencyChanged(currency);
53+ Q_EMIT formattedPriceChanged(formattedPrice());
54+ }
55+}
56+
57+void MockPayments::setPrice(const double price)
58+{
59+ if(m_price != price) {
60+ m_price = price;
61+ Q_EMIT priceChanged(price);
62+ Q_EMIT formattedPriceChanged(formattedPrice());
63+ }
64+}
65+
66+void MockPayments::setStoreItemId(const QString &store_item_id)
67+{
68+ if (m_store_item_id != store_item_id) {
69+ m_store_item_id = store_item_id;
70+ Q_EMIT storeItemIdChanged(m_store_item_id);
71+ }
72+
73+ if (m_store_item_id.isEmpty()) {
74+ return;
75+ }
76+}
77+
78+void MockPayments::start()
79+{
80+ if (!m_store_item_id.isEmpty()) {
81+ if (m_store_item_id == "com.example.invalid") {
82+ Q_EMIT purchaseError("Purchase failed.");
83+ } else {
84+ Q_EMIT purchaseCompleted();
85+ }
86+ } else {
87+ Q_EMIT purchaseError("No item ID supplied.");
88+ }
89+}
tests/mocks/Ubuntu/Payments/MockPayments.hnew file+60
@@ -0,0 +1,60 @@
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+#ifndef MOCK_PAYMENTS_H
18+#define MOCK_PAYMENTS_H
19+
20+#include <QObject>
21+
22+
23+class MockPayments : public QObject
24+{
25+ Q_OBJECT
26+ Q_DISABLE_COPY(MockPayments)
27+ Q_PROPERTY(QString currency READ currency WRITE setCurrency NOTIFY currencyChanged)
28+ Q_PROPERTY(double price READ price WRITE setPrice NOTIFY priceChanged)
29+ Q_PROPERTY(QString storeItemId READ storeItemId WRITE setStoreItemId NOTIFY storeItemIdChanged)
30+ Q_PROPERTY(QString formattedPrice READ formattedPrice NOTIFY formattedPriceChanged)
31+
32+public:
33+ explicit MockPayments(QObject *parent = 0);
34+
35+ QString currency() const;
36+ double price() const;
37+ QString storeItemId() const;
38+ QString formattedPrice() const;
39+
40+ void setCurrency(const QString& currency);
41+ void setPrice(const double price);
42+ void setStoreItemId(const QString& store_item_id);
43+ Q_INVOKABLE void start();
44+
45+Q_SIGNALS:
46+ void currencyChanged(const QString& currency);
47+ void priceChanged(const double price);
48+ void storeItemIdChanged(const QString &store_item_id);
49+ void formattedPriceChanged(const QString &formatted_price);
50+
51+ void purchaseError(const QString &error);
52+ void purchaseCompleted();
53+
54+private:
55+ QString m_currency;
56+ double m_price;
57+ QString m_store_item_id;
58+};
59+
60+#endif // MOCK_PAYMENTS_H
tests/mocks/Ubuntu/Payments/Payments.qmltypesnew file+42
@@ -0,0 +1,42 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Ubuntu.Payments 0.1 tests/mocks'
8+
9+Module {
10+ Component {
11+ name: "MockPayments"
12+ prototype: "QObject"
13+ exports: ["Ubuntu.Payments/Payments 0.1"]
14+ exportMetaObjectRevisions: [0]
15+ Property { name: "currency"; type: "string" }
16+ Property { name: "price"; type: "double" }
17+ Property { name: "storeItemId"; type: "string" }
18+ Property { name: "formattedPrice"; type: "string"; isReadonly: true }
19+ Signal {
20+ name: "currencyChanged"
21+ Parameter { name: "currency"; type: "string" }
22+ }
23+ Signal {
24+ name: "priceChanged"
25+ Parameter { name: "price"; type: "double" }
26+ }
27+ Signal {
28+ name: "storeItemIdChanged"
29+ Parameter { name: "store_item_id"; type: "string" }
30+ }
31+ Signal {
32+ name: "formattedPriceChanged"
33+ Parameter { name: "formatted_price"; type: "string" }
34+ }
35+ Signal {
36+ name: "purchaseError"
37+ Parameter { name: "error"; type: "string" }
38+ }
39+ Signal { name: "purchaseCompleted" }
40+ Method { name: "start" }
41+ }
42+}
tests/mocks/Ubuntu/Payments/plugin.cppnew file+28
@@ -0,0 +1,28 @@
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 "plugin.h"
18+#include "MockPayments.h"
19+
20+#include <QtQml>
21+
22+
23+void BackendPlugin::registerTypes(const char *uri)
24+{
25+ Q_ASSERT(uri == QLatin1String("Ubuntu.Payments"));
26+
27+ qmlRegisterType<MockPayments>(uri, 0, 1, "Payments");
28+}
tests/mocks/Ubuntu/Payments/plugin.hnew file+31
@@ -0,0 +1,31 @@
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+#ifndef PAYMENTS_PLUGIN_H
18+#define PAYMENTS_PLUGIN_H
19+
20+#include <QQmlExtensionPlugin>
21+
22+class BackendPlugin : public QQmlExtensionPlugin
23+{
24+ Q_OBJECT
25+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26+
27+public:
28+ void registerTypes(const char *uri);
29+};
30+
31+#endif // PAYMENTS_PLUGIN_H
tests/mocks/Ubuntu/Payments/qmldirnew file+3
@@ -0,0 +1,3 @@
1+module Ubuntu.Payments
2+plugin FakeUbuntuPaymentsQml
3+typeinfo Payments.qmltypes
tests/mocks/Ubuntu/Telephony/CMakeLists.txtnew file+22
@@ -0,0 +1,22 @@
1+set(FakeUbuntuTelephonyQml_SOURCES
2+ plugin.cpp
3+ ContactWatcherData.cpp
4+ MockCallEntry.cpp
5+ MockCallManager.cpp
6+ MockContactWatcher.cpp
7+ MockTelepathyHelper.cpp
8+)
9+
10+add_library(FakeUbuntuTelephonyQml MODULE ${FakeUbuntuTelephonyQml_SOURCES})
11+
12+qt5_use_modules(FakeUbuntuTelephonyQml Core Quick)
13+
14+# copy files into build directory for shadow builds
15+add_custom_target(UbuntuTelephonyQmlDirFile ALL
16+ COMMAND cp "${CMAKE_CURRENT_SOURCE_DIR}/qmldir" ${CMAKE_CURRENT_BINARY_DIR}
17+ DEPENDS qmldir
18+)
19+
20+install(TARGETS FakeUbuntuTelephonyQml
21+ DESTINATION ${SHELL_INSTALL_QML}/mocks/Ubuntu/Telephony
22+ )
tests/mocks/Ubuntu/Telephony/ContactWatcherData.cppnew file+43
@@ -0,0 +1,43 @@
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+ * Authored by: Nick Dedekind <nick.dedekind@canonical.com
17+ */
18+
19+#include "ContactWatcherData.h"
20+
21+ContactWatcherData::ContactWatcherData(QObject *parent)
22+ : QObject(parent)
23+{
24+}
25+
26+ContactWatcherData *ContactWatcherData::instance()
27+{
28+ static ContactWatcherData* contactData = new ContactWatcherData();
29+ return contactData;
30+}
31+
32+QVariant ContactWatcherData::contactData() const
33+{
34+ return m_data;
35+}
36+
37+void ContactWatcherData::setContactData(const QVariant& contactData)
38+{
39+ if(m_data != contactData){
40+ m_data = contactData;
41+ Q_EMIT contactDataChanged();
42+ }
43+}
tests/mocks/Ubuntu/Telephony/ContactWatcherData.hnew file+46
@@ -0,0 +1,46 @@
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+ * Authored by: Nick Dedekind <nick.dedekind@canonical.com
17+ */
18+
19+#ifndef CONTACTWATCHERDATA_H
20+#define CONTACTWATCHERDATA_H
21+
22+#include <QObject>
23+#include <QVariant>
24+
25+class ContactWatcherData : public QObject
26+{
27+ Q_OBJECT
28+ Q_DISABLE_COPY(ContactWatcherData)
29+ Q_PROPERTY(QVariant contactData READ contactData WRITE setContactData NOTIFY contactDataChanged)
30+
31+public:
32+ ContactWatcherData(QObject *parent = 0);
33+
34+ static ContactWatcherData *instance();
35+
36+ QVariant contactData() const;
37+ void setContactData(const QVariant& contactData);
38+
39+Q_SIGNALS:
40+ void contactDataChanged();
41+
42+private:
43+ QVariant m_data;
44+};
45+
46+#endif // CONTACTWATCHERDATA_H
tests/mocks/Ubuntu/Telephony/MockCallEntry.cppnew file+66
@@ -0,0 +1,66 @@
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+ * Authored by: Nick Dedekind <nick.dedekind@canonical.com
17+ */
18+
19+#include "MockCallEntry.h"
20+
21+MockCallEntry::MockCallEntry(QObject *parent)
22+ : QObject(parent)
23+ , m_conference(false)
24+ , m_elapsed(0)
25+{
26+ startTimer(1000);
27+}
28+
29+QString MockCallEntry::phoneNumber() const
30+{
31+ return m_phoneNumber;
32+}
33+
34+void MockCallEntry::setPhoneNumber(const QString& phoneNumber)
35+{
36+ if(m_phoneNumber != phoneNumber){
37+ m_phoneNumber = phoneNumber;
38+ Q_EMIT phoneNumberChanged();
39+ }
40+}
41+
42+bool MockCallEntry::isConference() const
43+{
44+ return m_conference;
45+}
46+
47+void MockCallEntry::setIsConference(bool isConference)
48+{
49+ if(m_conference != isConference){
50+ m_conference = isConference;
51+ Q_EMIT isConferenceChanged();
52+ }
53+}
54+
55+int MockCallEntry::elapsedTime() const
56+{
57+ return m_elapsed;
58+}
59+
60+void MockCallEntry::timerEvent(QTimerEvent * event)
61+{
62+ Q_UNUSED(event);
63+
64+ m_elapsed++;
65+ Q_EMIT elapsedTimeChanged();
66+}
tests/mocks/Ubuntu/Telephony/MockCallEntry.hnew file+57
@@ -0,0 +1,57 @@
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+ * Authored by: Nick Dedekind <nick.dedekind@canonical.com
17+ */
18+
19+#ifndef MOCKCALLENTRY_H
20+#define MOCKCALLENTRY_H
21+
22+#include <QObject>
23+
24+class MockCallEntry : public QObject
25+{
26+ Q_OBJECT
27+ Q_DISABLE_COPY(MockCallEntry)
28+
29+ Q_PROPERTY(QString phoneNumber READ phoneNumber WRITE setPhoneNumber NOTIFY phoneNumberChanged)
30+ Q_PROPERTY(bool isConference READ isConference WRITE setIsConference NOTIFY isConferenceChanged)
31+ Q_PROPERTY(int elapsedTime READ elapsedTime NOTIFY elapsedTimeChanged)
32+
33+public:
34+ MockCallEntry(QObject *parent = 0);
35+
36+ QString phoneNumber() const;
37+ bool isConference() const;
38+ int elapsedTime() const;
39+
40+ void setPhoneNumber(const QString& phoneNumber);
41+ void setIsConference(bool isConference);
42+
43+Q_SIGNALS:
44+ void phoneNumberChanged();
45+ void isConferenceChanged();
46+ void elapsedTimeChanged();
47+
48+protected:
49+ void timerEvent(QTimerEvent * event);
50+
51+private:
52+ QString m_phoneNumber;
53+ bool m_conference;
54+ int m_elapsed;
55+};
56+
57+#endif // MOCKCALLENTRY_H
tests/mocks/Ubuntu/Telephony/MockCallManager.cppnew file+80
@@ -0,0 +1,80 @@
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+ * Authored by: Nick Dedekind <nick.dedekind@canonical.com
17+ */
18+
19+#include "MockCallManager.h"
20+
21+MockCallManager::MockCallManager(QObject *parent)
22+ : QObject(parent)
23+ , m_foregroundCall(nullptr)
24+ , m_backgroundCall(nullptr)
25+ , m_callIndicatorVisible(false)
26+{
27+}
28+
29+MockCallManager *MockCallManager::instance()
30+{
31+ static MockCallManager* manager = new MockCallManager();
32+ return manager;
33+}
34+
35+QObject* MockCallManager::foregroundCall() const
36+{
37+ return m_foregroundCall;
38+}
39+
40+void MockCallManager::setForegroundCall(QObject* foregroundCall)
41+{
42+ if(m_foregroundCall != foregroundCall){
43+ m_foregroundCall = foregroundCall;
44+ Q_EMIT foregroundCallChanged();
45+ Q_EMIT hasCallsChanged();
46+ }
47+}
48+
49+QObject* MockCallManager::backgroundCall() const
50+{
51+ return m_backgroundCall;
52+}
53+
54+void MockCallManager::setBackgroundCall(QObject* backgroundCall)
55+{
56+ if(m_backgroundCall != backgroundCall){
57+ m_backgroundCall = backgroundCall;
58+ Q_EMIT backgroundCallChanged();
59+ Q_EMIT hasCallsChanged();
60+ }
61+}
62+
63+bool MockCallManager::hasCalls() const
64+{
65+ return m_foregroundCall || m_backgroundCall;
66+}
67+
68+
69+bool MockCallManager::callIndicatorVisible() const
70+{
71+ return m_callIndicatorVisible;
72+}
73+
74+void MockCallManager::setCallIndicatorVisible(bool callIndicatorVisible)
75+{
76+ if(m_callIndicatorVisible != callIndicatorVisible){
77+ m_callIndicatorVisible = callIndicatorVisible;
78+ Q_EMIT callIndicatorVisibleChanged();
79+ }
80+}
tests/mocks/Ubuntu/Telephony/MockCallManager.hnew file+60
@@ -0,0 +1,60 @@
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+ * Authored by: Nick Dedekind <nick.dedekind@canonical.com
17+ */
18+
19+#ifndef MOCKCALLMANAGER_H
20+#define MOCKCALLMANAGER_H
21+
22+#include <QObject>
23+
24+class MockCallManager : public QObject
25+{
26+ Q_OBJECT
27+ Q_DISABLE_COPY(MockCallManager)
28+
29+ Q_PROPERTY(QObject *foregroundCall READ foregroundCall WRITE setForegroundCall NOTIFY foregroundCallChanged)
30+ Q_PROPERTY(QObject *backgroundCall READ backgroundCall WRITE setBackgroundCall NOTIFY backgroundCallChanged)
31+ Q_PROPERTY(bool hasCalls READ hasCalls NOTIFY hasCallsChanged)
32+ Q_PROPERTY(bool callIndicatorVisible READ callIndicatorVisible WRITE setCallIndicatorVisible NOTIFY callIndicatorVisibleChanged)
33+
34+public:
35+ explicit MockCallManager(QObject *parent = 0);
36+
37+ static MockCallManager *instance();
38+
39+ QObject* foregroundCall() const;
40+ QObject* backgroundCall() const;
41+ bool hasCalls() const;
42+ bool callIndicatorVisible() const;
43+
44+ void setForegroundCall(QObject* foregroundCall);
45+ void setBackgroundCall(QObject* backgroundCall);
46+ void setCallIndicatorVisible(bool callIndicatorVisible);
47+
48+Q_SIGNALS:
49+ void foregroundCallChanged();
50+ void backgroundCallChanged();
51+ void hasCallsChanged();
52+ void callIndicatorVisibleChanged();
53+
54+private:
55+ QObject* m_foregroundCall;
56+ QObject* m_backgroundCall;
57+ bool m_callIndicatorVisible;
58+};
59+
60+#endif // MOCKCALLMANAGER_H
tests/mocks/Ubuntu/Telephony/MockContactWatcher.cppnew file+50
@@ -0,0 +1,50 @@
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+ * Authored by: Nick Dedekind <nick.dedekind@canonical.com
17+ */
18+
19+#include "MockContactWatcher.h"
20+#include "ContactWatcherData.h"
21+
22+MockContactWatcher::MockContactWatcher(QObject *parent)
23+ : QObject(parent)
24+{
25+ connect(ContactWatcherData::instance(), &ContactWatcherData::contactDataChanged,
26+ this, &MockContactWatcher::aliasChanged);
27+}
28+
29+QString MockContactWatcher::phoneNumber() const
30+{
31+ return m_phoneNumber;
32+}
33+
34+void MockContactWatcher::setPhoneNumber(const QString& phoneNumber)
35+{
36+ if(m_phoneNumber != phoneNumber){
37+ m_phoneNumber = phoneNumber;
38+ Q_EMIT phoneNumberChanged();
39+ Q_EMIT aliasChanged();
40+ }
41+}
42+
43+QString MockContactWatcher::alias() const
44+{
45+ QVariantMap data = ContactWatcherData::instance()->contactData().toMap();
46+ if (data.contains(m_phoneNumber)) {
47+ return data[m_phoneNumber].toMap()["alias"].toString();
48+ }
49+ return "";
50+}
tests/mocks/Ubuntu/Telephony/MockContactWatcher.hnew file+49
@@ -0,0 +1,49 @@
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+ * Authored by: Nick Dedekind <nick.dedekind@canonical.com
17+ */
18+
19+#ifndef MOCKCONTACTWATCHER_H
20+#define MOCKCONTACTWATCHER_H
21+
22+#include <QObject>
23+#include <QVariant>
24+
25+class MockContactWatcher : public QObject
26+{
27+ Q_OBJECT
28+ Q_DISABLE_COPY(MockContactWatcher)
29+
30+ Q_PROPERTY(QString phoneNumber READ phoneNumber WRITE setPhoneNumber NOTIFY phoneNumberChanged)
31+ Q_PROPERTY(QString alias READ alias NOTIFY aliasChanged)
32+
33+public:
34+ MockContactWatcher(QObject *parent = 0);
35+
36+ QString phoneNumber() const;
37+ QString alias() const;
38+
39+ void setPhoneNumber(const QString& phoneNumber);
40+
41+Q_SIGNALS:
42+ void phoneNumberChanged();
43+ void aliasChanged();
44+
45+private:
46+ QString m_phoneNumber;
47+};
48+
49+#endif // MOCKCONTACTWATCHER_H
tests/mocks/Ubuntu/Telephony/MockTelepathyHelper.cppnew file+35
@@ -0,0 +1,35 @@
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+ * Authored by: Nick Dedekind <nick.dedekind@canonical.com
17+ */
18+
19+#include "MockTelepathyHelper.h"
20+
21+MockTelepathyHelper::MockTelepathyHelper(QObject *parent)
22+ : QObject(parent)
23+{
24+}
25+
26+MockTelepathyHelper *MockTelepathyHelper::instance()
27+{
28+ static MockTelepathyHelper* helper = new MockTelepathyHelper();
29+ return helper;
30+}
31+
32+void MockTelepathyHelper::registerChannelObserver(const QString& name)
33+{
34+ Q_UNUSED(name);
35+}
tests/mocks/Ubuntu/Telephony/MockTelepathyHelper.hnew file+36
@@ -0,0 +1,36 @@
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+ * Authored by: Nick Dedekind <nick.dedekind@canonical.com
17+ */
18+
19+#ifndef MOCKTELEPATHYHELPER_H
20+#define MOCKTELEPATHYHELPER_H
21+
22+#include <QObject>
23+
24+class MockTelepathyHelper : public QObject
25+{
26+ Q_OBJECT
27+ Q_DISABLE_COPY(MockTelepathyHelper)
28+public:
29+ MockTelepathyHelper(QObject *parent = 0);
30+
31+ static MockTelepathyHelper *instance();
32+
33+ Q_INVOKABLE void registerChannelObserver(const QString& name);
34+};
35+
36+#endif // MOCKCONTACTWATCHER_H
tests/mocks/Ubuntu/Telephony/plugin.cppnew file+52
@@ -0,0 +1,52 @@
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+ * Authored by: Nick Dedekind <nick.dedekind@canonical.com
17+ */
18+
19+#include "plugin.h"
20+#include "MockCallEntry.h"
21+#include "MockCallManager.h"
22+#include "MockContactWatcher.h"
23+#include "MockTelepathyHelper.h"
24+#include "ContactWatcherData.h"
25+
26+#include <QtQml/QQmlContext>
27+#include <QtQml/QQmlEngine>
28+#include <qqml.h>
29+
30+void FakeUbuntuTelephonyQmlPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
31+{
32+ Q_ASSERT(engine);
33+
34+ Q_UNUSED(uri);
35+
36+ mRootContext = engine->rootContext();
37+ Q_ASSERT(mRootContext);
38+
39+ mRootContext->setContextProperty("telepathyHelper", MockTelepathyHelper::instance());
40+ mRootContext->setContextProperty("callManager", MockCallManager::instance());
41+ mRootContext->setContextProperty("contactWactherData", ContactWatcherData::instance());
42+}
43+
44+void FakeUbuntuTelephonyQmlPlugin::registerTypes(const char *uri)
45+{
46+ // @uri Telephony
47+ qmlRegisterUncreatableType<MockTelepathyHelper>(uri, 0, 1, "TelepathyHelper", "This is a singleton helper class");
48+ qmlRegisterUncreatableType<MockCallManager>(uri, 0, 1, "CallManager", "This is a singleton manager class");
49+ qmlRegisterUncreatableType<ContactWatcherData>(uri, 0, 1, "ContactWatcherData", "This is a singleton data class");
50+ qmlRegisterType<MockCallEntry>(uri, 0, 1, "CallEntry");
51+ qmlRegisterType<MockContactWatcher>(uri, 0, 1, "ContactWatcher");
52+}
tests/mocks/Ubuntu/Telephony/plugin.hnew file+37
@@ -0,0 +1,37 @@
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+ * Authored by: Nick Dedekind <nick.dedekind@canonical.com
17+ */
18+
19+#ifndef PLUGIN_H
20+#define PLUGIN_H
21+
22+#include <QQmlContext>
23+#include <QQmlExtensionPlugin>
24+
25+class FakeUbuntuTelephonyQmlPlugin : public QQmlExtensionPlugin
26+{
27+ Q_OBJECT
28+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29+public:
30+ void initializeEngine(QQmlEngine *engine, const char *uri);
31+ void registerTypes(const char *uri);
32+
33+private:
34+ QQmlContext *mRootContext;
35+};
36+
37+#endif
tests/mocks/Ubuntu/Telephony/qmldirnew file+2
@@ -0,0 +1,2 @@
1+module Ubuntu.Telephony
2+plugin FakeUbuntuTelephonyQml
tests/mocks/Ubuntu/Thumbnailer/Thumbnailer.qmltypesnew file+17
@@ -0,0 +1,17 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Ubuntu.Thumbnailer 0.1 tests/mocks'
8+
9+Module {
10+ Component {
11+ name: "QQmlTypeNotAvailable"
12+ prototype: "QObject"
13+ exports: ["Ubuntu.Thumbnailer/__ThumbnailerIgnoreMe 0.1"]
14+ isCreatable: false
15+ exportMetaObjectRevisions: [0]
16+ }
17+}
tests/mocks/Unity/Application/Application.qmltypesnew file+313
@@ -0,0 +1,313 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Unity.Application 0.1 tests/mocks'
8+
9+Module {
10+ Component {
11+ name: "ApplicationImage"
12+ defaultProperty: "data"
13+ prototype: "QQuickItem"
14+ exports: ["Unity.Application/ApplicationImage 0.1"]
15+ exportMetaObjectRevisions: [0]
16+ Enum {
17+ name: "FillMode"
18+ values: {
19+ "Stretch": 0,
20+ "PreserveAspectCrop": 1
21+ }
22+ }
23+ Property { name: "source"; type: "ApplicationInfo"; isPointer: true }
24+ Property { name: "fillMode"; type: "FillMode" }
25+ Property { name: "ready"; type: "bool" }
26+ Method { name: "scheduleUpdate" }
27+ Method { name: "updateFromCache" }
28+ }
29+ Component {
30+ name: "ApplicationInfo"
31+ prototype: "unity::shell::application::ApplicationInfoInterface"
32+ exports: ["Unity.Application/ApplicationInfo 0.1"]
33+ exportMetaObjectRevisions: [0]
34+ Property { name: "fullscreen"; type: "bool" }
35+ Property { name: "stage"; type: "Stage" }
36+ Property { name: "imageQml"; type: "string" }
37+ Property { name: "windowQml"; type: "string" }
38+ Signal { name: "appIdChanged" }
39+ Signal { name: "nameChanged" }
40+ Signal { name: "commentChanged" }
41+ Signal { name: "iconChanged" }
42+ Signal { name: "stateChanged" }
43+ Signal { name: "focusedChanged" }
44+ Signal { name: "screenshotChanged" }
45+ }
46+ Component {
47+ name: "ApplicationManager"
48+ prototype: "unity::shell::application::ApplicationManagerInterface"
49+ exports: ["Unity.Application/ApplicationManager 0.1"]
50+ isCreatable: false
51+ isSingleton: true
52+ exportMetaObjectRevisions: [0]
53+ Enum {
54+ name: "Role"
55+ values: {
56+ "Dash": 0,
57+ "Default": 1,
58+ "Indicators": 2,
59+ "Notifications": 3,
60+ "Greeter": 4,
61+ "Launcher": 5,
62+ "OnScreenKeyboard": 6,
63+ "ShutdownDialog": 7
64+ }
65+ }
66+ Enum {
67+ name: "StageHint"
68+ values: {
69+ "MainStage": 0,
70+ "IntegrationStage": 1,
71+ "ShareStage": 2,
72+ "ContentPickingStage": 3,
73+ "SideStage": 4,
74+ "ConfigurationStage": 5
75+ }
76+ }
77+ Enum {
78+ name: "FormFactorHint"
79+ values: {
80+ "DesktopFormFactor": 0,
81+ "PhoneFormFactor": 1,
82+ "TabletFormFactor": 2
83+ }
84+ }
85+ Enum {
86+ name: "FavoriteApplication"
87+ values: {
88+ "CameraApplication": 0,
89+ "GalleryApplication": 1,
90+ "BrowserApplication": 2,
91+ "ShareApplication": 3,
92+ "PhoneApplication": 4,
93+ "DialerApplication": 5,
94+ "MessagingApplication": 6,
95+ "AddressbookApplication": 7
96+ }
97+ }
98+ Enum {
99+ name: "ExecFlags"
100+ values: {
101+ "NoFlag": 0,
102+ "ForceMainStage": 1
103+ }
104+ }
105+ Property { name: "keyboardHeight"; type: "int"; isReadonly: true }
106+ Property { name: "keyboardVisible"; type: "bool"; isReadonly: true }
107+ Property { name: "sideStageWidth"; type: "int"; isReadonly: true }
108+ Property { name: "stageHint"; type: "StageHint"; isReadonly: true }
109+ Property { name: "formFactorHint"; type: "FormFactorHint"; isReadonly: true }
110+ Property { name: "fake"; type: "bool"; isReadonly: true }
111+ Property { name: "rightMargin"; type: "int" }
112+ Signal {
113+ name: "focusRequested"
114+ Parameter { name: "favoriteApplication"; type: "FavoriteApplication" }
115+ }
116+ Signal {
117+ name: "focusRequested"
118+ Parameter { name: "appId"; type: "string" }
119+ }
120+ Method {
121+ name: "get"
122+ type: "ApplicationInfo*"
123+ Parameter { name: "index"; type: "int" }
124+ }
125+ Method {
126+ name: "findApplication"
127+ type: "ApplicationInfo*"
128+ Parameter { name: "appId"; type: "string" }
129+ }
130+ Method {
131+ name: "move"
132+ Parameter { name: "from"; type: "int" }
133+ Parameter { name: "to"; type: "int" }
134+ }
135+ Method {
136+ name: "requestFocusApplication"
137+ type: "bool"
138+ Parameter { name: "appId"; type: "string" }
139+ }
140+ Method {
141+ name: "focusApplication"
142+ type: "bool"
143+ Parameter { name: "appId"; type: "string" }
144+ }
145+ Method { name: "unfocusCurrentApplication" }
146+ Method {
147+ name: "startApplication"
148+ type: "ApplicationInfo*"
149+ Parameter { name: "appId"; type: "string" }
150+ Parameter { name: "arguments"; type: "QStringList" }
151+ }
152+ Method {
153+ name: "startApplication"
154+ type: "ApplicationInfo*"
155+ Parameter { name: "appId"; type: "string" }
156+ }
157+ Method {
158+ name: "startApplication"
159+ type: "ApplicationInfo*"
160+ Parameter { name: "appId"; type: "string" }
161+ Parameter { name: "flags"; type: "ExecFlags" }
162+ Parameter { name: "arguments"; type: "QStringList" }
163+ }
164+ Method {
165+ name: "startApplication"
166+ type: "ApplicationInfo*"
167+ Parameter { name: "appId"; type: "string" }
168+ Parameter { name: "flags"; type: "ExecFlags" }
169+ }
170+ Method {
171+ name: "stopApplication"
172+ type: "bool"
173+ Parameter { name: "appId"; type: "string" }
174+ }
175+ Method {
176+ name: "updateScreenshot"
177+ type: "bool"
178+ Parameter { name: "appId"; type: "string" }
179+ }
180+ Method { name: "availableApplications"; type: "QStringList" }
181+ }
182+ Component {
183+ name: "unity::shell::application::ApplicationInfoInterface"
184+ prototype: "QObject"
185+ exports: ["Unity.Application/ApplicationInfoInterface 0.1"]
186+ isCreatable: false
187+ exportMetaObjectRevisions: [0]
188+ Enum {
189+ name: "Stage"
190+ values: {
191+ "MainStage": 0,
192+ "SideStage": 1
193+ }
194+ }
195+ Enum {
196+ name: "State"
197+ values: {
198+ "Starting": 0,
199+ "Running": 1,
200+ "Suspended": 2,
201+ "Stopped": 3
202+ }
203+ }
204+ Property { name: "appId"; type: "string"; isReadonly: true }
205+ Property { name: "name"; type: "string"; isReadonly: true }
206+ Property { name: "comment"; type: "string"; isReadonly: true }
207+ Property { name: "icon"; type: "QUrl"; isReadonly: true }
208+ Property { name: "stage"; type: "Stage"; isReadonly: true }
209+ Property { name: "state"; type: "State"; isReadonly: true }
210+ Property { name: "focused"; type: "bool"; isReadonly: true }
211+ Property { name: "screenshot"; type: "QUrl"; isReadonly: true }
212+ Signal {
213+ name: "nameChanged"
214+ Parameter { name: "name"; type: "string" }
215+ }
216+ Signal {
217+ name: "commentChanged"
218+ Parameter { name: "comment"; type: "string" }
219+ }
220+ Signal {
221+ name: "iconChanged"
222+ Parameter { name: "icon"; type: "QUrl" }
223+ }
224+ Signal {
225+ name: "stageChanged"
226+ Parameter { name: "stage"; type: "Stage" }
227+ }
228+ Signal {
229+ name: "stateChanged"
230+ Parameter { name: "state"; type: "State" }
231+ }
232+ Signal {
233+ name: "focusedChanged"
234+ Parameter { name: "focused"; type: "bool" }
235+ }
236+ Signal {
237+ name: "screenshotChanged"
238+ Parameter { name: "screenshot"; type: "QUrl" }
239+ }
240+ }
241+ Component {
242+ name: "unity::shell::application::ApplicationManagerInterface"
243+ prototype: "QAbstractListModel"
244+ exports: ["Unity.Application/ApplicationManagerInterface 0.1"]
245+ isCreatable: false
246+ exportMetaObjectRevisions: [0]
247+ Enum {
248+ name: "Roles"
249+ values: {
250+ "RoleAppId": 256,
251+ "RoleName": 257,
252+ "RoleComment": 258,
253+ "RoleIcon": 259,
254+ "RoleStage": 260,
255+ "RoleState": 261,
256+ "RoleFocused": 262,
257+ "RoleScreenshot": 263
258+ }
259+ }
260+ Property { name: "count"; type: "int"; isReadonly: true }
261+ Property { name: "focusedApplicationId"; type: "string"; isReadonly: true }
262+ Property { name: "suspended"; type: "bool" }
263+ Signal {
264+ name: "focusRequested"
265+ Parameter { name: "appId"; type: "string" }
266+ }
267+ Signal {
268+ name: "applicationAdded"
269+ Parameter { name: "appId"; type: "string" }
270+ }
271+ Signal {
272+ name: "applicationRemoved"
273+ Parameter { name: "appId"; type: "string" }
274+ }
275+ Method {
276+ name: "get"
277+ type: "unity::shell::application::ApplicationInfoInterface*"
278+ Parameter { name: "index"; type: "int" }
279+ }
280+ Method {
281+ name: "findApplication"
282+ type: "unity::shell::application::ApplicationInfoInterface*"
283+ Parameter { name: "appId"; type: "string" }
284+ }
285+ Method {
286+ name: "requestFocusApplication"
287+ type: "bool"
288+ Parameter { name: "appId"; type: "string" }
289+ }
290+ Method {
291+ name: "focusApplication"
292+ type: "bool"
293+ Parameter { name: "appId"; type: "string" }
294+ }
295+ Method { name: "unfocusCurrentApplication" }
296+ Method {
297+ name: "startApplication"
298+ type: "unity::shell::application::ApplicationInfoInterface*"
299+ Parameter { name: "appId"; type: "string" }
300+ Parameter { name: "arguments"; type: "QStringList" }
301+ }
302+ Method {
303+ name: "stopApplication"
304+ type: "bool"
305+ Parameter { name: "appId"; type: "string" }
306+ }
307+ Method {
308+ name: "updateScreenshot"
309+ type: "bool"
310+ Parameter { name: "appId"; type: "string" }
311+ }
312+ }
313+}
tests/mocks/Unity/Application/CMakeLists.txt+2−1
@@ -22,4 +22,5 @@ add_unity8_mock(Unity.Application 0.1 Unity/Application PREFIX mocks TARGETS Fak
2222add_unity8_mock(Unity.Application 0.1 Unity/Application
2323 PREFIX nonmirplugins
2424 TARGETS NonMirUnityApplicationQml
25− BINARY_DIR ${CMAKE_BINARY_DIR}/nonmirplugins)
25+ BINARY_DIR ${CMAKE_BINARY_DIR}/nonmirplugins
26+ NO_TYPES)
tests/mocks/Unity/CMakeLists.txt+1−1
@@ -6,7 +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)
9+pkg_check_modules(SCOPES_API REQUIRED unity-shell-scopes=2)
1010
1111include_directories(
1212 ${CMAKE_CURRENT_BINARY_DIR}
tests/mocks/Unity/Indicators/IndicatorBase.qmldeleted−38
@@ -1,38 +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 Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import QMenuModel 0.1
22−
23−Item {
24− id: indicatorBase
25−
26− //const
27− property string busName
28− property string actionsObjectPath
29− property string menuObjectPath
30− property string rootMenuType: "com.canonical.indicator.root"
31− property string deviceMenuObjectPath: menuObjectPath
32−
33− property var menuModel: UnityMenuModel {}
34−
35− property RootActionState rootActionState: RootActionState {
36− onUpdated: indicatorBase.rootActionStateChanged()
37− }
38−}
tests/mocks/Unity/Indicators/Indicators.qmltypesnew file+210
@@ -0,0 +1,210 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Unity.Indicators 0.1 tests/mocks'
8+
9+Module {
10+ Component {
11+ name: "ActionState"
12+ prototype: "QObject"
13+ exports: ["Unity.Indicators/ActionState 0.1"]
14+ isCreatable: false
15+ exportMetaObjectRevisions: [0]
16+ Enum {
17+ name: "ActionStates"
18+ values: {
19+ "Label": 0,
20+ "IconSource": 1,
21+ "AccessableName": 2,
22+ "Visible": 3
23+ }
24+ }
25+ }
26+ Component {
27+ name: "FakeIndicatorsModel"
28+ prototype: "QAbstractListModel"
29+ exports: ["Unity.Indicators/FakeIndicatorsModel 0.1"]
30+ exportMetaObjectRevisions: [0]
31+ Property { name: "count"; type: "int"; isReadonly: true }
32+ Method {
33+ name: "load"
34+ Parameter { name: "profile"; type: "string" }
35+ }
36+ Method { name: "unload" }
37+ Method {
38+ name: "append"
39+ Parameter { name: "row"; type: "QVariantMap" }
40+ }
41+ Method {
42+ name: "data"
43+ type: "QVariant"
44+ Parameter { name: "row"; type: "int" }
45+ Parameter { name: "role"; type: "int" }
46+ }
47+ }
48+ Component {
49+ name: "FlatMenuProxyModelRole"
50+ prototype: "QObject"
51+ exports: ["Unity.Indicators/FlatMenuProxyModelRole 0.1"]
52+ isCreatable: false
53+ exportMetaObjectRevisions: [0]
54+ Enum {
55+ name: "Roles"
56+ values: {
57+ "Action": 1,
58+ "Label": 2,
59+ "Extra": 3,
60+ "Depth": 4,
61+ "hasSection": 5,
62+ "hasSubMenu": 6
63+ }
64+ }
65+ }
66+ Component {
67+ name: "IndicatorsModelRole"
68+ prototype: "QObject"
69+ exports: ["Unity.Indicators/IndicatorsModelRole 0.1"]
70+ isCreatable: false
71+ exportMetaObjectRevisions: [0]
72+ Enum {
73+ name: "Roles"
74+ values: {
75+ "Identifier": 0,
76+ "Position": 1,
77+ "WidgetSource": 2,
78+ "PageSource": 3,
79+ "IndicatorProperties": 4,
80+ "IsVisible": 5
81+ }
82+ }
83+ }
84+ Component {
85+ name: "MenuContentActivator"
86+ prototype: "QObject"
87+ exports: ["Unity.Indicators/MenuContentActivator 0.1"]
88+ exportMetaObjectRevisions: [0]
89+ Property { name: "baseIndex"; type: "int" }
90+ Property { name: "running"; type: "bool" }
91+ Property { name: "count"; type: "int" }
92+ Property { name: "content"; type: "MenuContentState"; isList: true; isReadonly: true }
93+ Signal {
94+ name: "baseIndexChanged"
95+ Parameter { name: "baseIndex"; type: "int" }
96+ }
97+ Signal {
98+ name: "deltaChanged"
99+ Parameter { name: "delta"; type: "int" }
100+ }
101+ Signal {
102+ name: "runningChanged"
103+ Parameter { name: "running"; type: "bool" }
104+ }
105+ Signal {
106+ name: "countChanged"
107+ Parameter { name: "count"; type: "int" }
108+ }
109+ Method { name: "restart" }
110+ Method { name: "stop" }
111+ Method { name: "clear" }
112+ Method {
113+ name: "isMenuContentActive"
114+ type: "bool"
115+ Parameter { name: "index"; type: "int" }
116+ }
117+ }
118+ Component {
119+ name: "MenuContentState"
120+ prototype: "QObject"
121+ exports: ["Unity.Indicators/MenuContentState 0.1"]
122+ isCreatable: false
123+ exportMetaObjectRevisions: [0]
124+ Property { name: "active"; type: "bool"; isReadonly: true }
125+ }
126+ Component {
127+ name: "NetworkActionState"
128+ prototype: "QObject"
129+ exports: ["Unity.Indicators/NetworkActionState 0.1"]
130+ isCreatable: false
131+ exportMetaObjectRevisions: [0]
132+ Enum {
133+ name: "NetworkActionStates"
134+ values: {
135+ "Connection": 1,
136+ "SignalStrength": 2
137+ }
138+ }
139+ }
140+ Component {
141+ name: "NetworkConnection"
142+ prototype: "QObject"
143+ exports: ["Unity.Indicators/NetworkConnection 0.1"]
144+ isCreatable: false
145+ exportMetaObjectRevisions: [0]
146+ Enum {
147+ name: "NetworkConnectionStates"
148+ values: {
149+ "Initial": 0,
150+ "Activating": 1,
151+ "Activated": 2,
152+ "Deactivating": 3
153+ }
154+ }
155+ }
156+ Component {
157+ name: "QAbstractProxyModel"
158+ prototype: "QAbstractItemModel"
159+ Property { name: "sourceModel"; type: "QAbstractItemModel"; isPointer: true }
160+ }
161+ Component { name: "QIdentityProxyModel"; prototype: "QAbstractProxyModel" }
162+ Component {
163+ name: "UnityMenuModelStack"
164+ prototype: "QObject"
165+ exports: ["Unity.Indicators/UnityMenuModelStack 0.1"]
166+ exportMetaObjectRevisions: [0]
167+ Property { name: "head"; type: "UnityMenuModel"; isPointer: true }
168+ Property { name: "tail"; type: "UnityMenuModel"; isReadonly: true; isPointer: true }
169+ Property { name: "count"; type: "int"; isReadonly: true }
170+ Signal {
171+ name: "headChanged"
172+ Parameter { name: "head"; type: "UnityMenuModel"; isPointer: true }
173+ }
174+ Signal {
175+ name: "tailChanged"
176+ Parameter { name: "tail"; type: "UnityMenuModel"; isPointer: true }
177+ }
178+ Signal {
179+ name: "countChanged"
180+ Parameter { name: "count"; type: "int" }
181+ }
182+ Method {
183+ name: "push"
184+ Parameter { name: "model"; type: "UnityMenuModel"; isPointer: true }
185+ Parameter { name: "menuIndex"; type: "int" }
186+ }
187+ Method { name: "pop"; type: "UnityMenuModel*" }
188+ }
189+ Component {
190+ name: "VisibleIndicatorsModel"
191+ prototype: "QIdentityProxyModel"
192+ exports: ["Unity.Indicators/VisibleIndicatorsModel 0.1"]
193+ exportMetaObjectRevisions: [0]
194+ Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
195+ Property { name: "visible"; type: "QVariantMap" }
196+ Signal { name: "totalCountChanged" }
197+ Method {
198+ name: "onBeginRowInserted"
199+ Parameter { type: "QModelIndex" }
200+ Parameter { name: "start"; type: "int" }
201+ Parameter { name: "end"; type: "int" }
202+ }
203+ Method {
204+ name: "onRowInserted"
205+ Parameter { type: "QModelIndex" }
206+ Parameter { name: "start"; type: "int" }
207+ Parameter { name: "end"; type: "int" }
208+ }
209+ }
210+}
tests/mocks/Unity/Indicators/fakeindicatorsmodel.cpp+1−1
@@ -31,7 +31,7 @@ FakeIndicatorsModel::FakeIndicatorsModel(QObject *parent)
3131/*! \internal */
3232FakeIndicatorsModel::~FakeIndicatorsModel()
3333{
34− unload();
34+ qDeleteAll(m_indicators);
3535}
3636
3737int FakeIndicatorsModel::count() const
tests/mocks/Unity/Indicators/qmldir−2
@@ -3,8 +3,6 @@ plugin IndicatorsFakeQml
33typeinfo Indicators.qmltypes
44
55CachedUnityMenuModel 0.1 CachedUnityMenuModel.qml
6−IndicatorBase 0.1 IndicatorBase.qml
76IndicatorsModel 0.1 IndicatorsModel.qml
87FakeMenuPage 0.1 FakeMenuPage.qml
9−MenuItemFactory 0.1 MenuItemFactory.qml
108RootActionState 0.1 RootActionState.qml
tests/mocks/Unity/Launcher/Launcher.qmltypesnew file+171
@@ -0,0 +1,171 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Unity.Launcher 0.1 tests/mocks'
8+
9+Module {
10+ Component {
11+ name: "MockLauncherItem"
12+ prototype: "unity::shell::launcher::LauncherItemInterface"
13+ exports: ["Unity.Launcher/LauncherItem 0.1"]
14+ isCreatable: false
15+ exportMetaObjectRevisions: [0]
16+ }
17+ Component {
18+ name: "MockLauncherModel"
19+ prototype: "unity::shell::launcher::LauncherModelInterface"
20+ exports: ["Unity.Launcher/LauncherModel 0.1"]
21+ isCreatable: false
22+ isSingleton: true
23+ exportMetaObjectRevisions: [0]
24+ Signal {
25+ name: "quickListTriggered"
26+ Parameter { name: "appId"; type: "string" }
27+ Parameter { name: "index"; type: "int" }
28+ }
29+ Method {
30+ name: "get"
31+ type: "unity::shell::launcher::LauncherItemInterface*"
32+ Parameter { name: "index"; type: "int" }
33+ }
34+ Method {
35+ name: "move"
36+ Parameter { name: "oldIndex"; type: "int" }
37+ Parameter { name: "newIndex"; type: "int" }
38+ }
39+ Method {
40+ name: "pin"
41+ Parameter { name: "appId"; type: "string" }
42+ Parameter { name: "index"; type: "int" }
43+ }
44+ Method {
45+ name: "pin"
46+ Parameter { name: "appId"; type: "string" }
47+ }
48+ Method {
49+ name: "requestRemove"
50+ Parameter { name: "appId"; type: "string" }
51+ }
52+ Method {
53+ name: "quickListActionInvoked"
54+ Parameter { name: "appId"; type: "string" }
55+ Parameter { name: "actionIndex"; type: "int" }
56+ }
57+ Method {
58+ name: "setUser"
59+ Parameter { name: "username"; type: "string" }
60+ }
61+ Method {
62+ name: "getUrlForAppId"
63+ type: "string"
64+ Parameter { name: "appId"; type: "string" }
65+ }
66+ }
67+ Component {
68+ name: "MockQuickListModel"
69+ prototype: "unity::shell::launcher::QuickListModelInterface"
70+ exports: ["Unity.Launcher/QuickListModel 0.1"]
71+ isCreatable: false
72+ exportMetaObjectRevisions: [0]
73+ }
74+ Component {
75+ name: "unity::shell::launcher::LauncherItemInterface"
76+ prototype: "QObject"
77+ exports: ["Unity.Launcher/LauncherItemInterface 0.1"]
78+ isCreatable: false
79+ exportMetaObjectRevisions: [0]
80+ Property { name: "appId"; type: "string"; isReadonly: true }
81+ Property { name: "name"; type: "string"; isReadonly: true }
82+ Property { name: "icon"; type: "string"; isReadonly: true }
83+ Property { name: "pinned"; type: "bool"; isReadonly: true }
84+ Property { name: "running"; type: "bool"; isReadonly: true }
85+ Property { name: "recent"; type: "bool"; isReadonly: true }
86+ Property { name: "progress"; type: "int"; isReadonly: true }
87+ Property { name: "count"; type: "int"; isReadonly: true }
88+ Property { name: "focused"; type: "bool"; isReadonly: true }
89+ Property {
90+ name: "quickList"
91+ type: "unity::shell::launcher::QuickListModelInterface"
92+ isReadonly: true
93+ isPointer: true
94+ }
95+ Signal {
96+ name: "pinnedChanged"
97+ Parameter { name: "pinned"; type: "bool" }
98+ }
99+ Signal {
100+ name: "runningChanged"
101+ Parameter { name: "running"; type: "bool" }
102+ }
103+ Signal {
104+ name: "recentChanged"
105+ Parameter { name: "running"; type: "bool" }
106+ }
107+ Signal {
108+ name: "progressChanged"
109+ Parameter { name: "progress"; type: "int" }
110+ }
111+ Signal {
112+ name: "countChanged"
113+ Parameter { name: "count"; type: "int" }
114+ }
115+ Signal {
116+ name: "focusedChanged"
117+ Parameter { name: "focused"; type: "bool" }
118+ }
119+ }
120+ Component {
121+ name: "unity::shell::launcher::LauncherModelInterface"
122+ prototype: "QAbstractListModel"
123+ exports: ["Unity.Launcher/LauncherModelInterface 0.1"]
124+ isCreatable: false
125+ exportMetaObjectRevisions: [0]
126+ Property {
127+ name: "applicationManager"
128+ type: "unity::shell::application::ApplicationManagerInterface"
129+ isPointer: true
130+ }
131+ Method {
132+ name: "move"
133+ Parameter { name: "oldIndex"; type: "int" }
134+ Parameter { name: "newIndex"; type: "int" }
135+ }
136+ Method {
137+ name: "get"
138+ type: "unity::shell::launcher::LauncherItemInterface*"
139+ Parameter { name: "index"; type: "int" }
140+ }
141+ Method {
142+ name: "pin"
143+ Parameter { name: "appId"; type: "string" }
144+ Parameter { name: "index"; type: "int" }
145+ }
146+ Method {
147+ name: "pin"
148+ Parameter { name: "appId"; type: "string" }
149+ }
150+ Method {
151+ name: "requestRemove"
152+ Parameter { name: "appId"; type: "string" }
153+ }
154+ Method {
155+ name: "quickListActionInvoked"
156+ Parameter { name: "appId"; type: "string" }
157+ Parameter { name: "actionIndex"; type: "int" }
158+ }
159+ Method {
160+ name: "setUser"
161+ Parameter { name: "username"; type: "string" }
162+ }
163+ }
164+ Component {
165+ name: "unity::shell::launcher::QuickListModelInterface"
166+ prototype: "QAbstractListModel"
167+ exports: ["Unity.Launcher/QuickListModelInterface 0.1"]
168+ isCreatable: false
169+ exportMetaObjectRevisions: [0]
170+ }
171+}
tests/mocks/Unity/Launcher/MockLauncherModel.cpp+6−1
@@ -24,10 +24,12 @@ MockLauncherModel::MockLauncherModel(QObject* parent): LauncherModelInterface(pa
2424{
2525 MockLauncherItem *item = new MockLauncherItem("dialer-app", "/usr/share/applications/dialer-app.desktop", "Dialer", "dialer-app", this);
2626 item->setProgress(0);
27− m_list.append(item);
27+ item->setPinned(true);
2828 item->setFocused(true);
29+ m_list.append(item);
2930 item = new MockLauncherItem("camera-app", "/usr/share/applications/camera-app.desktop", "Camera", "camera", this);
3031 item->setProgress(10);
32+ item->setPinned(true);
3133 m_list.append(item);
3234 item = new MockLauncherItem("gallery-app", "/usr/share/applications/gallery-app.desktop", "Gallery", "gallery", this);
3335 item->setProgress(50);
@@ -40,6 +42,7 @@ MockLauncherModel::MockLauncherModel(QObject* parent): LauncherModelInterface(pa
4042 m_list.append(item);
4143 item = new MockLauncherItem("twitter-webapp", "/usr/share/applications/twitter-webapp.desktop", "Twitter", "twitter", this);
4244 item->setCount(12);
45+ item->setPinned(true);
4346 m_list.append(item);
4447 item = new MockLauncherItem("gmail-webapp", "/usr/share/applications/gmail-webapp.desktop", "GMail", "gmail", this);
4548 item->setCount(123);
@@ -51,8 +54,10 @@ MockLauncherModel::MockLauncherModel(QObject* parent): LauncherModelInterface(pa
5154 item->setProgress(50);
5255 item->setCount(5);
5356 item->setFocused(true);
57+ item->setPinned(true);
5458 m_list.append(item);
5559 item = new MockLauncherItem("calendar-app", "/usr/share/applications/calendar-app.desktop","Calendar", "calendar", this);
60+ item->setPinned(true);
5661 m_list.append(item);
5762}
5863
tests/mocks/Unity/Notifications/Notifications.qmltypesnew file+10
@@ -0,0 +1,10 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Unity.Notifications 1.0 tests/mocks'
8+
9+Module {
10+}
tests/mocks/Unity/Unity.qmltypesnew file+345
@@ -0,0 +1,345 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Unity 0.2 tests/mocks'
8+
9+Module {
10+ Component {
11+ name: "Categories"
12+ prototype: "unity::shell::scopes::CategoriesInterface"
13+ Method {
14+ name: "addSpecialCategory"
15+ Parameter { name: "categoryId"; type: "string" }
16+ Parameter { name: "name"; type: "string" }
17+ Parameter { name: "icon"; type: "string" }
18+ Parameter { name: "rawTemplate"; type: "string" }
19+ Parameter { name: "countObject"; type: "QObject"; isPointer: true }
20+ }
21+ Method {
22+ name: "overrideCategoryJson"
23+ type: "bool"
24+ Parameter { name: "categoryId"; type: "string" }
25+ Parameter { name: "json"; type: "string" }
26+ }
27+ }
28+ Component {
29+ name: "PreviewModel"
30+ prototype: "unity::shell::scopes::PreviewModelInterface"
31+ exports: ["Unity/FakePreviewModel 0.2"]
32+ exportMetaObjectRevisions: [0]
33+ }
34+ Component {
35+ name: "PreviewStack"
36+ prototype: "unity::shell::scopes::PreviewStackInterface"
37+ exports: ["Unity/PreviewStack 0.2"]
38+ isCreatable: false
39+ exportMetaObjectRevisions: [0]
40+ Method {
41+ name: "getPreviewModel"
42+ type: "unity::shell::scopes::PreviewModelInterface*"
43+ Parameter { name: "index"; type: "int" }
44+ }
45+ }
46+ Component {
47+ name: "PreviewWidgetModel"
48+ prototype: "unity::shell::scopes::PreviewWidgetModelInterface"
49+ exports: ["Unity/PreviewWidgetModel 0.2"]
50+ isCreatable: false
51+ exportMetaObjectRevisions: [0]
52+ }
53+ Component {
54+ name: "ResultsModel"
55+ prototype: "unity::shell::scopes::ResultsModelInterface"
56+ exports: ["Unity/ResultsModel 0.2"]
57+ isCreatable: false
58+ exportMetaObjectRevisions: [0]
59+ }
60+ Component {
61+ name: "Scope"
62+ prototype: "unity::shell::scopes::ScopeInterface"
63+ exports: ["Unity/MockScope 0.2"]
64+ exportMetaObjectRevisions: [0]
65+ Method {
66+ name: "setSearchInProgress"
67+ Parameter { name: "inProg"; type: "bool" }
68+ }
69+ Method {
70+ name: "activate"
71+ Parameter { name: "result"; type: "QVariant" }
72+ }
73+ Method {
74+ name: "preview"
75+ type: "PreviewStack*"
76+ Parameter { name: "result"; type: "QVariant" }
77+ }
78+ Method { name: "cancelActivation" }
79+ Method {
80+ name: "closeScope"
81+ Parameter { name: "scope"; type: "unity::shell::scopes::ScopeInterface"; isPointer: true }
82+ }
83+ Method {
84+ name: "getDepartment"
85+ type: "unity::shell::scopes::DepartmentInterface*"
86+ Parameter { name: "id"; type: "string" }
87+ }
88+ Method {
89+ name: "loadDepartment"
90+ Parameter { name: "id"; type: "string" }
91+ }
92+ }
93+ Component {
94+ name: "Scopes"
95+ prototype: "unity::shell::scopes::ScopesInterface"
96+ exports: ["Unity/Scopes 0.2"]
97+ exportMetaObjectRevisions: [0]
98+ Method {
99+ name: "rowCount"
100+ type: "int"
101+ Parameter { name: "parent"; type: "QModelIndex" }
102+ }
103+ Method { name: "rowCount"; type: "int" }
104+ Method {
105+ name: "getScope"
106+ type: "unity::shell::scopes::ScopeInterface*"
107+ Parameter { name: "row"; type: "int" }
108+ }
109+ Method {
110+ name: "getScope"
111+ type: "unity::shell::scopes::ScopeInterface*"
112+ Parameter { name: "scope_id"; type: "string" }
113+ }
114+ Method {
115+ name: "addScope"
116+ Parameter { name: "scope"; type: "Scope"; isPointer: true }
117+ }
118+ Method { name: "clear" }
119+ Method { name: "load" }
120+ }
121+ Component {
122+ name: "unity::shell::scopes::CategoriesInterface"
123+ prototype: "QAbstractListModel"
124+ exports: ["Unity/Categories 0.2"]
125+ isCreatable: false
126+ exportMetaObjectRevisions: [0]
127+ Enum {
128+ name: "Roles"
129+ values: {
130+ "RoleCategoryId": 0,
131+ "RoleName": 1,
132+ "RoleIcon": 2,
133+ "RoleRawRendererTemplate": 3,
134+ "RoleRenderer": 4,
135+ "RoleComponents": 5,
136+ "RoleResults": 6,
137+ "RoleCount": 7
138+ }
139+ }
140+ Method {
141+ name: "overrideCategoryJson"
142+ type: "bool"
143+ Parameter { name: "categoryId"; type: "string" }
144+ Parameter { name: "json"; type: "string" }
145+ }
146+ Method {
147+ name: "addSpecialCategory"
148+ Parameter { name: "categoryId"; type: "string" }
149+ Parameter { name: "name"; type: "string" }
150+ Parameter { name: "icon"; type: "string" }
151+ Parameter { name: "rawTemplate"; type: "string" }
152+ Parameter { name: "countObject"; type: "QObject"; isPointer: true }
153+ }
154+ }
155+ Component {
156+ name: "unity::shell::scopes::DepartmentInterface"
157+ prototype: "QAbstractListModel"
158+ exports: ["Unity/Department 0.2"]
159+ isCreatable: false
160+ exportMetaObjectRevisions: [0]
161+ Enum {
162+ name: "Roles"
163+ values: {
164+ "RoleDepartmentId": 0,
165+ "RoleLabel": 1,
166+ "RoleHasChildren": 2,
167+ "RoleIsActive": 3
168+ }
169+ }
170+ Property { name: "departmentId"; type: "string"; isReadonly: true }
171+ Property { name: "label"; type: "string"; isReadonly: true }
172+ Property { name: "allLabel"; type: "string"; isReadonly: true }
173+ Property { name: "parentDepartmentId"; type: "string"; isReadonly: true }
174+ Property { name: "parentLabel"; type: "string"; isReadonly: true }
175+ Property { name: "loaded"; type: "bool"; isReadonly: true }
176+ Property { name: "isRoot"; type: "bool"; isReadonly: true }
177+ Property { name: "count"; type: "int"; isReadonly: true }
178+ }
179+ Component {
180+ name: "unity::shell::scopes::PreviewModelInterface"
181+ prototype: "QAbstractListModel"
182+ Enum {
183+ name: "Roles"
184+ values: {
185+ "RoleColumnModel": 0
186+ }
187+ }
188+ Property { name: "widgetColumnCount"; type: "int" }
189+ Property { name: "loaded"; type: "bool"; isReadonly: true }
190+ Property { name: "processingAction"; type: "bool"; isReadonly: true }
191+ Signal {
192+ name: "triggered"
193+ Parameter { type: "string" }
194+ Parameter { type: "string" }
195+ Parameter { type: "QVariantMap" }
196+ }
197+ }
198+ Component {
199+ name: "unity::shell::scopes::PreviewStackInterface"
200+ prototype: "QAbstractListModel"
201+ Enum {
202+ name: "Roles"
203+ values: {
204+ "RolePreviewModel": 0
205+ }
206+ }
207+ Property { name: "widgetColumnCount"; type: "int" }
208+ Method {
209+ name: "getPreviewModel"
210+ type: "unity::shell::scopes::PreviewModelInterface*"
211+ Parameter { name: "index"; type: "int" }
212+ }
213+ }
214+ Component {
215+ name: "unity::shell::scopes::PreviewWidgetModelInterface"
216+ prototype: "QAbstractListModel"
217+ Enum {
218+ name: "Roles"
219+ values: {
220+ "RoleWidgetId": 0,
221+ "RoleType": 1,
222+ "RoleProperties": 2
223+ }
224+ }
225+ }
226+ Component {
227+ name: "unity::shell::scopes::ResultsModelInterface"
228+ prototype: "QAbstractListModel"
229+ Enum {
230+ name: "Roles"
231+ values: {
232+ "RoleUri": 0,
233+ "RoleCategoryId": 1,
234+ "RoleDndUri": 2,
235+ "RoleResult": 3,
236+ "RoleTitle": 4,
237+ "RoleArt": 5,
238+ "RoleSubtitle": 6,
239+ "RoleMascot": 7,
240+ "RoleEmblem": 8,
241+ "RoleSummary": 9,
242+ "RoleAttributes": 10,
243+ "RoleBackground": 11
244+ }
245+ }
246+ Property { name: "categoryId"; type: "string" }
247+ Property { name: "count"; type: "int"; isReadonly: true }
248+ }
249+ Component {
250+ name: "unity::shell::scopes::ScopeInterface"
251+ prototype: "QObject"
252+ exports: ["Unity/Scope 0.2"]
253+ isCreatable: false
254+ exportMetaObjectRevisions: [0]
255+ Property { name: "id"; type: "string"; isReadonly: true }
256+ Property { name: "name"; type: "string"; isReadonly: true }
257+ Property { name: "iconHint"; type: "string"; isReadonly: true }
258+ Property { name: "description"; type: "string"; isReadonly: true }
259+ Property { name: "searchHint"; type: "string"; isReadonly: true }
260+ Property { name: "searchInProgress"; type: "bool"; isReadonly: true }
261+ Property { name: "visible"; type: "bool"; isReadonly: true }
262+ Property { name: "shortcut"; type: "string"; isReadonly: true }
263+ Property {
264+ name: "categories"
265+ type: "unity::shell::scopes::CategoriesInterface"
266+ isReadonly: true
267+ isPointer: true
268+ }
269+ Property { name: "searchQuery"; type: "string" }
270+ Property { name: "noResultsHint"; type: "string" }
271+ Property { name: "formFactor"; type: "string" }
272+ Property { name: "isActive"; type: "bool" }
273+ Property { name: "currentDepartmentId"; type: "string"; isReadonly: true }
274+ Property { name: "hasDepartments"; type: "bool"; isReadonly: true }
275+ Signal { name: "showDash" }
276+ Signal { name: "hideDash" }
277+ Signal {
278+ name: "gotoUri"
279+ Parameter { name: "uri"; type: "string" }
280+ }
281+ Signal {
282+ name: "previewRequested"
283+ Parameter { name: "result"; type: "QVariant" }
284+ }
285+ Signal {
286+ name: "gotoScope"
287+ Parameter { name: "scopeId"; type: "string" }
288+ }
289+ Signal {
290+ name: "openScope"
291+ Parameter { name: "scope"; type: "unity::shell::scopes::ScopeInterface"; isPointer: true }
292+ }
293+ Signal {
294+ name: "activateApplication"
295+ Parameter { name: "desktop"; type: "string" }
296+ }
297+ Method {
298+ name: "activate"
299+ Parameter { name: "result"; type: "QVariant" }
300+ }
301+ Method {
302+ name: "preview"
303+ type: "unity::shell::scopes::PreviewStackInterface*"
304+ Parameter { name: "result"; type: "QVariant" }
305+ }
306+ Method { name: "cancelActivation" }
307+ Method {
308+ name: "closeScope"
309+ Parameter { name: "scope"; type: "unity::shell::scopes::ScopeInterface"; isPointer: true }
310+ }
311+ Method {
312+ name: "getDepartment"
313+ type: "unity::shell::scopes::DepartmentInterface*"
314+ Parameter { name: "departmentId"; type: "string" }
315+ }
316+ Method {
317+ name: "loadDepartment"
318+ Parameter { name: "departmentId"; type: "string" }
319+ }
320+ }
321+ Component {
322+ name: "unity::shell::scopes::ScopesInterface"
323+ prototype: "QAbstractListModel"
324+ Enum {
325+ name: "Roles"
326+ values: {
327+ "RoleScope": 0,
328+ "RoleId": 1,
329+ "RoleVisible": 2,
330+ "RoleTitle": 3
331+ }
332+ }
333+ Property { name: "loaded"; type: "bool"; isReadonly: true }
334+ Method {
335+ name: "getScope"
336+ type: "unity::shell::scopes::ScopeInterface*"
337+ Parameter { name: "row"; type: "int" }
338+ }
339+ Method {
340+ name: "getScope"
341+ type: "unity::shell::scopes::ScopeInterface*"
342+ Parameter { name: "scopeId"; type: "string" }
343+ }
344+ }
345+}
tests/mocks/Unity/fake_categories.cpp+4
@@ -116,6 +116,8 @@ Categories::data(const QModelIndex& index, int role) const
116116 map["title"] = "HOLA";
117117 return map;
118118 }
119+ case RoleHeaderLink:
120+ return QString();
119121 case RoleResults:
120122 return QVariant();
121123 case RoleCount:
@@ -163,6 +165,8 @@ Categories::data(const QModelIndex& index, int role) const
163165 map["subtitle"] = "HOLA";
164166 return map;
165167 }
168+ case RoleHeaderLink:
169+ return QString();
166170 case RoleResults:
167171 return QVariant::fromValue(resultsModel);
168172 case RoleCount:
tests/mocks/Unity/fake_scope.cpp+58−19
@@ -14,6 +14,8 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 */
1616
17+#include <QUrl>
18+
1719#include "fake_scope.h"
1820#include "fake_department.h"
1921#include "fake_resultsmodel.h"
@@ -35,87 +37,110 @@ Scope::Scope(QString const& id, QString const& name, bool visible, QObject* pare
3537{
3638}
3739
38−QString Scope::id() const {
40+QString Scope::id() const
41+{
3942 return m_id;
4043}
4144
42−QString Scope::name() const {
45+QString Scope::name() const
46+{
4347 return m_name;
4448}
4549
46−QString Scope::searchQuery() const {
50+QString Scope::searchQuery() const
51+{
4752 return m_searchQuery;
4853}
4954
50−QString Scope::iconHint() const {
55+QString Scope::iconHint() const
56+{
5157 return m_iconHint;
5258}
5359
54−QString Scope::description() const {
60+QString Scope::description() const
61+{
5562 return m_description;
5663}
5764
58−QString Scope::searchHint() const {
65+QString Scope::searchHint() const
66+{
5967 return QString("");
6068}
6169
62−QString Scope::shortcut() const {
70+QString Scope::shortcut() const
71+{
6372 return QString("");
6473}
6574
66−bool Scope::searchInProgress() const {
75+bool Scope::searchInProgress() const
76+{
6777 return m_searching;
6878}
6979
70−unity::shell::scopes::CategoriesInterface* Scope::categories() const {
80+unity::shell::scopes::CategoriesInterface* Scope::categories() const
81+{
7182 return m_categories;
7283}
7384
74−QString Scope::noResultsHint() const {
85+unity::shell::scopes::SettingsModelInterface* Scope::settings() const
86+{
87+ return nullptr;
88+}
89+
90+QString Scope::noResultsHint() const
91+{
7592 return m_noResultsHint;
7693}
7794
78−QString Scope::formFactor() const {
95+QString Scope::formFactor() const
96+{
7997 return m_formFactor;
8098}
8199
82−bool Scope::visible() const {
100+bool Scope::visible() const
101+{
83102 return m_visible;
84103}
85104
86−bool Scope::isActive() const {
105+bool Scope::isActive() const
106+{
87107 return m_isActive;
88108}
89109
90−void Scope::setSearchQuery(const QString &str) {
110+void Scope::setSearchQuery(const QString &str)
111+{
91112 if (str != m_searchQuery) {
92113 m_searchQuery = str;
93114 Q_EMIT searchQueryChanged();
94115 }
95116}
96117
97−void Scope::setFormFactor(const QString &str) {
118+void Scope::setFormFactor(const QString &str)
119+{
98120 if (str != m_formFactor) {
99121 m_formFactor = str;
100122 Q_EMIT formFactorChanged();
101123 }
102124}
103125
104−void Scope::setActive(const bool active) {
126+void Scope::setActive(const bool active)
127+{
105128 if (active != m_isActive) {
106129 m_isActive = active;
107130 Q_EMIT isActiveChanged();
108131 }
109132}
110133
111−void Scope::setSearchInProgress(const bool inProg) {
134+void Scope::setSearchInProgress(const bool inProg)
135+{
112136 if (inProg != m_searching) {
113137 m_searching = inProg;
114138 Q_EMIT searchInProgressChanged();
115139 }
116140}
117141
118−void Scope::setNoResultsHint(const QString& str) {
142+void Scope::setNoResultsHint(const QString& str)
143+{
119144 if (str != m_noResultsHint) {
120145 m_noResultsHint = str;
121146 Q_EMIT noResultsHintChanged();
@@ -157,7 +182,16 @@ bool Scope::hasDepartments() const
157182
158183QVariantMap Scope::customizations() const
159184{
160− return QVariantMap();
185+ QVariantMap m;
186+ if (m_id == "clickscope") {
187+ m["background-color"] = "red";
188+ m["foreground-color"] = "blue";
189+ } else if (m_id == "MockScope5") {
190+ QVariantMap pageHeader;
191+ pageHeader["logo"] = QUrl("../../../tests/qmltests/Components/tst_PageHeader/logo-ubuntu-orange.svg");
192+ m["page-header"] = pageHeader;
193+ }
194+ return m;
161195}
162196
163197unity::shell::scopes::DepartmentInterface* Scope::getDepartment(const QString& id)
@@ -182,3 +216,8 @@ void Scope::loadDepartment(const QString& id)
182216 m_currentDeparment = id;
183217 Q_EMIT currentDepartmentIdChanged();
184218}
219+
220+void Scope::performQuery(const QString& query)
221+{
222+ Q_UNUSED(query);
223+}
tests/mocks/Unity/fake_scope.h+2
@@ -46,6 +46,7 @@ public:
4646 QString noResultsHint() const override;
4747 QString formFactor() const override;
4848 bool isActive() const override;
49+ unity::shell::scopes::SettingsModelInterface* settings() const override;
4950
5051 /* setters */
5152 void setSearchQuery(const QString& search_query) override;
@@ -63,6 +64,7 @@ public:
6364 bool hasDepartments() const override;
6465 Q_INVOKABLE unity::shell::scopes::DepartmentInterface* getDepartment(const QString& id) override;
6566 Q_INVOKABLE void loadDepartment(const QString& id) override;
67+ Q_INVOKABLE void performQuery(const QString& query) override;
6668
6769 QVariantMap customizations() const override;
6870
tests/mocks/Unity/fake_unity_plugin.cpp+1
@@ -45,6 +45,7 @@ void FakeUnityPlugin::registerTypes(const char *uri)
4545 qmlRegisterUncreatableType<unity::shell::scopes::ScopeInterface>(uri, 0, 2, "Scope", "Can't create Scope object in QML.");
4646 qmlRegisterUncreatableType<unity::shell::scopes::DepartmentInterface>(uri, 0, 2, "Department", "Can't create Department object in QML.");
4747 qmlRegisterUncreatableType<unity::shell::scopes::CategoriesInterface>(uri, 0, 2, "Categories", "Can't create Categories object in QML.");
48+ qmlRegisterUncreatableType<unity::shell::scopes::PreviewModelInterface>(uri, 0, 2, "PreviewModel", "Can't create new PreviewModel in QML. Get them from PreviewStack instance.");
4849 qmlRegisterUncreatableType<ResultsModel>(uri, 0, 2, "ResultsModel", "Can't create ResultsModel object in QML.");
4950 qmlRegisterType<PreviewModel>(uri, 0, 2, "FakePreviewModel");
5051 qmlRegisterUncreatableType<PreviewWidgetModel>(uri, 0, 2, "PreviewWidgetModel", "Can't create new PreviewWidgetModel in QML. Get them from PreviewModel instance.");
tests/plugins/Dash/CMakeLists.txt+2
@@ -76,4 +76,6 @@ add_binary_qml_test(CardCreator "" "Dash-qml")
7676# plain qml test
7777set(qmltest_DEFAULT_TARGETS qmluitests)
7878set(qmltest_DEFAULT_NO_ADD_TEST TRUE)
79+set(qmltest_DEFAULT_PROPERTIES ENVIRONMENT "LC_ALL=C")
80+add_qml_test(. ScopeStyle IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
7981add_qml_test(. ListViewWithPageHeaderQML IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
tests/plugins/Dash/cardcreator/1.res+3−2
@@ -5,7 +5,8 @@ AbstractButton {
55 property var cardData;
66 property var artShapeBorderSource: undefined;
77 property real fontScale: 1.0;
8− property int headerAlignment: Text.AlignLeft;
8+ property var scopeStyle: null;
9+ property int headerAlignment: Text.AlignLeft;
910 property int fixedHeaderHeight: -1;
1011 property size fixedArtShapeSize: Qt.size(-1, -1);
1112 readonly property string title: cardData && cardData["title"] || "";
@@ -75,7 +76,7 @@ leftMargin: units.gu(1);
7576 wrapMode: Text.Wrap;
7677 maximumLineCount: 2;
7778 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
78− color: "grey";
79+ color: root.scopeStyle ? root.scopeStyle.foreground : "grey";
7980 visible: showHeader ;
8081 text: root.title;
8182 font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
tests/plugins/Dash/cardcreator/2.res+5−5
@@ -5,7 +5,8 @@ AbstractButton {
55 property var cardData;
66 property var artShapeBorderSource: undefined;
77 property real fontScale: 1.0;
8− property int headerAlignment: Text.AlignLeft;
8+ property var scopeStyle: null;
9+ property int headerAlignment: Text.AlignLeft;
910 property int fixedHeaderHeight: -1;
1011 property size fixedArtShapeSize: Qt.size(-1, -1);
1112 readonly property string title: cardData && cardData["title"] || "";
@@ -78,8 +79,7 @@ Column {
7879 anchors.verticalCenter: parent.verticalCenter;
7980 spacing: units.dp(2);
8081 width: parent.width - x;
81− data: [
82−Label {
82+ data: [ Label {
8383 id: titleLabel;
8484 objectName: "titleLabel";
8585 anchors { left: parent.left; right: parent.right }
@@ -88,7 +88,7 @@ Label {
8888 wrapMode: Text.Wrap;
8989 maximumLineCount: 2;
9090 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
91− color: backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < 0.7 ? "white" : "grey";
91+ color: backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < 0.7 ? "white" : (root.scopeStyle ? root.scopeStyle.foreground : "grey");
9292 visible: showHeader ;
9393 text: root.title;
9494 font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
@@ -103,7 +103,7 @@ Label {
103103 elide: Text.ElideRight;
104104 fontSize: "small";
105105 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
106− color: backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < 0.7 ? "white" : "grey";
106+ color: backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < 0.7 ? "white" : (root.scopeStyle ? root.scopeStyle.foreground : "grey");
107107 visible: titleLabel.visible && titleLabel.text;
108108 text: cardData && cardData["subtitle"] || "";
109109 font.weight: Font.Light;
tests/plugins/Dash/cardcreator/3.res+6−4
@@ -5,7 +5,8 @@ AbstractButton {
55 property var cardData;
66 property var artShapeBorderSource: undefined;
77 property real fontScale: 1.0;
8− property int headerAlignment: Text.AlignLeft;
8+ property var scopeStyle: null;
9+ property int headerAlignment: Text.AlignLeft;
910 property int fixedHeaderHeight: -1;
1011 property size fixedArtShapeSize: Qt.size(-1, -1);
1112 readonly property string title: cardData && cardData["title"] || "";
@@ -75,7 +76,7 @@ leftMargin: units.gu(1);
7576 wrapMode: Text.Wrap;
7677 maximumLineCount: 2;
7778 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
78− color: "grey";
79+ color: root.scopeStyle ? root.scopeStyle.foreground : "grey";
7980 visible: showHeader ;
8081 text: root.title;
8182 font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
@@ -88,11 +89,12 @@ Label {
8889 leftMargin: titleLabel.leftMargin;
8990 right: titleLabel.right;
9091 top: titleLabel.bottom;
91− topMargin: units.dp(2); }
92+ topMargin: units.dp(2);
93+ }
9294 elide: Text.ElideRight;
9395 fontSize: "small";
9496 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
95− color: "grey";
97+ color: root.scopeStyle ? root.scopeStyle.foreground : "grey";
9698 visible: titleLabel.visible && titleLabel.text;
9799 text: cardData && cardData["subtitle"] || "";
98100 font.weight: Font.Light;
tests/plugins/Dash/cardcreator/4.res+4−3
@@ -5,7 +5,8 @@ AbstractButton {
55 property var cardData;
66 property var artShapeBorderSource: undefined;
77 property real fontScale: 1.0;
8− property int headerAlignment: Text.AlignLeft;
8+ property var scopeStyle: null;
9+ property int headerAlignment: Text.AlignLeft;
910 property int fixedHeaderHeight: -1;
1011 property size fixedArtShapeSize: Qt.size(-1, -1);
1112 readonly property string title: cardData && cardData["title"] || "";
@@ -68,7 +69,7 @@ data: [ Label {
6869 wrapMode: Text.Wrap;
6970 maximumLineCount: 2;
7071 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
71− color: "grey";
72+ color: root.scopeStyle ? root.scopeStyle.foreground : "grey";
7273 visible: showHeader ;
7374 text: root.title;
7475 font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
@@ -83,7 +84,7 @@ Label {
8384 elide: Text.ElideRight;
8485 fontSize: "small";
8586 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
86− color: "grey";
87+ color: root.scopeStyle ? root.scopeStyle.foreground : "grey";
8788 visible: titleLabel.visible && titleLabel.text;
8889 text: cardData && cardData["subtitle"] || "";
8990 font.weight: Font.Light;
tests/plugins/Dash/cardcreator/5.res+3−2
@@ -4,8 +4,9 @@ AbstractButton {
44 property var components;
55 property var cardData;
66 property var artShapeBorderSource: undefined;
7− property real fontScale: 1.0;
8− property int headerAlignment: Text.AlignLeft;
7+ property real fontScale: 1.0;
8+ property var scopeStyle: null;
9+ property int headerAlignment: Text.AlignLeft;
910 property int fixedHeaderHeight: -1;
1011 property size fixedArtShapeSize: Qt.size(-1, -1);
1112 readonly property string title: cardData && cardData["title"] || "";
tests/plugins/Dash/cardcreator/6.resnew file+66
@@ -0,0 +1,66 @@
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 > 0 ? root.fixedArtShapeSize.height : artShapeLoader.height;
20+ width: root.fixedArtShapeSize.width > 0 ? 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+ visible: image.status == Image.Ready;
33+ readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1;
34+ readonly property real aspect: fixedArtShapeSizeAspect > 0 ? fixedArtShapeSizeAspect : components !== undefined ? components["art"]["aspect-ratio"] : 1;
35+ readonly property bool aspectSmallerThanImageAspect: aspect < image.aspect;
36+ Component.onCompleted: { updateWidthHeightBindings(); if (artShapeBorderSource !== undefined) borderSource = artShapeBorderSource; }
37+ onAspectSmallerThanImageAspectChanged: updateWidthHeightBindings();
38+ Connections { target: root; onFixedArtShapeSizeChanged: updateWidthHeightBindings(); }
39+ function updateWidthHeightBindings() {
40+ if (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) {
41+ width = root.fixedArtShapeSize.width;
42+ height = root.fixedArtShapeSize.height;
43+ } else if (aspectSmallerThanImageAspect) {
44+ width = Qt.binding(function() { return !visible ? 0 : image.width });
45+ height = Qt.binding(function() { return !visible ? 0 : image.fillMode === Image.PreserveAspectCrop ? image.height : width / image.aspect });
46+ } else {
47+ width = Qt.binding(function() { return !visible ? 0 : image.fillMode === Image.PreserveAspectCrop ? image.width : height * image.aspect });
48+ height = Qt.binding(function() { return !visible ? 0 : image.height });
49+ }
50+ }
51+ image: Image {
52+ objectName: "artImage";
53+ source: cardData && cardData["art"] || "";
54+ cache: true;
55+ asynchronous: root.asynchronous;
56+ fillMode: components && components["art"]["fill-mode"] === "fit" ? Image.PreserveAspectFit: Image.PreserveAspectCrop;
57+ readonly property real aspect: implicitWidth / implicitHeight;
58+ width: root.width;
59+ height: width / artShape.aspect;
60+ }
61+ }
62+ }
63+ }
64+readonly property int headerHeight: 0;
65+implicitHeight: artShapeHolder.height;
66+}
tests/plugins/Dash/cardcreator/6.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"}}
3+result: 6.res
tests/plugins/Dash/tst_ScopeStyle.qmlnew file+151
@@ -0,0 +1,151 @@
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 QtTest 1.0
19+import Dash 0.1
20+import Ubuntu.Components 1.1
21+
22+Rectangle {
23+ width: units.gu(40)
24+ height: units.gu(71)
25+
26+ ScopeStyle {
27+ id: tool
28+ }
29+
30+ TestCase {
31+ id: testCase
32+ name: "ScopeStyle"
33+ when: windowShown
34+
35+ property color color
36+ property var styles: [
37+ {},
38+ { "foreground-color": "red", "background-color": "black", "page-header": { "logo": "/foo/bar" } },
39+ { "foreground-color": "green", "background-color": "white" },
40+ { "foreground-color": "blue", "background-color": "darkgrey" },
41+ ]
42+
43+ function cleanup() {
44+ testCase.color = "transparent";
45+ }
46+
47+ function test_luminance_data() {
48+ return [
49+ { tag: "#F00", luminance: 0.2126 },
50+ { tag: "#0F0", luminance: 0.7152 },
51+ { tag: "#00F", luminance: 0.0722 },
52+ { tag: "white", luminance: 1.0 },
53+ { tag: "black", luminance: 0.0 },
54+ { tag: "lightgrey", luminance: 0.8275 },
55+ { tag: "grey", luminance: 0.5020 },
56+ { tag: "darkgrey", luminance: 0.6627 },
57+ ];
58+ }
59+
60+ function test_luminance(data) {
61+ testCase.color = data.tag;
62+ compare(tool.luminance(testCase.color).toFixed(4), data.luminance.toFixed(4));
63+ }
64+
65+ function test_foreground_data() {
66+ return [
67+ { tag: "default", index: 0, foreground: "grey" },
68+ { tag: "red on black", index: 1, foreground: "red" },
69+ { tag: "green on white", index: 2, foreground: "green" },
70+ { tag: "blue on darkgrey", index: 3, foreground: "blue" },
71+ ];
72+ }
73+
74+ function test_foreground(data) {
75+ tool.style = testCase.styles[data.index];
76+ verify(Qt.colorEqual(tool.foreground, data.foreground),
77+ "Foreground color not equal: %1 != %2".arg(tool.foreground).arg(data.foreground));
78+ }
79+
80+ function test_background_data() {
81+ return [
82+ { tag: "default", index: 0, background: "transparent" },
83+ { tag: "red on black", index: 1, background: "black" },
84+ { tag: "green on white", index: 2, background: "white" },
85+ { tag: "blue on darkgrey", index: 3, background: "darkgrey" },
86+ ];
87+ }
88+
89+ function test_background(data) {
90+ tool.style = testCase.styles[data.index];
91+ verify(Qt.colorEqual(tool.background, data.background),
92+ "Background color not equal: %1 != %2".arg(tool.background).arg(data.background));
93+ }
94+
95+ function test_threshold_data() {
96+ return [
97+ { tag: "default", index: 0, threshold: 0.5020 },
98+ { tag: "red on black", index: 1, threshold: 0.1063 },
99+ { tag: "green on white", index: 2, threshold: 0.6795 },
100+ { tag: "blue on darkgrey", index: 3, threshold: 0.3675 },
101+ ];
102+ }
103+
104+ function test_threshold(data) {
105+ tool.style = testCase.styles[data.index];
106+ compare(tool.threshold.toFixed(4), data.threshold.toFixed(4), "Luminance threshold was incorrect.");
107+ }
108+
109+ function test_light_data() {
110+ return [
111+ { tag: "default", index: 0, light: "white" },
112+ { tag: "red on black", index: 1, light: "red" },
113+ { tag: "green on white", index: 2, light: "white" },
114+ { tag: "blue on darkgrey", index: 3, light: "darkgrey" },
115+ ];
116+ }
117+
118+ function test_light(data) {
119+ tool.style = testCase.styles[data.index];
120+ verify(Qt.colorEqual(tool.light, data.light),
121+ "Light color not equal: %1 != %2".arg(tool.light).arg(data.light));
122+ }
123+
124+ function test_dark_data() {
125+ return [
126+ { tag: "default", index: 0, dark: "grey" },
127+ { tag: "red on black", index: 1, dark: "black" },
128+ { tag: "green on white", index: 2, dark: "green" },
129+ { tag: "blue on darkgrey", index: 3, dark: "blue" },
130+ ];
131+ }
132+
133+ function test_dark(data) {
134+ tool.style = testCase.styles[data.index];
135+ verify(Qt.colorEqual(tool.dark, data.dark),
136+ "Dark color not equal: %1 != %2".arg(tool.dark).arg(data.dark));
137+ }
138+
139+ function test_headerLogo_data() {
140+ return [
141+ { tag: "default", index: 0, headerLogo: "" },
142+ { tag: "with logo", index: 1, headerLogo: "file:///foo/bar" },
143+ ];
144+ }
145+
146+ function test_headerLogo(data) {
147+ tool.style = testCase.styles[data.index];
148+ compare(tool.headerLogo, data.headerLogo, "Header logo was incorrect.");
149+ }
150+ }
151+}
tests/plugins/Unity/Launcher/launchermodeltest.cpp+9
@@ -156,11 +156,20 @@ private Q_SLOTS:
156156 }
157157
158158 void testPinning() {
159+ QSignalSpy spy(launcherModel, SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>)));
159160 QCOMPARE(launcherModel->get(0)->pinned(), false);
160161 QCOMPARE(launcherModel->get(1)->pinned(), false);
161162 launcherModel->pin(launcherModel->get(0)->appId());
162163 QCOMPARE(launcherModel->get(0)->pinned(), true);
163164 QCOMPARE(launcherModel->get(1)->pinned(), false);
165+ QCOMPARE(spy.count(), 1);
166+ QCOMPARE(spy.at(0).at(2).value<QVector<int>>().first(), (int)LauncherModelInterface::RolePinned);
167+
168+ launcherModel->requestRemove(launcherModel->get(0)->appId());
169+ QCOMPARE(launcherModel->get(0)->pinned(), false);
170+ QCOMPARE(launcherModel->get(1)->pinned(), false);
171+ QCOMPARE(spy.count(), 2);
172+ QCOMPARE(spy.at(1).at(2).value<QVector<int>>().first(), (int)LauncherModelInterface::RolePinned);
164173 }
165174
166175 void testRemove_data() {
tests/qmltests/CMakeLists.txt+3−1
@@ -32,7 +32,7 @@ add_qml_test(Components ResponsiveGridView)
3232add_qml_test(Components ResponsiveVerticalJournal IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
3333add_qml_test(Components SeeMore)
3434add_qml_test(Components Showable)
35−add_qml_test(Components PageHeaderLabel)
35+add_qml_test(Components PageHeader)
3636add_qml_test(Components ZoomableImage)
3737add_qml_test(Dash Dash)
3838add_qml_test(Dash DashContent)
@@ -46,6 +46,7 @@ add_qml_test(Dash/Previews PreviewActions)
4646add_qml_test(Dash/Previews PreviewAudioPlayback)
4747add_qml_test(Dash/Previews PreviewHeader)
4848add_qml_test(Dash/Previews PreviewImageGallery)
49+add_qml_test(Dash/Previews PreviewPayments)
4950add_qml_test(Dash/Previews PreviewProgress)
5051add_qml_test(Dash/Previews PreviewRatingDisplay)
5152add_qml_test(Dash/Previews PreviewRatingInput)
@@ -63,6 +64,7 @@ add_qml_test(Hud Result)
6364add_qml_test(Launcher Launcher)
6465add_qml_test(Notifications Notifications)
6566add_qml_test(Notifications VisualSnapDecisionsQueue)
67+add_qml_test(Panel ActiveCallHint)
6668add_qml_test(Panel IndicatorRow)
6769add_qml_test(Panel Indicators)
6870add_qml_test(Panel MenuContent)
tests/qmltests/Components/tst_Carousel.qml+48−2
@@ -27,12 +27,13 @@ Item {
2727 Carousel {
2828 anchors.fill: parent
2929 id: carousel
30− model: 40
3130
3231 property int createdDelegates: 0
3332 property int destroyedDelegates: 0
3433
3534 itemComponent: BaseCarouselDelegate {
35+ objectName: "carouselDelegate" + index
36+
3637 Rectangle {
3738 anchors.fill: parent
3839 border.color: "black"
@@ -42,6 +43,11 @@ Item {
4243 }
4344 }
4445 }
46+
47+ SignalSpy {
48+ id: spy
49+ }
50+
4551 UT.UnityTestCase {
4652 id: root
4753 name: "Carousel"
@@ -51,6 +57,8 @@ Item {
5157 property int itemCount
5258 property real tileWidth
5359
60+ property Item listView: findChild(carousel, "listView")
61+
5462 property real contentWidth: itemCount * tileWidth
5563 // following variables are copied from Carousel.qml
5664 // I'm not using the variables directly from there, as then tileWidth and others would be affected as well
@@ -60,11 +68,25 @@ Item {
6068 property real kGapEnd: kMiddleIndex * (1 - gapToEndPhase / gapToMiddlePhase)
6169 property real kXBeginningEnd: 1 / tileWidth + kMiddleIndex / gapToMiddlePhase
6270
71+ function init() {
72+ carousel.model = 40;
73+ waitForRendering(carousel)
74+ listView.positionViewAtBeginning();
75+ }
76+
77+ function cleanup() {
78+ carousel.model = 0;
79+ carousel.createdDelegates = 0;
80+ carousel.destroyedDelegates = 0;
81+ spy.target = null;
82+ spy.signalName = "";
83+ }
84+
6385 // This test needs to run first since it tests a corner case condition
6486 // to where the carousel is just being created
6587 // That is why it has a 1 in the name
6688 function test_1onlyNeededItemsCreated() {
67− tryCompare(carousel, "createdDelegates", 10);
89+ tryCompare(carousel, "createdDelegates", 9);
6890 compare(carousel.destroyedDelegates, 0);
6991 }
7092
@@ -243,5 +265,29 @@ Item {
243265 var x = carouselList.getXFromContinuousIndex(carousel.model - 1);
244266 verify(Math.abs(x - carouselList.contentX) < 1);
245267 }
268+
269+ function test_activate() {
270+ var carouselList = findChild(carousel, "listView");
271+ tryCompareFunction(function() { return findChild(carouselList, "carouselDelegate3") ? true : false; }, true);
272+ var carouselItem = findChild(carousel, "carouselDelegate3")
273+ verify(carouselItem, "Could not find delegate");
274+
275+ spy.signalName = "clicked";
276+ spy.target = carouselItem;
277+ mouseClick(carouselItem, carouselItem.width / 2, carouselItem.height / 2);
278+ tryCompare(carouselList, "moving", false);
279+ tryCompare(carouselItem, "explicitlyScaled", true);
280+ mouseClick(carouselItem, carouselItem.width / 2, carouselItem.height / 2);
281+ spy.wait();
282+
283+ spy.signalName = "pressAndHold";
284+ spy.target = carouselItem;
285+ mouseClick(carouselItem, carouselItem.width / 2, carouselItem.height / 2);
286+ tryCompare(carouselList, "moving", false);
287+ tryCompare(carouselItem, "explicitlyScaled", true);
288+ mousePress(carouselItem, carouselItem.width / 2, carouselItem.height / 2);
289+ spy.wait();
290+ mouseRelease(carouselItem, carouselItem.width / 2, carouselItem.height / 2);
291+ }
246292 }
247293}
tests/qmltests/Components/tst_PageHeaderLabel.qml → tests/qmltests/Components/tst_PageHeader.qmlrenamed+90−54
@@ -23,13 +23,10 @@ import Unity 0.2
2323import Unity.Test 0.1 as UT
2424
2525Item {
26+ id: root
2627 width: units.gu(110)
2728 height: units.gu(30)
2829
29− MockScope {
30− id: scopeMock
31− }
32−
3330 UT.UnityTestCase {
3431 name: "PageHeaderLabelTest"
3532 when: windowShown
@@ -82,33 +79,6 @@ Item {
8279 compare(searchQuery, "", "Reset search did not reset searchQuery correctly.")
8380 }
8481
85− function test_move_search_by_width()
86− {
87− searchEnabled = true
88− pageHeader.resetSearch()
89−
90− var searchContainer = findChild(pageHeader, "searchContainer")
91−
92− parent.width = units.gu(40)
93−
94− verify(searchContainer !== undefined)
95− verify(searchContainer.y <= 0)
96−
97− pageHeader.triggerSearch()
98− verify(searchContainer.y >= 0)
99−
100− pageHeader.resetSearch()
101− verify(searchContainer.y <= 0)
102−
103− parent.width = units.gu(110)
104− verify(searchContainer.y >= 0)
105−
106− pageHeader.triggerSearch()
107− tryCompare(searchContainer, "narrowMode", false)
108− tryCompare(searchContainer, "state", "active")
109− tryCompare(searchContainer, "width", units.gu(40))
110− }
111−
11282 function test_history() {
11383 pageHeader.searchHistory.clear()
11484 compare(pageHeader.searchHistory.count, 0)
@@ -144,21 +114,41 @@ Item {
144114
145115 function test_search_indicator() {
146116 var searchIndicator = findChild(pageHeader, "searchIndicator")
147− var primaryImage = findChild(pageHeader, "primaryImage")
117+ var clearIcon = findChild(pageHeader, "clearIcon")
148118
149119 pageHeader.triggerSearch()
150120
151− scopeMock.setSearchInProgress(false);
121+ tryCompare(clearIcon, "visible", false)
122+ pageHeader.searchQuery = "ubuntu"
123+ tryCompare(clearIcon, "visible", true)
124+
125+ pageHeader.searchInProgress = false
152126 compare(searchIndicator.running, false, "Search indicator is running.")
153− tryCompare(primaryImage, "visible", true)
127+ tryCompare(clearIcon, "visible", true)
154128
155− scopeMock.setSearchInProgress(true);
129+ pageHeader.searchInProgress = true
156130 compare(searchIndicator.running, true, "Search indicator isn't running.")
157− tryCompare(primaryImage, "visible", false)
131+ tryCompare(clearIcon, "visible", false)
132+
133+ pageHeader.searchInProgress = false;
134+ compare(searchIndicator.running, false, "Search indicator is running.")
135+ tryCompare(clearIcon, "visible", true)
136+ }
137+
138+ function test_titleImage() {
139+
140+ var titleImage = findChild(pageHeader, "titleImage");
141+ verify(titleImage == null);
142+
143+ showImageCheckBox.checked = true;
144+
145+ titleImage = findChild(pageHeader, "titleImage");
146+ verify(titleImage !== null);
147+ compare(titleImage.source, pageHeader.titleImageSource);
148+
158149 }
159150
160151 function cleanup() {
161− scopeMock.setSearchInProgress(false);
162152 pageHeader.resetSearch();
163153 }
164154
@@ -171,14 +161,21 @@ Item {
171161
172162 pageHeader.triggerSearch();
173163
174− var searchContainer = findChild(pageHeader, "searchContainer");
175− verify(searchContainer !== undefined, "searchContainer != undefined");
176− tryCompareFunction(function() { return searchContainer.popover !== null; }, true);
164+ var headerContainer = findChild(pageHeader, "headerContainer");
165+ verify(headerContainer !== null, "headerContainer != null");
166+ tryCompareFunction(function() { return headerContainer.popover !== null; }, true);
177167
178− tryCompare(searchContainer.popover, "visible", true);
168+ tryCompare(headerContainer.popover, "visible", true);
179169 }
180170
181− function test_resetSearch_onPopupClose() {
171+ function test_tap_outside_closes_popup_data() {
172+ return [
173+ { tag: "with search text", searchText: "foobar", hideSearch: false },
174+ { tag: "without search text", searchText: "", hideSearch: true }
175+ ];
176+ }
177+
178+ function test_tap_outside_closes_popup(data) {
182179 searchEnabled = true;
183180 pageHeader.searchHistory.clear();
184181
@@ -187,16 +184,19 @@ Item {
187184
188185 pageHeader.triggerSearch();
189186
190− var searchContainer = findChild(pageHeader, "searchContainer");
191− verify(searchContainer !== undefined, "searchContainer != undefined");
192− tryCompareFunction(function() { return searchContainer.popover !== null; }, true);
193− compare(searchContainer.popover.visible, true);
187+ var headerContainer = findChild(pageHeader, "headerContainer");
188+ verify(headerContainer !== null, "headerContainer != null");
189+ tryCompareFunction(function() { return headerContainer.popover !== null; }, true);
190+ compare(headerContainer.popover.visible, true);
191+
192+ pageHeader.searchQuery = data.searchText;
194193
195− pageHeader.searchQuery = "test";
196− tryCompareFunction( function() { return (searchContainer.popover===null || !searchContainer.popover.visible) }, true);
194+ mouseClick(root, root.width / 2, root.height - 1);
195+
196+ tryCompare(headerContainer, "showSearch", !data.hideSearch);
197+ tryCompareFunction(function() { return headerContainer.popover === null; }, true);
197198
198199 pageHeader.resetSearch();
199− compare((searchContainer.popover===null || !searchContainer.popover.visible), true);
200200 }
201201 }
202202
@@ -204,18 +204,24 @@ Item {
204204 anchors.fill: parent
205205 spacing: units.gu(1)
206206
207− PageHeaderLabel {
207+ PageHeader {
208208 id: pageHeader
209209 anchors {
210210 left: parent.left
211211 right: parent.right
212212 }
213213
214− scope: scopeMock
215−
216214 searchEntryEnabled: true
217− searchHistory: SearchHistoryModel {}
218− text: "%^$%^%^&%^&%^$%GHR%"
215+ title: "%^$%^%^&%^&%^$%GHR%"
216+ scopeStyle: QtObject {
217+ readonly property color foreground: "grey"
218+ readonly property url headerLogo: showImageCheckBox.checked ? pageHeader.titleImageSource : ""
219+ }
220+ showBackButton: showBackButtonCheckBox.checked
221+
222+ property string titleImageSource: Qt.resolvedUrl("tst_PageHeader/logo-ubuntu-orange.svg")
223+ property date lastBackClicked
224+ onBackClicked: lastBackClicked = new Date()
219225 }
220226
221227 Row {
@@ -251,5 +257,35 @@ Item {
251257 anchors.verticalCenter: parent.verticalCenter
252258 }
253259 }
260+
261+ Row {
262+ spacing: units.gu(1)
263+ anchors {
264+ left: parent.left
265+ right: parent.right
266+ }
267+ CheckBox {
268+ id: showBackButtonCheckBox
269+ }
270+ Label {
271+ text: "Back button enabled (Last clicked: " + Qt.formatTime(pageHeader.lastBackClicked, "hh:mm:ss") + ")"
272+ anchors.verticalCenter: parent.verticalCenter
273+ }
274+ }
275+
276+ Row {
277+ spacing: units.gu(1)
278+ anchors {
279+ left: parent.left
280+ right: parent.right
281+ }
282+ CheckBox {
283+ id: showImageCheckBox
284+ }
285+ Label {
286+ text: "Show image instead of title"
287+ anchors.verticalCenter: parent.verticalCenter
288+ }
289+ }
254290 }
255291}
tests/qmltests/Components/tst_PageHeader/logo-ubuntu-orange.svgnew file+60
@@ -0,0 +1,60 @@
1+<?xml version="1.0" encoding="utf-8"?>
2+<!-- Generator: Adobe Illustrator 17.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5+ width="107px" height="25px" viewBox="0 0 107 25" enable-background="new 0 0 107 25" xml:space="preserve">
6+<g id="BK">
7+</g>
8+<g id="Comp">
9+ <circle fill="#DD4814" cx="100.596" cy="7.374" r="6.403"/>
10+ <path fill="#FFFFFF" d="M96.6,6.605c-0.424,0-0.768,0.344-0.768,0.77c0,0.423,0.344,0.768,0.768,0.768
11+ c0.425,0,0.772-0.345,0.772-0.768C97.371,6.949,97.025,6.605,96.6,6.605z M102.094,10.103c-0.365,0.211-0.492,0.682-0.282,1.047
12+ c0.214,0.372,0.685,0.497,1.051,0.284c0.369-0.21,0.496-0.682,0.281-1.05C102.932,10.014,102.462,9.889,102.094,10.103z
13+ M98.272,7.375c0-0.76,0.378-1.434,0.956-1.839l-0.562-0.944c-0.675,0.451-1.176,1.138-1.384,1.943
14+ c0.246,0.2,0.398,0.501,0.398,0.84c0,0.337-0.152,0.639-0.398,0.838c0.208,0.805,0.709,1.492,1.384,1.941l0.562-0.941
15+ C98.65,8.807,98.272,8.134,98.272,7.375z M100.518,5.125c1.177,0,2.14,0.902,2.24,2.052l1.098-0.019
16+ c-0.055-0.846-0.425-1.61-0.994-2.166c-0.295,0.108-0.634,0.093-0.925-0.078c-0.292-0.168-0.473-0.452-0.524-0.761
17+ c-0.285-0.077-0.584-0.12-0.895-0.12c-0.53,0-1.032,0.125-1.48,0.345l0.535,0.958C99.86,5.201,100.182,5.125,100.518,5.125z
18+ M100.518,9.622c-0.336,0-0.658-0.076-0.945-0.21l-0.535,0.958c0.447,0.221,0.95,0.344,1.48,0.344c0.312,0,0.61-0.039,0.895-0.119
19+ c0.051-0.311,0.232-0.596,0.524-0.763c0.294-0.168,0.63-0.186,0.925-0.073c0.569-0.562,0.938-1.323,0.994-2.17l-1.098-0.015
20+ C102.658,8.721,101.695,9.622,100.518,9.622z M102.094,4.646c0.368,0.213,0.838,0.088,1.051-0.282
21+ c0.214-0.367,0.087-0.839-0.281-1.052c-0.366-0.211-0.837-0.085-1.051,0.283C101.601,3.962,101.728,4.433,102.094,4.646z"/>
22+ <path fill="#DD4814" d="M12.807,24.177c-0.649,0.162-1.509,0.337-2.577,0.518c-1.068,0.184-2.304,0.276-3.704,0.276
23+ c-1.222,0-2.247-0.179-3.082-0.535c-0.833-0.355-1.503-0.858-2.01-1.509c-0.509-0.65-0.875-1.419-1.098-2.302
24+ C0.11,19.739,0,18.76,0,17.68V8.778h2.835v8.293c0,1.932,0.304,3.315,0.916,4.147c0.61,0.834,1.636,1.249,3.079,1.249
25+ c0.304,0,0.62-0.01,0.945-0.031c0.326-0.02,0.632-0.045,0.914-0.075C8.974,22.33,9.234,22.3,9.468,22.27
26+ c0.234-0.032,0.401-0.065,0.504-0.108V8.778h2.835V24.177L12.807,24.177z"/>
27+ <path fill="#DD4814" d="M19.728,9.478c0.347-0.222,0.871-0.458,1.572-0.7c0.7-0.243,1.507-0.367,2.424-0.367
28+ c1.137,0,2.148,0.205,3.033,0.609c0.886,0.406,1.632,0.977,2.243,1.709c0.607,0.731,1.069,1.605,1.385,2.622
29+ c0.317,1.016,0.474,2.135,0.474,3.355c0,1.279-0.187,2.433-0.565,3.461c-0.377,1.025-0.909,1.894-1.6,2.605
30+ c-0.692,0.714-1.524,1.26-2.502,1.647C25.219,24.807,24.121,25,22.899,25c-1.321,0-2.49-0.093-3.506-0.276
31+ c-1.016-0.183-1.849-0.367-2.501-0.549V1.46l2.837-0.488L19.728,9.478L19.728,9.478z M19.728,22.162
32+ c0.285,0.084,0.686,0.159,1.206,0.23c0.517,0.073,1.161,0.107,1.935,0.107c1.523,0,2.746-0.504,3.659-1.509
33+ c0.915-1.007,1.373-2.435,1.373-4.284c0-0.813-0.081-1.575-0.245-2.288c-0.163-0.712-0.428-1.326-0.793-1.845
34+ c-0.366-0.519-0.839-0.923-1.416-1.219c-0.582-0.297-1.278-0.444-2.09-0.444c-0.774,0-1.484,0.133-2.135,0.395
35+ c-0.651,0.267-1.149,0.541-1.495,0.825v10.032H19.728z"/>
36+ <path fill="#DD4814" d="M46.684,24.177c-0.651,0.162-1.509,0.337-2.576,0.518c-1.067,0.184-2.303,0.276-3.707,0.276
37+ c-1.219,0-2.246-0.179-3.079-0.535c-0.833-0.355-1.504-0.858-2.011-1.509c-0.511-0.65-0.875-1.419-1.098-2.302
38+ c-0.224-0.886-0.335-1.865-0.335-2.944V8.778h2.835v8.293c0,1.932,0.304,3.315,0.914,4.147c0.611,0.834,1.636,1.249,3.08,1.249
39+ c0.305,0,0.622-0.01,0.947-0.031c0.325-0.02,0.629-0.045,0.915-0.075c0.284-0.032,0.544-0.062,0.779-0.092
40+ c0.232-0.032,0.4-0.065,0.503-0.108V8.778h2.835v15.399H46.684z"/>
41+ <path fill="#DD4814" d="M50.769,9.236c0.651-0.164,1.514-0.335,2.593-0.521c1.077-0.18,2.316-0.272,3.719-0.272
42+ c1.263,0,2.308,0.178,3.142,0.533c0.834,0.356,1.499,0.853,1.997,1.494c0.498,0.64,0.849,1.408,1.053,2.3
43+ c0.202,0.898,0.304,1.882,0.304,2.959v8.905h-2.836V16.34c0-0.977-0.067-1.809-0.198-2.501c-0.132-0.693-0.351-1.249-0.656-1.676
44+ c-0.303-0.429-0.712-0.738-1.221-0.93c-0.506-0.197-1.139-0.292-1.888-0.292c-0.306,0-0.622,0.012-0.944,0.032
45+ c-0.326,0.021-0.637,0.046-0.931,0.076c-0.298,0.03-0.56,0.067-0.794,0.107c-0.235,0.041-0.402,0.072-0.503,0.091v13.386h-2.837
46+ L50.769,9.236L50.769,9.236z"/>
47+ <path fill="#DD4814" d="M70.132,8.778h6.008v2.378h-6.008v7.319c0,0.792,0.062,1.45,0.185,1.966
48+ c0.121,0.52,0.304,0.927,0.548,1.221c0.244,0.292,0.549,0.501,0.914,0.625c0.367,0.122,0.794,0.182,1.28,0.182
49+ c0.874,0,1.565-0.096,2.076-0.29c0.507-0.193,0.853-0.329,1.035-0.412l0.609,2.32c-0.283,0.142-0.787,0.324-1.508,0.547
50+ c-0.722,0.225-1.539,0.338-2.454,0.338c-1.078,0-1.968-0.137-2.669-0.413c-0.701-0.275-1.265-0.685-1.692-1.234
51+ c-0.427-0.548-0.727-1.224-0.898-2.027c-0.175-0.805-0.26-1.734-0.26-2.79V4.356l2.833-0.489v4.911H70.132z"/>
52+ <path fill="#DD4814" d="M91.57,24.177c-0.653,0.162-1.51,0.337-2.579,0.518c-1.067,0.184-2.3,0.276-3.701,0.276
53+ c-1.222,0-2.247-0.179-3.081-0.535c-0.836-0.355-1.506-0.858-2.013-1.509c-0.509-0.65-0.873-1.419-1.1-2.302
54+ c-0.221-0.886-0.335-1.865-0.335-2.944V8.778h2.838v8.293c0,1.932,0.305,3.315,0.914,4.147c0.609,0.834,1.637,1.249,3.081,1.249
55+ c0.304,0,0.618-0.01,0.945-0.031c0.323-0.02,0.629-0.045,0.914-0.075c0.284-0.032,0.546-0.062,0.777-0.092
56+ c0.234-0.032,0.403-0.065,0.505-0.108V8.778h2.837v15.399H91.57z"/>
57+</g>
58+<g id="Grid" display="none">
59+</g>
60+</svg>
tests/qmltests/Dash/Previews/tst_Preview.qml+2−2
@@ -73,8 +73,8 @@ Rectangle {
7373
7474 function test_containOnFocus() {
7575 waitForRendering(preview);
76− tryCompareFunction(function () { return findChild(preview, "widget-9") != null }, true);
77− var widget = findChild(preview, "widget-9");
76+ tryCompareFunction(function () { return findChild(preview, "widget-10") != null }, true);
77+ var widget = findChild(preview, "widget-10");
7878
7979 var bottomLeft = preview.mapFromItem(widget, 0, widget.height);
8080 verify(bottomLeft.y > preview.height);
tests/qmltests/Dash/Previews/tst_PreviewPayments.qmlnew file+100
@@ -0,0 +1,100 @@
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/Dash/Previews"
20+import Unity.Test 0.1 as UT
21+import Ubuntu.Components 0.1
22+
23+Rectangle {
24+ id: root
25+ width: units.gu(60)
26+ height: units.gu(80)
27+
28+ property var jsonPurchase: {
29+ "source": { "price" : 0.99, "currency": "USD", "store_item_id": "com.example.package" }
30+ }
31+
32+ property var jsonPurchaseError: {
33+ "source": { "price" : 0.99, "currency": "USD", "store_item_id": "com.example.invalid" }
34+ }
35+
36+ SignalSpy {
37+ id: spy
38+ target: previewPayments
39+ signalName: "triggered"
40+ }
41+
42+ PreviewPayments {
43+ id: previewPayments
44+ widgetId: "previewPayments"
45+ width: units.gu(30)
46+ }
47+
48+ UT.UnityTestCase {
49+ name: "PreviewPaymentsTest"
50+ when: windowShown
51+
52+ function cleanup()
53+ {
54+ spy.clear();
55+ }
56+
57+ function test_purchase_text_display() {
58+ previewPayments.widgetData = jsonPurchase;
59+
60+ var button = findChild(root, "paymentButton");
61+ verify(button != null, "Button not found.");
62+ compare(button.text, "0.99USD");
63+ }
64+
65+ function test_purchase_completed() {
66+ // Exercise the purchaseCompleted signal here.
67+ previewPayments.widgetData = jsonPurchase;
68+
69+ var button = findChild(root, "paymentButton");
70+ verify(button != null, "Button not found.");
71+
72+ mouseClick(button, button.width / 2, button.height / 2);
73+
74+ spy.wait();
75+
76+ var args = spy.signalArguments[0];
77+ compare(args[0], "previewPayments");
78+ compare(args[1], "purchaseCompleted");
79+ compare(args[2], jsonPurchase["source"]);
80+ }
81+
82+ function test_purchase_error() {
83+ // The mock Payments triggers an error when com.example.invalid is
84+ // passed to it as store_item_id. Exercise it here
85+ previewPayments.widgetData = jsonPurchaseError;
86+
87+ var button = findChild(root, "paymentButton");
88+ verify(button != null, "Button not found.");
89+
90+ mouseClick(button, button.width / 2, button.height / 2);
91+
92+ spy.wait();
93+
94+ var args = spy.signalArguments[0];
95+ compare(args[0], "previewPayments");
96+ compare(args[1], "purchaseError");
97+ compare(args[2], jsonPurchaseError["source"]);
98+ }
99+ }
100+}
tests/qmltests/Dash/Previews/tst_PreviewRatingDisplay.qml+13
@@ -108,5 +108,18 @@ Rectangle {
108108 }
109109 }
110110 }
111+
112+ function test_non_interactive() {
113+ previewRatingDisplay.widgetData = reviewsModel1;
114+
115+ var reviewItem = findChild(previewRatingDisplay, "reviewItem1");
116+ var rating = findChild(reviewItem, "rating");
117+
118+ compare(rating.value, reviewsModel1["reviews"][1]["rating"]);
119+
120+ // Tap on first star
121+ mouseClick(rating, 0, 0);
122+ compare(rating.value, reviewsModel1["reviews"][1]["rating"]);
123+ }
111124 }
112125}
tests/qmltests/Dash/tst_Dash.qml−39
@@ -70,24 +70,6 @@ Item {
7070 ]
7171 }
7272
73− function test_set_current_scope_data() {
74− return get_scope_data()
75− }
76−
77− function test_set_current_scope(data) {
78− // wait for scopes to load
79− tryCompare(scopes, "loaded", true);
80−
81− var tabbar = findChild(dash, "tabbar");
82− verify(tabbar != undefined)
83− var dashContent = findChild(dash, "dashContent");
84− var current_index = dashContent.currentIndex;
85−
86− dash.setCurrentScope(data.tag, true /* animate */, false /* reset */);
87− compare(dashContent.currentIndex, data.shouldBeVisible ? data.visualIndex : current_index);
88− compare(tabbar.selectedIndex, data.shouldBeVisible ? data.visualIndex : current_index);
89− }
90−
9173 function test_show_scope_on_load_data() {
9274 return get_scope_data()
9375 }
@@ -109,26 +91,5 @@ Item {
10991 verify(dashContentList != undefined);
11092 tryCompare(dashContentList, "currentIndex", data.visualIndex);
11193 }
112−
113− function test_dash_bar_set_index_connection_data() {
114− return get_scope_data()
115− }
116−
117− function test_dash_bar_set_index_connection(data) {
118− if (data.shouldBeVisible == false) {
119− console.log("Not testing " + data.tag + ": not visible");
120− return;
121− }
122− // wait for scopes to load
123− tryCompare(scopes, "loaded", true);
124−
125− var tabbar = findChild(dash, "tabbar");
126− verify(tabbar != undefined)
127− var dashContent = findChild(dash, "dashContent");
128− var current_index = dashContent.currentIndex;
129−
130− tabbar.model.selectedIndex = data.visualIndex;
131− compare(dashContent.currentIndex, data.shouldBeVisible ? data.visualIndex : current_index);
132− }
13394 }
13495}
tests/qmltests/Dash/tst_DashContent.qml+4−152
@@ -47,8 +47,6 @@ Item {
4747 model: scopesModel
4848 }
4949 scopes : scopesModel
50−
51− searchHistory: SearchHistoryModel {}
5250 }
5351
5452 SignalSpy {
@@ -194,8 +192,9 @@ Item {
194192 function test_scope_mapping(data) {
195193 dashContent.setCurrentScopeAtIndex(data.index, true, false);
196194 tryCompareFunction(get_current_item_object_name, data.objectName)
197− var pageHeader = findChild(dashContent, "pageHeader");
198− compare(pageHeader.scope, scopesModel.getScope(data.index));
195+ var scopeView = findChild(dashContent, data.objectName);
196+ var pageHeader = findChild(scopeView, "innerPageHeader");
197+ compare(pageHeader.title, scopesModel.getScope(data.index).name);
199198 }
200199
201200 function test_is_active_data() {
@@ -217,67 +216,6 @@ Item {
217216 tryCompare(scopesModel.getScope(2), "isActive", data.active2);
218217 }
219218
220− function doFindMusicButton(parent) {
221− for (var i = 0; i < parent.children.length; i++) {
222− var c = parent.children[i];
223− if (UT.Util.isInstanceOf(c, "AbstractButton") && parent.x >= 0) {
224− for (var ii = 0; ii < c.children.length; ii++) {
225− var cc = c.children[ii];
226− if (UT.Util.isInstanceOf(cc, "Label") && cc.text == "Music") {
227− return c;
228− }
229− }
230− }
231− var r = doFindMusicButton(c);
232− if (r !== undefined) {
233− return r;
234− }
235− }
236− return undefined;
237− }
238−
239− function findMusicButton() {
240− // We need to find a AbstractButton that has a Label child
241− // with text Music and it's parent x is >= 0
242− var tabbar = findChild(dashContent, "tabbar");
243− return doFindMusicButton(tabbar);
244− }
245−
246− function test_tabBar_index_change() {
247− tryCompare(scopesModel, "loaded", true);
248− var tabbar = findChild(dashContent, "tabbar");
249−
250− tryCompare(dashContent, "currentIndex", 0);
251− tryCompare(tabbar, "selectedIndex", 0);
252− tryCompare(tabbar, "selectionMode", false);
253−
254− mouseClick(tabbar, units.gu(5), units.gu(5))
255−
256− tryCompare(tabbar, "selectionMode", true);
257− tryCompare(tabbar, "selectedIndex", 0);
258− tryCompare(dashContent, "currentIndex", 0);
259−
260− var button;
261− tryCompareFunction(function() { button = findMusicButton(); return button != undefined; }, true);
262− waitForRendering(button);
263−
264− tryCompareFunction(function() { return button.opacity > 0; }, true);
265− mouseClick(button, button.width / 2, button.height / 2)
266−
267− tryCompare(tabbar, "selectionMode", false);
268− tryCompare(tabbar, "selectedIndex", 1);
269− tryCompare(dashContent, "currentIndex", 1);
270− }
271−
272− function test_tabBar_listens_to_index_change() {
273− var tabbar = findChild(dashContent, "tabbar");
274− tryCompare(dashContent, "currentIndex", 0);
275− compare(tabbar.selectedIndex, 0);
276− var dashContentList = findChild(dashContent, "dashContentList");
277− dashContentList.currentIndex = 1;
278− compare(tabbar.selectedIndex, 1);
279− }
280−
281219 function checkFlickMovingAndNotInteractive()
282220 {
283221 var dashContentList = findChild(dashContent, "dashContentList");
@@ -300,93 +238,6 @@ Item {
300238 tryCompareFunction(checkFlickMovingAndNotInteractive, true);
301239 }
302240
303− function openPreview() {
304− tryCompareFunction(function() {
305− var filterGrid = findChild(dashContent, "0");
306− if (filterGrid != null) {
307− var tile = findChild(filterGrid, "delegate0");
308− return tile != null;
309− }
310− return false;
311− },
312− true);
313− var tile = findChild(findChild(dashContent, "0"), "delegate0");
314− mouseClick(tile, tile.width / 2, tile.height / 2);
315− var previewListView = findChild(dashContent, "dashContentPreviewList");
316− tryCompare(previewListView, "open", true);
317− tryCompare(previewListView, "x", 0);
318− }
319−
320− function closePreview() {
321− var closePreviewMouseArea = findChild(dashContent, "dashContentPreviewList_pageHeader_backButton");
322− mouseClick(closePreviewMouseArea, closePreviewMouseArea.width / 2, closePreviewMouseArea.height / 2);
323−
324− var previewListView = findChild(dashContent, "dashContentPreviewList");
325− tryCompare(previewListView, "open", false);
326− }
327−
328− function test_previewOpenClose() {
329− var previewListView = findChild(dashContent, "dashContentPreviewList");
330− tryCompare(previewListView, "open", false);
331−
332− var categoryListView = findChild(dashContent, "categoryListView");
333− categoryListView.positionAtBeginning();
334−
335− openPreview();
336− closePreview();
337− }
338−
339− function test_showPreviewCarousel() {
340− tryCompareFunction(function() {
341− var scope = findChild(dashContent, "MockScope1 loader");
342− if (scope != null) {
343− var dashCategory1 = findChild(scope, "dashCategory1");
344− if (dashCategory1 != null) {
345− var tile = findChild(dashCategory1, "carouselDelegate1");
346− return tile != null;
347− }
348− }
349− return false;
350− },
351− true);
352−
353− var previewListView = findChild(dashContent, "dashContentPreviewList");
354− tryCompare(previewListView, "open", false);
355−
356− var scope = findChild(dashContent, "MockScope1 loader");
357− var dashCategory1 = findChild(scope, "dashCategory1");
358− var tile = findChild(dashCategory1, "carouselDelegate1");
359− mouseClick(tile, tile.width / 2, tile.height / 2);
360− tryCompare(previewListView, "open", true);
361− tryCompare(previewListView, "x", 0);
362−
363− closePreview();
364− }
365−
366− function test_previewCycle() {
367− var categoryListView = findChild(dashContent, "categoryListView");
368− categoryListView.positionAtBeginning();
369−
370− var previewListView = findChild(dashContent, "dashContentPreviewList");
371− tryCompare(previewListView, "open", false);
372− var previewListViewList = findChild(dashContent, "dashContentPreviewList_listView");
373−
374− openPreview();
375−
376− // flick to the next previews
377− tryCompare(previewListView, "count", 15);
378− for (var i = 1; i < previewListView.count; ++i) {
379− mouseFlick(previewListView, previewListView.width - units.gu(1),
380− previewListView.height / 2,
381− units.gu(2),
382− previewListView.height / 2);
383− tryCompare(previewListViewList, "moving", false);
384− tryCompare(previewListView.currentItem, "objectName", "previewItem" + i);
385−
386− }
387− closePreview();
388− }
389−
390241 function test_carouselAspectRatio() {
391242 tryCompareFunction(function() {
392243 var scope = findChild(dashContent, "MockScope1 loader");
@@ -461,6 +312,7 @@ Item {
461312 compare(allButton.visible, true);
462313 compare(backButton.visible, true);
463314
315+ waitForRendering(departmentListView);
464316 mouseClick(allButton, 0, 0);
465317 compare(dashDepartments.showList, false);
466318 tryCompare(dashDepartments.currentDepartment, "departmentId", "middle2");
tests/qmltests/Dash/tst_GenericScopeView.qml+98−45
@@ -37,10 +37,6 @@ Item {
3737
3838 Scopes {
3939 id: scopes
40−
41− onLoadedChanged: {
42− genericScopeView.scope = scopes.getScope(2)
43− }
4440 }
4541
4642 property Item applicationManager: Item {
@@ -48,24 +44,17 @@ Item {
4844 signal mainStageFocusedApplicationChanged()
4945 }
5046
51− PageHeaderLabel {
52− id: testPageHeader
53− searchHistory: SearchHistoryModel {}
54− text: genericScopeView.scope ? genericScopeView.scope.name : ""
55− width: parent.width
56− }
57−
5847 GenericScopeView {
5948 id: genericScopeView
6049 anchors.fill: parent
61− previewListView: previewListView
62− pageHeader: testPageHeader
63− tabBarHeight: testPageHeader.implicitHeight
6450
6551 UT.UnityTestCase {
52+ id: testCase
6653 name: "GenericScopeView"
6754 when: scopes.loaded && windowShown
6855
56+ property Item previewListView: findChild(genericScopeView, "previewListView")
57+
6958 function init() {
7059 genericScopeView.scope = scopes.getScope(2)
7160 shell.width = units.gu(120)
@@ -73,37 +62,28 @@ Item {
7362 tryCompare(genericScopeView.categoryView, "contentY", 0)
7463 }
7564
76− function test_isCurrent() {
77− genericScopeView.isCurrent = true
78− testPageHeader.searchQuery = "test"
79− previewListView.open = true
80− genericScopeView.isCurrent = false
81− tryCompare(testPageHeader, "searchQuery", "")
82− tryCompare(previewListView, "open", false);
83− }
84−
8565 function test_isActive() {
8666 tryCompare(genericScopeView.scope, "isActive", false)
8767 genericScopeView.isCurrent = true
8868 tryCompare(genericScopeView.scope, "isActive", true)
89− previewListView.open = true
69+ testCase.previewListView.open = true
9070 tryCompare(genericScopeView.scope, "isActive", false)
91− previewListView.open = false
71+ testCase.previewListView.open = false
9272 tryCompare(genericScopeView.scope, "isActive", true)
9373 genericScopeView.isCurrent = false
9474 tryCompare(genericScopeView.scope, "isActive", false)
9575 }
9676
9777 function test_showDash() {
98− previewListView.open = true;
78+ testCase.previewListView.open = true;
9979 scopes.getScope(2).showDash();
100− tryCompare(previewListView, "open", false);
80+ tryCompare(testCase.previewListView, "open", false);
10181 }
10282
10383 function test_hideDash() {
104− previewListView.open = true;
84+ testCase.previewListView.open = true;
10585 scopes.getScope(2).hideDash();
106− tryCompare(previewListView, "open", false);
86+ tryCompare(testCase.previewListView, "open", false);
10787 }
10888
10989 function test_searchQuery() {
@@ -170,14 +150,6 @@ Item {
170150
171151 categoryListView.positionAtBeginning();
172152
173− // wait for the header0 to be on its position
174− tryCompareFunction(
175− function() {
176− var header0 = findChild(genericScopeView, "dashSectionHeader0")
177− return header0.y == testPageHeader.height;
178− },
179− true);
180−
181153 var header0 = findChild(genericScopeView, "dashSectionHeader0")
182154 var category0 = findChild(genericScopeView, "dashCategory0")
183155 mouseClick(header0, header0.width / 2, header0.height / 2);
@@ -204,14 +176,95 @@ Item {
204176 mouseClick(header0, header0.width / 2, header0.height / 2);
205177 tryCompare(category, "filtered", true);
206178 }
207− }
208− }
209179
210− PreviewListView {
211− id: previewListView
212− anchors.fill: parent
213− visible: false
214− pageHeader: testPageHeader
215− scope: genericScopeView.scope
180+ function openPreview() {
181+ tryCompareFunction(function() {
182+ var filterGrid = findChild(genericScopeView, "0");
183+ if (filterGrid != null) {
184+ var tile = findChild(filterGrid, "delegate0");
185+ return tile != null;
186+ }
187+ return false;
188+ },
189+ true);
190+ var tile = findChild(findChild(genericScopeView, "0"), "delegate0");
191+ mouseClick(tile, tile.width / 2, tile.height / 2);
192+ tryCompare(testCase.previewListView, "open", true);
193+ tryCompare(testCase.previewListView, "x", 0);
194+ }
195+
196+ function closePreview() {
197+ var closePreviewMouseArea = findChild(genericScopeView, "innerPageHeader");
198+ mouseClick(closePreviewMouseArea, units.gu(2), units.gu(2));
199+
200+ tryCompare(testCase.previewListView, "open", false);
201+ }
202+
203+ function test_previewOpenClose() {
204+ tryCompare(testCase.previewListView, "open", false);
205+
206+ var categoryListView = findChild(genericScopeView, "categoryListView");
207+ categoryListView.positionAtBeginning();
208+
209+ openPreview();
210+ closePreview();
211+ }
212+
213+ function test_showPreviewCarousel() {
214+ tryCompareFunction(function() {
215+ var dashCategory1 = findChild(genericScopeView, "dashCategory1");
216+ if (dashCategory1 != null) {
217+ var tile = findChild(dashCategory1, "carouselDelegate1");
218+ return tile != null;
219+ }
220+ return false;
221+ },
222+ true);
223+
224+ tryCompare(testCase.previewListView, "open", false);
225+
226+ var dashCategory1 = findChild(genericScopeView, "dashCategory1");
227+ var tile = findChild(dashCategory1, "carouselDelegate1");
228+ mouseClick(tile, tile.width / 2, tile.height / 2);
229+ tryCompare(tile, "explicitlyScaled", true);
230+ mouseClick(tile, tile.width / 2, tile.height / 2);
231+ tryCompare(testCase.previewListView, "open", true);
232+ tryCompare(testCase.previewListView, "x", 0);
233+
234+ closePreview();
235+ }
236+
237+ function test_previewCycle() {
238+ var categoryListView = findChild(genericScopeView, "categoryListView");
239+ categoryListView.positionAtBeginning();
240+
241+ tryCompare(testCase.previewListView, "open", false);
242+ var previewListViewList = findChild(previewListView, "listView");
243+
244+ openPreview();
245+
246+ // flick to the next previews
247+ tryCompare(testCase.previewListView, "count", 15);
248+ for (var i = 1; i < testCase.previewListView.count; ++i) {
249+ mouseFlick(testCase.previewListView, testCase.previewListView.width - units.gu(1),
250+ testCase.previewListView.height / 2,
251+ units.gu(2),
252+ testCase.previewListView.height / 2);
253+ tryCompare(previewListViewList, "moving", false);
254+ tryCompare(testCase.previewListView.currentItem, "objectName", "previewItem" + i);
255+
256+ }
257+ closePreview();
258+ }
259+
260+ function test_haeder_logo() {
261+ genericScopeView.scope = scopes.getScope(3);
262+
263+ var image = findChild(genericScopeView, "titleImage");
264+ verify(image, "Could not find the title image");
265+ compare(image.source, Qt.resolvedUrl("../Components/tst_PageHeader/logo-ubuntu-orange.svg"), "Title image has the wrong source");
266+
267+ }
268+ }
216269 }
217270}
tests/qmltests/Panel/Indicators/tst_DefaultIndicatorPage.qml+1
@@ -31,6 +31,7 @@ Item {
3131 anchors.fill: parent
3232 contentActive: true
3333
34+ menuModel: UnityMenuModel {}
3435 busName: "test"
3536 actionsObjectPath: "test"
3637 menuObjectPath: "test"
tests/qmltests/Panel/Indicators/tst_DefaultIndicatorWidget.qml+3−40
@@ -33,6 +33,7 @@ Item {
3333 top: parent.top
3434 }
3535
36+ menuModel: UnityMenuModel {}
3637 busName: "test"
3738 actionsObjectPath: "test"
3839 deviceMenuObjectPath: "test"
@@ -41,12 +42,6 @@ Item {
4142
4243 iconSize: units.gu(3.2)
4344 height: units.gu(3)
44−
45− rootActionState {
46− icons: [ "image://theme/audio-volume-high", "image://theme/audio-volume-low" ]
47− leftLabel: "left"
48− rightLabel: "right"
49− }
5045 }
5146
5247 UT.UnityTestCase {
@@ -57,41 +52,9 @@ Item {
5752 widget.rootActionState.icons = [];
5853 widget.rootActionState.leftLabel = "";
5954 widget.rootActionState.rightLabel = "";
60− wait(50);
61− }
62−
63− function test_guRoundedWidth_data() {
64− return [
65− { tag: "empty", icons: [], leftLabel: "", rightLabel: "" },
66− { tag: "1-icon-no-label", icons: [ "image://theme/audio-volume-high" ], leftLabel: "", rightLabel: "" },
67− { tag: "2-icon-no-label", icons: [ "image://theme/audio-volume-high", "image://theme/audio-volume-low" ], leftLabel: "", rightLabel: "" },
68− { tag: "no-icon-l-label", icons: [], leftLabel: "left", rightLabel: "" },
69− { tag: "no-icon-lr-label", icons: [], leftLabel: "left", rightLabel: "right" },
70− { tag: "1-icon-l-label", icons: [ "image://theme/audio-volume-high" ], leftLabel: "left", rightLabel: "" },
71− { tag: "1-icon-lr-label", icons: [ "image://theme/audio-volume-high" ], leftLabel: "left", rightLabel: "right" },
72− { tag: "2-icon-l-label", icons: [ "image://theme/audio-volume-high", "image://theme/audio-volume-low" ], leftLabel: "left", rightLabel: "" },
73− { tag: "2-icon-lr-label", icons: [ "image://theme/audio-volume-high", "image://theme/audio-volume-low" ], leftLabel: "left", rightLabel: "right" }
74− ];
75− }
76−
77− function test_guRoundedWidth(data) {
78− widget.rootActionState.icons = data.icons
79− widget.rootActionState.leftLabel = data.leftLabel;
80− widget.rootActionState.rightLabel = data.rightLabel;
81− wait(50);
82−
83− compare(widget.width, guRoundUp(widget.width));
84− }
85− }
86−
87− // TODO: Use toolkit function https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1242575
88− function guRoundUp(width) {
89− if (width == 0) {
90− return 0;
55+ waitForRendering(widget)
9156 }
92− var gu1 = units.gu(1.0);
93− var mod = (width % gu1);
9457
95− return mod == 0 ? width : width + (gu1 - mod);
58+ // FIXME: add tests
9659 }
9760}
tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+65−2
@@ -18,15 +18,16 @@ import QtQuick 2.0
1818import QtTest 1.0
1919import Unity.Test 0.1 as UT
2020import QMenuModel 0.1
21−import Unity.Indicators 0.1 as Indicators
2221import Utils 0.1 as Utils
22+import "../../../../qml/Panel/Indicators"
23+
2324
2425Item {
2526 id: testView
2627 width: units.gu(40)
2728 height: units.gu(70)
2829
29− Indicators.MenuItemFactory {
30+ MenuItemFactory {
3031 id: factory
3132 menuModel: UnityMenuModel {}
3233 }
@@ -97,6 +98,8 @@ Item {
9798 { tag: 'switch2', type: "com.canonical.indicator.switch", objectName: "switchMenu" },
9899 { tag: 'alarm', type: "com.canonical.indicator.alarm", objectName: "alarmMenu" },
99100 { tag: 'appointment', type: "com.canonical.indicator.appointment", objectName: "appointmentMenu" },
101+ { tag: 'transfer', type: "com.canonical.indicator.transfer", objectName: "transferMenu" },
102+ { tag: 'buttonSection', type: "com.canonical.indicator.button-section", objectName: "buttonSectionMenu" },
100103
101104 { tag: 'messageItem', type: "com.canonical.indicator.messages.messageitem", objectName: "messageItem" },
102105 { tag: 'sourceItem', type: "com.canonical.indicator.messages.sourceitem", objectName: "groupedMessage" },
@@ -427,6 +430,66 @@ Item {
427430 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
428431 }
429432
433+ function test_create_transferMenu_data() {
434+ return [
435+ {tag: "queued", label: "testLabel1", enabled: true, active: true, icon: "file:///testIcon1", progress: 0, stateText: "In queue…" },
436+ {tag: "running", label: "testLabel2", enabled: true, active: true, icon: "file:///testIcon2", progress: 0.1, stateText: "1 minute, 40 seconds remaining" },
437+ {tag: "paused", label: "testLabel3", enabled: true, active: true, icon: "file:///testIcon3", progress: 0.5, stateText: "Paused, tap to resume" },
438+ {tag: "cancelled", label: "testLabel4", enabled: true, active: true, icon: "file:///testIcon4", progress: 0.4, stateText: "Canceled" },
439+ {tag: "finished", label: "testLabel5", enabled: false, active: false, icon: "file:///testIcon5", progress: 1.0, stateText: "Finished" },
440+ {tag: "error", label: "testLabel6", enabled: false, active: true, icon: "file:///testIcon6", progress: 0, stateText: "Failed, tap to retry" },
441+ ];
442+ }
443+
444+ function test_create_transferMenu(data) {
445+ menuData.type = "com.canonical.indicator.transfer";
446+ menuData.label = data.label;
447+ menuData.sensitive = data.enabled;
448+ menuData.icon = data.icon;
449+ menuData.ext = {
450+ 'xCanonicalUid': data.tag
451+ };
452+
453+ loader.data = menuData;
454+ loader.sourceComponent = factory.load(menuData);
455+ tryCompareFunction(function() { return loader.item != undefined; }, true);
456+ compare(loader.item.objectName, "transferMenu", "Should have created a transfer menu");
457+
458+ compare(loader.item.text, data.label, "Label does not match data");
459+ compare(loader.item.iconSource, data.icon, "Icon does not match data");
460+ compare(loader.item.enabled, data.enabled, "Enabled does not match data");
461+ compare(loader.item.progress, data.progress, "Icon does not match data");
462+ compare(loader.item.active, data.active, "Active does not match data");
463+ compare(loader.item.stateText, data.stateText, "State text does not match data");
464+ }
465+
466+ function test_create_buttonSectionMenu_data() {
467+ return [
468+ {label: "testLabel1", enabled: true, buttonText: "buttonLabel1", icon: "file:///testIcon1" },
469+ {label: "testLabel2", enabled: false, buttonText: "buttonLabel1", icon: "file:///testIcon2" },
470+ ];
471+ }
472+
473+ function test_create_buttonSectionMenu(data) {
474+ menuData.type = "com.canonical.indicator.button-section";
475+ menuData.label = data.label;
476+ menuData.sensitive = data.enabled;
477+ menuData.icon = data.icon;
478+ menuData.ext = {
479+ 'xCanonicalExtraLabel': data.buttonText
480+ };
481+
482+ loader.data = menuData;
483+ loader.sourceComponent = factory.load(menuData);
484+ tryCompareFunction(function() { return loader.item != undefined; }, true);
485+ compare(loader.item.objectName, "buttonSectionMenu", "Should have created a transfer menu");
486+
487+ compare(loader.item.text, data.label, "Label does not match data");
488+ compare(loader.item.iconSource, data.icon, "Icon does not match data");
489+ compare(loader.item.enabled, data.enabled, "Enabled does not match data");
490+ compare(loader.item.control.text, data.buttonText, "Button text does not match data");
491+ }
492+
430493 function test_create_wifiSection_data() {
431494 return [
432495 {label: "testLabel1", busy: false },
tests/qmltests/Panel/Indicators/tst_MessageMenuItemFactory.qml+2−2
@@ -18,15 +18,15 @@ import QtQuick 2.0
1818import QtTest 1.0
1919import Unity.Test 0.1 as UT
2020import QMenuModel 0.1
21−import Unity.Indicators 0.1 as Indicators
2221import Utils 0.1 as Utils
22+import "../../../../qml/Panel/Indicators"
2323
2424Item {
2525 id: testView
2626 width: units.gu(40)
2727 height: units.gu(70)
2828
29− Indicators.MessageMenuItemFactory {
29+ MessageMenuItemFactory {
3030 id: factory
3131 menuModel: UnityMenuModel {}
3232 menuIndex: 0
tests/qmltests/Panel/tst_ActiveCallHint.qmlnew file+165
@@ -0,0 +1,165 @@
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 Unity.Test 0.1 as UT
20+import Ubuntu.Telephony 0.1 as Telephony
21+import Unity.Application 0.1
22+import ".."
23+import "../../../qml/Panel"
24+
25+Item {
26+ width: units.gu(40)
27+ height: units.gu(20)
28+
29+ Telephony.CallEntry {
30+ id: call1
31+ phoneNumber: "+447812221111"
32+ }
33+
34+ Telephony.CallEntry {
35+ id: call2
36+ phoneNumber: "+447812221112"
37+ }
38+
39+ Telephony.CallEntry {
40+ id: call3
41+ phoneNumber: "+447812221113"
42+ }
43+
44+ ActiveCallHint {
45+ id: callHint
46+ anchors {
47+ top: parent.top
48+ left:parent.left
49+ right:parent.right
50+ }
51+ height: units.gu(3)
52+ labelSwitchInterval: 2000
53+ }
54+
55+ Component.onCompleted: {
56+ contactWactherData.contactData = {
57+ "+447812221113": {
58+ "alias": "Bob's Uncle"
59+ }
60+ };
61+ callManager.foregroundCall = call3;
62+ }
63+
64+ UT.UnityTestCase {
65+ name: "ActiveCallHint"
66+ when: windowShown
67+
68+ function init() {
69+ callManager.foregroundCall = null;
70+ callManager.backgroundCall = null;
71+ callHint.labelSwitchInterval = 300;
72+
73+ ApplicationManager.stopApplication("dialer-app");
74+ }
75+
76+ function test_activeHint_data() {
77+ return [
78+ { tag: "noCall-callNotVisible", dialer: false, call: null, visible: false, expected: false },
79+ { tag: "noCall-callVisible", dialer: false, call: null, visible: true, expected: false },
80+ { tag: "hasCall-callNotVisible", dialer: false, call: call1, visible: false, expected: true },
81+ { tag: "hasCall-callVisible", dialer: false, call: call1, visible: true, expected: true },
82+
83+ { tag: "dialerNotFocused-noCall-callNotVisible", dialer: true, focused: false, call: null, visible: false, expected: false },
84+ { tag: "dialerNotFocused-noCall-callVisible", dialer: true, focused: false, call: null, visible: true, expected: false },
85+ { tag: "dialerNotFocused-hasCall-callNotVisible", dialer: true, focused: false, call: call1, visible: false, expected: true },
86+ { tag: "dialerNotFocused-hasCall-callVisible", dialer: true, focused: false, call: call1, visible: true, expected: true },
87+
88+ { tag: "dialerFocused-noCall-callNotVisible", dialer: true, focused: true, call: null, visible: false, expected: false },
89+ { tag: "dialerFocused-noCall-callVisible", dialer: true, focused: true, call: null, visible: true, expected: true },
90+ { tag: "dialerFocused-hasCall-callNotVisible", dialer: true, focused: true, call: call1, visible: false, expected: false },
91+ { tag: "dialerFocused-hasCall-callVisible", dialer: true, focused: true, call: call1, visible: true, expected: true },
92+ ];
93+ }
94+
95+ function test_activeHint(data) {
96+ if (data.dialer) {
97+ var application = ApplicationManager.startApplication("dialer-app");
98+ tryCompare(ApplicationManager, "focusedApplicationId", "dialer-app");
99+ tryCompare(application, "state", ApplicationInfo.Running);
100+
101+ if (!data.focused) { ApplicationManager.unfocusCurrentApplication(); }
102+ }
103+ callManager.foregroundCall = data.call;
104+ callManager.callIndicatorVisible = data.visible;
105+
106+ compare(callHint.active, data.expected, "Call hint should be active when callIndicatorVisible=true");
107+ }
108+
109+ function test_currentCall_data() {
110+ return [
111+ { tag: "empty", foreground: null, background: null, active: false, label: "" },
112+ { tag: "foreground", foreground: call1, background: null, active: true, label: "+447812221111" },
113+ { tag: "background", foreground: null, background: call2, active: true, label: "+447812221112" },
114+ { tag: "multiple", foreground: call1, background: call2, active: true, label: "+447812221111" },
115+ ];
116+ }
117+
118+ function test_currentCall(data) {
119+ callManager.foregroundCall = data.foreground;
120+ callManager.backgroundCall = data.background;
121+
122+ var contactLabel = findChild(callHint, "contactLabel");
123+ verify(contactLabel !== null);
124+
125+ compare(contactLabel.text, data.label, "Contact label does not match call");
126+ }
127+
128+ function test_changeContactData() {
129+ callManager.backgroundCall = call3;
130+
131+ var contactLabel = findChild(callHint, "contactLabel");
132+ verify(contactLabel !== null);
133+
134+ contactWactherData.contactData = { "+447812221113": { "alias": "Bob's Uncle" } };
135+ compare(contactLabel.text, "Bob's Uncle", "Contact label does not match call");
136+
137+ contactWactherData.contactData = { "+447812221113": { "alias": "Freddy" } };
138+ compare(contactLabel.text, "Freddy", "Contact label does not match call");
139+ }
140+
141+ function test_timeLapse() {
142+ callManager.backgroundCall = call3;
143+
144+ var timeLabel = findChild(callHint, "timeLabel");
145+ verify(timeLabel !== null);
146+
147+ var currentLabel = timeLabel.text;
148+ tryCompareFunction(function() { return timeLabel.text !== currentLabel }, true);
149+ currentLabel = timeLabel.text;
150+ tryCompareFunction(function() { return timeLabel.text !== currentLabel }, true);
151+ }
152+
153+ function test_displayedLabelChangesOverTime() {
154+ callManager.backgroundCall = call3;
155+
156+ var labelPathView = findChild(callHint, "labelPathView");
157+ verify(labelPathView !== null);
158+
159+ var currentOffset = labelPathView.offset
160+ tryCompareFunction(function() { return labelPathView.offset !== currentOffset }, true);
161+ currentOffset = labelPathView.offset
162+ tryCompareFunction(function() { return labelPathView.offset !== currentOffset }, true);
163+ }
164+ }
165+}
tests/qmltests/Panel/tst_Indicators.qml+10−21
@@ -17,6 +17,7 @@
1717import QtQuick 2.0
1818import QtTest 1.0
1919import Unity.Test 0.1 as UT
20+import Ubuntu.Components 0.1 as UC
2021import ".."
2122import "../../../qml/Panel"
2223import "../../../qml/Components"
@@ -45,13 +46,12 @@ Item {
4546 shown: false
4647 profile: "test1"
4748
48− openedHeight: parent.height - click_me.height
49+ openedHeight: parent.height - button.height
4950 }
5051
51− // Just a rect for clicking to open the indicators.
52− Rectangle {
53− id: click_me
54− color: "red"
52+ UC.Button {
53+ id: button
54+ text: indicators.shown ? "Hide" : "Show"
5555 anchors {
5656 bottom: shell.bottom
5757 left: parent.left
@@ -59,22 +59,11 @@ Item {
5959 }
6060 height: 50
6161
62− Text {
63− text: "Click Me"
64− horizontalAlignment: Text.AlignHCenter
65− verticalAlignment: Text.AlignVCenter
66− anchors.fill: parent
67−
68− MouseArea {
69− anchors.fill: parent
70−
71− onClicked: {
72− if (!indicators.shown) {
73− indicators.show();
74− } else {
75− indicators.hide();
76− }
77− }
62+ onClicked: {
63+ if (!indicators.shown) {
64+ indicators.show();
65+ } else {
66+ indicators.hide();
7867 }
7968 }
8069 }
tests/qmltests/Panel/tst_Panel.qml+147−82
@@ -17,6 +17,8 @@
1717import QtQuick 2.0
1818import QtTest 1.0
1919import Unity.Test 0.1 as UT
20+import Ubuntu.Components 0.1 as UC
21+import Ubuntu.Telephony 0.1 as Telephony
2022import ".."
2123import "../../../qml/Panel"
2224
@@ -30,42 +32,104 @@ Item {
3032 width: units.gu(40)
3133 height: units.gu(80)
3234
33− property bool searchClicked: false
34−
35− Connections {
36− target: panel
37− onSearchClicked: searchClicked = true
38− }
39−
4035 Panel {
4136 id: panel
42− anchors.fill: parent
37+ anchors {
38+ left: parent.left
39+ right: parent.right
40+ }
41+ height: parent.height - row.height
42+ fullscreenMode: false
4343
4444 indicators {
4545 profile: "test1"
46+ panelHeight: units.gu(5)
47+ }
48+ callHint {
49+ height: units.gu(4)
4650 }
51+
52+ property real panelAndSeparatorHeight: panel.indicators.panelHeight + units.dp(2)
53+ }
54+
55+
56+ Row {
57+ id: row
58+ anchors {
59+ bottom: shell.bottom
60+ left: parent.left
61+ right: parent.right
62+ }
63+ height: 50
64+
65+ UC.Button {
66+ text: panel.indicators.shown ? "Hide" : "Show"
67+ anchors {
68+ top: parent.top
69+ bottom: parent.bottom
70+ }
71+ width: parent.width/3
72+
73+ onClicked: {
74+ if (panel.indicators.shown) {
75+ panel.indicators.hide();
76+ } else {
77+ panel.indicators.show();
78+ }
79+ }
80+ }
81+
82+ UC.Button {
83+ text: panel.fullscreenMode ? "Maximize" : "FullScreen"
84+ anchors {
85+ top: parent.top
86+ bottom: parent.bottom
87+ }
88+ width: parent.width/3
89+
90+ onClicked: panel.fullscreenMode = !panel.fullscreenMode
91+ }
92+
93+ UC.Button {
94+ text: callManager.hasCalls ? "Called" : "No Calls"
95+ anchors {
96+ top: parent.top
97+ bottom: parent.bottom
98+ }
99+ width: parent.width/3
100+
101+ onClicked: {
102+ if (callManager.foregroundCall) {
103+ callManager.foregroundCall = null;
104+ } else {
105+ callManager.foregroundCall = phoneCall;
106+ }
107+ }
108+ }
109+ }
110+
111+ Telephony.CallEntry {
112+ id: phoneCall
113+ phoneNumber: "+447812221111"
47114 }
48115
49116 UT.UnityTestCase {
50117 name: "Panel"
51118 when: windowShown
52119
53− function get_window_data() {
54− return [
55− {tag: "pinned", fullscreenFlag: false, alreadyOpen: false },
56− {tag: "fullscreen", fullscreenFlag: true, alreadyOpen: false },
57− {tag: "pinned-alreadyOpen", fullscreenFlag: false, alreadyOpen: true },
58− {tag: "fullscreen-alreadyOpen", fullscreenFlag: true, alreadyOpen: true }
59− ];
60− }
61−
62120 function init() {
63121 panel.indicators.initialise();
122+ panel.fullscreenMode = false;
64123
65− searchClicked = false;
66124 panel.indicators.hide();
125+ // Wait for animation to complete
67126 tryCompare(panel.indicators.hideAnimation, "running", false);
68− tryCompare(panel.indicators, "state", "initial");
127+ callManager.foregroundCall = null;
128+
129+ // Wait for the indicators to get into position.
130+ // (switches between normal and fullscreen modes are animated)
131+ var indicatorArea = findChild(panel, "indicatorArea");
132+ tryCompare(indicatorArea, "y", 0);
69133 }
70134
71135 function get_indicator_item(index) {
@@ -88,46 +152,59 @@ Item {
88152 // Pressing on the indicator panel should activate the indicator hints
89153 // and expose a portion of the conent.
90154 function test_hint() {
91− panel.fullscreenMode = false;
92− // Wait for the indicators to get into position.
93− // (switches between normal and fullscreen modes are animated)
94− tryCompare(panel.indicators, "y", 0);
95−
96155 var indicatorItemCoord = get_indicator_item_position(0);
97156
98− touchPress(panel, indicatorItemCoord.x, panel.panelHeight / 2);
157+ touchPress(panel, indicatorItemCoord.x, panel.indicators.panelHeight / 2);
99158
100159 // hint animation should be run, meaning that indicators will move downwards
101160 // by hintValue pixels without any drag taking place
102− tryCompare(panel.indicators, "height",
103− panel.indicators.panelHeight + panel.indicators.hintValue);
161+ tryCompareFunction(function() { return panel.indicators.height },
162+ panel.indicators.panelHeight + panel.indicators.hintValue);
104163 tryCompare(panel.indicators, "partiallyOpened", true);
105164 tryCompare(panel.indicators, "fullyOpened", false);
106165
107− touchRelease(panel, indicatorItemCoord.x, panel.panelHeight/2);
166+ touchRelease(panel, indicatorItemCoord.x, panel.indicators.panelHeight/2);
108167 }
109168
110169 // Pressing on the top edge of the screen should have no effect if the panel
111− // is hidden (!pinned), which is the case when a fullscreen app is being shown
170+ // is hidden (fullscreen), which is the case when a fullscreen app is being shown
112171 function test_noHintOnFullscreenMode() {
113172 panel.fullscreenMode = true;
114173 // Wait for the indicators to get into position.
115174 // (switches between normal and fullscreen modes are animated)
116− tryCompare(panel.indicators, "y", -panel.panelHeight);
175+ var indicatorArea = findChild(panel, "indicatorArea");
176+ tryCompare(indicatorArea, "y", -panel.panelHeight);
117177
118178 var indicatorItemCoord = get_indicator_item_position(0);
119179
120− touchPress(panel, indicatorItemCoord.x, panel.panelHeight / 2);
180+ touchPress(panel, indicatorItemCoord.x, panel.indicators.panelHeight / 2);
181+
182+ // Give some time for a hint animation to change things, if any
183+ wait(500);
184+
185+ // no hint animation when fullscreen
186+ compare(panel.indicators.partiallyOpened, false,
187+ "Indicator should not be partially opened when panel is pressed in" +
188+ " fullscreenmode");
189+ compare(panel.indicators.fullyOpened, false, "Indicator should not be partially" +
190+ " opened when panel is pressed in fullscreenmode");
191+
192+ touchRelease(panel, indicatorItemCoord.x, panel.panelHeight/2);
193+ }
194+
195+ // Pressing on the top edge of the indicator should have no effect if the panel
196+ // has an active call
197+ function test_noHintOnActiveCall() {
198+ callManager.foregroundCall = phoneCall;
199+
200+ var indicatorItemCoord = get_indicator_item_position(0);
201+
202+ touchPress(panel, indicatorItemCoord.x, panel.callHint.height + panel.indicators.panelHeight / 2);
121203
122204 // Give some time for a hint animation to change things, if any
123205 wait(500);
124206
125207 // no hint animation when fullscreen
126− compare(panel.indicators.y, -panel.panelHeight);
127− var indicatorRow = findChild(panel.indicators, "indicatorRow");
128− verify(indicatorRow !== null);
129− compare(indicatorRow.y, 0);
130− compare(panel.indicators.height, panel.indicators.panelHeight);
131208 compare(panel.indicators.partiallyOpened, false,
132209 "Indicator should not be partially opened when panel is pressed in" +
133210 " fullscreenmode");
@@ -137,34 +214,47 @@ Item {
137214 touchRelease(panel, indicatorItemCoord.x, panel.panelHeight/2);
138215 }
139216
140− function test_drag_show_data() { return get_window_data(); }
217+ function test_drag_show_data() {
218+ return [
219+ { tag: "pinned", fullscreenFlag: false, alreadyOpen: false, call: null,
220+ indicatorY: 0 },
221+ { tag: "fullscreen", fullscreenFlag: true, alreadyOpen: false, call: null,
222+ indicatorY: -panel.panelAndSeparatorHeight },
223+ { tag: "pinned-alreadyOpen", fullscreenFlag: false, alreadyOpen: true, call: null,
224+ indicatorY: 0 },
225+ { tag: "fullscreen-alreadyOpen", fullscreenFlag: true, alreadyOpen: true, call: null,
226+ indicatorY: 0 },
227+ { tag: "pinned-callActive", fullscreenFlag: false, alreadyOpen: false, call: phoneCall,
228+ indicatorY: 0},
229+ { tag: "fullscreen-callActive", fullscreenFlag: true, alreadyOpen: false, call: phoneCall,
230+ indicatorY: -panel.panelAndSeparatorHeight }
231+ ];
232+ }
141233
142234 // Dragging from a indicator item in the panel will gradually expose the
143235 // indicators, first by running the hint animation, then after dragging down will
144236 // expose more of the panel, binding it to the selected indicator and opening it's menu.
145237 function test_drag_show(data) {
146238 panel.fullscreenMode = data.fullscreenFlag;
239+ callManager.foregroundCall = data.call;
240+
147241 if (data.alreadyOpen) {
148242 panel.indicators.show();
149243 tryCompare(panel.indicators, "fullyOpened", true);
150244 }
151245
152− var indicatorRow = findChild(panel.indicators, "indicatorRow");
246+ var indicatorRow = findChild(panel.indicators, "indicatorRow");
153247 verify(indicatorRow !== null);
154248
155249 var menuContent = findChild(panel.indicators, "menuContent");
156− verify(indicatorRow !== null);
250+ verify(menuContent !== null);
157251
158− var menuContent = findChild(panel.indicators, "menuContent");
159− verify(indicatorRow !== null);
252+ var indicatorArea = findChild(panel, "indicatorArea");
253+ verify(indicatorArea !== null);
160254
161255 // Wait for the indicators to get into position.
162256 // (switches between normal and fullscreen modes are animated)
163− if (data.fullscreenFlag) {
164− tryCompare(panel.indicators, "y", -panel.panelHeight);
165− } else {
166− tryCompare(panel.indicators, "y", 0);
167− }
257+ tryCompareFunction(function() { return indicatorArea.y }, data.indicatorY);
168258
169259 // do this for each indicator item
170260 for (var i = 0; i < indicatorRow.row.count; i++) {
@@ -178,12 +268,12 @@ Item {
178268 var indicatorItemCoord = get_indicator_item_position(i);
179269
180270 touchPress(panel,
181− indicatorItemCoord.x, panel.panelHeight / 2);
271+ indicatorItemCoord.x, panel.indicators.panelHeight / 2);
182272
183273 // 1) Drag the mouse down
184274 touchFlick(panel,
185− indicatorItemCoord.x, panel.panelHeight / 2,
186− indicatorItemCoord.x, panel.height * 0.8,
275+ indicatorItemCoord.x, panel.indicators.panelHeight / 2,
276+ indicatorItemCoord.x, panel.height,
187277 false /* beginTouch */, false /* endTouch */);
188278
189279 // Indicators height should follow the drag, and therefore increase accordingly.
@@ -192,7 +282,7 @@ Item {
192282 function() {return panel.indicators.height >= panel.height * 0.5},
193283 true);
194284
195− touchRelease(panel, indicatorItemCoord.x, panel.height * 0.8);
285+ touchRelease(panel, indicatorItemCoord.x, panel.height);
196286
197287 compare(indicatorRow.currentItem, indicatorItem,
198288 "Incorrect item activated at position " + i);
@@ -200,43 +290,18 @@ Item {
200290
201291 // init for next indicatorItem
202292 if (!data.alreadyOpen) {
203− init();
293+ panel.indicators.hide();
294+ tryCompare(panel.indicators.hideAnimation, "running", false);
295+ tryCompare(panel.indicators, "state", "initial");
204296 }
205297 }
206298 }
207299
208− function test_search_click_when_visible() {
209− panel.fullscreenMode = false;
210− panel.searchVisible = true;
211−
212− var searchIndicator = findChild(panel, "search");
213− verify(searchIndicator !== null);
214−
215− tap(searchIndicator, 1, 1);
216−
217− compare(searchClicked, true,
218− "Tapping search indicator while it was enabled did not emit searchClicked signal");
219− }
220−
221− function test_search_click_when_not_visible() {
222− panel.fullscreenMode = false;
223− panel.searchVisible = false;
224−
225− var searchIndicator = findChild(panel, "search");
226− verify(searchIndicator !== null);
227−
228− tap(searchIndicator, 1, 1);
229−
230− compare(searchClicked, false,
231− "Tapping search indicator while it was not visible emitted searchClicked signal");
232− }
233−
234300 // Test the vertical velocity check when flicking the indicators open at an angle.
235301 // If the vertical velocity is above a specific point, we shouldnt change active indicators
236302 // if the x position changes
237303 function test_vertical_velocity_detector() {
238304 panel.fullscreenMode = false;
239− panel.searchVisible = false;
240305
241306 var indicatorRow = findChild(panel.indicators, "indicatorRow");
242307 verify(indicatorRow !== null);
@@ -249,19 +314,19 @@ Item {
249314 var indicatorItemCoordNext = get_indicator_item_position(indicatorRow.row.count - 1);
250315
251316 touchPress(panel,
252− indicatorItemCoordFirst.x, panel.panelHeight / 2);
317+ indicatorItemCoordFirst.x, panel.indicators.panelHeight / 2);
253318
254319 // 1) Drag the mouse down to hint a bit
255320 touchFlick(panel,
256− indicatorItemCoordFirst.x, panel.panelHeight / 2,
257− indicatorItemCoordFirst.x, panel.panelHeight * 2,
321+ indicatorItemCoordFirst.x, panel.indicators.panelHeight / 2,
322+ indicatorItemCoordFirst.x, panel.indicators.panelHeight * 2,
258323 false /* beginTouch */, false /* endTouch */);
259324
260325 tryCompare(indicatorRow, "currentItem", indicatorItemFirst)
261326
262327 // 1) Flick mouse down to bottom
263328 touchFlick(panel,
264− indicatorItemCoordFirst.x, panel.panelHeight * 2,
329+ indicatorItemCoordFirst.x, panel.indicators.panelHeight * 2,
265330 indicatorItemCoordNext.x, panel.height,
266331 false /* beginTouch */, true /* endTouch */,
267332 units.gu(10) /* speed */, 30 /* iterations */); // more samples needed for accurate velocity
tests/qmltests/tst_Shell.qml+1−37
@@ -112,7 +112,7 @@ Item {
112112 killApps(ApplicationManager);
113113
114114 var dashContent = findChild(shell, "dashContent");
115− dashContent.previewOpen = false;
115+ dashContent.closePreview();
116116
117117 var dashHome = findChild(shell, "clickscope loader");
118118 swipeUntilScopeViewIsReached(dashHome);
@@ -518,42 +518,6 @@ Item {
518518 tryCompare(dash, "shown", data.expectedShown);
519519 }
520520
521− function test_searchIndicatorHidesOnAppFocus() {
522− var searchIndicator = findChild(shell, "container")
523− tryCompare(searchIndicator, "opacity", 1)
524− dragLauncherIntoView();
525−
526− // Launch an app from the launcher
527− tapOnAppIconInLauncher();
528− waitUntilApplicationWindowIsFullyVisible();
529−
530− tryCompare(searchIndicator, "opacity", 0);
531− }
532−
533− function test_searchIndicatorHidesOnGreeterShown() {
534− var searchIndicator = findChild(shell, "container")
535− var greeter = findChild(shell, "greeter");
536−
537− tryCompare(searchIndicator, "opacity", 1)
538−
539− greeter.show()
540− tryCompare(greeter, "shown", true)
541− tryCompare(searchIndicator, "opacity", 0)
542− }
543−
544− function test_searchIndicatorHideOnPreviewShown() {
545− var searchIndicator = findChild(shell, "container");
546− var dashContent = findChild(shell, "dashContent");
547−
548− verify(dashContent != null);
549−
550− tryCompare(searchIndicator, "opacity", 1);
551−
552− dashContent.previewOpen = true;
553−
554− tryCompare(searchIndicator, "opacity", 0);
555− }
556−
557521 function test_focusRequestedHidesGreeter() {
558522 var greeter = findChild(shell, "greeter")
559523
tests/utils/modules/Unity/Test/Test.qmltypesnew file+59
@@ -0,0 +1,59 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Unity.Test 0.1 tests/utils/modules'
8+
9+Module {
10+ Component {
11+ name: "TestUtil"
12+ prototype: "QObject"
13+ exports: ["Unity.Test/Util 0.1"]
14+ isCreatable: false
15+ isSingleton: true
16+ exportMetaObjectRevisions: [0]
17+ Method {
18+ name: "isInstanceOf"
19+ type: "bool"
20+ Parameter { type: "QObject"; isPointer: true }
21+ Parameter { type: "string" }
22+ }
23+ Method { name: "touchEvent"; type: "TouchEventSequenceWrapper*" }
24+ }
25+ Component {
26+ name: "TouchEventSequenceWrapper"
27+ prototype: "QObject"
28+ exports: ["Unity.Test/TouchEventSequence 0.1"]
29+ isCreatable: false
30+ exportMetaObjectRevisions: [0]
31+ Method {
32+ name: "commit"
33+ Parameter { name: "processEvents"; type: "bool" }
34+ }
35+ Method { name: "commit" }
36+ Method {
37+ name: "move"
38+ Parameter { name: "touchId"; type: "int" }
39+ Parameter { name: "x"; type: "int" }
40+ Parameter { name: "y"; type: "int" }
41+ }
42+ Method {
43+ name: "press"
44+ Parameter { name: "touchId"; type: "int" }
45+ Parameter { name: "x"; type: "int" }
46+ Parameter { name: "y"; type: "int" }
47+ }
48+ Method {
49+ name: "release"
50+ Parameter { name: "touchId"; type: "int" }
51+ Parameter { name: "x"; type: "int" }
52+ Parameter { name: "y"; type: "int" }
53+ }
54+ Method {
55+ name: "stationary"
56+ Parameter { name: "touchId"; type: "int" }
57+ }
58+ }
59+}
tests/whitespace/check_whitespace.py+22−12
@@ -1,7 +1,7 @@
11#! /usr/bin/env python3
22
33#
4−# Copyright (C) 2013 Canonical Ltd
4+# Copyright (C) 2013, 2014 Canonical Ltd
55#
66# This program is free software: you can redistribute it and/or modify
77# it under the terms of the GNU General Public License version 3 as
@@ -19,8 +19,8 @@
1919#
2020
2121#
22−# Little helper program to test that source files do not contain trailing whitespace
23−# or tab indentation.
22+# Little helper program to test that source files do not contain trailing
23+# whitespace or tab indentation.
2424#
2525# Usage: check_whitespace.py directory [ignore_prefix]
2626#
@@ -31,18 +31,20 @@
3131# See the file_pat definition below for a list of files that are checked.
3232#
3333
34+from __future__ import print_function
35+
3436import argparse
3537import os
3638import re
3739import sys
3840
39−# Print msg on stderr, preceded by program name and followed by newline
4041
42+# Print msg on stderr, preceded by program name and followed by newline
4143def error(msg):
4244 print(os.path.basename(sys.argv[0]) + ": " + msg, file=sys.stderr)
4345
44−# Function to raise errors encountered by os.walk
4546
47+# Function to raise errors encountered by os.walk
4648def raise_error(e):
4749 raise e
4850
@@ -52,6 +54,7 @@ def raise_error(e):
5254whitespace_pat = re.compile(r'.*[ \t]$')
5355tab_indent_pat = re.compile(r'^ *\t')
5456
57+
5558def scan_for_bad_whitespace(file_path):
5659 global tab_indent_pat, whitespace_pat
5760 errors = []
@@ -69,7 +72,9 @@ def scan_for_bad_whitespace(file_path):
6972 plural = 's'
7073 else:
7174 plural = ''
72− print("%s: bad whitespace in line%s %s" % (file_path, plural, ", ".join((str(i) for i in errors))))
75+ print(
76+ "%s: bad whitespace in line%s %s" % (
77+ file_path, plural, ", ".join((str(i) for i in errors))))
7378 elif errors:
7479 print("%s: bad whitespace in multiple lines" % file_path)
7580 if newlines_at_end:
@@ -78,15 +83,20 @@ def scan_for_bad_whitespace(file_path):
7883
7984# Parse args
8085
81−parser = argparse.ArgumentParser(description = 'Test that source files do not contain trailing whitespace.')
82−parser.add_argument('dir', nargs = 1, help = 'The directory to (recursively) search for source files')
83−parser.add_argument('ignore_prefix', nargs = '?', default=None,
84− help = 'Ignore source files with a path that starts with the given prefix.')
86+parser = argparse.ArgumentParser(
87+ description='Test that source files do not contain trailing whitespace.')
88+parser.add_argument(
89+ 'dir', nargs=1,
90+ help='The directory to (recursively) search for source files')
91+parser.add_argument(
92+ 'ignore_prefix', nargs='?', default=None,
93+ help='Ignore source files with a path that starts with the given prefix.')
8594args = parser.parse_args()
8695
8796# Files we want to check for trailing whitespace.
8897
89−file_pat = r'(.*\.(c|cpp|h|hpp|hh|in|install|js|py|qml|sh)$)|(.*CMakeLists\.txt$)'
98+file_pat = (
99+ r'(.*\.(c|cpp|h|hpp|hh|in|install|js|py|qml|sh)$)|(.*CMakeLists\.txt$)')
90100pat = re.compile(file_pat)
91101
92102# Find all the files with matching file extension in the specified
@@ -97,7 +107,7 @@ ignore = args.ignore_prefix and os.path.abspath(args.ignore_prefix) or None
97107
98108found_whitespace = False
99109try:
100− for root, dirs, files in os.walk(directory, onerror = raise_error):
110+ for root, dirs, files in os.walk(directory, onerror=raise_error):
101111 for file in files:
102112 path = os.path.join(root, file)
103113 if not (ignore and path.startswith(ignore)) and pat.match(file):
tools/scopetool.cpp−2
@@ -77,8 +77,6 @@ int main(int argc, char *argv[])
7777 tracker.reset(new RegistryTracker(extraScopes, systemScopes, serverScopes));
7878 }
7979
80− resolveIconTheme();
81−
8280 bindtextdomain("unity8", translationDirectory().toUtf8().data());
8381
8482 QQuickView* view = new QQuickView();